HTTPS已经不是可选项了——百度和Google都明确表示HTTPS是搜索排名的加分因素,Chrome浏览器对HTTP网站标记为"不安全"。但HTTPS迁移不是简单装个证书就完事,配置不当会导致混合内容警告、性能下降甚至收录丢失。本文将系统讲解SSL证书选择、Nginx HTTPS配置、性能优化和常见问题处理。
一、SSL证书选择指南
1. 证书类型对比

- DV证书(域名验证):只验证域名所有权,签发速度快(10分钟内),免费(Let's Encrypt)或低价。适合个人站和小型网站。
- OV证书(组织验证):验证企业真实身份,地址栏显示公司名。价格500-2000元/年。适合企业官网和电商网站。
- EV证书(扩展验证):最严格的验证,绿色地址栏显示公司名。价格3000-10000元/年。适合金融和大型电商。
对95%的站长来说,免费的Let's Encrypt DV证书就够了。
2. Let's Encrypt免费证书
# 使用acme.sh自动申请和续期 curl https://get.acme.sh | sh # DNS验证方式(推荐,不需要暂停Nginx) acme.sh --issue --dns dns_dp -d yoursite.com -d www.yoursite.com # 或HTTP验证方式 acme.sh --issue -d yoursite.com -d www.yoursite.com --webroot /www/wwwroot/yoursite/ # 安装证书到Nginx acme.sh --install-cert -d yoursite.com \ --key-file /www/server/ssl/yoursite.key \ --fullchain-file /www/server/ssl/yoursite.crt \ --reloadcmd "systemctl reload nginx"
acme.sh会自动配置cron任务,每60天自动续期证书。Let's Encrypt证书有效期90天。
3. 宝塔面板一键申请
宝塔面板 → 网站 → 设置 → SSL → Let's Encrypt → 勾选域名 → 申请。自动续期,最简单的方案。
二、Nginx HTTPS配置
1. 基础HTTPS配置
server {
listen 443 ssl http2;
server_name www.yoursite.com yoursite.com;
# SSL证书
ssl_certificate /www/server/ssl/yoursite.crt;
ssl_certificate_key /www/server/ssl/yoursite.key;
# SSL协议版本
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
# 加密套件(兼顾安全性和性能)
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
# 会话缓存
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
# OCSP装订(加速证书验证)
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
# HSTS(强制浏览器始终使用HTTPS)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# 安全头
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Content-Security-Policy "upgrade-insecure-requests" always;
root /www/wwwroot/yoursite;
index index.php index.html;
location ~ \.php$ {
fastcgi_pass unix:/tmp/php-cgi-82.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_param HTTPS on; # 告诉PHP当前是HTTPS
}
}
# HTTP→HTTPS 301重定向
server {
listen 80;
server_name www.yoursite.com yoursite.com;
return 301 https://www.yoursite.com$request_uri;
}
# 非www→www 301重定向
server {
listen 443 ssl http2;
server_name yoursite.com;
ssl_certificate /www/server/ssl/yoursite.crt;
ssl_certificate_key /www/server/ssl/yoursite.key;
return 301 https://www.yoursite.com$request_uri;
}
2. TLS 1.3优化
# TLS 1.3 0-RTT(零往返时间) ssl_early_data on; # 0-RTT有重放攻击风险,仅对安全请求启用 proxy_set_header Early-Data $ssl_early_data; # TLS 1.3 cipher suites(只有5个,无需配置) # TLS_AES_256_GCM_SHA384 # TLS_CHACHA20_POLY1305_SHA256 # TLS_AES_128_GCM_SHA256 # TLS_AES_128_CCM_8_SHA256 # TLS_AES_128_CCM_SHA256
TLS 1.3将握手时间从2-RTT降为1-RTT(首次)或0-RTT(恢复),显著提升HTTPS性能。
三、HTTPS性能优化
1. HTTPS性能开销分析
HTTPS相比HTTP的额外开销主要在TLS握手阶段:
- 首次连接:1-2次额外RTT(TLS握手)
- 恢复连接:0-1次额外RTT(会话复用/TLS 1.3)
- 加解密CPU开销:AES-GCM硬件加速后可忽略不计
2. 优化手段汇总
# 会话复用(减少握手次数)
ssl_session_cache shared:SSL:10m; # 缓存10MB约4万个会话
ssl_session_timeout 1d; # 会话有效期1天
ssl_session_tickets on; # Session Ticket(无状态会话复用)
# OCSP装订(减少证书验证延迟)
ssl_stapling on;
ssl_stapling_verify on;
# HTTP/2(多路复用,减少连接数)
listen 443 ssl http2;
# 开启Gzip/Brotli压缩(减少传输量)
brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css application/javascript application/json;
# 开启缓存(减少重复请求)
location ~* \.(css|js|jpg|png|gif|ico|woff2)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
经过优化后,HTTPS的性能开销可以控制在5%以内,完全可以忽略。
四、混合内容处理
HTTPS页面加载HTTP资源会产生混合内容警告,浏览器会阻止加载不安全的脚本:
1. 自动修复方案(Nginx)
# Content-Security-Policy自动升级不安全请求 add_header Content-Security-Policy "upgrade-insecure-requests" always;
这个头会让浏览器自动将页面中的HTTP请求升级为HTTPS请求,是最简单的解决方案。
2. 源码层面修复
# 替换所有硬编码的HTTP链接 # 数据库批量替换(WordPress) UPDATE wp_posts SET post_content = REPLACE(post_content, 'http://www.yoursite.com', 'https://www.yoursite.com'); UPDATE wp_options SET option_value = REPLACE(option_value, 'http://www.yoursite.com', 'https://www.yoursite.com'); UPDATE wp_postmeta SET meta_value = REPLACE(meta_value, 'http://www.yoursite.com', 'https://www.yoursuzy.com'); # Z-Blog # 后台 → 网站设置 → 修改网站地址为https:// # 再用数据库替换文章内容中的旧链接
3. 外部资源处理
# 外部JS/CSS使用协议相对路径 <script src="//cdn.example.com/lib.js"></script> # 或直接改为HTTPS(现在几乎所有CDN都支持HTTPS) <script src="https://cdn.example.com/lib.js"></script> # 百度统计/Google Analytics等都提供HTTPS版本 # 更新嵌入代码为HTTPS版本
五、HTTPS与SEO
1. HTTP→HTTPS迁移SEO要点
- 301重定向所有HTTP页面到HTTPS对应页面
- 更新sitemap.xml中的所有URL为HTTPS
- 在百度搜索资源平台添加HTTPS版本网站
- 在Google Search Console添加HTTPS资源
- 更新robots.txt中的Sitemap地址
- 更新canonical标签为HTTPS
- 更新所有内链为HTTPS
2. 常见SEO问题
# 问题:HTTP和HTTPS同时被收录(重复内容) # 解决:确保301重定向生效,提交HTTPS版sitemap # 问题:HTTPS迁移后排名下降 # 原因:301重定向未生效、内链仍指向HTTP、百度未识别HTTPS版本 # 解决:检查重定向、更新内链、在搜索资源平台认证HTTPS版本 # 问题:SSL证书到期导致网站不可访问 # 预防:acme.sh自动续期 + 监控告警 # 安装证书到期监控 echo "0 0 * * * root [ \$(date +%s) -gt \$(date -d \"\$(openssl x509 -enddate -noout -in /www/server/ssl/yoursite.crt | cut -d= -f2)\" +%s) ] && echo 'SSL证书即将过期' | mail -s 'SSL告警' admin@yoursite.com" >> /etc/crontab
六、SSL证书问题排查
1. 证书链不完整
# 检查证书链 openssl s_client -connect www.yoursite.com:443 -showcerts # 如果显示"unable to get local issuer certificate" # 说明中间证书缺失,需要合并证书链 cat yoursite.crt ca_bundle.crt > fullchain.crt
2. 证书名称不匹配
# 检查证书覆盖的域名 openssl x509 -in yoursite.crt -text -noout | grep -A1 "Subject Alternative Name" # 确保所有访问域名都在SAN列表中 # 包括yoursite.com和www.yoursite.com
3. HSTS导致的无法访问
# 如果错误配置了HSTS(比如max-age设太大),浏览器会强制HTTPS # 临时解决:清除浏览器HSTS缓存 # Chrome: chrome://net-internals/#hsts → Delete domain # 正式解决:先降低max-age add_header Strict-Transport-Security "max-age=300"; # 5分钟 # 确认一切正常后再增加到1年 add_header Strict-Transport-Security "max-age=31536000";
七、总结
HTTPS迁移的核心步骤:申请证书→配置Nginx→301重定向→修复混合内容→更新sitemap和内链→搜索资源平台添加HTTPS版本。性能方面,TLS 1.3 + HTTP/2 + OCSP装订 + 会话复用可以将HTTPS开销降到最低。安全方面,HSTS + CSP + X-Frame-Options形成防护链。Let's Encrypt免费证书+acme.sh自动续期,零成本实现全站HTTPS。
关注西数资源网,获取更多HTTPS配置、SSL证书和站长资源技术干货!
相关文章
发表评论
评论列表