Nginx HTTPS 配置 这份文档讲的是 Nginx 的 HTTPS 基础配置,以及常见的 HTTP 跳 HTTPS 重定向。
HTTPS 这一块的重点是:
提供安全加密
配置证书
强制 HTTPS
可以顺便只允许域名访问,减少直接 IP+端口访问
0. HTTPS 配置流程图 flowchart TD A[开始] --> B[准备证书和私钥] B --> C[写 443 的 server 配置] C --> D[配置 ssl_certificate 和 ssl_certificate_key] D --> E[写 80 到 443 的重定向] E --> F[执行 nginx -t] F --> G{配置是否通过} G -- 否 --> H[修正 HTTPS 配置] H --> F G -- 是 --> I[reload nginx] I --> J[完成]
1. 你要怎么写 假设你的证书文件是:
/etc/nginx/ssl/example.com.crt
/etc/nginx/ssl/example.com.key
站点配置:
sudo vim /etc/nginx/sites-available/example.com
示例内容:
server { listen 80 ; listen [::]:80 ; server_name example.com www.example.com; return 301 https://$host $request_uri ; } server { listen 443 ssl; listen [::]:443 ssl; server_name example.com www.example.com; ssl_certificate /etc/nginx/ssl/example.com.crt; ssl_certificate_key /etc/nginx/ssl/example.com.key; root /var/www/example.com; index index.html; access_log /var/log/nginx/example.com.access.log; error_log /var/log/nginx/example.com.error .log warn ; location / { try_files $uri $uri / =404 ; } }
2. 重定向是什么 这里的重定向,最常见就是:
用户访问 http://example.com
Nginx 直接返回跳转
浏览器再去访问 https://example.com
最常见写法就是:
server { listen 80 ; listen [::]:80 ; server_name example.com www.example.com; return 301 https://$host $request_uri ; }
这几项的意思:
301 永久重定向
https://$host$request_uri 保留原域名和原路径,直接跳到 HTTPS
例如:
http://example.com/a
会跳到
https://example.com/a
3. 为什么通常要强制 HTTPS 因为如果你已经有证书,通常就希望:
用户不要再走明文 HTTP
所有访问统一走 HTTPS
减少混乱和安全风险
所以实际部署里,80 端口很多时候只做一件事:
4. 反向代理场景下的 HTTPS 如果你不是纯静态站点,而是 HTTPS + 反向代理,常见写法是这样:
server { listen 80 ; listen [::]:80 ; server_name api.example.com; return 301 https://$host $request_uri ; } server { listen 443 ssl; listen [::]:443 ssl; server_name api.example.com; ssl_certificate /etc/nginx/ssl/api.example.com.crt; ssl_certificate_key /etc/nginx/ssl/api.example.com.key; location / { proxy_pass http://127.0.0.1:8080; proxy_http_version 1 .1 ; proxy_set_header Host $host ; proxy_set_header X-Real-IP $remote_addr ; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ; proxy_set_header X-Forwarded-Proto $scheme ; } }
5. 写完了怎么检查和启用 sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.comsudo nginx -tsudo systemctl reload nginx
6. 怎么屏蔽直接 IP 访问 如果你希望尽量只允许通过域名访问,而不是直接访问服务器 IP,可以保留一个默认兜底站点:
server { listen 80 default_server; listen [::]:80 default_server; server_name _; return 444 ; }
如果是 HTTPS,也可以做同样的兜底:
server { listen 443 ssl default_server; listen [::]:443 ssl default_server; server_name _; ssl_certificate /etc/nginx/ssl/example.com.crt; ssl_certificate_key /etc/nginx/ssl/example.com.key; return 444 ; }
这个思路的作用是:
通过正式域名访问正常站点
直接访问 IP 或错误 Host 时,直接丢弃
7. 使用时要注意的事
证书路径和私钥路径一定要写对
改完配置先 nginx -t
80 端口通常保留给跳转到 HTTPS
如果你站点不只一个域名,证书也要覆盖对应域名
如果后面接的是反向代理服务,记得继续保留代理头