第六节——NGINX反向代理

  • 作者:新网
  • 来源:新网
  • 2018-03-20 01:09:48

代理通常用于在多个服务器之间分发负载、无缝从不同网站显示内容或基于HTTP之外的协议传递请求处理应用服务器。

1 介绍

代理通常用于在多个服务器之间分发负载、无缝从不同网站显示内容或基于HTTP之外的协议传递请求处理应用服务器。

t01b1e2680efe77e567.jpg

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和地址一起指定,替换请求匹配location参数的URI。例如,请求/some/path/page.html被代理到http://www.example.com/link/page.html。如果地址没有指定URI,或不能决定URI替换的部分,传入完整URI。

为了传递请求到一个非HTTP代理服务器,应该使用适当的**_pass指令:

fastcgi_pass:传递请求到FastCGI服务器。 uwsgi_pass:传递请求到uwsgi服务器。 scgi_pass:传递请求到SCGI服务器。 memcached:传递请求到memcached服务器。

注意,在这些情况下,指定地址可能有不同规则。可能也需要传递额外参数给服务器。

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 配置缓存

默认,NGINX缓存代理服务器的响应。响应存储在内部缓存,直到响应完全接收才会发送到客户端。缓存有助于优化慢客户端性能,如果响应传入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; }

如果缓存禁用,当NGINX从代理服务器接收响应时同步发送到客户端。该行为可能适合需要快速交互的客户端。

为了禁用特定location的缓存,在location中设置proxy_buffering指令为off参数:

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

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

5 选择出站IP地址

如果代理服务器有多个网络接口,有时可能需要选择特定源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/; }

 

免责声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,也不承认相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,请发送邮件至:operations@xinnet.com进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

免费咨询获取折扣