Nginx SSL 反向代理配置(443 → 本机 8080)

发布于 2026年09月22日

先澄清一个端口问题

Nginx 不能同时监听 8080 又转发到 8080(端口冲突)。常见做法是:

Nginx 监听 443(HTTPS + SSL 证书)→ 转发到本机 8080 服务

配置文件

Debian/Ubuntu 系统

创建 /etc/nginx/sites-available/myproxy.conf:

# HTTP 自动跳转 HTTPS
server {
    listen 80;
    listen [::]:80;
    server_name u.177857.xyz;          # 改成你的域名
​
    return 301 https://$host$request_uri;
}
​
# HTTPS 反向代理
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;                          # Nginx >= 1.25.1;旧版本用 listen 443 ssl http2;
    server_name u.177857.xyz;           # 改成你的域名
​
    # SSL 证书路径(Let's Encrypt 示例,按实际路径修改)
    ssl_certificate     /etc/ssl/_.177857.xyz.pem;
    ssl_certificate_key /etc/ssl/_.177857.xyz.key;
​
    # SSL 安全配置
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_ciphers         HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 10m;
​
    # 反向代理到本机 8080
    location / {
        proxy_pass http://127.0.0.1:8080;
​
        # 传递真实客户端信息
        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 支持(可选,不需要可删除)
        proxy_http_version 1.1;
        proxy_set_header Upgrade    $http_upgrade;
        proxy_set_header Connection "upgrade";
​
        # 超时设置(按需调整)
        proxy_connect_timeout 60s;
        proxy_send_timeout    60s;
        proxy_read_timeout    60s;
    }
}

启用配置:

sudo ln -s /etc/nginx/sites-available/myproxy.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

CentOS/RHEL 系统

直接创建 /etc/nginx/conf.d/myproxy.conf,内容同上,然后:

sudo nginx -t && sudo systemctl reload nginx

关键点说明

配置项

作用

proxy_pass http://127.0.0.1:8080

转发到本机 8080 服务

proxy_set_header Host $host

让后端知道原始域名

X-Forwarded-For

传递客户端真实 IP

X-Forwarded-Proto $scheme

告诉后端原始请求是 HTTPS(很多框架需要)

Upgrade / Connection

WebSocket 升级支持

常见问题

1. CentOS 上报 502(SELinux 拦截)

sudo setsebool -P httpd_can_network_connect 1

2. 防火墙放行 443

# Ubuntu
sudo ufw allow 443/tcp
​
# CentOS
sudo firewall-cmd --permanent --add-service=https && sudo firewall-cmd --reload

3. 还没有 SSL 证书? 用 Let's Encrypt 免费申请:

sudo apt install certbot python3-certbot-nginx   # Debian/Ubuntu
sudo certbot --nginx -d u.177857.xyz

报错:cannot load certificate

2026/09/22 10:09:21 [emerg] 449116#449116: cannot load certificate "/etc/ssl/_.177857.xyz.pem": BIO_new_file() failed (SSL: error:80000002:system library::No such file or directory:calling fopen(/etc/ssl/_.177857.xyz.pem, r) error:10000080:BIO routines::no such file)
nginx: configuration file /etc/nginx/nginx.conf test failed

问题已经定位了。你 Nginx 配置里写的证书文件名是 _.177857.xyz.pem,但实际目录里并没有这个文件。

通过 ll /etc/ssl 命令的输出可以看到,你的证书文件是分开存放的,并且文件名里包含了括号,这很可能是导致问题的根源。

📂 文件分析

你当前目录下的证书文件如下:

  • c:这是你的域名证书。

  • _.177857.xyz.key:这是你的私钥。

  • '_.177857.xyz (intermedia).pem':这是中间证书。

  • '_.177857.xyz (server).pem':这是服务器证书。

Nginx 的 ssl_certificate 指令需要一个包含域名证书和中间证书的完整证书链文件。

🛠️ 解决方案

你需要将域名证书和中间证书合并成一个文件,并在 Nginx 配置中引用它。

检查 .crt 是否已包含完整证书链

grep -c "BEGIN CERTIFICATE" _.177857.xyz.crt
  • 输出 1 → 只有服务器证书,需要手动合并

  • 输出 2 或更多 → 已含完整链,直接用 _.177857.xyz.crt

1. 合并证书文件(仅当上一步输出为 1 时)

顺序必须是 服务器证书在前,中间证书在后。

在终端执行以下命令,将 .crt 文件和 (intermedia).pem 文件合并成一个新的 .pem 文件。

注意:因为文件名里有空格和括号,所以必须用单引号 ' 把文件名括起来。

cat '/etc/ssl/_.177857.xyz (intermedia).pem' /etc/ssl/_.177857.xyz.crt > /etc/ssl/_.177857.xyz.pem

这个命令会创建一个新的 /etc/ssl/_.177857.xyz.pem 文件,它包含了完整的证书链。

2. 检查并修改 Nginx 配置

打开你的 Nginx 配置文件,确保 ssl_certificate 和 ssl_certificate_key 指向正确的文件。

nano /etc/nginx/conf.d/u.177857.xyz.conf

配置应该修改为:

# 指向我们刚刚合并生成的完整证书链文件
ssl_certificate /etc/ssl/_.177857.xyz.pem;

# 指向你的私钥文件
ssl_certificate_key /etc/ssl/_.177857.xyz.key;

3. 再次测试配置

保存修改后,重新测试 Nginx 配置:

nginx -t

如果一切顺利,你应该会看到 test is successful 的提示。


💡 小提示 文件名里带空格和括号在命令行操作时非常容易出错。为了以后方便管理,建议你把证书文件重命名为不带特殊字符的名字,例如 177857.xyz_bundle.pem 和 177857.xyz.key。

验证

curl -I https://u.177857.xyz

返回后端服务的响应头即配置成功。


下一篇 链接

评论