• 搜索
  • 夜间模式
    ©2025-2026  技术杂货铺 Theme by OneBlog

    技术杂货铺博客

    搜索
    标签
    # npm # authentik # ddns # wg-easy # v2ray
  • 首页>
  • 技术>
  • 正文
  • Nginx Proxy Manager - 一个 Web 界面搞定所有反向代理

    2026年03月28日 14 阅读 0 评论 5587 字

    1. 什么是 Nginx Proxy Manager?
    Nginx Proxy Manager(简称 NPM)是一款基于 Nginx 的开源反向代理管理工具,它提供了一个简洁、直观的 Web 用户界面,让你无需手动编写复杂的 Nginx 配置文件,即可轻松地为你的多个 Web 服务配置反向代理、SSL 证书(支持 Let's Encrypt 免费证书自动签发)、访问控制等高级功能。
    主要特性:
    图形化界面:告别命令行和 nginx.conf,通过浏览器轻松管理。
    一键 SSL:集成 Let's Encrypt,几分钟内为你的域名启用 HTTPS。
    反向代理:将不同域名或子域名指向本地不同端口的服务(如 WordPress、Nextcloud、Home Assistant 等)。
    访问控制:设置密码保护、IP 白名单等安全策略。
    多用户支持:可创建管理员和普通用户账户。
    Docker 友好:官方提供 Docker 镜像,部署简单。

    💡 适用场景:家庭服务器、开发测试环境、小型企业应用网关。
    2. 部署 Nginx Proxy Manager
    我们将使用 Docker 或 Docker Compose 来快速部署 Nginx Proxy Manager。这种方式便于管理容器、持久化数据,并能轻松升级。
    2.1 准备工作
    创建目录
    # 创建安装目录
    mkdir nginx-proxy-manager && cd nginx-proxy-manager
    # 创建挂载目录
    mkdir -p data letsencrypt
    请确保在运行命令的当前目录下创建所需目录,否则会出现挂载失败错误。
    2.2 Docker部署
    docker run -d \
    --name nginx-proxy-manager \
    --restart unless-stopped \
    -p 80:80 \
    -p 81:81 \
    -p 443:443 \
    -v ./data:/data \
    -v ./letsencrypt:/etc/letsencrypt \
    docker.io/jc21/nginx-proxy-manager:latest
    2.3 Docker Compose 部署
    2.3.1 docker-compose.yml (带数据库)
    services:
    # 主应用服务:Nginx Proxy Manager
    app:
    # 使用官方 Nginx Proxy Manager 镜像
    image: 'jc21/nginx-proxy-manager:latest'
    # 自定义容器名称
    container_name: nginx-proxy-manager
    # 重启策略:除非手动停止,否则自动重启(适合生产环境)
    restart: unless-stopped
    # 端口映射
    ports:
    - '80:80' # HTTP 流量入口
    - '443:443' # HTTPS 流量入口
    - '81:81' # Web 管理界面访问端口(通过 http://your-ip:81 访问)
    # 数据卷挂载,实现数据持久化
    volumes:
    - ./data:/data # 持久化 NPM 配置和数据库
    - ./letsencrypt:/etc/letsencrypt # 持久化 Let's Encrypt SSL 证书
    # 环境变量:配置数据库连接信息
    environment:
    DB_HOST: mysql # 数据库主机名(对应下方 mysql 服务名)
    DB_USER: npm # 数据库用户名
    DB_PASS: your_secure_password_here # 数据库用户密码(请替换为强密码!)
    DB_NAME: npm_db # 使用的数据库名称
    DB_PORT: 3306 # MySQL 默认端口
    # 依赖关系:确保 mysql 服务启动完成后再启动 NPM
    depends_on:
    - mysql
    # 数据库服务:MySQL 8.0(稳定版本,广泛支持)
    mysql:
    # 使用 MySQL 8.0 官方镜像
    # 8.0 版本性能更好,安全性更高,且长期支持
    image: 'mysql:8.0'
    # 自定义容器名称
    container_name: npm-mysql
    # 自动重启策略
    restart: unless-stopped
    # 环境变量:MySQL 初始化配置
    environment:
    MYSQL_ROOT_PASSWORD: your_root_password_here # root 用户密码(请务必修改!)
    MYSQL_DATABASE: npm_db # 初始化时创建的数据库(需与 NPM 配置一致)
    MYSQL_USER: npm # 创建的普通用户
    MYSQL_PASSWORD: your_secure_password_here # 该用户的密码(必须与 DB_PASS 一致)
    # 数据持久化:将 MySQL 数据目录挂载到本地
    volumes:
    - ./mysql-data:/var/lib/mysql # 确保数据库数据在容器重建后不丢失
    # 可选:如果需要自定义 MySQL 配置(如编码、性能调优),可挂载配置文件
    # volumes:
    # - ./mysql-data:/var/lib/mysql
    # - ./mysql-config/my.cnf:/etc/mysql/my.cnf
    2.3.2 docker-compose.yaml(不带数据库)
    services:
    # 定义一个名为 'app' 的服务,用于运行 Nginx Proxy Manager
    app:
    # 镜像地址:从 Docker Hub 拉取官方镜像
    # 使用完整域名 docker.io 表示来自官方镜像仓库(等同于不写也可,但更明确)
    # 'jc21/nginx-proxy-manager' 是 Nginx Proxy Manager 的官方镜像
    # ':latest' 标签表示使用最新稳定版本(建议生产环境指定具体版本号以确保稳定性)
    image: 'docker.io/jc21/nginx-proxy-manager:latest'
    # 容器重启策略
    # unless-stopped:除非手动停止容器,否则在 Docker 启动时自动运行
    # 适合长期运行的服务,保证异常退出后能自动恢复
    restart: unless-stopped
    # 端口映射(Host:Container)——将宿主机端口映射到容器内部端口
    ports:
    - '80:80' # 将宿主机的 80 端口映射到容器的 80 端口
    # 用途:接收并处理 HTTP 请求(如 http://your-domain.com)
    - '81:81' # 将宿主机的 81 端口映射到容器的 81 端口
    # 用途:访问 Nginx Proxy Manager 的 Web 管理界面(http://your-ip:81)
    - '443:443' # 将宿主机的 443 端口映射到容器的 443 端口
    # 用途:接收并处理 HTTPS 请求(如 https://your-domain.com)
    # 数据卷挂载(Volume Mounts)——实现数据持久化,防止容器删除后配置丢失
    volumes:
    - ./data:/data # 将当前目录下的 ./data 映射到容器内的 /data
    # 用途:存储 NPM 的数据库、配置文件、会话等核心数据
    - ./letsencrypt:/etc/letsencrypt # 将当前目录下的 ./letsencrypt 映射到容器内的 /etc/letsencrypt
    # 用途:持久化 Let's Encrypt 签发的 SSL 证书
    # 避免因容器重建导致证书失效或频繁重签
    2.4 启动服务
    docker-compose up -d
    首次启动可能需要几分钟下载镜像并初始化数据库。
    3. 登录
    打开浏览器,访问:http://你的服务器IP:81
    默认登录的用户名:[email protected] 密码:changeme
    第一次登录会提示更改用户名和密码,建议修改一个复杂一点的密码。
    至此,我们已经完成了 Nginx Proxy Manager 的搭建,之后就可以用它给我们的 其他 Web 应用做反向代理了。

    4. 配置反向代理
    登录系统后,我们就可以来给 Halo 来添加一个反向代理了。
    点击 Proxy Hosts,接着点击 Add Proxy Host,我们只要用到其中的几个功能即可,这边稍微解释一下:
    Domain Names :填我们 Halo 网站的域名,首先记得做好 DNS 解析,把域名绑定到我们的服务器的 IP 上
    Scheme :默认 http 即可,除非你有自签名证书
    Forward Hostname/IP :填入服务器的 IP,或者 Docker 容器内部的 IP(如果 NPM 和 Halo 搭建在同一台服务器上的话)
    Forward Port:填入 Halo 映射出的端口,这边默认是 8090
    Cache Assets :缓存,可以选择打开
    Block Common Exploits:阻止常见的漏洞,可以选择打开
    Websockets Support :WS 支持,可以选择打开
    Access List:这个是 NPM 自带的一个限制访问功能

    以下是一个样列:因为样例的 NPM 和 Halo 搭建在同一台 VPS 上,所以这边的 IP,图中填的是 172.17.0.1,为 Docker 容器内部的 IP 地址,
    可以通过下面的命令查询:
    ip addr show docker0

    4: docker0: mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:e4:a3:b5:b9 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever

    这边的 IP 是 172.17.0.1,填入这个 IP,可以不用打开防火墙的 8090 端口。
    当然,如果你的 NPM 和 Halo 不在同一台服务上,你需要在 IP 部分填入 你的 Halo 所在的服务器的 IP,并在服务商(部分服务商如腾讯、阿里)的后台打开 8090 端口。
    5. 一键申请 SSL 证书

    接着我们来申请一张 SSL 证书,让我们的网站支持 https 访问。记得打开强制 SSL,
    申请证书需要你提前将域名解析到 NPM 所在的服务器的 IP 上;
    如果你使用的是国内的服务器,默认 80 和 443 端口是关闭的,你需要备案之后才能使用;
    如果你使用了 CloudFlare 的 DNS 服务,记得把小黄云关闭(即不开启 CDN)。

    不出意外,你将成功申请到 SSL 证书,证书会三个月自动续期。
    再次点开配置,查看一下,将强制 SSL 打开。至此,你已经成功完成了 Halo 的反向代理,快尝试使用域名访问一下看看吧!

    本文著作权归作者 [ 爱生活的懒人 ] 享有,未经作者书面授权,禁止转载,封面图片来源于 [ 互联网 ] ,本文仅供个人学习、研究和欣赏使用。如有异议,请联系博主及时处理。
    npm

    发表留言
    回复

    Copyright©2025-2026  All Rights Reserved.  Load:0.006 s
    Theme by OneBlog V3.6.5
    夜间模式

    开源不易,请尊重作者版权,保留基本的版权信息。