
Nginx配置带SSL认证的转发方式 (HTTPS请求)
在现代Web架构中,使用Nginx作为反向代理处理HTTPS请求并转发至后端服务是极其常见的做法。这种方式不仅能实现SSL卸载,减轻后端服务的加解密负担,还能通过统一的入口保障通信安全。本文将详细介绍Nginx配置SSL认证及HTTPS转发的常见场景与实战配置。
场景一:Nginx开启HTTPS,转发至后端HTTP(SSL卸载)
这是最基础且应用最广的场景。客户端与Nginx之间通过HTTPS加密通信,Nginx解密后将普通的HTTP请求转发给内网后端服务,内网通信无需加密,提升性能。
server {
listen 443 ssl;
server_name www.ipipp.com;
# 指定SSL证书和私钥路径
ssl_certificate /etc/nginx/ssl/www.ipipp.com.pem;
ssl_certificate_key /etc/nginx/ssl/www.ipipp.com.key;
# SSL优化配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
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;
}
}场景二:Nginx开启HTTPS,转发至后端HTTPS(全链路加密)
如果后端服务本身也强制要求HTTPS访问,Nginx需要以HTTPS协议将请求转发至后端。此时需配置proxy_ssl相关参数。若后端使用的是自签名证书,通常需要配置proxy_ssl_verify off以跳过证书校验,避免Nginx因无法验证后端证书而报502错误。
server {
listen 443 ssl;
server_name www.ipipp.com;
ssl_certificate /etc/nginx/ssl/www.ipipp.com.pem;
ssl_certificate_key /etc/nginx/ssl/www.ipipp.com.key;
location / {
# 转发至后端HTTPS服务
proxy_pass https://192.168.1.100:8443;
# 跳过后端HTTPS证书校验(适用于自签名证书)
proxy_ssl_verify off;
# 指定与后端HTTPS握手使用的协议
proxy_ssl_protocols TLSv1.2 TLSv1.3;
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 https;
}
}场景三:Nginx与后端双向SSL认证(mTLS)
在零信任网络或高安全要求场景下,后端服务需要校验Nginx的身份,Nginx也需要向后端出示客户端证书。这就需要配置Nginx作为客户端与后端进行双向认证。
server {
listen 443 ssl;
server_name www.ipipp.com;
# Nginx服务端证书(给客户端浏览器看)
ssl_certificate /etc/nginx/ssl/server.pem;
ssl_certificate_key /etc/nginx/ssl/server.key;
location / {
proxy_pass https://192.168.1.100:8443;
# Nginx作为客户端,出示证书给后端服务验证
proxy_ssl_certificate /etc/nginx/ssl/client.pem;
proxy_ssl_certificate_key /etc/nginx/ssl/client.key;
# 信任后端服务的CA证书(严格验证后端身份)
proxy_ssl_trusted_certificate /etc/nginx/ssl/backend-ca.crt;
proxy_ssl_verify on;
proxy_ssl_verify_depth 2;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}配套优化:HTTP强制跳转HTTPS与WebSocket支持
为了保证所有请求都走加密通道,通常需要将80端口的HTTP请求301重定向至HTTPS。同时,如果后端是WebSocket服务,Nginx需要支持协议升级。
# HTTP强跳HTTPS
server {
listen 80;
server_name www.ipipp.com;
return 301 https://$host$request_uri;
}
# HTTPS主配置(含WebSocket支持)
server {
listen 443 ssl;
server_name www.ipipp.com;
ssl_certificate /etc/nginx/ssl/www.ipipp.com.pem;
ssl_certificate_key /etc/nginx/ssl/www.ipipp.com.key;
location / {
proxy_pass http://127.0.0.1:8080;
# WebSocket 核心支持
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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工作进程(通常为www-data或nginx用户)对证书和私钥文件有读取权限。
防火墙放行: 确保服务器安全组或本地防火墙放行了443端口。
配置检查: 修改配置后,务必执行
nginx -t检查语法,无误后再使用nginx -s reload平滑重载配置。后端获取真实IP: 转发至后端时,务必配置
X-Forwarded-Proto头,否则后端应用可能无法识别原始请求是HTTP还是HTTPS,从而导致无限重定向循环。