问题描述
该笔记将记录:与 proxy_pass 有关的常见问题,以及使用配置
解决方案
使用方法可以参考 Module ngx_http_proxy_module / proxy_pass 文档
location /some/path/ { proxy_pass http://localhost:8000; 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_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Port $server_port; }
场景:通过不同的 URI 进行反向代理
Module ngx_http_proxy_module / proxy_pass
How to remove the path with an nginx proxy_pass – Server Fault
How can query string parameters be forwarded through a proxy_pass with nginx? – Stack Overflow
问题描述
1)访问 http://example.com/a/foo/auth 地址,则反向代理到 http://127.0.0.1:8443/foo/auth 地址
1)访问 http://example.com/b/foo/auth 地址,则反向代理到 http://127.0.0.1:8993/foo/auth 地址
解决方法
server { listen 80; server_name example.com; location /a/ { # 注意,一定要使用 http://127.0.0.1:8443/ 而不是 http://127.0.0.1:8443,否则 传递的 URL 将携带 /a/ 前缀 # 参考文档对 proxy_pass 的描述(是否携带 URI 的区别) proxy_pass http://127.0.0.1:8443/; # 传递请求头(默认) proxy_pass_request_headers on; # 传递请求提(默认) proxy_pass_request_body on; } location /b/ { proxy_pass http://127.0.0.1:8993/; } location / { return 404; } }
当然,还有其他配置方法,比如 rewrite 或 正则表达式匹配 location 等等。
注意事项,如果在 location 中使用正则表达式匹配的方式,需要自行处理 GET 参数问题。如下配置:
server { ... location ~ ^/a/(.*)$ { proxy_pass http://127.0.0.1:7011/$1$is_args$args; } ... }
场景:反向代理 WebSocket 连接
map $http_upgrade $connection_upgrade { default upgrade; '' close; } upstream websocket { server localhost:8282; # appserver_ip:ws_port } server { server_name test.enzhico.net; listen 443 ssl; location / { proxy_pass http://websocket; proxy_read_timeout 300s; proxy_send_timeout 300s; 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_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; } ssl_certificate /etc/letsencrypt/live/test.enzhico.net/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/test.enzhico.net/privkey.pem; }
场景:反向代理 HTTPS 服务
nginx as reverse proxy with upstream SSL – Server Fault
... server { location / { proxy_pass https://backend.server.ip/; proxy_ssl_trusted_certificate /etc/nginx/sslcerts/backend.server.pem; # 关闭证书检查 proxy_ssl_verify off; } ...
参考文献
DNS for Service Discovery with NGINX and NGINX Plus
NGINX Reverse Proxy
nginx反向代理配置