欢迎光临
我们一直在努力

nginx请求代理转发配置

一、基础环境准备

  • 安装 Nginx

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

    sudo systemctl start nginx

  • 查看 Nginx 配置文件路径 通常为 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/default.conf。


  • 二、反向代理基本配置

    1. 反向代理单个服务

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

    server {
    listen 80;
    server_name yourdomain.com;

    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.com;

    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.com;

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


    4. HTTPS 代理(SSL 配置)

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

    server {
    listen 443 ssl;
    server_name yourdomain.com;

    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.com;

    # 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 Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS, PUT, DELETE';
    add_header Access-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.com;

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


    十一、防盗链配置

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

    location ~* \\.(jpg|png|gif)$ {
    valid_referers none blocked yourdomain.com *.yourdomain.com;
    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.com;

    # 静态资源
    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.com;
    if ($invalid_referer) {
    return 403;
    }
    }
    }


    十四、调试与日志

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

    十五、动静分离

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

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

    # 静态资源直接由 Nginx 处理
    location /static/ {
    root /var/www/html;
    expires 7d;
    access_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 或 commercial 版本支持主动健康检查,开源版可以用第三方模块或简单被动健康检查(如max_fails和fail_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.com;
    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.com;
    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.com;

    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.com;

    # 静态资源
    location /static/ {
    root /var/www/html;
    expires 7d;
    access_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;
    }
    }
    }


    二十二、调试与排错建议

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

  • 赞(0)
    未经允许不得转载:171主机测评 » nginx请求代理转发配置
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址