Nginx启用HTTPS需四步:确认已编译http_ssl_module模块;获取并放置有效证书(如Let’s Encrypt或自签名);配置443端口server块,指定证书路径及TLSv1.2+、强加密套件;添加80端口301跳转及HSTS头增强安全。

要在 Nginx 中启用 HTTPS,核心是加载 SSL/TLS 证书、启用 SSL 模块,并正确监听 443 端口。整个过程不复杂但容易忽略几个关键点,比如模块是否已编译、证书路径是否可读、HTTP 是否自动跳转 HTTPS。
确认 Nginx 已编译 SSL 模块
Nginx 默认安装可能不含 http_ssl_module。运行以下命令检查:
nginx -V 2>&1 | grep -o with-http_ssl_module
若无输出,说明未启用该模块,需重新编译:
- 下载对应版本的 Nginx 源码
- 执行:
./configure --prefix=/usr/local/nginx --with-http_ssl_module - 运行
make(不要直接make install,避免覆盖配置) - 用
objs/nginx替换原二进制文件,再验证模块是否存在
获取并放置证书文件
生产环境推荐使用 Let’s Encrypt 或云厂商(如阿里云、腾讯云)签发的免费证书;开发测试可用 OpenSSL 自签:
openssl req -x509 -newkey rsa:2048 -keyout example.com.key -out example.com.crt -nodes -days 365
将生成的 .crt(或 .pem)和 .key 文件放到 Nginx 可读目录,例如:
/usr/local/nginx/conf/cert/example.com.crt/usr/local/nginx/conf/cert/example.com.key
确保权限合理(私钥建议 600,Nginx 主进程能读取即可)。
修改 nginx.conf 启用 HTTPS server 块
在 http 块内添加或修改一个 server 配置,监听 443 端口:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /usr/local/nginx/conf/cert/example.com.crt;
ssl_certificate_key /usr/local/nginx/conf/cert/example.com.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
location / {
root html;
index index.html;
}
}
注意:
– ssl_protocols 推荐只启用 TLSv1.2 及以上,禁用已不安全的 TLSv1.0/1.1;
– ssl_ciphers 应避开弱算法(如 RC4、MD5、aNULL);
– 若使用 Let’s Encrypt,证书路径通常为 /etc/letsencrypt/live/example.com/fullchain.pem 和 privkey.pem。
强制 HTTP 跳转 HTTPS(可选但推荐)
避免用户手动输入 http://,应在 80 端口配置重定向:
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
这样所有 HTTP 请求都会 301 永久跳转到 HTTPS,提升安全性与 SEO 表现。
启用 HSTS 提升浏览器级防护
在 HTTPS 的 server 块中加入响应头:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
这会告诉浏览器未来一年内只允许通过 HTTPS 访问该域名及所有子域名,并支持提交至浏览器 HSTS 预加载列表。注意:启用前务必确保全站 HTTPS 稳定可用,否则可能导致子域名无法访问。


















