代理通常用于在多个服务器之间分配负载,无缝显示来自不同网站的内容,或通过 HTTP
以外的协议将处理请求传递给应用程序服务器。
当 NGINX
代理请求时,它会将请求发送到指定的代理服务器,获取响应,并将其发送回客户端。可以使用指定的协议将请求代理到HTTP
服务器(另一个NGINX
服务器或任何其他服务器)或非HTTP
服务器(可以运行使用特定框架开发的应用程序,例如PHP
或Python
)。支持的协议包括 FastCGI
、uwsgi
、SCGI
和 memcached
。
若要将请求传递给 HTTP 代理服务器,请在位置内指定 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
中与 location
参数匹配的部分。例如,此处带有 /some/path/page.html URI
的请求将被代理到 http://www.example.com/link/page.html
。如果指定地址时没有 URI
,或者无法确定要替换的 URI
部分,则会传递完整的请求 URI
(可能已修改)。
要将请求传递到非 HTTP
代理服务器,应使用适当的 **_pass
指令:
fastcgi_pass
将请求传递给 FastCGI 服务器uwsgi_pass
将请求传递给 uWSGI 服务器scgi_pass
将请求传递给 SCGI 服务器memcached_pass
将请求传递给 memcached 服务器请注意,在这些情况下,指定地址的规则可能会有所不同。您可能还需要将其他参数传递给服务器(有关详细信息,请参阅参考文档)。
proxy_pass
指令还可以指向一组命名的服务器。在这种情况下,请求将按照指定的方法分布在组中的服务器之间。
案例1:使用http://localhost:8085
的IP
加端口代理访问百度配置如下:
访问效果如下:
案例2:使用http://localhost:8085/image
的IP
加端口代理访问http://127.0.0.1:8084/image
下的文件目录列表配置如下:
访问效果如下:
当访问http://localhost:8085/image
时,nginx
会自动代理访问http://127.0.1.1:8084
并且会将/image URI
拼接在路径后面,完整路径就是http://127.0.0.1:8084\image
.
默认情况下,NGINX
重新定义了代理请求中的两个标头字段,即 Host
和 Connection
,并删除了值为空字符串的标头字段。Host
设置为变量 $proxy_host ,Connection
设置为 close
。
若要更改这些设置以及修改其他标头字段,请使用 proxy_set_header
指令。可以在某个位置或更高位置指定此指令。它也可以在特定的服务器上下文或 http
块中指定。例如:
location /some/path/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://localhost:8000;
}
在此配置中,Host
字段设置为$host
变量
若要防止将标头字段传递到代理服务器,请将其设置为空字符串,如下所示:
location /some/path/ {
proxy_set_header Accept-Encoding "";
proxy_pass http://localhost:8000;
}
默认情况下,NGINX
会缓冲来自代理服务器的响应。响应存储在内部缓冲区中,在收到整个响应之前不会发送到客户端。缓冲有助于优化慢速客户端的性能,如果响应从 NGINX
同步传递到客户端,这可能会浪费代理服务器时间。但是,启用缓冲后,NGINX
允许代理服务器快速处理响应,而 NGINX
将响应存储与客户端下载响应所需的时间一样长。
负责启用和禁用缓冲的指令是 proxy_buffering
。默认情况下,它设置为并 on
启用缓冲。
proxy_buffers
指令控制为请求分配的缓冲区的大小和数量。来自代理服务器的响应的第一部分存储在单独的缓冲区中,其大小由 proxy_buffer_size
指令设置。此部分通常包含相对较小的响应标头,并且可以小于响应其余部分的缓冲区。
在以下示例中,将增加默认缓冲区数,并且响应第一部分的缓冲区大小小于默认值。
location /some/path/ {
proxy_buffers 16 4k;
proxy_buffer_size 2k;
proxy_pass http://localhost:8000;
}
如果禁用缓冲,则在客户端从代理服务器接收响应时,响应将同步发送到客户端。对于需要尽快开始接收响应的快速交互式客户端,此行为可能是可取的。
若要在特定位置禁用缓冲,请将 proxy_buffering
指令放在带有参数 off
的位置,如下所示:
location /some/path/ {
proxy_buffering off;
proxy_pass http://localhost:8000;
}
在这种情况下,NGINX
仅使用 proxy_buffer_size
配置的缓冲区来存储响应的当前部分。
如果代理服务器具有多个网络接口,则有时可能需要选择特定的源 IP
地址来连接到代理服务器或上游。如果将 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/;
}
案例1:限制只能192.168.0.111
IP可进行访问到http://localhost:9090/
时,可以使用proxy_bind
指令进行限制。
浏览器访问效果如下: