一开始搭建自己网站的时候,自己的服务器上并没有配置nginx服务,然后更别说配置文件的编辑了,然后经过和AI的深度交流之后才发现这个小的图形化界面这么好用

Nginx Proxy Manager(简称 NPM)是一个将 Nginx 反向代理和证书管理图形化(Web GUI)的开源工具。它本质上是用 Node.js + Python + 数据库(SQLite/MySQL) 给底层的 OpenResty/Nginx 包了一层可视化外壳,通常以 Docker 容器形式一键交付。

对于个人开发者、家庭实验室(HomeLab)和自建轻量服务的场景,它极其方便;但在中大型企业运维与生产级 SRE 体系中,它几乎不会被选为主流方案。

一、 核心功能与亮点

  1. 零代码配置反向代理(Proxy Hosts)

    • 在 Web 界面填入域名、目标 IP 和端口即可,彻底告别手动编写 server 块、proxy_pass 和请求头。

    • 支持一键勾选常用参数:Websockets Support、Block Common Exploits(基础防注入规则)、静态资源缓存(Cache Assets)。

  2. 自动化 SSL/TLS 证书生命周期管理

    • 内置集成 Let's Encrypt(Certbot),支持一键免费申请证书、强制跳转 HTTPS、启用 HSTS/HTTP2。

    • 支持 DNS-01 验证(配合阿里云、Cloudflare 等 DNS API 申请通配符泛域名证书 *.domain.com),后台常驻定时任务自动更新证书,防止证书过期。

  3. 访问控制列表(Access Lists)

    • 可通过界面快速配置 HTTP Basic Auth(账密认证)或客户端 IP 白名单/黑名单。

  4. 四层流代理(Streams)与重定向

    • 支持 TCP/UDP 端口转发(基于 Nginx stream 模块)。

    • 提供 Redirection Hosts(域名 301/302 重定向)和 404 Hosts。

二、 典型部署形态(Docker Compose)

NPM 本身高度依赖容器化,最标准的落地方式就是极简的 Compose 文件:

YAML

version: '3.8'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'      # 公网 HTTP
      - '81:81'      # Web 管理后台端口(生产建议不对公网开放)
      - '443:443'    # 公网 HTTPS
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

三、 配置文件进行反向代理和SSL证书申请

抛弃 NPM 图形界面,纯手写 Nginx 配置文件并结合 Certbot 跑通整个底层流程,是 SRE 和运维工程师必备的硬核基本功。你描述的原理正是 Certbot 的 webroot 模式。

以下是在你的服务器上,基于后端 Halo(运行在 127.0.0.1:8090)的纯手工配置实战全流程:

1. 准备验证专用目录并安装工具 在宿主机上安装 Nginx 和 Certbot,并为 Let's Encrypt 创建专门存放临时文件的目录:

Bash

yum install epel-release -y
yum install nginx certbot -y
mkdir -p /usr/share/nginx/html/certbot

2. 配置 Nginx 开放 80 端口与验证路由 创建或修改 /etc/nginx/conf.d/originspace.conf,将 .well-known 的请求指向临时目录,将其他访问反向代理给 Halo:

Nginx

server {
    listen 80;
    server_name originspace.work;

    # 1. 专门拦截 Let's Encrypt 的 HTTP 验证请求,去临时目录读取文件
    location /.well-known/acme-challenge/ {
        root /usr/share/nginx/html/certbot;
    }

    # 2. 正常用户的请求,全部反向代理给后端的 Halo 博客容器
    location / {
        proxy_pass http://127.0.0.1:8090;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

启动并重载 Nginx 生效:systemctl enable --now nginx 和 nginx -s reload。

3. 执行 Certbot 申请证书 在终端执行以下命令,Certbot 会自动在刚才的目录生成临时文件,并通知 Let's Encrypt 来抓取:

Bash

certbot certonly --webroot -w /usr/share/nginx/html/certbot -d originspace.work

成功后,终端会提示证书已保存在 /etc/letsencrypt/live/originspace.work/fullchain.pem 和 privkey.pem。

4. 升级为 443 加密并强制重定向 拿到证书后,再次修改 /etc/nginx/conf.d/originspace.conf,挂载证书并将 80 端口的 HTTP 流量强制跳转到 HTTPS:

Nginx

# HTTP 强制跳转 HTTPS
server {
    listen 80;
    server_name originspace.work;
    
    # 依然保留验证路由,以便后续自动续期
    location /.well-known/acme-challenge/ {
        root /usr/share/nginx/html/certbot;
    }
    
    location / {
        return 301 https://$host$request_uri;
    }
}

# HTTPS 核心业务反向代理
server {
    listen 443 ssl http2;
    server_name originspace.work;

    ssl_certificate /etc/letsencrypt/live/originspace.work/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/originspace.work/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;

    location / {
        proxy_pass http://127.0.0.1:8090;
        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;
    }
}

再次执行 nginx -s reload,业务彻底完成手动 HTTPS 改造。

5. 编写 Crontab 配置证书自动续期 手动将续期任务写入系统的计划任务:

Bash

crontab -e

添加一行:0 2 1 * * /usr/bin/certbot renew --quiet && systemctl reload nginx (每月 1 号凌晨 2 点自动检查续期,并重载 Nginx 刷新证书内存)。