nginx请求代理转发配置

一、基础环境准备

  1. 安装 Nginx

    • Linux(如 Ubuntu):
      sudo apt update
      sudo apt install nginx
      
    • Windows/Mac:
      前往 nginx 官网 下载并解压即可。
  2. 启动 Nginx

    sudo systemctl start nginx
    
  3. 查看 Nginx 配置文件路径
    通常为 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/default.conf


二、反向代理基本配置

1. 反向代理单个服务

假设你有一个后端服务,地址为 http://127.0.0.1:8080,希望通过 Nginx 的 http://yourdomain.***/ 访问。

server {
    listen 80;
    server_name yourdomain.***;

    location / {
        proxy_pass http://127.0.0.1:8080;
        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_pass:指定后端服务地址。
  • proxy_set_header:转发请求头,保证后端可以获取真实来源信息。

2. 路径转发/多服务代理

假设 /api 转发到后端 API 服务,/static 转发到静态文件服务器。

server {
    listen 80;
    server_name yourdomain.***;

    location /api/ {
        proxy_pass http://127.0.0.1:8081/;
        proxy_set_header Host $host;
    }

    location /static/ {
        proxy_pass http://127.0.0.1:8082/;
        proxy_set_header Host $host;
    }
}

注意
proxy_pass 后面如果有 /,会直接拼接后端路径;如果没有 /,会保留原始路径。


3. 端口转发

将外部 80 端口请求转发到内网 8080 端口:

server {
    listen 80;
    server_name yourdomain.***;

    location / {
        proxy_pass http://127.0.0.1:8080;
    }
}

4. HTTPS 代理(SSL 配置)

如果需要支持 HTTPS,需要证书(如 ssl.crt 和 ssl.key)。

server {
    listen 443 ssl;
    server_name yourdomain.***;

    ssl_certificate /etc/nginx/ssl/ssl.crt;
    ssl_certificate_key /etc/nginx/ssl/ssl.key;

    location / {
        proxy_pass http://127.0.0.1:8080;
    }
}

三、常用优化参数

location / {
    proxy_pass http://127.0.0.1:8080;
    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;

    proxy_connect_timeout 60s;
    proxy_send_timeout 60s;
    proxy_read_timeout 60s;
    send_timeout 60s;
}

四、完整配置示例

server {
    listen 80;
    server_name www.example.***;

    # API 转发
    location /api/ {
        proxy_pass http://127.0.0.1:7001/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    # 前端静态资源
    location / {
        root /var/www/html;
        index index.html index.htm;
    }
}

五、重载/重启 Nginx

修改配置后需重载 Nginx:

sudo nginx -t       # 检查配置语法是否正确
sudo systemctl reload nginx   # 重载配置

六、常见问题排查

  • 404/502 错误:检查后端服务是否启动,端口是否正确,防火墙是否放行。
  • 配置未生效:确认 Nginx 配置文件路径,是否已 reload。
  • 路径拼接问题proxy_pass 后面有无 /,影响转发路径。

七、路径重写(rewrite)

有时需要将外部路径重写后再转发给后端,比如将 /api/v1/user 转为 /user

示例1:去除前缀

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

效果:请求 /api/user 实际转发为 /user

示例2:正则匹配重写

location ~ ^/v1/(.*) {
    proxy_pass http://127.0.0.1:8080/$1;
}

效果:请求 /v1/test 转发为 /test


八、WebSocket 代理

WebSocket 需要特殊头部支持,Nginx 1.3+ 支持 WebSocket 代理。

location /ws/ {
    proxy_pass http://127.0.0.1:9000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
}

九、跨域(CORS)配置

如果前端和后端分离,且通过 Nginx 代理,可能需要允许跨域。

location /api/ {
    proxy_pass http://127.0.0.1:8080;
    add_header A***ess-Control-Allow-Origin *;
    add_header A***ess-Control-Allow-Methods 'GET, POST, OPTIONS, PUT, DELETE';
    add_header A***ess-Control-Allow-Headers 'Content-Type,Authorization';
    if ($request_method = 'OPTIONS') {
        return 204;
    }
}

十、负载均衡(多后端)

Nginx 支持多后端服务的负载均衡。

1. 定义后端服务器组

upstream backend_servers {
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
    # 可以加权、健康检查等
}

2. 配置代理到后端组

server {
    listen 80;
    server_name yourdomain.***;

    location /api/ {
        proxy_pass http://backend_servers;
        proxy_set_header Host $host;
    }
}

十一、防盗链配置

防止图片、视频等资源被其他网站盗用。

location ~* \.(jpg|png|gif)$ {
    valid_referers none blocked yourdomain.*** *.yourdomain.***;
    if ($invalid_referer) {
        return 403;
    }
}

十二、常见问题解析

1. proxy_pass 路径拼接规则

  • proxy_pass http://127.0.0.1:8080/;
    去除 location 匹配部分,直接拼接后端。
  • proxy_pass http://127.0.0.1:8080;
    保留 location 匹配部分。

2. 配置生效但无响应

  • 检查后端服务是否监听 127.0.0.1(有时只监听 0.0.0.0 也可以)。
  • 检查防火墙端口是否放通。
  • 检查 SELinux(CentOS)是否限制。

3. 502 Bad Gateway

  • 后端服务未启动或端口错误。
  • Nginx 用户权限问题(可尝试更改 user 或关闭 SELinux)。

十三、完整多场景配置示例

upstream myapp {
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
}

server {
    listen 80;
    server_name www.example.***;

    # 静态资源
    location /static/ {
        root /var/www/html;
    }

    # API 负载均衡
    location /api/ {
        proxy_pass http://myapp;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    # WebSocket
    location /ws/ {
        proxy_pass http://127.0.0.1:9000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    # 防盗链
    location ~* \.(jpg|png|gif)$ {
        valid_referers none blocked www.example.***;
        if ($invalid_referer) {
            return 403;
        }
    }
}

十四、调试与日志

  • 访问日志(默认开启):
    /var/log/nginx/a***ess.log
  • 错误日志
    /var/log/nginx/error.log
  • 可临时增加日志级别,排查问题。

十五、动静分离

动静分离指的是将静态资源(如图片、JS、CSS)和动态请求(如 API、后端服务)分开处理,提高性能。

server {
    listen 80;
    server_name www.example.***;

    # 静态资源直接由 Nginx 处理
    location /static/ {
        root /var/www/html;
        expires 7d;
        a***ess_log off;
    }

    # 动态请求转发给后端
    location /api/ {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
    }

    # 其他请求转发给前端应用
    location / {
        proxy_pass http://127.0.0.1:3000;
    }
}

十六、健康检查(负载均衡后端)

Nginx 的 openresty 或 ***mercial 版本支持主动健康检查,开源版可以用第三方模块或简单被动健康检查(如max_failsfail_timeout)。

upstream backend_servers {
    server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
    server 127.0.0.1:8081 max_fails=3 fail_timeout=30s;
}

说明:如果某个后端连续失败3次,30秒内不再转发请求给它。


十七、灰度发布 / AB 测试

通过 Nginx,可以实现按 IP、Cookie、Header 等进行灰度流量分流。

1. 按 Cookie 灰度

map $http_cookie $gray {
    default 0;
    "~*gray_user=1" 1;
}

upstream v1 {
    server 127.0.0.1:8080;
}
upstream v2 {
    server 127.0.0.1:8081;
}

server {
    listen 80;
    server_name www.example.***;
    location /api/ {
        if ($gray) {
            proxy_pass http://v2;
        }
        proxy_pass http://v1;
    }
}

2. 按 IP 灰度

geo $gray_ip {
    default 0;
    192.168.1.100 1;
}

server {
    listen 80;
    server_name www.example.***;
    location /api/ {
        if ($gray_ip) {
            proxy_pass http://127.0.0.1:8081;
        }
        proxy_pass http://127.0.0.1:8080;
    }
}

十八、IP 访问控制(黑白名单)

1. 只允许某些 IP 访问

location /admin/ {
    allow 192.168.1.100;
    allow 10.0.0.1;
    deny all;
}

2. 禁止某些 IP 访问

location /api/ {
    deny 123.123.123.123;
    allow all;
}

十九、限流配置(防止接口被刷)

Nginx 的 limit_req_zone 和 limit_req 可实现简单限流。

http {
    limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;

    server {
        listen 80;
        server_name www.example.***;

        location /api/ {
            limit_req zone=api_limit burst=20 nodelay;
            proxy_pass http://127.0.0.1:8080;
        }
    }
}

说明:每个 IP 每秒最多10次请求,突发流量允许20次。


二十、缓存配置(提升静态资源访问效率)

location /static/ {
    root /var/www/html;
    expires 30d;
    add_header Cache-Control "public";
}

二十一、动静分离+负载均衡+限流综合示例

http {
    limit_req_zone $binary_remote_addr zone=api_limit:10m rate=5r/s;

    upstream backend_servers {
        server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
        server 127.0.0.1:8081 max_fails=3 fail_timeout=30s;
    }

    server {
        listen 80;
        server_name www.example.***;

        # 静态资源
        location /static/ {
            root /var/www/html;
            expires 7d;
            a***ess_log off;
        }

        # API 限流+负载均衡
        location /api/ {
            limit_req zone=api_limit burst=10 nodelay;
            proxy_pass http://backend_servers;
        }

        # 其他请求
        location / {
            proxy_pass http://127.0.0.1:3000;
        }
    }
}

二十二、调试与排错建议

  1. nginx -t 检查配置语法。
  2. systemctl reload nginx 或 nginx -s reload 重载配置。
  3. 查看 a***ess.log 和 error.log
  4. 用 curl 工具测试转发效果,例如:
    curl -I http://yourdomain.***/api/test
    

转载请说明出处内容投诉
CSS教程网 » nginx请求代理转发配置

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买