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_modulemake(别 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 块里,混在一起会直接报错。
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;listen 80;server_name your-domain.com;return 301 https://$server_name$request_uri;(比 rewrite 更简洁可靠)server 块里同时写 listen 80 和 ssl_certificate,Nginx 会拒绝加载验证并重载服务
改完配置不是直接重启,得先验证再平滑生效。
sudo nginx -t 检查语法是否正确sudo nginx -s reload 重载配置sudo ss -tlnp | grep :443
sudo ufw allow 443 或 sudo firewall-cmd --permanent --add-port=443/tcp)https://your-domain.com,看是否锁图标正常,无证书警告不复杂但容易忽略