这篇文章介绍了一个代理服务器的基本配置。你将学习到如何通过不同的协议,从NGINX传递一个请求到一个代理服务器,修改传递到代理服务器的客户端的请求头,以及配置从代理服务器来的响应缓冲。
介绍
代理典型的应用场景是在多个服务器之间的流量负载,无缝显示来自不同网站的展示内容,或者是通过HTTP协议之外的请求将请求传递到应用服务器。
传递一个Request到Proxy服务器
当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下的所有请求传递给给定地址对应的代理服务器。这个地址可以是domain,也可以是IP address。这个地址也可以包含端口号。
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服务器
注意在这些例子中,为地址赋值的规则可能不同。你也许需要传递额外的参数给服务器。(查阅reference文档获取更多细节)。
proxy_pass指令将指向一个服务器named group。在这个例子中,组内的服务器会根据特定的方法去分发。
传递请求头
默认情况下,NGINX重定义了2个代理请求的报文头,"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;
}
配置缓冲
默认情况下,NGINX可以从各个代理服务器缓冲响应。一个响应可以被储存在内部缓冲,而且直到整个响应收到以后才会被发送给客户端。Buffering帮助优化了慢客户端的性能,如果响应从NGINX传递到客户端是以同步的方式传递,它会浪费代理服务器的时间。然而,当缓冲允许NGINX使得代理服务器快速处理响应的时候,NGINX会预先存储响应一段时间,为client下载做准备。
开启关闭缓冲的指令是proxy_buffering。默认情况下它会被设为on,缓冲未开启状态。
proxy_buffers指令控制分配给buffer的size和number。代理服务器响应的第一部分会被存储在一个分离的缓冲,缓冲的size会在proxy_buffer_size设置。这一部分通常包含了一个相对较小的响应头,而且对于剩余的响应也会更小。
在下面这例子中,默认的buffer数在增长,而且响应第一部分的buffer区大小比默认的更小。
location /some/path/ {
proxy_buffers 16 4k;
proxy_buffer_size 2k;
proxy_pass http://localhost:8000;
}
如果buffering被关闭了,当它接收到来自代理服务器的响应时,它将被同步发送到客户端。对于需要快速用户响应的客户端来说这是必须的。
为了禁用buffering,将proxy_buffering指令设置为off即可。
location /some/path/ {
proxy_buffering off;
proxy_pass http://localhost:8000;
}
在这个例子中,NGINX唯一使用了proxy_buffer_size去存储响应的一部分。
另外一份反向代理的使用场景就是负载均衡。可以去看 Five Reasons to Choose a Software Load Balancer电子书。
选择一个输出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/;
}