Nginx SSL证书部署:从申请到HTTPS访问的完整操作步骤
给 Nginx 配置 SSL 证书,本质上就是两件事:把证书文件放到服务器上,然后在 Nginx 配置里指向这两个文件并监听 443 端口。
下面按零基础能照做的顺序,把准备条件、配置片段、强制跳转、排错和验证讲清楚。
开始之前需要准备什么
先确认两件事:你的服务器已经装好 Nginx,并且域名已经解析到这台服务器。
可以用下面两条命令快速确认。
nginx -v
dig +short your-domain.com
nginx -v 能看到版本号说明 Nginx 已安装;dig 返回的 IP 要和服务器公网 IP 一致,否则证书配置好了也访问不到。
证书方面,你需要拿到两个文件,不同服务商命名可能略有差异,但作用固定:
- 证书文件(公钥),常见名如
your-domain.com.pem或fullchain.pem - 私钥文件,常见名如
your-domain.com.key
建议统一放到 /etc/nginx/ssl/ 目录,权限收紧:
sudo mkdir -p /etc/nginx/ssl
sudo chmod 700 /etc/nginx/ssl
sudo chmod 600 /etc/nginx/ssl/your-domain.com.key
私钥文件权限设为 600,只有 root 可读,避免泄露。
把证书接入 Nginx 配置
找到你的站点配置文件,通常在 /etc/nginx/conf.d/ 或 /etc/nginx/sites-available/ 下。
用编辑器打开后,写一个监听 443 的 server 块:
server {
listen 443 ssl;
server_name your-domain.com www.your-domain.com;
ssl_certificate /etc/nginx/ssl/your-domain.com.pem;
ssl_certificate_key /etc/nginx/ssl/your-domain.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
root /var/www/your-site;
index index.html index.php;
}
几个关键点:ssl_certificate 指向证书文件,ssl_certificate_key 指向私钥;ssl_protocols 建议只保留 TLSv1.2 和 TLSv1.3,
旧协议存在已知安全问题。
改完先做语法检查,再重载,不要直接 restart:
sudo nginx -t
sudo systemctl reload nginx
nginx -t 输出 syntax is ok 和 test is successful 才算通过。
如果报错,优先看提示的文件名和行号,多半是路径写错或少了分号。
让 HTTP 自动跳转到 HTTPS
配好 443 之后,用户用 http 访问仍然不会自动加密。
再加一个 80 端口的 server 块做跳转:
server {
listen 80;
server_name your-domain.com www.your-domain.com;
return 301 https://$host$request_uri;
}
用 return 301 比 rewrite 更直接,也更省资源。
重载后访问 http://your-domain.com,浏览器地址栏应自动变成 https://。
高频报错怎么排查
配置过程中最常遇到这几类问题,按现象对号入座。
- 浏览器提示“证书链不完整”:说明只配了站点证书,没带中间证书。解决办法是使用服务商提供的
fullchain文件,或把中间证书内容拼接到站点证书后面。 - 访问超时或连接被拒绝:先确认 443 端口在防火墙和安全组里都已放行。
sudo ufw status或云控制台安全组规则都要检查。 nginx -t报cannot load certificate:检查证书路径是否写错、文件是否存在、私钥权限是否被改成了其他人不可读之外的状态。- 浏览器仍显示“不安全”:确认访问的域名和证书里的域名完全一致,
www和裸域是否都包含在证书里。
每次改完配置,固定走一遍“nginx -t → reload → 浏览器无痕窗口访问”的流程,能省掉很多来回折腾。
怎么确认部署真的生效了
配置重载后,用命令和浏览器各验证一次。
curl -I https://your-domain.com
返回 HTTP/2 200 或 HTTP/1.1 200,且没有证书相关警告,说明握手正常。
再用浏览器打开,点击地址栏的锁图标,查看证书颁发者和有效期,确认域名匹配。
如果还想检查协议和加密套件,可以用在线 SSL 检测工具输入域名,重点看是否支持 TLSv1.2 以上、是否启用了不安全套件。
检测结果只作为参考,最终以浏览器实际访问和 curl 返回为准。
证书有有效期,到期前需要替换文件并重载 Nginx。
建议在日历里设置到期前提醒,或者用 certbot 这类工具配置自动续期,避免证书过期导致站点无法访问。
几个容易忽略的细节
同一台服务器上如果有多个站点,每个 server 块都要单独配置证书和 server_name,不要共用一份配置。
如果使用了 CDN 或反向代理,证书可能需要在 CDN 侧也配置一份,源站和 CDN 的证书是两回事,只配一边可能出现“部分环境正常、部分环境报错”的情况。
修改配置前先备份原文件,例如 cp your-site.conf your-site.conf.bak,出问题能快速回滚,比现场重写要稳妥得多。