nginx 配置 https 需满足三要素:编译时启用 --with-http_ssl_module 模块、证书与私钥路径正确且权限合规(私钥600)、http 与 https 分属独立 server 块并正确监听端口。

Nginx 要跑 HTTPS,核心就三件事:模块得有、证书得对、配置得准。缺一不可,卡住的往往不是步骤多,而是某个细节没到位。
确认 Nginx 已编译 SSL 模块
Nginx 本身不自带 HTTPS 支持,必须编译时加 --with-http_ssl_module 才能识别 ssl_certificate 这类指令。
- 运行
nginx -V 2>&1 | grep -o with-http_ssl_module - 有输出说明模块已启用;没输出,后续所有配置都会失败,
nginx -t直接报unknown directive "ssl_certificate" - 若缺失,需回到源码目录重新编译:
-
./configure --prefix=/usr/local/nginx --with-http_ssl_module -
make(别make install,避免覆盖配置) -
cp objs/nginx /usr/local/nginx/sbin/
-
- 注意:系统缺少
openssl-devel(CentOS)或libssl-dev(Ubuntu)会导致 configure 静默跳过 SSL 模块,务必提前装好
上传并设置证书文件权限
证书和私钥必须放对位置、设对权限,否则 Nginx 启动失败或拒绝读取。
- 推荐路径:
/etc/nginx/ssl/(创建命令:sudo mkdir -p /etc/nginx/ssl) - 把
.crt(或.pem)和.key文件上传至此目录 - 私钥权限必须是
600:sudo chmod 600 /etc/nginx/ssl/your_domain.key - 证书文件权限建议
644,但关键是私钥不能被组或其他人读取 - 路径必须写绝对路径,不能用
~/或相对路径,Nginx 不解析 shell 符号 - 私钥不能加密(即生成时没设密码),如有,用
openssl rsa -in server.key.org -out server.key去密
配置独立的 HTTP 和 HTTPS server 块
HTTP 和 HTTPS 必须分开写在两个独立的 server 块里,混在一起会直接报错。
-
HTTPS server(监听 443):
-
listen 443 ssl http2;(ssl关键字不可少) -
server_name your-domain.com; -
ssl_certificate /etc/nginx/ssl/your-domain.com.crt; -
ssl_certificate_key /etc/nginx/ssl/your-domain.com.key;
-
-
HTTP server(监听 80,仅用于跳转):
-
listen 80; -
server_name your-domain.com; -
return 301 https://$server_name$request_uri;(比rewrite更简洁可靠)
-
- 不要在一个
server块里同时写listen 80和ssl_certificate,Nginx 会拒绝加载
验证并重载服务
改完配置不是直接重启,得先验证再平滑生效。
- 运行
sudo nginx -t检查语法是否正确 - 若提示 success,执行
sudo nginx -s reload重载配置 - 检查 443 端口是否监听:
sudo ss -tlnp | grep :443 - 确保防火墙放行 443(如
sudo ufw allow 443或sudo firewall-cmd --permanent --add-port=443/tcp) - 浏览器访问
https://your-domain.com,看是否锁图标正常,无证书警告
不复杂但容易忽略











