Editing Nginx config files over SSH works, but a web interface can make day-to-day changes faster, especially when you add proxy hosts and certificates often. Two popular open-source options take different approaches:
- Nginx UI edits your server’s real Nginx configuration through a browser, with a code editor, templates, and Let’s Encrypt automation.
- Nginx Proxy Manager (NPM) runs its own Nginx in Docker, and generates the configs from a simple form, for reverse proxy hosts with SSL.
Which one fits?
| Nginx UI | Nginx Proxy Manager | |
|---|---|---|
| Manages | Your existing host Nginx | Its own containerised Nginx |
| Config style | Raw config editing (plus templates) | Forms; custom snippets per host |
| Best for | Admins who know Nginx and want a GUI | Quickly proxying Docker apps with SSL |
| Static sites, PHP, complex configs | Yes | Limited |
| Certificates | Let’s Encrypt (HTTP and DNS challenges) | Let’s Encrypt (HTTP and DNS challenges) |
| Extras | Log viewer, terminal, server stats, multi-node | Access lists, streams (TCP/UDP), redirects |
If you already run Nginx with hand-written configs, use Nginx UI, or keep using the command line. If the server mainly runs Docker apps that need HTTPS, NPM is the quickest path. For a deeper look at NPM, see Nginx Proxy Manager.
Nginx UI: install
The project provides an install script for a native setup (a systemd service that manages /etc/nginx):
bash -c "$(curl -L https://raw.githubusercontent.com/0xJacky/nginx-ui/main/install.sh)" @ install
sudo systemctl status nginx-ui
Read the script before running it if you prefer. Nginx UI listens on port 9000 by default. Its config file is /usr/local/etc/nginx-ui/app.ini. Docker images are also available, mounting /etc/nginx from the host.
On first visit, you set up the admin account. Do it right away.
Nginx UI: what you get
- Site list and editor: edit server blocks with syntax highlighting. Nginx UI runs
nginx -tbefore reloading, and refuses broken configs. - Templates for common setups (reverse proxy, PHP, WebSocket).
- Certificates: issue and auto-renew Let’s Encrypt certificates, including DNS challenges for wildcards.
- Logs and stats: access and error log viewer, CPU, memory and connection graphs.
- Config backups, and multi-server management from one dashboard.
Nginx Proxy Manager: install
# /opt/npm/compose.yaml
services:
npm:
image: jc21/nginx-proxy-manager:latest
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "127.0.0.1:81:81" # admin UI: keep it private
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
NPM needs ports 80 and 443 itself, so it can’t run alongside another web server on the same ports. Reach the admin UI on port 81 via an SSH tunnel. The initial login is shown in the docs, and you change it on first login. See SSH tunnelling.
Securing any Nginx web GUI
A web panel that edits your web server config is effectively root-level access to your sites. Treat it accordingly:
- Don’t expose the admin port publicly. Bind it to 127.0.0.1, and use an SSH tunnel or VPN. See Tailscale.
- If it must be public, put it behind HTTPS plus 2FA (Nginx UI supports TOTP and passkeys) or SSO, and allow only your IPs.
- Use strong, unique passwords, and keep the panel updated. Admin panels are frequent targets.
- Keep your configs in Git, or take regular backups of
/etc/nginx, so a bad change can be rolled back. See Nginx config testing.
Command line still matters
Even with a GUI, know the basics for when the panel is down:
sudo nginx -t # test config
sudo systemctl reload nginx # apply
sudo tail -f /var/log/nginx/error.log
See Nginx access and error logs and Nginx server blocks.
Quick reference
| Item | Nginx UI | NPM |
|---|---|---|
| Admin port | 9000 | 81 |
| Config | /usr/local/etc/nginx-ui/app.ini |
./data (SQLite) |
| Manages | /etc/nginx on the host |
its own Nginx in Docker |
| Needs ports 80/443 | No (uses host Nginx) | Yes |
Related: Coolify and Caddy reverse proxy.