nginxHTTPS配置

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 端口很多时候只做一件事:

  • 接请求
  • 然后重定向到 443

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.com
sudo nginx -t
sudo 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. 使用时要注意的事

  1. 证书路径和私钥路径一定要写对
  2. 改完配置先 nginx -t
  3. 80 端口通常保留给跳转到 HTTPS
  4. 如果你站点不只一个域名,证书也要覆盖对应域名
  5. 如果后面接的是反向代理服务,记得继续保留代理头