Nginx配置HTTPS证书,http自动跳转https
前言
现在网站都要上 HTTPS,搜索引擎也更喜欢 HTTPS 的网站。本文讲一下 Nginx 怎么配置 HTTPS 证书,以及怎么把 HTTP 请求自动跳转到 HTTPS。
第一步:申请 SSL 证书
免费证书(Let's Encrypt)
用 certbot 自动申请:
# 安装 certbot
yum install certbot python3-certbot-nginx -y
# 自动申请并配置
certbot --nginx -d www.example.com -d example.com
certbot 会自动修改 Nginx 配置,不用手动改。
自己上传证书
如果是从阿里云、腾讯云申请的证书,下载 Nginx 版本的,一般有两个文件:
xxx.crt(证书文件)xxx.key(私钥文件)
上传到服务器:
mkdir -p /etc/nginx/ssl
把两个文件传到 /etc/nginx/ssl/ 目录下。
第二步:Nginx 配置 HTTPS
编辑 Nginx 配置文件:
vi /etc/nginx/conf.d/example.conf
配置内容:
server {
listen 443 ssl http2;
server_name www.example.com example.com;
# 证书路径
ssl_certificate /etc/nginx/ssl/xxx.crt;
ssl_certificate_key /etc/nginx/ssl/xxx.key;
# SSL 优化配置
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# 网站根目录
root /var/www/html;
index index.html index.php;
location / {
try_files $uri $uri/ =404;
}
}
第三步:HTTP 自动跳转 HTTPS
在同一个配置文件里,加一个 80 端口的 server:
# HTTP 跳转 HTTPS
server {
listen 80;
server_name www.example.com example.com;
return 301 https://$host$request_uri;
}
这样访问 http://www.example.com 就会自动跳转到 https://www.example.com。
第四步:检查配置并重载
检查 Nginx 配置有没有语法错误:
nginx -t
没问题就重载:
nginx -s reload
完整配置示例
# HTTP 跳转 HTTPS
server {
listen 80;
server_name www.example.com example.com;
return 301 https://$host$request_uri;
}
# HTTPS 配置
server {
listen 443 ssl http2;
server_name www.example.com example.com;
ssl_certificate /etc/nginx/ssl/xxx.crt;
ssl_certificate_key /etc/nginx/ssl/xxx.key;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
root /var/www/html;
index index.html index.php;
location / {
try_files $uri $uri/ =404;
}
}
常见坑
坑1:证书文件路径不对
配置里写的证书路径和实际路径不一致,Nginx 启动报错。
解决: 确认证书文件确实在配置写的那个位置。
坑2:443 端口没开放
配置了 HTTPS 但访问不了。
原因: 防火墙没开 443 端口。
解决:
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
坑3:跳转死循环
HTTP 跳 HTTPS 后又跳回 HTTP,无限循环。
原因: 用了 CDN 或者负载均衡,后端以为还是 HTTP。
解决: Nginx 配置里加:
set $flag 0;
if ($http_x_forwarded_proto = 'http') {
set $flag 1;
}
if ($flag = 1) {
return 301 https://$host$request_uri;
}
坑4:证书过期了
HTTPS 证书一般一年有效期,忘了续签就会过期。
解决: 用 certbot 的话自动续签:
certbot renew
加个定时任务自动续签:
0 3 1 * * certbot renew --quiet
总结
| 步骤 | 命令/操作 |
|---|---|
| 申请证书 | certbot --nginx -d 域名 |
| 配置 HTTPS | 写 443 端口的 server 块 |
| HTTP 跳转 | return 301 https://$host$request_uri |
| 检查配置 | nginx -t |
| 重载 | nginx -s reload |
| 开防火墙 | firewall-cmd --permanent --add-service=https |
提醒: HTTPS 证书要定期续签,别等过期了才想起。
遇到问题加QQ23979811 协助处理