详细介绍:nginx代理配置详解

一、什么是 Nginx 代理?

Nginx 代理分为两类:

  • 正向代理:客户端通过 Nginx 访问外部资源,外部服务器认为请求来自 Nginx。
  • 反向代理:客户端访问 Nginx,Nginx根据配置将请求转发到后端服务器,客户端并不知道后端服务器的真实地址。

Nginx 最常用于 反向代理,实现负载均衡、缓存和安全防护等。


二、反向代理配置详解

1. 基本反向代理

server {
    listen 80;
    server_name www.example.com;
    location / {
        proxy_pass http://backend_server;
    }
}
upstream backend_server {
    server 127.0.0.1:8080;
    server 192.168.1.2:8080;
}
说明:
  • proxy_pass:将请求转发到指定地址(可以是 IP,也可以是 upstream 定义的集群)。
  • upstream:定义后端服务器集群,实现负载均衡。

2. 代理头部配置(保持客户端信息)

location / {
    proxy_pass http://backend_server;
    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:设置转发请求时的 HTTP 头部,保持真实客户端信息。

3. 代理 HTTPS

server {
    listen 443 ssl;
    server_name www.example.com;
    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;
    location / {
        proxy_pass http://backend_server;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}


4. 反向代理常用参数

参数作用
proxy_pass指定后端服务器地址
proxy_set_header设置转发请求头
proxy_read_timeout后端响应超时时间
proxy_connect_timeout连接后端超时时间
proxy_buffering是否开启缓冲
proxy_redirect重定向后端响应
proxy_cookie_domain替换后端响应中的 Cookie 域名
proxy_intercept_errors拦截错误页面,由 Nginx 自己处理

示例:

location /api/ {
    proxy_pass http://api_backend/;
    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_read_timeout 60s;
    proxy_connect_timeout 10s;
    proxy_buffering off;
}

三、正向代理配置

Nginx 默认不支持正向代理,需要开启 ngx_http_proxy_connect_module 模块(编译时加上),或者使用第三方模块。

简单 HTTP 正向代理:

server {
    listen 8888;
    location / {
        proxy_pass $scheme://$http_host$request_uri;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

注意:正向代理有安全风险,生产环境慎用。


四、实际应用场景

  • 跨域代理:解决前端开发跨域问题。
  • 负载均衡:多台后端服务器分流压力。
  • SSL 终端:Nginx 负责 HTTPS,后端为 HTTP。
  • 缓存加速:Nginx 缓存后端内容,提升性能。

五、常见问题与排查

  • 代理后端无法访问:检查 proxy_pass 地址是否正确,后端服务是否启动。
  • 头部丢失:确保 proxy_set_header 设置了必要的头部。
  • 请求超时:调整 proxy_read_timeout 和 proxy_connect_timeout

六、完整示例

upstream backend {
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
}
server {
    listen 80;
    server_name www.example.com;
    location / {
        proxy_pass http://backend;
        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_read_timeout 60s;
        proxy_connect_timeout 10s;
        proxy_buffering off;
    }
}

七、Nginx 反向代理高级配置

1. 路径重写与子路径代理

有时候需要将某个路径代理到后端的不同路径:

location /api/ {
    proxy_pass http://backend_server/api/;
}

如果需要去掉 /api/ 前缀,可以这样:

location /api/ {
    proxy_pass http://backend_server/;
    rewrite ^/api/(.*)$ /$1 break;
}

2. 负载均衡策略

Nginx 提供多种负载均衡算法:

upstream backend {
    server 192.168.1.2:8080 weight=3;
    server 192.168.1.3:8080 weight=1;
    # 轮询(默认)、权重、ip_hash、least_conn
    ip_hash;          # 按客户端IP分配请求
    # least_conn;     # 最少连接数优先
}

3. 健康检查(第三方模块)

Nginx 默认没有主动健康检查,可以用 nginx_upstream_check_module 实现:

upstream backend {
    server 192.168.1.2:8080;
    server 192.168.1.3:8080;
    check interval=3000 rise=2 fall=5 timeout=1000 type=http;
    check_http_send "GET /health HTTP/1.0\r\n\r\n";
    check_http_expect_alive http_2xx http_3xx;
}

4. 缓存代理内容(proxy_cache)

Nginx 可作为缓存服务器,减轻后端压力:

proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=mycache:10m max_size=1g inactive=60m use_temp_path=off;
server {
    location / {
        proxy_pass http://backend;
        proxy_cache mycache;
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 404 1m;
        proxy_cache_key "$scheme$request_method$host$request_uri";
    }
}

八、常见问题排查技巧

  1. 代理后端返回 502/504 错误

    • 检查后端服务是否启动、端口是否可达。
    • 检查 Nginx 的 proxy_connect_timeoutproxy_read_timeout 设置是否合理。
  2. 跨域问题

    • 可以在 Nginx 配置中添加响应头解决:

      add_header Access-Control-Allow-Origin *;
      add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
      add_header Access-Control-Allow-Headers 'Authorization,Content-Type';
  3. 静态资源与代理混用

    • 可以用 location 区分:

      location /static/ {
          root /var/www/html;
      }
      location / {
          proxy_pass http://backend;
      }
  4. WebSocket 代理

    • WebSocket 需要特殊头:

      location /ws/ {
          proxy_pass http://backend;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection "upgrade";
      }

九、性能优化建议

  1. 合理设置连接数与超时时间

    • worker_processesworker_connectionskeepalive_timeout等参数根据服务器能力调整。
  2. 开启缓存与压缩

    • 启用 proxy_cache 和 gzip,减少后端压力与带宽消耗。

      gzip on;
      gzip_types text/plain application/json text/css application/javascript;
  3. 限制请求速率和并发

    • 防止恶意攻击或流量突发:

      limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
      location /api/ {
          limit_req zone=one burst=5;
          proxy_pass http://backend;
      }

十、Nginx 日志分析与调试

  • 访问日志:定位请求问题

    access_log /var/log/nginx/access.log;
  • 错误日志:定位代理错误

    error_log /var/log/nginx/error.log warn;
  • 可以用 tail -f 实时查看日志,配合 grep 筛查特定请求或错误。


十一、完整生产环境示例

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
    worker_connections 1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    keepalive_timeout  65;
    upstream backend {
        server 127.0.0.1:8080 weight=2;
        server 127.0.0.1:8081 weight=1;
        ip_hash;
    }
    proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=mycache:10m max_size=1g inactive=60m use_temp_path=off;
    server {
        listen 80;
        server_name www.example.com;
        location /static/ {
            root /var/www/html;
        }
        location /api/ {
            proxy_pass http://backend;
            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_cache mycache;
            proxy_cache_valid 200 302 10m;
            add_header Access-Control-Allow-Origin *;
        }
        location /ws/ {
            proxy_pass http://backend;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
    }
}
posted on 2026-01-17 15:34  ljbguanli  阅读(1)  评论(0)    收藏  举报