Nginx 配置 HTTPS 及添加服务器证书详解
Nginx 配置 HTTPS 及添加服务器证书详解
一、原理概述
HTTPS(HyperText Transfer Protocol Secure)是 HTTP 的安全版本,通过 SSL/TLS 协议对数据进行加密传输,同时验证服务器身份。配置 HTTPS 需要服务器证书(包含公钥)和私钥,Nginx 通过加载这些文件,启用 SSL 模块,实现加密通信。
二、具体操作步骤
1. 准备服务器证书
获取服务器证书文件(通常为.pem或.crt)和私钥文件(.key)。将这两个文件复制到 Nginx 安装目录下的conf目录(如/usr/local/nginx/conf)。
2. 编辑 Nginx 配置文件
以下是Linux系统配置,windows系统同理
打开 Nginx 配置文件nginx.conf(路径可能因安装方式而异):
bash
vi /usr/local/nginx/conf/nginx.conf
找到或添加HTTPS server块。假设原配置有 HTTP 的 80 端口,新增或修改为:
nginx
server {
listen 443 ssl;
server_name www.yourdomain.com; # 替换为你的域名
ssl on;
ssl_certificate server.pem; # 证书文件路径
ssl_certificate_key server.key; # 私钥文件路径
ssl_session_timeout 5m;
# 配置SSL协议版本(根据OpenSSL版本选择)
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 若OpenSSL版本低,使用TLSv1
# 配置加密套件
ssl_ciphers HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
- listen 443 ssl:监听 443 端口并启用 SSL。
- server_name:替换为你的域名。
- ssl_certificate和ssl_certificate_key:确保路径正确,放入conf同级目录下
3. 检查配置并重启 Nginx
检查配置语法:
bash
/usr/local/nginx/sbin/nginx -t
若提示configuration is correct,重启 Nginx:
bash
/usr/local/nginx/sbin/nginx -s reload
4. 测试访问
通过https://你的域名访问,检查是否成功加载 HTTPS 页面,浏览器应显示安全连接(锁图标)。
三、注意事项
定期备份证书和配置文件。
确保 Nginx 编译时包含--with-http_ssl_module模块(一般默认包含)。
根据服务器环境调整ssl_protocols和ssl_ciphers,确保安全性和兼容性。
四、具体项目
4.1 项目环境
生产环境ip 192.16.1.116:1005 app 192.16.1.116:1055
测试环境 192.16.1.118:1005 app 192.16.1.118:1055
前置机 外网ip
host文件映射域名
127.0.0.1 xxx.xxx.com
前置机nginx.conf
#PC
server {
listen 1005 ssl http2; #监听 1005 端口,同时启用 SSL 加密和 HTTP/2 协议
server_name localhost; #设置服务器名称为 localhost
ssl_certificate //.pem; #添加证书路径 conf目录下文件名称
ssl_certificate_key //.key; #添加密钥路径 conf目录下文件名称
ssl_session_cache shared:SSL:30m; #设置 SSL 会话缓存,共享缓存区名为 SSL,大小为 30m,用于提高 SSL 会话恢复效率。
ssl_session_timeout 60m; #设置 SSL 会话超时时间为 60 分钟
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!3DES:!DES; #配置允许使用的加密套件,确保数据传输的加密强度和兼容性。
ssl_protocols TLSv1.2 TLSv1.3; #启用 TLSv1.2 和 TLSv1.3 协议版本,提升安全性
ssl_prefer_server_ciphers on; #优先使用服务器端配置的加密套件
location / {
proxy_pass http://192.16.1.116:1005/; #将根路径的请求代理到 http://192.16.1.116:1005/ 后端服务器
}
}
#app server
server {
listen 1055 ssl http2;
server_name localhost;
ssl_certificate //.pem; #添加证书路径
ssl_certificate_key //.key; #添加密钥路径
ssl_session_cache shared:SSL:30m;
ssl_session_timeout 60m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!3DES:!DES;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
location /bjyqtest/ {
proxy_pass http://192.16.1.118:1055/; 将 /bjyqtest/ 路径的请求代理到 http://192.16.1.118:1055/ 后端服务器。
}
location /bjyq/ {
proxy_pass http://192.16.1.116:1055/; 将 /bjyq/ 路径的请求代理到 http://192.16.1.116:1055/ 后端服务器。
}
location / {
proxy_pass http://192.16.1.116:1055/; 将根路径的请求代理到 http://192.16.1.118:1055/ 后端服务器
}
}
4.2 具体流程
4.2.1网址与 Nginx 配置的对应关系
1. 域名与端口匹配
域名:xxx.xxx.com
对应 Nginx 配置中的 server_name,server_name这个属性一般跟证书配套,也可以不配置,(多个域名用一个端口的时候才需要配置)
端口:1055
对应 server 块中的 listen 1055 ssl http2;,表示通过 HTTPS(SSL/TLS 加密)和 HTTP/2 协议监听 1055 端口。
2. 路径匹配与代理逻辑
请求路径:/bjyqtest/html/common/login.html
前缀 /bjyqtest/ 会触发 Nginx 配置中的 location /bjyqtest/ { ... } 块。
根据配置 proxy_pass http://192.16.1.118:1055/ ; nginx 会将请求转发到后端服务器 192.16.1.118:1055,并保留原始路径 html/common/login.html,最终请求为http://192.16.1.118:1055/html/common/login.html。
4.2.2访问流程原理
1.客户端发起请求:
浏览器输入https://xxx.xxx.com:1055/bjyq/html/common/login.html 请求通过https协议发送到前置机的 1055 端口。
Nginx 域名与端口匹配:
Nginx 找到 server_name xxx.xxx.com 且 listen 1055 ssl 的 server 块,确认使用 HTTPS 处理请求,并验证客户端证书(若配置了双向认证)或服务器证书(单向认证,即当前场景)。
2.路径匹配与代理转发:
路径 /bjyq/... 匹配 location /bjyq/ 块,Nginx 去除前缀 /bjyq/,将剩余路径 html/common/login.html 拼接至 proxy_pass 地址后,转发到 192.16.1.116:1055/html/common/login.html。
后端服务器响应:
生产环境服务器(192.16.1.116:1055)返回登录页面 login.html,经 Nginx 转发回客户端,浏览器渲染页面。
4.2.3 配置注意事项
1.证书必须与域名匹配:
证书文件(cert.pem)必须包含 xxx.xxx.com 域名(可为通配符证书或多域名证书),否则浏览器会提示证书错误(如 “不安全”)。
2.端口与防火墙设置:
确保前置机的 7055 端口已开放(通过 firewall-cmd 或 ufw 等工具配置),且后端服务器(192.16.1.116:1055)可正常访问。
4.2.4验证配置正确性
检查 Nginx 语法:
bash
nginx -t # 确保配置无语法错误
重启 Nginx:
bash
nginx -s reload # 使配置生效 热加载
浏览器访问测试:
输入网址后,浏览器应显示安全锁图标(HTTPS 生效)。
开发者工具(F12)的 Network 面板中,请求协议应为 https,状态码 200(成功响应)。
通过以上配置,Nginx 作为前置代理服务器,将外部 HTTPS 请求安全地转发到内部生产环境服务器,实现了通过域名访问特定路径下的登录页面。
4.2.5 流程
大致流程 - 主要描述小程序(外网)

1.访问域名
- 生产环境:
PC:https://xxx.xxx.com:1005/ 内网
app:https://xxx.xxx.com:1055/html/common/login.html#
https://xxx.xxx.com:1055/bjyq/html/common/login.html# - 测试环境:
PC:无域名
app:https://xxx.xxx.com:1055/bjyqtest/html/common/login.html#
2.DNS 解析
(指向 WAF 公网 IP)
3.建立 HTTPS 连接
(验证 WAF 的 SSL 证书)
4.WAF 接收请求
- 检查域名: xxx.xxx.com
- 验证 SSL 证书
- 应用安全策略 (如防 SQL 注入、XSS)
5. 转发请求到前置机
- 目标: xxx.xxx.xxx.xxx:1055 前置机公网ip
- 保留或添加头部信息
(如 X-Forwarded-For: 客户端真实 IP)
6. 前置机接收 WAF 转发的请求
- 提取真实 IP (通过 X-Forwarded-For)
- 路径匹配 (如 /bjyq/)
7. 转发请求到后端服务器
- 目标: 192.16.1.116:1055
- 传递原始请求头 + 自定义头
(如 X-Real-IP, X-Forwarded-For)
8. 后端服务器处理请求
- 通过 X-Real-IP 获取客户端真实 IP
- 生成响应内容 (如 login.html)
9. 响应返回给前置机
10. WAF 接收前置机响应
- 检查响应安全性
11. 前置机响应转发到 WAF
12. 客户端接收响应
- 验证 SSL 证书
- 渲染页面内容

浙公网安备 33010602011771号