背景
在 NAS 设备上安装 Nginx 代理软件时,通常会遇到一个问题:家宽环境下 80 和 443 端口大多被运营商封禁,外网无法访问。
虽然可以通过 桥接网络模式 运行 Docker 容器来自定义端口,但桥接模式下,被代理的应用无法获取真实客户端 IP,只能看到代理容器的内网网关地址。
为解决这一问题,可以使用 Host 网络模式 部署 nginx-proxy-manager(以下简称 NPM),既能自定义端口,也能保留客户端真实 IP。
本文将介绍如何在 Host 网络模式下运行 NPM,并修改其默认监听端口。
快速指南(长话短说版)
核心思路来自 NPM issues #4748:
通过挂载配置文件到宿主机并修改其中的监听端口。
步骤
准备挂载文件:
./templates:/app/templates./default.conf:/etc/nginx/conf.d/default.conf(可以是空文件)
下载并修改
templates目录中的配置文件,将其中的80和443改为你想要的端口。如果是已有安装,需要同步修改之前的代理配置文件:
./data/nginx/proxy_host/*.conf若要修改后台管理界面的
81端口,可额外挂载:./production.conf:/etc/nginx/conf.d/production.conf
文件示例(将
81改为所需端口):# Admin Interface server { listen 81 default; listen [::]:81 default; server_name nginxproxymanager; root /app/frontend; access_log /dev/null; location /api { return 302 /api/; } location /api/ { add_header X-Served-By $host; proxy_set_header Host $host; proxy_set_header X-Forwarded-Scheme $scheme; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $remote_addr; proxy_pass http://127.0.0.1:3000/; proxy_read_timeout 15m; proxy_send_timeout 15m; } location / { index index.html; if ($request_uri ~ ^/(.*)\.html$) { return 302 /$1; } try_files $uri $uri.html $uri/ /index.html; } }
详细步骤(小白版)
如果你对上面的快速指南还有疑问,可以按以下步骤操作。
1. 下载 templates 目录文件
有两种方法获取:
方法一(推荐):从 GitHub 仓库下载
地址:
https://github.com/NginxProxyManager/nginx-proxy-manager/tree/develop/docker/rootfs/app/templates点击右上角 Code → Download ZIP 下载整个仓库
解压后仅保留
docker/rootfs/app/templates目录
方法二:从容器中复制出来
docker run --rm --entrypoint "" -v $(pwd):/host jc21/nginx-proxy-manager:latest \
cp -r /app/templates /host/
执行后会在当前目录生成 templates 文件夹。
2. 创建配置文件
在当前目录下创建:
空白的
default.conf自定义端口的
production.conf(内容见上)
3. 编写 docker-compose.yml
在同级目录创建 docker-compose.yml 文件:
version: "3"
services:
app:
container_name: npm
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
network_mode: host
environment:
DB_MYSQL_HOST: "127.0.0.1"
DB_MYSQL_PORT: 53306
DB_MYSQL_USER: "npm"
DB_MYSQL_PASSWORD: "Dsdd23sf1wdfwa"
DB_MYSQL_NAME: "npm"
TZ: Asia/Shanghai
volumes:
- ./data:/data
- ./templates:/app/templates
- ./letsencrypt:/etc/letsencrypt
- ./default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- mariadb-npm
mariadb-npm:
container_name: mariadb-npm
image: 'jc21/mariadb-aria:latest'
restart: unless-stopped
ports:
- '53306:3306'
environment:
MYSQL_ROOT_PASSWORD: 'npm'
MYSQL_DATABASE: 'npm'
MYSQL_USER: 'npm'
MYSQL_PASSWORD: 'Dsdd23sf1wdfwa'
volumes:
- ./db:/var/lib/mysql
4. 启动服务
在终端执行:
docker-compose up -d
启动完成后,访问你设定的端口即可使用 NPM,且可以正常获取客户端真实 IP。
评论区