Windows 上用 Nginx 做 HTTPS 反向代理
Windows 上用 Nginx 做 HTTPS 反向代理
场景:一个只监听 HTTP 的内部服务(这里以 Jenkins 为例),想在前面套一层 Nginx 做 HTTPS,让外部走 443 加密访问,后端继续跑明文 HTTP。
准备证书
需要一张带完整证书链的证书——服务器证书 + 中间证书 + 根证书拼成一个文件。自签或找内部 CA 签都行,关键是链要完整,否则后面 SSL 握手会出问题(见末尾排查)。
只让本机访问后端(可选)
为了不让别人绕过 Nginx 直接打后端的 HTTP 端口,可以把后端只绑到 127.0.0.1。以 Jenkins 为例,启动时限定监听地址:
java.exe -Xmx4096m -Xrs -DJENKINS_HOME=D:\Jenkins\.jenkins -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 -jar D:\Jenkins\jenkins.war --httpPort=8070 --httpListenAddress=127.0.0.1
--httpListenAddress=127.0.0.1 后端就只接受本机连接,外部只能从 Nginx 的 443 进来。
下载安装 Nginx
- 下载 Windows 版 Nginx
- 解压到比如
C:\nginx
把证书放到配置目录:
cd /d C:\nginx
mkdir .\conf\ssl
# 把证书文件拷到 .\conf\ssl
配置反向代理
编辑 C:\nginx\conf\nginx.conf,加一个 server 块:
server {
listen 443 ssl;
server_name your_domain.example.com; # 也可以写 IP
ssl_certificate ssl/server.pem; # 完整证书链(服务器证书 + 中间证书 + 根证书)
ssl_certificate_key ssl/server.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://localhost: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;
}
}
# 可选:把 HTTP 重定向到 HTTPS
server {
listen 80;
server_name your_domain.example.com;
return 301 https://$host$request_uri;
}
启动与控制
cd C:\nginx
start nginx
# 重载配置
nginx -s reload
# 停止
nginx -s quit
# 查端口占用
netstat -ano | findstr 80
# 按 PID 查进程
tasklist /FI "PID eq 1234"
启动成功后 C:\nginx\logs\nginx.pid 会存在。如果 nginx -s reload 报 CreateFile() "C:\nginx/logs/nginx.pid" failed (2),说明 Nginx 根本没起来——pid 文件不存在,先看 logs\error.log 找原因再 reload。
SSL 握手不通过的排查
最常见的故障是 SSL 验证不通过,客户端报类似 stream_socket_enable_crypto(): SSL operation failed ... OpenSSL Error messages、握手失败、"no response"。
几乎都是证书链不完整——Nginx 只配了服务器证书,没带中间证书。把完整链拼进 ssl_certificate 那个文件就好,这是个一次性配置问题,链完整就不会再犯。
如果一定要在请求方(比如一台 Rocky Linux)上手动信任证书(正常情况下服务端证书链完整就不需要):
sudo cp 2025cert.crt /etc/pki/ca-trust/source/anchors/
sudo cp 2025cert.pem /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust extract
openssl verify -CAfile /etc/pki/tls/certs/ca-bundle.crt 2025cert.crt