Skip to main content

10.反向代理服务器

将NGINX配置为HTTP和其他协议的反向代理,支持修改请求标头和微调响应缓冲。 代理通常用于在多个服务器之间分配负载,无缝显示来自不同网站的内容,或通过 HTTP 以外的协议将处理请求传递给应用程序服务器。

将请求传递到代理服务器(Passing a Request to a Proxied Server)

当NGINX代理请求时,它会将请求发送到指定的代理服务器,获取响应,然后将其发送回客户端。可以使用指定的协议将请求代理到HTTP服务器(另一个NGINX服务器或任何其他服务器)或非HTTP服务器(可以运行使用特定框架(如PHP或Python)开发的应用程序)。支持的协议包括FastCGIuwsgiSCGImemcached

若要将请求传递到 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指令:

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;
}

配置缓冲区(Configuring Buffers)

默认情况下,NGINX缓冲来自代理服务器的响应。响应存储在内部缓冲区中,在收到整个响应之前不会发送到客户端。缓冲有助于优化慢速客户端的性能,如果响应从 NGINX 同步传递到客户端,这可能会浪费代理服务器时间。但是,当启用缓冲时,NGINX允许代理服务器快速处理响应,而NGINX存储响应的时间与客户端下载它们所需的时间一样长。

负责启用和禁用缓冲的指令是proxy_buffering。默认情况下,它设置为 on并启用缓冲。

proxy_buffers 指令控制为请求分配的缓冲区的大小和数量。来自代理服务器的响应的第一部分存储在单独的缓冲区中,缓冲区的大小由 proxy_buffer_size 指令设置。此部分通常包含一个相对较小的响应标头,并且可以使其小于其余响应的缓冲区。

在以下示例中,将增加默认缓冲区数,并使响应第一部分的缓冲区大小小于默认值。

location /some/path/ {
proxy_buffers 16 4k; #proxy_buffers number size;
proxy_buffer_size 2k;
proxy_pass http://localhost:8000;
}

设置用于从代理服务器读取单个连接响应的缓冲区 numbersize。默认情况下,缓冲区大小等于一个内存页。根据平台不同,缓冲区大小为4K或8K。

如果禁用了缓冲,则在客户端从代理服务器接收响应时,响应将同步发送到客户端。对于需要尽快开始接收响应的快速交互式客户端,可能需要此行为。

若要在特定location禁用缓冲,请将 proxy_buffering 指令放在带有 off参数的location中,如下所示:

location /some/path/ {
proxy_buffering off;
proxy_pass http://localhost:8000;
}

在这种情况下,NGINX仅使用proxy_buffer_size配置的缓冲区来存储响应的当前部分。

反向代理的常见用途是提供负载平衡。在免费的《选择软件负载均衡器的五个理由》电子书中了解如何通过快速部署来提高功耗、性能并专注于您的应用。

选择传出 IP 地址

如果您的代理服务器有多个网络接口,有时您可能需要选择特定的源 IP 地址来连接到代理服务器或upstream。如果 NGINX 后面的代理服务器配置为接受来自特定 IP 网络或 IP 地址范围的连接,这可能很有用。

指定 proxy_bind 指令和所需网络接口的 IP 地址:

location /app1/ {
proxy_bind 127.0.0.1;
proxy_pass http://example.com/app1/;
}

location /app2/ {
proxy_bind 127.0.0.2;
proxy_pass http://example.com/app2/;
}

IP 地址也可以使用变量指定。例如,$server_addr 变量传递接受请求的网络接口的 IP 地址:

location /app3/ {
proxy_bind $server_addr;
proxy_pass http://example.com/app3/;