nginx反向代理
英文原文:https://www.nginx.com/resources/admin-guide/reverse-proxy/
本文描述了代理服务器的基本配置。你将学会怎样使用各种协议把一个请求从NGINX转发到代理服务器、怎样修改发送给代理服务器的客户端请求头,以及怎样为来自代理服务器的请求响应配置缓存。
目录
- 介绍
- 转发请求到代理服务器
- 转发请求头
- 配置缓存
- 选择输出IP
介绍
代理通常用来把负载分发到若干服务器,由不同的网站无缝地提供内容,或者经由非HTTP的其它协议转发请求到应用服务器做处理。
转发请求到代理服务器
当NGINX代理请求时,NGINX把请求发送给指定的代理服务器——获取到请求结果——把结果返回给客户端。请求可能被发送给HTTP服务器(另一个NGINX服务或者其它HTTP服务器),也可能通过特定的协议发送给非HTTP服务(运行基于特定框架开发的应用服务,例如PHP、Python)。支持的协议包括FastCGI、uwsgi、SCGI和memcached。
为了把一个请求转发到HTTP代理服务器,将proxy_pass指令添加到location里面。例如:
|
|
这个配置示例会使所有由该location处理的请求转发到指定地址的代理服务器。这里的地址可以指定为一个域名或是一个IP,地址也可以带上端口:
|
|
注意到在第一个示例中,代理服务器的地址后面是一个URI:/link/。如果地址中指定了该URI,那么它会替换掉原始请求URI中与location参数匹配的部分。例如,这里的原始请求URI包含/some/path/page.html,转发的请求会替换成http://www.example.com/link/page.html。如果地址中没有指明URI,或者无法判断需要替换请求URI的哪部分,则会转发完整的请求(可能被修改过)。
为了把一个请求转发到非HTTP代理服务器,必须使用适当的**_pass指令:
- fastcgi_pass 转发请求到FastCGI服务器
- uwsgi_pass 转发请求到uwsgi服务器
- scgi_pass 转发请求到SCGI服务器
- memcached_pass 转发请求到memcached服务器
请注意,在这些情况下,指定地址的规则可能会有所不同。你可能还需要将附加参数传递到服务器(请参见参考文档的更多细节)。
proxy_pass指令也可以指向一组命名服务器。在这种情况下,请求按照指定的方式被分发到组中的服务器。
转发请求头
NGINX默认会重新定义代理请求中的两个header字段:Host和Connection,并且去除值为空字符串的字段。Host设置为$proxy_host变量,Connection设置为close。
如果要修改这些设置,或者修改其它header字段,就需要用到proxy_set_header指令。这条指令可以放在location或更高一级的位置,此外也可以放在特定的server上下文或者http块中,例如:
|
|
在这个配置中,Host字段被设置成$host变量。
为了防止一个header字段被传递给代理服务器,可以将其设置为空字符串:
|
|
配置缓存
在默认情况下,NGINX会缓存来自代理服务器的响应。响应会存储在内部缓冲区中,直到接收到完整的数据才将响应内容发送给客户端,这样就有助于优化与慢客户端之间的交互体验,反之,如果响应以同步的方式从NGINX服务器发送给客户端,将会对代理服务器造成浪费。当启用缓存,NGINX允许代理服务器迅速地处理响应(而无须等待客户端接收),与此同时NGINX存储响应数据以保证客户端有充足的时间下载。
负责启用和禁用缓存的指令是proxy_buffering。默认情况下它被设置为on:启用缓存。
proxy_buffers指令控制分配给一个请求的缓冲区大小和数量。来自代理服务器的第一份响应数据被存储在单独的缓冲区,这块缓冲区的大小由proxy_buffer_size指令指定。该缓冲区通常包含相对较小的响应header以及剩余可以可以被塞进缓冲区的响应数据。
在下面的例子中,缓冲区的默认数量被加大了,并且第一份响应数据的缓冲区大小小于默认的缓冲区大小。
|
|
如果缓存被禁用,NGINX一旦接收到来自代理服务器的响应将会同步地发送给客户端。对要求尽可能实时的快速交互式客户端来说这种方式是可取的。
如果要禁用特定location中的缓存,则将location中的proxy_buffering设置为off,例如:
|
|
在这种情况下,NGINX仅使用由proxy_buffer_size配置的缓存区来存储当前响应数据。
反向代理的一个常见用途是提供负载平衡。阅读电子书 Five Reasons to Choose a Software Load Balancer,了解如何提高性能、专注快速部署你的应用。
选择输出IP
如果你的代理服务器有多个网络接口,有时候你可能需要选择一个特定的源IP用于连接到代理服务器或上游服务器(upstream)。当NGINX后端的代理服务器配置为接受来自特定IP网络或IP地址范围的连接时,这样是设置是很有用处的。
指定proxy_bind指令和必要的网络接口的IP地址:
|
|
也可以用一个变量来指定IP地址。例如,$var_server_addr变量表示接收客户端请求的网络接口的IP地址:
|
|