必须先确认Nginx已启用--with-http_ssl_module模块,再配置独立80端口server块用return 301跳转HTTPS,并在443端口server块中正确指定证书路径、TLSv1.2+协议及加密套件,同时确保私钥权限为600、路径为绝对路径且防火墙放行443端口。

要让 Nginx 在 Linux 上实现全站强制从 HTTP 升级到 HTTPS,核心是两件事:确保 HTTPS 服务本身能正常响应,再把所有 HTTP 请求无例外地重定向过去。这不是加个开关就能生效的配置,每一步都有明确前提和常见踩坑点。
确认 SSL 模块已启用
Nginx 必须编译时带上 --with-http_ssl_module,否则任何含 ssl_certificate、listen 443 ssl 的配置都会直接报错,连配置文件都加载不了。
- 运行
nginx -V 2>&1 | grep -o with-http_ssl_module,有输出才表示模块就绪 - 若无输出,yum/apt 安装的通常自带;但自编译或旧版本可能缺失,需返回源码目录重新执行
./configure --with-http_ssl_module && make,再用objs/nginx替换原二进制(不执行make install)
安全存放并设置证书权限
证书路径和私钥权限出错,Nginx 启动会静默失败或拒绝读取,这是调试中最常卡住的地方。
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 推荐统一存放在
/etc/nginx/ssl/(非/root或用户家目录),路径中不能含空格或中文 -
.key文件必须设为600:chmod 600 /etc/nginx/ssl/your_domain.key - 所有权建议设为 Nginx 运行用户:
chown nginx:nginx /etc/nginx/ssl/*.key -
.crt文件可设为644,但也要确保 Nginx worker 进程能读取
用独立 server 块做 80 端口跳转
HTTP 强制跳转 HTTPS 必须用一个只监听 80 端口、不带任何 ssl_* 指令的 server 块。混在 443 的 server 里写 if ($scheme = http) 是无效的,Nginx 启动会拒绝加载。
- 在
http块内新增如下配置:
listen 80;
server_name your-domain.com;
return 301 https://$host$request_uri;
}
- 务必用
$host(保留原始 Host 和端口信息),不用$server_name(可能为空或不带端口) - 不要用
rewrite ... permanent,return 301更轻量、无正则开销、语义清晰
正确配置 443 端口的 HTTPS 服务
这个 server 块负责真正响应加密请求,除了证书路径,还需启用现代 TLS 协议和合理加密套件。
- 关键指令示例:
listen 443 ssl http2;
server_name your-domain.com;
ssl_certificate /etc/nginx/ssl/your_domain.crt;
ssl_certificate_key /etc/nginx/ssl/your_domain.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
# 其他 location、root 等按需添加
}
- 禁用 TLSv1.0/TLSv1.1 及更早协议,避免已知漏洞
- 检查防火墙是否放行 443 端口:
firewall-cmd --list-ports(CentOS)或ufw status(Ubuntu) - SELinux 若启用,需确认没拦截证书读取:
ausearch -m avc -ts recent | grep nginx
改完配置后,先运行 nginx -t 验证语法,再 nginx -s reload 生效。整个过程不复杂,但容易忽略模块验证、权限控制和独立 server 块结构这三个关键环节。

















