侧边栏壁纸
  • 累计撰写 27 篇文章
  • 累计创建 50 个标签
  • 累计收到 9 条评论

目 录CONTENT

文章目录

在 NAS 上使用 Host 模式部署 Nginx Proxy Manager 并自定义端口

Jack
2025-09-13 / 0 评论 / 0 点赞 / 283 阅读 / 0 字
温馨提示:
本文最后更新于2025-09-13,若内容或图片失效,请留言反馈。 部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

背景

在 NAS 设备上安装 Nginx 代理软件时,通常会遇到一个问题:家宽环境下 80 和 443 端口大多被运营商封禁,外网无法访问。

虽然可以通过 桥接网络模式 运行 Docker 容器来自定义端口,但桥接模式下,被代理的应用无法获取真实客户端 IP,只能看到代理容器的内网网关地址。

为解决这一问题,可以使用 Host 网络模式 部署 nginx-proxy-manager(以下简称 NPM),既能自定义端口,也能保留客户端真实 IP。

本文将介绍如何在 Host 网络模式下运行 NPM,并修改其默认监听端口。


快速指南(长话短说版)

核心思路来自 NPM issues #4748:
通过挂载配置文件到宿主机并修改其中的监听端口。

步骤

  1. 准备挂载文件:

    • ./templates:/app/templates

    • ./default.conf:/etc/nginx/conf.d/default.conf(可以是空文件)

  2. 下载并修改 templates 目录中的配置文件,将其中的 80 和 443 改为你想要的端口。

  3. 如果是已有安装,需要同步修改之前的代理配置文件:
    ./data/nginx/proxy_host/*.conf

  4. 若要修改后台管理界面的 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 仓库下载

方法二:从容器中复制出来

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。

npm

评论区