Nginx 支持 HTTPS 需满足三条件:SSL 模块已编译、证书路径正确且权限合规(私钥 chmod 600)、配置中用独立 server 块监听 443 并指定证书,同时建议 80 端口 301 跳转 HTTPS。

Linux 下让 Nginx 支持 HTTPS,核心不是“安装一个插件”,而是确保三件事到位:SSL 模块已编译进 Nginx 二进制、证书文件正确放置且权限合规、Nginx 配置中明确启用并指向证书。缺一不可,任一环节出错都会导致 nginx -t 报错或服务启动失败。
确认 Nginx 已编译 SSL 模块
Nginx 默认不保证自带 --with-http_ssl_module,尤其是源码编译安装或某些精简版包。没这个模块,ssl_certificate 这类指令直接被识别为非法指令。
- 执行
nginx -V 2>&1 | grep -o with-http_ssl_module,有输出说明已启用 - 若无输出,需重新编译:进入源码目录,运行
./configure --prefix=/usr/local/nginx --with-http_ssl_module,再make,最后用objs/nginx覆盖原二进制文件(不要make install) - 覆盖后再次运行
nginx -V验证,确认参数中出现该模块
上传并设置证书文件权限
证书不能随便放,路径要绝对、属主要对、私钥必须严格保护——Nginx 进程(如 nginx 或 www-data 用户)需要能读取证书,但私钥绝不能被其他用户读取。
- 推荐存放路径:
/etc/nginx/ssl/example.com.crt和/etc/nginx/ssl/example.com.key - 创建目录:
sudo mkdir -p /etc/nginx/ssl - 上传后立即设权限:
sudo chmod 600 /etc/nginx/ssl/*.key - 确保属主正确:
sudo chown nginx:nginx /etc/nginx/ssl/*.key(根据实际运行用户调整)
配置独立的 HTTPS server 块
HTTPS 必须使用单独的 server 块监听 443 端口,不能和 HTTP 的 80 端口混在一个块里。同时要禁用老旧协议,启用现代加密套件。
- 在站点配置文件(如
/etc/nginx/conf.d/default.conf)中添加: server { listen 443 ssl http2; server_name example.com; ssl_certificate /etc/nginx/ssl/example.com.crt; ssl_certificate_key /etc/nginx/ssl/example.com.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256; }- 注意:不要写
ssl on;(Nginx 1.15+ 已废弃),靠listen 443 ssl触发
强制 HTTP 跳转 HTTPS(可选但强烈建议)
只配 443 不够,用户仍可能手动输 http://。加一个纯 80 端口的 server 块做 301 重定向,实现全站安全升级。
- 在同一配置文件中追加:
server { listen 80; server_name example.com; return 301 https://$host$request_uri; }- 避免用
rewrite,return 301更高效、更清晰 - 确保防火墙开放 443 端口:
sudo firewall-cmd --permanent --add-port=443/tcp && sudo firewall-cmd --reload


















