1. 介绍
代理通常用于在几台服务器之间分配负载,无缝显示来自不同网站的内容或通过除HTTP之外的协议将处理请求传递给应用服务器。
2. 将请求传递到代理服务器
当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中与location参数匹配的部分。例如,此处带有/some/path/page.htmlURI 的请求将被代理到http://www.example.com/link/page.html。如果指定的地址没有URI,或者无法确定URI的要替换的部分,则将传递完整的请求URI。
要将请求传递到非HTTP代理服务器,应使用适当的**_pass指令:
- fastcgi_pass 将请求传递给FastCGI服务器
- uwsgi_pass 将请求传递给uwsgi服务器
- scgi_pass 将请求传递给SCGI服务器
- memcached_pass 将请求传递到内存缓存服务器
请注意,在这些情况下,用于指定地址的规则可能会有所不同。您可能还需要将其他参数传递给服务器。
该proxy_pass指令还可以指向一组命名的服务器。在这种情况下,请求将根据指定的方法在组中的服务器之间分配。
3. 传递请求报头
默认情况下,NGINX在代理请求中重新定义两个标头字段“Host”和“ Connection”,并消除其值为空字符串的标头字段。“Host”设置为$proxy_host变量,“Connection”设置为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”字段设置为$host变量。
为了防止将报头字段传递给代理服务器,请按以下步骤将其设置为空字符串:
location /some/path/ {
proxy_set_header Accept-Encoding "";
proxy_pass http://localhost:8000;
}
4. 配置缓冲区(Buffers)
默认情况下,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;
}
如果禁用了缓冲,则从代理服务器接收到的响应同步发送到客户端。对于需要尽快开始接收响应的快速交互客户端,此行为是可取的。
要在特定location禁用缓冲,请将proxy_buffering指令参数设置为off,如下所示:
location /some/path/ {
proxy_buffering off;
proxy_pass http://localhost:8000;
}
在这种情况下,NGINX仅使用proxy_buffer_size配置的缓冲区来存储响应的当前部分。
反向代理的常见用法是提供负载平衡。
5. 选择外发IP地址
如果代理服务器具有多个网络接口,有时您可能需要选择特定的源IP地址以连接到被代理的服务器或upstream服务器。如果NGNIX背后的被代理的服务器被配置为接受来自特定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/;
}
参考文档
https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/