10.反向代理服务器
将NGINX配置为HTTP和其他协议的反向代理,支持修改请求标头和微调响应缓冲。 代理通常用于在多个服务器之间分配负载,无缝显示来自不同网站的内容,或通过 HTTP 以外的协议将处理请求传递给应用程序服务器。
将请求传递到代理服务器(Passing a Request to a Proxied Server)
当NGINX代理请求时,它会将请求发送到指定的代理服务器,获取响应,然后将其发送回客户端。可以使用指定的协议将请求代理到HTTP服务器(另一个NGINX服务器或任何其他服务器)或非HTTP服务器(可以运行使用特定框架(如PHP或Python)开发的应用程 序)。支持的协议包括FastCGI,uwsgi,SCGI和memcached。
若要将请求传递到 HTTP 代理服务器,请在location内指定 proxy_pass 指令。例如:
location /some/path/ {
proxy_pass http://www.example.com/link/;
}
此示例配置导致将在此location处理的所有请求传递到指定地址的代理服务器。此地址可以指定为域名或 IP 地址。该地址还可能包括一个端口:
location ~ \.php {
proxy_pass http://127.0.0.1:8000;
}
请注意,在上面的第一个示例中,代理服务器的地址后跟一个 URI /link/。如果 URI 与地址一起指定,它将替换请求 URI 中与位置参数匹配的部分。例如,此处带有 /some/path/page.html URI 的请求将代理为 http://www.example.com/link/page.html 。如果在没有 URI 的情况下指定地址,或者无法确定要替换的 URI 部分,则会传递完整的请求 URI(可能修改)If the address is specified without a URI, or it is not possible to determine the part of URI to be replaced, the full request URI is passed (possibly, modified).。
要将请求传递到非 HTTP 代理服务器,应使用适当的 **_pass指令:
- fastcgi_pass将请求传递给 FastCGI 服务器
- uwsgi_pass将请求传递给 UWSGI 服务器
- scgi_pass将请求传递给 SCGI 服务器
- memcached_pass将请求传递给 memcached 服务器
proxy_pass 指令还可以指向命名(named group)的服务器组。在这种情况下,请求根据指定的方法在组中的服务器之间分配。
传递请求标头(Passing Request Headers)
默认情况下,NGINX 重新定义了代理请求中的两个标头字段“主机”和“连接”(“Host” and “Connection”),并删除了值为空字符串的标头字段。“主机”设置为 $proxy_host变量,“连接”设置为 close 。
若要更改这些设置以及修改其他标头字段,请使用 proxy_set_header 指令。可以在某个location或更高级别指定此指令。也可以在特定的server上下文或 http 块中指定它。例如:
location /some/path/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://localhost:8000;
}
在此配置中,“主机”字段设置为 $host 变量。
若要防止将标头字段传递到代理服务器,请将其设置为空字符串,如下所示:
location /some/path/ {
proxy_set_header Accept-Encoding "";
proxy_pass http://localhost:8000;
}