台南市网站建设_网站建设公司_响应式网站_seo优化
2026/1/17 15:37:32 网站建设 项目流程

详细介绍: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_connip_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";}}
}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询