nginx-ui

0xJackyAGPL-3.0活跃维护

给 Nginx 配一个自托管的 Web 管理界面,可视化编辑配置、申请 Let's Encrypt 证书、管理定时任务和 Docker 部署,省去手改配置文件的麻烦。

Yet another WebUI for Nginx

v3.0.1发布于 2026-11-07 02:11 UTC11,755star +12 / 7 天919fork同步于 2026-11-10 23:29 UTC

怎么上手

由 README 提炼,执行前请确认
docker run -dit --name=nginx-ui --restart=always -e TZ=Asia/Shanghai -v /mnt/user/appdata/nginx:/etc/nginx -v /mnt/user/appdata/nginx-ui:/etc/nginx-ui -v /var/run/docker.sock:/var/run/docker.sock -p 8080:80 -p 8443:443 uozi/nginx-ui:latest
硬件要求按 README 说明

README 未说明显存或 GPU 要求;支持 macOS 11+、Windows 10+、Linux 2.6.23+(x86/amd64/arm/armv5~v7/mips/riscv64/loongarch64)、FreeBSD、OpenBSD、Dragonfly BSD、OpenWrt

有 Docker 镜像
下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

给 Nginx 套一个 Web 管理面板,用浏览器就能改配置、管站点,不用再手敲 conf 文件

给 Nginx 配一个自托管的 Web 管理界面,可视化编辑配置、申请 Let's Encrypt 证书、管理定时任务和 Docker 部署,省去手改配置文件的麻烦。

核心能力

  • 浏览器里在线编辑 Nginx 配置文件
  • 按 Debian 规范管理 sites-available 与 sites-enabled 软链
  • 首次访问网页完成初始化配置
  • 提供 Docker 镜像,可直接替换宿主机 Nginx
  • 支持 systemd 服务方式启停与重启

容易踩的坑

