<返回目录     Powered by claud/xia兄

第4课: 反向代理配置

proxy_pass、请求转发、header设置

什么是反向代理

反向代理是Nginx最重要的功能之一。客户端向反向代理发送请求,反向代理将请求转发到后端服务器,然后将后端服务器的响应返回给客户端。反向代理可以实现负载均衡、缓存、安全隔离等功能。

反向代理的优势

proxy_pass基础配置

proxy_pass是Nginx反向代理的核心指令。

示例1:基础反向代理

server {
    listen 80;
    server_name example.com;

    location / {
        # 代理到后端服务器
        proxy_pass http://127.0.0.1:8000;
    }
}

示例2:代理到不同的后端

server {
    listen 80;
    server_name example.com;

    # API请求代理到API服务器
    location /api/ {
        proxy_pass http://127.0.0.1:8000/;
    }

    # 静态资源代理到静态服务器
    location /static/ {
        proxy_pass http://127.0.0.1:8001/;
    }

    # 其他请求代理到Web服务器
    location / {
        proxy_pass http://127.0.0.1:8002;
    }
}

示例3:proxy_pass的URI处理

server {
    listen 80;
    server_name example.com;

    # 不带URI:保留原始请求路径
    # 请求 /api/users -> http://backend/api/users
    location /api/ {
        proxy_pass http://backend;
    }

    # 带URI:替换匹配的路径
    # 请求 /api/users -> http://backend/v1/users
    location /api/ {
        proxy_pass http://backend/v1/;
    }

    # 带URI(无斜杠)
    # 请求 /api/users -> http://backend/v1users
    location /api/ {
        proxy_pass http://backend/v1;
    }
}

请求头设置

代理请求时需要正确设置请求头,以便后端服务器获取客户端信息。

示例4:标准请求头配置

location / {
    proxy_pass http://backend;

    # 设置Host头为原始请求的Host
    proxy_set_header Host $host;

    # 设置真实客户端IP
    proxy_set_header X-Real-IP $remote_addr;

    # 设置代理链IP列表
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    # 设置原始协议(http或https)
    proxy_set_header X-Forwarded-Proto $scheme;

    # 设置原始请求的Host
    proxy_set_header X-Forwarded-Host $host;

    # 设置原始请求的端口
    proxy_set_header X-Forwarded-Port $server_port;
}

示例5:自定义请求头

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_set_header X-Custom-Header "MyValue";
    proxy_set_header X-Request-ID $request_id;
    proxy_set_header X-Client-IP $remote_addr;

    # 删除某个请求头
    proxy_set_header Authorization "";
}

代理缓冲配置

代理缓冲可以提高性能,但需要合理配置。

示例6:缓冲区配置

location / {
    proxy_pass http://backend;

    # 启用代理缓冲(默认开启)
    proxy_buffering on;

    # 缓冲区大小(用于读取响应头)
    proxy_buffer_size 4k;

    # 缓冲区数量和大小(用于读取响应体)
    proxy_buffers 8 4k;

    # 繁忙时的缓冲区大小
    proxy_busy_buffers_size 8k;

    # 临时文件大小限制
    proxy_max_temp_file_size 1024m;

    # 临时文件写入大小
    proxy_temp_file_write_size 8k;
}

超时设置

合理设置超时时间可以避免请求长时间挂起。

示例7:超时配置

location / {
    proxy_pass http://backend;

    # 连接后端服务器的超时时间
    proxy_connect_timeout 60s;

    # 从后端服务器读取响应的超时时间
    proxy_read_timeout 60s;

    # 向后端服务器发送请求的超时时间
    proxy_send_timeout 60s;

    # 长连接超时时间
    proxy_next_upstream_timeout 0;
    proxy_next_upstream_tries 0;
}

WebSocket代理

WebSocket需要特殊的代理配置。

示例8:WebSocket代理配置

location /ws/ {
    proxy_pass http://backend;

    # WebSocket必需的请求头
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

    # 标准请求头
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    # 超时设置(WebSocket通常需要较长的超时时间)
    proxy_connect_timeout 7d;
    proxy_send_timeout 7d;
    proxy_read_timeout 7d;
}

错误处理

配置错误处理可以提高用户体验。

示例9:错误处理配置

location / {
    proxy_pass http://backend;

    # 后端返回这些状态码时,尝试下一个服务器
    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;

    # 拦截后端错误,返回自定义错误页面
    proxy_intercept_errors on;
    error_page 500 502 503 504 /50x.html;

    location = /50x.html {
        root /usr/share/nginx/html;
    }
}

示例10:完整的生产环境配置

upstream backend {
    server 127.0.0.1:8000 weight=3;
    server 127.0.0.1:8001 weight=2;
    server 127.0.0.1:8002 backup;
}

server {
    listen 80;
    server_name 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_set_header X-Forwarded-Proto $scheme;

        # 缓冲配置
        proxy_buffering on;
        proxy_buffer_size 4k;
        proxy_buffers 8 4k;
        proxy_busy_buffers_size 8k;

        # 超时配置
        proxy_connect_timeout 30s;
        proxy_send_timeout 30s;
        proxy_read_timeout 30s;

        # 错误处理
        proxy_next_upstream error timeout http_500 http_502 http_503;
        proxy_intercept_errors on;

        # 隐藏后端响应头
        proxy_hide_header X-Powered-By;
        proxy_hide_header Server;

        # 添加自定义响应头
        add_header X-Proxy-Cache $upstream_cache_status;
    }
}
反向代理最佳实践:
常见问题:

实践练习

练习任务:
  1. 配置一个基础的反向代理,将请求转发到本地8000端口
  2. 设置标准的代理请求头(Host、X-Real-IP、X-Forwarded-For)
  3. 配置代理超时时间为30秒
  4. 配置WebSocket代理到/ws/路径
  5. 配置错误处理,后端错误时显示自定义错误页面
  6. 使用curl测试代理功能:curl -H "Host: example.com" http://localhost/
  7. 查看后端服务器日志,验证请求头是否正确传递
  8. 测试代理超时:让后端服务器延迟响应,观察Nginx行为

总结

反向代理是Nginx的核心功能,通过proxy_pass指令可以将请求转发到后端服务器。合理配置请求头、缓冲区、超时时间和错误处理,可以构建高性能、高可用的反向代理系统。掌握反向代理配置是使用Nginx的基础。