必须先运行nginx -V | grep with-http_ssl_module确认模块是否启用,无输出则需进入源码目录执行./configure --with-http_ssl_module && make,用objs/nginx替换原二进制;证书路径须为绝对路径、私钥权限设为600、HTTP跳转HTTPS需用独立80端口server块并写return 301 https://$host$request_uri;。

确认Nginx已编译启用 --with-http_ssl_module
没这个模块,ssl_certificate、listen 443 ssl 这类指令直接报错,配置文件都加载不了。别急着改配置,先验证:
- 运行
nginx -V 2>&1 | grep -o with-http_ssl_module,有输出才表示已启用 - 若无输出,说明是源码编译时漏了参数;yum/apt 安装的通常自带,但自建二进制或旧版可能缺失
- 补模块必须重新编译:进源码目录执行
./configure --prefix=/usr/local/nginx --with-http_ssl_module,再make,最后用objs/nginx替换原二进制(不执行make install,避免覆盖 conf)
证书文件权限和路径必须严格控制
.key 文件一旦被非 root / nginx 用户读取,私钥就泄露了。常见错误是上传后忘了改权限或放错位置:
- 证书建议统一放在
/etc/nginx/ssl/(非/root或用户家目录),确保 Nginx worker 进程能读取 - 执行
chmod 600 /etc/nginx/ssl/your_domain.key,chown nginx:nginx /etc/nginx/ssl/*.key -
.crt文件权限可宽松些(如 644),但路径不能包含空格或中文,否则nginx -t会静默失败 - 别把证书和 key 放在
/usr/local/nginx/conf/下——该目录常被误设为 755,容易被遍历
HTTP跳转HTTPS必须用独立的 server 块监听 80 端口
混在 443 的 server 块里加 if ($scheme = http) { return 301 ... } 是错的,Nginx 启动会拒绝加载。正确做法是:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 在
http块内新增一个纯 80 端口的server,只做跳转,不配 SSL 指令 - 写法必须是:
return 301 https://$host$request_uri;(注意不是$server_name,它不带端口且可能为空) - 不要用
rewrite+permanent,虽然能用,但return更轻量、无正则开销、语义明确 - 如果用了
if判断$scheme或$server_port,属于 location 内嵌套,性能差且易出逻辑漏洞,官方已不推荐
测试与生效前必做三件事
改完配置别直接 systemctl restart nginx,容易服务中断:
- 先跑
nginx -t:失败时看具体哪行报错,90% 是路径错、权限错、少分号或用了未启用模块的指令 - 检查防火墙是否放行 443 端口:
firewall-cmd --list-ports(CentOS)或ufw status(Ubuntu) - 确认 SELinux 没拦住读取证书:
ausearch -m avc -ts recent | grep nginx,若有 denied 记录,临时用setsebool -P httpd_read_user_content 1或改文件上下文
真正容易被忽略的是:跳转后浏览器地址栏仍显示 HTTP,大概率是反向代理(如 CDN 或负载均衡)把原始请求协议“吃掉”了,此时需在 443 的 server 块中加 proxy_set_header X-Forwarded-Proto $scheme; 并让上层透传真实协议头。

















