nginx反向代理node.js实现全站https的核心是nginx终止tls连接,node保持http(如localhost:3000),通过80端口301跳转https、443端口配置ssl证书及proxy_pass反代,并设置hsts与关键请求头。

要让 Nginx 反向代理 Node.js 应用(如 Express、NestJS、Next.js 等)支持全站 HTTPS,核心不是给 Node 本身配 SSL,而是由 Nginx 统一终止 TLS 连接——即 Node 仍跑在 HTTP(如 localhost:3000),所有加密解密、证书验证、重定向均由 Nginx 完成。这种方式性能高、配置清晰、符合生产实践。
确认 Nginx 已启用 SSL 模块
Nginx 必须编译时带 --with-http_ssl_module,否则会报 unknown directive "ssl_certificate" 错误。
- 运行
/usr/local/nginx/sbin/nginx -V 2>&1 | grep -i ssl(路径按实际调整) - 若输出中含
--with-http_ssl_module,模块已就绪;否则需重新编译安装 - 常见路径:Ubuntu/Debian 用
apt install nginx-full默认包含该模块;CentOS/RHEL 用yum install nginx-mod-http-ssl
准备并放置证书文件
推荐使用 Let’s Encrypt 免费证书(通过 Certbot 自动获取),或从腾讯云、阿里云下载 Nginx 类型证书包。
- 将
fullchain.pem(或your_domain.crt)和privkey.pem(或your_domain.key)上传至服务器,例如:/etc/nginx/ssl/example.com/ - 设置严格权限:
sudo chmod 600 /etc/nginx/ssl/example.com/privkey.pem - 确保 Nginx 主进程用户(如
www-data或nginx)可读证书:sudo chown root:www-data /etc/nginx/ssl/example.com/*.pem
配置 Nginx 反向代理 + HTTPS 全站强制跳转
编辑站点配置文件(如 /etc/nginx/sites-available/example.com 或 /etc/nginx/conf.d/example.com.conf),写入两个 server 块:
-
HTTP → HTTPS 301 跳转(80端口):
server {<br> listen 80;<br> server_name example.com www.example.com;<br> return 301 https://$host$request_uri;<br>} -
HTTPS 服务(443端口)+ 反代 Node:
server {<br> listen 443 ssl http2;<br> server_name example.com www.example.com;<br> ssl_certificate /etc/nginx/ssl/example.com/fullchain.pem;<br> ssl_certificate_key /etc/nginx/ssl/example.com/privkey.pem;<br> ssl_protocols TLSv1.2 TLSv1.3;<br> ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;<br> add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;<br><br> location / {<br> proxy_pass http://127.0.0.1:3000;<br> proxy_http_version 1.1;<br> proxy_set_header Upgrade $http_upgrade;<br> proxy_set_header Connection 'upgrade';<br> proxy_set_header Host $host;<br> proxy_set_header X-Real-IP $remote_addr;<br> proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<br> proxy_set_header X-Forwarded-Proto $scheme;<br> }<br>}
验证与启用
每步修改后务必执行检查,避免配置错误导致服务中断:
- 语法检测:
sudo nginx -t(必须显示success) - 重载配置:
sudo nginx -s reload(不中断已有连接) - 测试访问:
curl -I http://example.com应返回301 Moved Permanently;curl -I https://example.com应返回200 OK且含strict-transport-security头 - 浏览器打开
https://example.com,地址栏显示锁图标,无证书警告