首次用该容器时映射到 /etc/nginx 的卷必须为空;非 Debian/Ubuntu 系统需把 nginx.conf 改成 Debian 风格的 include 结构;从旧镜像升级需按 Docker WebSocket 修复指南更新 conf.d/nginx-ui.conf,且 /etc/nginx-ui 要挂卷以保留插件

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本v3.0.1
  1. v3.0.1最新正式版2026-11-07 · 2026-11-07 02:11 UTC

    🩹 v3.0.1 fixes two problems found right after v3.0.0. v3.0.0 was released only a day earlier, so its full notes are included below. If you are upgrading from v2, read them: they cover the plugin system, the rebuilt log analytics and what to check when upgrading.

    v3.0.1

    Features

    • None.

    Bug Fixes

    • Advanced log indexing can be enabled again: the GeoLite2 check in the indexing dialog, the GeoLite2 download and the China city map boundaries no longer fail with "not found" by @0xJacky (ce8692fc)
    • Translated messages in eight languages no longer show raw or wrong placeholders such as %{Timestamp} by @ChandraChaan (c7c58014)

    v3.0.0

    🎉 Nginx UI v3 is here. It is the biggest change since v2: Nginx UI now runs plugins, installed from a signed marketplace. So far only the DNS-01 providers have moved out of the core into a plugin; everything else stays built in, and log analytics is rebuilt from the ground up.

    ❤️ Thank you to everyone who tested the v3 branch, and to @Hintay, who designed and built the plugin system.

    ✨ Highlights

    🧩 Plugin system

    • Install, update and remove plugins from the Plugins page, from the official marketplace or catalogs of your own, or upload an offline package.
    • Plugins can extend Nginx UI with DNS-01 providers, pages, notifications, probes, MCP tools, backup storage, certificate deployment, content and log sinks. Only DNS-01 has moved out of the core so far.
    • Each plugin runs in its own process. A plugin that crashes is restarted and, if it keeps crashing, stopped, without taking Nginx UI down with it. On Linux, the system stops a plugin before Nginx UI when memory runs out, and with cgroup v2 plugins run under memory and CPU limits.
    • Plugins ask for the permissions they need and say why. An update that asks for more waits for your approval, and plugins are kept in sync across cluster nodes.

    📦 A lighter core

    Moving the DNS providers out of the core makes every installation smaller, and lets the providers update on their own:

    v2.9.5v3.0.0
    Binary (linux/amd64)142.4 MB100.2 MB−30%
    Download (nginx-ui-linux-64.tar.gz)45.4 MB33.7 MB−26%
    Go module dependencies361205−43%
    • Only a node that issues DNS-01 certificates installs the DNS-01 plugin (19.6 MB for linux/amd64), with all 222 providers lego supports.
    • New providers and provider fixes ship as plugin releases from the marketplace, without waiting for a new Nginx UI version.

    🛒 Official marketplace and Developer Center

    • The official marketplace at plugins.nginxui.com is built in. Every package is signed, and each plugin shows its trust level: official, verified partner or community.
    • The marketplace shows screenshots, why a plugin needs each permission, release notes, beta channels and earlier versions, and tells you when an installed version was withdrawn or a plugin was taken down.
    • Plugin authors submit and manage their listings in the Developer Center.

    🌐 DNS-01 becomes an official plugin

    • The DNS providers move into the official DNS-01 plugin, installed automatically on nodes that issue DNS-01 certificates. The Docker image bundles it, so containers keep renewing without a download.
    • The main node can issue DNS-01 certificates for other nodes.

    📊 Log analytics, rebuilt on a column store

    Bleve, a full-text search engine, kept one document per log line with an index on almost every field. Log analytics only ever filters by time, value or substring and then counts, groups or pages, so v3 stores parsed logs in a column store built for exactly that: dictionary-encoded, zstd-compressed columns in blocks the queries can skip by time range.

    On 100k combined-format log lines (App

  2. v3.0.02026-11-06 · 2026-11-06 16:22 UTC
    查看更新说明

    🎉 Nginx UI v3 is here. It is the biggest change since v2: Nginx UI now runs plugins, installed from a signed marketplace. So far only the DNS-01 providers have moved out of the core into a plugin; everything else stays built in, and log analytics is rebuilt from the ground up.

    ❤️ Thank you to everyone who tested the v3 branch, and to @Hintay, who designed and built the plugin system.

    ✨ Highlights

    🧩 Plugin system

    • Install, update and remove plugins from the Plugins page, from the official marketplace or catalogs of your own, or upload an offline package.
    • Plugins can extend Nginx UI with DNS-01 providers, pages, notifications, probes, MCP tools, backup storage, certificate deployment, content and log sinks. Only DNS-01 has moved out of the core so far.
    • Each plugin runs in its own process. A plugin that crashes is restarted and, if it keeps crashing, stopped, without taking Nginx UI down with it. On Linux, the system stops a plugin before Nginx UI when memory runs out, and with cgroup v2 plugins run under memory and CPU limits.
    • Plugins ask for the permissions they need and say why. An update that asks for more waits for your approval, and plugins are kept in sync across cluster nodes.

    📦 A lighter core

    Moving the DNS providers out of the core makes every installation smaller, and lets the providers update on their own:

    v2.9.5v3.0.0
    Binary (linux/amd64)142.4 MB100.2 MB−30%
    Download (nginx-ui-linux-64.tar.gz)45.4 MB33.7 MB−26%
    Go module dependencies361205−43%
    • Only a node that issues DNS-01 certificates installs the DNS-01 plugin (19.6 MB for linux/amd64), with all 222 providers lego supports.
    • New providers and provider fixes ship as plugin releases from the marketplace, without waiting for a new Nginx UI version.

    🛒 Official marketplace and Developer Center

    • The official marketplace at plugins.nginxui.com is built in. Every package is signed, and each plugin shows its trust level: official, verified partner or community.
    • The marketplace shows screenshots, why a plugin needs each permission, release notes, beta channels and earlier versions, and tells you when an installed version was withdrawn or a plugin was taken down.
    • Plugin authors submit and manage their listings in the Developer Center.

    🌐 DNS-01 becomes an official plugin

    • The DNS providers move into the official DNS-01 plugin, installed automatically on nodes that issue DNS-01 certificates. The Docker image bundles it, so containers keep renewing without a download.
    • The main node can issue DNS-01 certificates for other nodes.

    📊 Log analytics, rebuilt on a column store

    Bleve, a full-text search engine, kept one document per log line with an index on almost every field. Log analytics only ever filters by time, value or substring and then counts, groups or pages, so v3 stores parsed logs in a column store built for exactly that: dictionary-encoded, zstd-compressed columns in blocks the queries can skip by time range.

    On 100k combined-format log lines (Apple M5 Pro):

    v2 (Bleve)v3 (column store)
    Index on disk per line1508 B (8.6× the raw log)28.5 B (0.16× the raw log)53× smaller
    Indexing CPU per line134 µs0.98 µs136× faster
    Memory allocated while indexing9.2 GB216 MB42× less
    Log viewer page1479 ms19.9 ms74× faster
    Dashboard browser, OS and device charts75.8 ms0.56 ms135× faster
    Dashboard top 100 URLs64.7 ms5.7 ms11× faster
    World map84.1 ms0.31 ms275× faster

    The dashboard's hourly and daily charts over 1M lines went from 61.8 s to 0.1 s in the design benchmark.

    • Indexing memory is bounded by one block per log file, sized to the memory of the machine.
    • Rotated logs are followed, not indexed again: a file renamed by logrotate, copied by copytruncate o
  3. v2.9.52026-11-04 · 2026-11-04 13:43 UTC
    查看更新说明

    Features

    • None.

    Bug Fixes

    • Select the local account for OIDC logins only from trusted claims: a configured Identifier no longer falls back to other claims, name is no longer used, and email requires email_verified unless the new TrustUnverifiedEmail option is enabled (GHSA-q856-qj25-p7fc). Existing setups that matched users by display name or by unverified email must set Identifier to a stable claim; see the OIDC guide by @0xJacky (cab1e54f)
    • Verify the organization, audience and token type of Casdoor tokens, and resolve JWT-Standard tokens by username rather than display name (GHSA-gv2g-m37c-8wwh). Users of other Casdoor organizations can no longer sign in; see the Casdoor guide by @0xJacky (bffd49fb)
    • Show the container's uptime on the dashboard when Nginx UI runs inside an LXC container by @0xJacky (e3832ce1)
    • Keep endpoint settings when restoring a portable backup by @0xJacky (9a42b757)
    • Keep a loopback listener from failing the HTTP-01 route check when issuing certificates by @0xJacky (1f5f3f48)
    • Make the Retry button of the certificate issue dialog work by @0xJacky (e202fbf2)
    • Treat file names Windows rejects as missing files instead of logging errors by @0xJacky (a1bb61cd)
    • Read the nginx log level only from a bracketed tag in nginx output by @kevin9327 (00d48cb4)

    Contributors

    @0xJacky @kevin9327

  4. v2.9.42026-11-02 · 2026-11-02 06:04 UTC
    查看更新说明

    Features

    • None.

    Bug Fixes

    • Validate include patterns the way nginx resolves them, covering POSIX bracket expressions, backslash escapes, ./.. components and byte-wise matching (GHSA-8mrc-pvvv-f7p8) by @0xJacky (e627f5a5, 64460e6c)
    • Remove deleted logs from the log list and index once no configuration declares them and their files are gone by @0xJacky (0c5fec96)
    • Save wildcard certificates on Windows by storing them under # directories by @0xJacky (77ae4d9c)
    • Keep the code of server level *_by_lua_block directives when a site config is rebuilt, such as entering maintenance mode by @Dev-next-gen (9b6d1b55)
    • Allow lua_package_path and lua_package_cpath, so configs such as the CrowdSec bouncer can be saved by @0xJacky (34c27a28)
    • Count bond interfaces in network statistics and the dashboard IP by @0xJacky (c769fa28)
    • Fix logrotate rescheduling, an auto-backup restart deadlock, the GeoLite custom path being overwritten, initial user restore, scheme-less cluster node URLs and version check error handling by @0xJacky (526122a2)

    Contributors

    @0xJacky @Dev-next-gen

  5. v2.9.32026-10-30 · 2026-10-30 03:56 UTC
    查看更新说明

    Features

    • None.

    Bug Fixes

    • Incremental log indexing no longer re-reads whole log files: the full index records how far it read, incremental runs stream appended lines in batches under the indexing concurrency limit, and re-indexed files are cleared first, so memory stays bounded and documents are not duplicated by @0xJacky (7abea8b3)
    • Saving settings with a partial request body keeps the fields and sections it leaves out instead of resetting them by @0xJacky (ec28806b)
    • The demo container writes its sample log fixtures before nginx starts by @0xJacky (583dd1cd)

    Contributors

    @0xJacky

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    Nginx UI

    Yet another Nginx Web UI, developed by 0xJacky, Hintay and Akino.

    DeepWiki Ask DeepWiki Documentation

    AtomGit Stars

    Build and Publish GitHub license Release Version GitHub Stars GitHub Forks Repo Size Closed Issues

    Docker Stars Docker Pulls Image Size

    Featured|HelloGitHub Plumber Score

    Deploy on RainYun

    Documentation

    To check out docs, visit nginxui.com.

    Sponsor

    If you find this project helpful, please consider sponsoring us to support ongoing development and maintenance.

    GitHub Sponsors Afdian

    Sponsors

    Protect and accelerate websites and APIs with consistent access performance across mainland China and worldwide, and extend acceleration and security to native and mobile apps through client SDKs — Self-hosted private CDN|Subscription-based anti-DDoS CDN|A self-controlled, flexibly composable CDN network.

    Official Community Group

    Join the official Nginx UI WeChat community group to discuss usage, deployment ideas, and troubleshooting with other community members.

    Scan the QR code below to add us on WeChat, and include Nginx UI Community Group in your request. The administrator will invite you to the official community group.

    Your support helps us:

    • 🚀 Accelerate the development of new features
    • 🐛 Fix bugs and improve stability
    • 📚 Enhance documentation and tutorials
    • 🌐 Provide better community support
    • 💻 Maintain infrastructure and demo servers

    Tooling Support

    Thanks to JetBrains for supporting us with free open source licenses.

    Stargazers over time

    Stargazers over time

    English | Español | 简体中文 | 繁體中文 | Tiếng Việt | 日本語

    About The Project

    Dashboard

    Demo

    URL:https://demo.nginxui.com

    • Username:admin
    • Password:admin

    Features

    • Online statistics for server indicators such as CPU usage, memory usage, load average, and disk usage.
    • Automatic configuration backup after changes, with version comparison and restore capabilities
    • Cluster management supporting mirroring operations to multiple nodes, making multi-server environments easy to manage
    • Export encrypted Nginx / Nginx UI configurations for quick deployment and recovery to new environments
    • Enhanced online ChatGPT assistant supporting multiple models, including Deepseek-R1's chain-of-thought display to help you better understand and optimize configurations
    • MCP (Model Context Protocol) provides special interfaces for AI agents to interact with Nginx UI, enabling automated configuration management and service control.
    • One-click deployment and automatic renewal Let's Encrypt certificates.
    • Online editing websites configurations with our self-designed NgxConfigEditor which is a user-friendly block editor for nginx configurations or Ace Code Editor which supports LLM Code Completion and highlighting nginx configuration syntax.
    • View Nginx logs online, with indexed search, a traffic dashboard and visitor maps
    • Plugin system: install signed plugins from the marketplace, an uploaded file or an offline directory, for example the official DNS-01 plugin with the DNS providers for certificates
    • Written in Go and Vue, distribution is a single executable binary.
    • Automatically test configuration file and reload nginx after saving configuration.
    • Web Terminal
    • Dark Mode
    • Responsive Web Design

    Internationalization

    We proudly offer official support for:

    • English
    • Simplified Chinese
    • Traditional Chinese

    As non-native English speakers, we strive for accuracy, but we know there's always room for improvement. If you spot any issues, we'd love your feedback!

    Thanks to our amazing community, additional languages are also available! Explore and contribute to translations on Weblate.

    Getting Started

    Before Use

    The Nginx UI follows the Debian web server configuration file standard. Created site configuration files will be placed in the sites-available folder that under the Nginx configuration folder (auto-detected). The configuration files for an enabled site will create a soft link to the sites-enabled folder. You may need to adjust the way the configuration files are organised.

    For non-Debian (and Ubuntu) systems, you may need to change the contents of the nginx.conf configuration file to the Debian style as shown below.

    http {
    	# ...
    	include /etc/nginx/conf.d/*.conf;
    	include /etc/nginx/sites-enabled/*;
    }
    

    For more information: debian/conf/nginx.conf

    Installation

    Nginx UI is available on the following platforms:

    • macOS 11 Big Sur and later (amd64 / arm64)
    • Windows 10 and later (amd64 / arm64)
    • Linux 2.6.23 and later (x86 / amd64 / arm64 / armv5 / armv6 / armv7 / mips32 / mips64 / riscv64 / loongarch64)
      • Including but not limited to Debian 7 / 8, Ubuntu 12.04 / 14.04 and later, CentOS 6 / 7, Arch Linux
    • FreeBSD
    • OpenBSD
    • Dragonfly BSD
    • Openwrt

    You can visit latest release to download the latest distribution, or just use installation scripts for Linux.

    Usage

    In the first runtime of Nginx UI, please visit http://<your_server_ip>:<listen_port> in your browser to complete the follow-up configurations.

    From Executable

    Run Nginx UI in Terminal

    nginx-ui -config app.ini
    

    Press Control+C in the terminal to exit Nginx UI.

    Run Nginx UI in Background

    nohup ./nginx-ui -config app.ini -pidfile nginx-ui.pid &
    

    Stop Nginx UI gracefully with the following command.

    kill -TERM "$(cat nginx-ui.pid)"
    
    With Systemd

    If you are using the installation script for Linux, the Nginx UI will be installed as nginx-ui service in systemd. Please use the systemctl command to control it.

    Start Nginx UI

    systemctl start nginx-ui
    

    Stop Nginx UI

    systemctl stop nginx-ui
    

    Restart Nginx UI

    systemctl restart nginx-ui
    
    With Docker

    Our docker image uozi/nginx-ui:latest is based on the latest nginx image and can be used to replace the Nginx on the host. By publishing the container's port 80 and 443 to the host, you can easily make the switch.

    Note
    1. When using this container for the first time, ensure that the volume mapped to /etc/nginx is empty.
    2. If you want to host static files, you can map directories to container.
    3. If you are upgrading from an older image, see the Docker WebSocket fix guide for required conf.d/nginx-ui.conf updates.
    4. The image bundles the official DNS-01 plugin and installs it on the first start. Installed plugins are kept in /etc/nginx-ui/plugins, so keep /etc/nginx-ui on a volume. When upgrading from v2, see Upgrading to v3.
    1. Install Docker.

    2. Then deploy nginx-ui like this:

    docker run -dit \
      --name=nginx-ui \
      --restart=always \
      -e TZ=Asia/Shanghai \
      -v /mnt/user/appdata/nginx:/etc/nginx \
      -v /mnt/user/appdata/nginx-ui:/etc/nginx-ui \
      -v /var/run/docker.sock:/var/run/docker.sock \
      -p 8080:80 -p 8443:443 \
      uozi/nginx-ui:latest
    
    1. When your docker container is running, Log in to nginx-ui panel with http://<your_server_ip>:8080/install. If you change the port mapping, access Nginx UI through the host port mapped to container port 80 instead.
    1. Install Docker-Compose.

    2. Create a docker-compose.yml file like this:

    services:
        nginx-ui:
            stdin_open: true
            tty: true
            container_name: nginx-ui
            restart: always
            environment:
                - TZ=Asia/Shanghai
            volumes:
                - '/mnt/user/appdata/nginx:/etc/nginx'
                - '/mnt/user/appdata/nginx-ui:/etc/nginx-ui'
                - '/var/www:/var/www'
                - '/var/run/docker.sock:/var/run/docker.sock'
            ports:
                - 8080:80
                - 8443:443
            image: 'uozi/nginx-ui:latest'
    
    1. Then creat your container by:
    docker compose up -d
    
    1. When your docker container is running, Log in to nginx-ui panel with http://<your_server_ip>:8080/install. If you change the port mapping, access Nginx UI through the host port mapped to container port 80 instead.

    Manual Build

    On platforms that do not have an official build version, they can be built manually.

    Prerequisites

    • Make

    • Golang 1.27.2+

    • Bun 1.4.3 (the version pinned by this repository's package manifest and CI)

    • node.js 21+

      npx browserslist@latest --update-db
      

    Build Frontend

    Please execute the following command in app directory.

    bun install
    bun run build
    

    Build Backend

    Please build the app first, and then execute the following command in the project root directory.

    go generate
    go build -tags=jsoniter -ldflags "$LD_FLAGS -X 'github.com/0xJacky/Nginx-UI/settings.buildTime=$(date +%s)'" -o nginx-ui -v main.go
    

    Script for Linux

    Basic Usage

    Install and Upgrade

    bash -c "$(curl -L https://cloud.nginxui.com/install.sh)" @ install
    

    The default listening port is 9000, and the default HTTP Challenge port is 9180. If there is a port conflict, please modify /usr/local/etc/nginx-ui/app.ini manually, then use systemctl restart nginx-ui to reload the Nginx UI service.

    Remove Nginx UI, except configuration and database files

    bash -c "$(curl -L https://cloud.nginxui.com/install.sh)" @ remove
    

    More Usage

    bash -c "$(curl -L https://cloud.nginxui.com/install.sh)" @ help
    

    Example of Nginx Reverse Proxy Configuration

    server {
        listen          80;
        listen          [::]:80;
    
        server_name     <your_server_name>;
        rewrite ^(.*)$  https://$host$1 permanent;
    }
    
    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }
    
    server {
        listen  443       ssl;
        listen  [::]:443  ssl;
        http2   on;
    
        server_name         <your_server_name>;
    
        ssl_certificate     /path/to/ssl_cert;
        ssl_certificate_key /path/to/ssl_cert_key;
    
        location / {
            proxy_set_header    Host                $host;
            proxy_set_header    X-Real-IP           $remote_addr;
            proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
            proxy_set_header    X-Forwarded-Proto   $scheme;
            proxy_http_version  1.1;
            proxy_set_header    Upgrade             $http_upgrade;
            proxy_set_header    Connection          $connection_upgrade;
            proxy_pass          http://127.0.0.1:9000/;
        }
    }
    

    Contributing

    Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.

    If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". Don't forget to give the project a star! Thanks again!

    1. Fork the Project
    2. Create your Feature Branch (git checkout -b feature/AmazingFeature)
    3. Commit your Changes (git commit -m 'Add some AmazingFeature')
    4. Push to the Branch (git push origin feature/AmazingFeature)
    5. Open a Pull Request

    License

    This project is provided under a GNU Affero General Public License v3.0 license that can be found in the LICENSE file. By using, distributing, or contributing to this project, you agree to the terms and conditions of this license.