脱离 NPM 图形界面,直接手写 Nginx 配置文件,正是深入理解反向代理底层逻辑的必经之路。NPM 的本质,其实就是一个帮你自动生成并重载 nginx.conf 文件的后台面板。

如果不使用 NPM,纯手工实现你的 originspace.work 博客反向代理,你需要自己管理容器编排、Nginx 配置文件以及SSL 证书。

具体操作可以拆解为以下三个核心步骤:

1. 替换 Docker Compose 里的接入层

你需要把 NPM 容器替换为官方原生的 Nginx 容器。新建一个 /opt/nginx/docker-compose.yml:

YAML

version: '3.8'

services:
  nginx:
    image: nginx:alpine
    container_name: nginx
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      # 核心:手动将宿主机写好的配置文件映射到容器内覆盖默认配置
      - ./conf.d:/etc/nginx/conf.d 
      # 手动挂载证书目录
      - ./ssl:/etc/nginx/ssl
    networks:
      - default

networks:
  default:
    name: web-net
    external: true

2. 手写核心的 Nginx 配置文件

在宿主机新建 /opt/nginx/conf.d/halo.conf 文件,这段代码就是 NPM 面板背后真正在跑的东西:

Nginx

# 第一部分:监听 80 端口,强制将所有 HTTP 流量 301 重定向到 HTTPS
server {
    listen 80;
    server_name originspace.work;
    return 301 https://$host$request_uri;
}

# 第二部分:监听 443 端口,处理 SSL 加密与反向代理
server {
    listen 443 ssl http2;
    server_name originspace.work;

    # 声明 SSL 证书物理路径(对应 Compose 挂载的目录)
    ssl_certificate /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;

    # 现代 SSL 安全配置(NPM 也是默认生成这套密码套件)
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;

    # 核心转发逻辑
    location / {
        # 直接通过内部自定义网络 web-net 找到 halo 容器的 8090 端口
        proxy_pass http://halo:8090; 
        
        # 必须携带的重要请求头,否则 Halo 后台拿不到访客真实 IP
        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;
        
        # 开启 WebSocket 支持(对应 NPM 面板里勾选的 Websockets Support)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

3. 手动申请与管理 SSL 证书

没有了 NPM 面板的“一键申请”,你需要自己在宿主机使用 Certbot 或 acme.sh 等命令行工具来签发证书。

例如使用 Certbot 申请:

Bash

# 安装 certbot
yum install epel-release -y && yum install certbot -y

# 申请独立证书(需确保 80 端口未被占用)
certbot certonly --standalone -d originspace.work -m 你的邮箱@xx.com --agree-tos

申请成功后,Certbot 会把 fullchain.pem 和 privkey.pem 生成在 /etc/letsencrypt/live/originspace.work/ 目录下。你只需把它们拷贝到 /opt/nginx/ssl/ 目录中,然后执行 docker compose restart nginx,绿锁就配置完成了。