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

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:latestREADME 未说明显存或 GPU 要求;支持 macOS 11+、Windows 10+、Linux 2.6.23+(x86/amd64/arm/armv5~v7/mips/riscv64/loongarch64)、FreeBSD、OpenBSD、Dragonfly BSD、OpenWrt
给 Nginx 套一个 Web 管理面板,用浏览器就能改配置、管站点,不用再手敲 conf 文件
给 Nginx 配一个自托管的 Web 管理界面,可视化编辑配置、申请 Let's Encrypt 证书、管理定时任务和 Docker 部署,省去手改配置文件的麻烦。
核心能力
- 浏览器里在线编辑 Nginx 配置文件
- 按 Debian 规范管理 sites-available 与 sites-enabled 软链
- 首次访问网页完成初始化配置
- 提供 Docker 镜像,可直接替换宿主机 Nginx
- 支持 systemd 服务方式启停与重启
容易踩的坑
- 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.5 v3.0.0 Binary (linux/amd64) 142.4 MB 100.2 MB −30% Download ( nginx-ui-linux-64.tar.gz)45.4 MB 33.7 MB −26% Go module dependencies 361 205 −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
- 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.5 v3.0.0 Binary (linux/amd64) 142.4 MB 100.2 MB −30% Download ( nginx-ui-linux-64.tar.gz)45.4 MB 33.7 MB −26% Go module dependencies 361 205 −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 line 1508 B (8.6× the raw log) 28.5 B (0.16× the raw log) 53× smaller Indexing CPU per line 134 µs 0.98 µs 136× faster Memory allocated while indexing 9.2 GB 216 MB 42× less Log viewer page 1479 ms 19.9 ms 74× faster Dashboard browser, OS and device charts 75.8 ms 0.56 ms 135× faster Dashboard top 100 URLs 64.7 ms 5.7 ms 11× faster World map 84.1 ms 0.31 ms 275× 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
- 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
Identifierno longer falls back to other claims,nameis no longer used, andemailrequiresemail_verifiedunless the newTrustUnverifiedEmailoption is enabled (GHSA-q856-qj25-p7fc). Existing setups that matched users by display name or by unverified email must setIdentifierto a stable claim; see the OIDC guide by @0xJacky (cab1e54f) - Verify the organization, audience and token type of Casdoor tokens, and resolve
JWT-Standardtokens 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
- 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_blockdirectives when a site config is rebuilt, such as entering maintenance mode by @Dev-next-gen (9b6d1b55) - Allow
lua_package_pathandlua_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
- 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
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
Nginx UI
Yet another Nginx Web UI, developed by 0xJacky, Hintay and Akino.
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.
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
English | Español | 简体中文 | 繁體中文 | Tiếng Việt | 日本語
About The Project

Demo
- 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
- When using this container for the first time, ensure that the volume mapped to /etc/nginx is empty.
- If you want to host static files, you can map directories to container.
- If you are upgrading from an older image, see the Docker WebSocket fix guide for required
conf.d/nginx-ui.confupdates. - 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-uion a volume. When upgrading from v2, see Upgrading to v3.
-
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
- 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 port80instead.
-
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'
- Then creat your container by:
docker compose up -d
- 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 port80instead.
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!
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature) - Commit your Changes (
git commit -m 'Add some AmazingFeature') - Push to the Branch (
git push origin feature/AmazingFeature) - 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.