Nginx反向代理Server块配置全解析:从基础到进阶

一、基础监听配置详解

Server块的核心功能是定义虚拟主机,其监听配置直接决定了服务器的网络行为。典型的配置结构如下:

  1. server {
  2. listen 80; # 监听HTTP默认端口
  3. listen 443 ssl; # 监听HTTPS端口并启用SSL
  4. listen 192.168.1.100:8080; # 绑定特定IP和端口
  5. server_name api.example.com www.example.com;
  6. }

1.1 监听参数解析

  • 端口绑定listen指令支持多种格式:

    • 纯端口号:listen 80(监听所有网络接口)
    • IP+端口:listen 10.0.0.5:8080(仅绑定指定IP)
    • 协议指定:listen 443 ssl(启用HTTPS)
    • 特殊参数:listen 80 default_server(设为默认Server块)
  • IPv6支持:需使用方括号包裹IP地址:

    1. listen [2001:db8::1]:80;

1.2 Server Name匹配规则

server_name指令支持三种匹配模式:

  1. 精确匹配server_name example.com;
  2. 通配符匹配
    • 前缀通配:*.example.com
    • 后缀通配:mail.*
  3. 正则匹配
    1. server_name ~^(www\.)?example\.com$;

优先级规则:精确匹配 > 前缀通配 > 正则匹配 > 默认配置。当请求的Host头未匹配任何server_name时,Nginx会选择第一个监听相同端口的Server块作为默认配置。

二、反向代理核心配置实践

反向代理是Nginx最核心的功能之一,通过proxy_pass指令实现流量转发。典型配置如下:

  1. location / {
  2. proxy_pass http://backend_pool;
  3. proxy_set_header Host $host;
  4. proxy_set_header X-Real-IP $remote_addr;
  5. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  6. proxy_set_header X-Forwarded-Proto $scheme;
  7. }

2.1 后端服务定义

后端服务可通过三种方式定义:

  1. 直接指定
    1. proxy_pass http://10.0.0.10:8080;
  2. 使用变量
    1. proxy_pass http://$backend_server;
  3. 上游模块(推荐)
    1. upstream backend_pool {
    2. server 10.0.0.10:8080 weight=3;
    3. server 10.0.0.11:8080 backup;
    4. server 10.0.0.12:8080 max_fails=3 fail_timeout=30s;
    5. }

负载均衡策略

  • 轮询(默认)
  • IP Hash:ip_hash;
  • 最少连接:least_conn;
  • 响应时间加权:需结合第三方模块

2.2 请求头处理

关键请求头参数说明:
| 参数 | 作用 | 示例值 |
|———|———|————|
| Host | 传递原始域名 | $host |
| X-Real-IP | 客户端真实IP | $remote_addr |
| X-Forwarded-For | 代理链IP | $proxy_add_x_forwarded_for |
| X-Forwarded-Proto | 原始协议 | $scheme |

安全建议:在生产环境中务必设置X-Forwarded-For,否则后端服务将无法获取客户端真实IP。

三、路径匹配与分发策略

Nginx通过location指令实现精细化的流量分发,支持四种匹配模式:

3.1 匹配类型详解

修饰符 匹配方式 示例
= 精确匹配 location = /login
^~ 前缀匹配(优先) location ^~ /static/
~ 正则匹配(区分大小写) `location ~ .(jpg png)$`
~* 正则匹配(不区分大小写) `location ~* .(js css)$`

优先级规则

  1. 精确匹配(=)
  2. 前缀匹配(^~)
  3. 正则匹配(按配置文件中的顺序)
  4. 普通前缀匹配

3.2 典型应用场景

静态资源处理

  1. location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
  2. root /var/www/static;
  3. expires 30d;
  4. access_log off;
  5. }

API接口转发

  1. location /api/ {
  2. proxy_pass http://api_backend;
  3. proxy_connect_timeout 60s;
  4. proxy_read_timeout 300s;
  5. }

WebSocket支持

  1. location /ws/ {
  2. proxy_pass http://websocket_backend;
  3. proxy_http_version 1.1;
  4. proxy_set_header Upgrade $http_upgrade;
  5. proxy_set_header Connection "upgrade";
  6. }

四、HTTPS与安全加固方案

现代Web服务必须启用HTTPS,以下是完整的安全配置示例:

4.1 SSL基础配置

  1. server {
  2. listen 443 ssl;
  3. server_name secure.example.com;
  4. ssl_certificate /etc/nginx/certs/fullchain.pem;
  5. ssl_certificate_key /etc/nginx/certs/privkey.pem;
  6. ssl_protocols TLSv1.2 TLSv1.3;
  7. ssl_ciphers HIGH:!aNULL:!MD5:!RC4:!3DES;
  8. ssl_prefer_server_ciphers on;
  9. # HSTS配置
  10. add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
  11. }

4.2 安全增强措施

  1. 会话复用优化

    1. ssl_session_cache shared:SSL:10m;
    2. ssl_session_timeout 10m;
  2. OCSP Stapling

    1. ssl_stapling on;
    2. ssl_stapling_verify on;
    3. resolver 8.8.8.8 8.8.4.4 valid=300s;
  3. 防点击劫持

    1. add_header X-Frame-Options SAMEORIGIN;
  4. 内容安全策略

    1. add_header Content-Security-Policy "default-src 'self'";

4.3 性能优化技巧

  1. TLS假握手

    1. ssl_early_data on; # 需要客户端支持TLS 1.3
  2. 零拷贝传输

    1. sendfile on;
    2. tcp_nopush on;
  3. 连接保持

    1. keepalive_timeout 75s;
    2. keepalive_requests 1000;

五、高级配置技巧

5.1 多域名证书配置

  1. server {
  2. listen 443 ssl;
  3. server_name example.com www.example.com;
  4. ssl_certificate /path/to/multidomain.pem;
  5. ssl_certificate_key /path/to/privkey.pem;
  6. }

5.2 流量镜像(A/B测试)

  1. split_clients $remote_addr $backend {
  2. 50% backend_v1;
  3. 50% backend_v2;
  4. }
  5. server {
  6. location / {
  7. proxy_pass http://$backend;
  8. }
  9. }

5.3 限流配置

  1. limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
  2. server {
  3. location /api/ {
  4. limit_req zone=api_limit burst=20 nodelay;
  5. }
  6. }

总结

本文系统梳理了Nginx Server块的核心配置,从基础监听设置到高级安全优化,覆盖了反向代理部署中的关键场景。通过合理配置Server块,可以实现:

  1. 多域名虚拟主机管理
  2. 智能流量分发与负载均衡
  3. 端到端的安全加固
  4. 高并发场景下的性能优化

建议运维人员结合实际业务需求,参考本文提供的配置模板进行定制化开发,同时定期更新SSL证书和Nginx版本以保障服务安全性。对于超大规模部署场景,可考虑结合监控系统实现动态配置调整。