第六节——NGINX反向代理

阅读:314 2019-03-19 15:01:21 来源:新网

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

当nginx代理一个请求时,发送请求给指定代理服务器,获取响应,返回给客户端。可以代理请求给http服务器(另一个nginx服务器或任意其它服务器)或使用特定协议的非http服务器(运行使用特定框架开发的应用,例如,php或python)。支持协议包括,fastcgi、uwsgi、scgi和memcached。

为了传递请求给http代理服务器,在location指令中指定proxy_pass指令,例如:

location/some/path/{proxy_passhttp://www.example.com/link/;}

该示例配置导致传入该location处理的所有请求传递到指定地址的代理服务器。地址可以使用域名或ip地址指定。地址可以包括端口:

location~.php{proxy_passhttp://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指令:

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

proxy_pass指令也可以指向已命名的服务器组。在这种情况下,请求在组中的服务器之间分发。

默认,nginx在代理请求中重新定义两个头字段“host”和“connection”,删除值为空字符串的头字段。“host”设置为$proxy_host变量,“connection”设置为close。

为了改变设置,使用proxy_set_header指令修改其它头字段。该指令可以在location上下文中指定。也可以在特定server上下文或http上下文中指定。例如:

location/some/path/{proxy_set_headerhost$host;proxy_set_headerx-real-ip$remote_addr;proxy_passhttp://localhost:8000;}

在该配置中,“host”字段设置为$host变量。

为了防止一个头字段传入代理服务器,设置该头字段为空串:

location/some/path/{proxy_set_headeraccept-encoding"";proxy_passhttp://localhost:8000;}4配置缓存

默认,nginx缓存代理服务器的响应。响应存储在内部缓存,直到响应完全接收才会发送到客户端。缓存有助于优化慢客户端性能,如果响应传入nginx同步到客户端会浪费代理服务器时间。然而,当nginx启用缓存时,nginx允许代理服务器快速处理响应,而nginx存储响应,客户端只需多次下载。

proxy_buffering指令负责启用和禁用缓存。默认设置为on,启用缓存。

proxy_buffers指令控制为请求分配的缓存大小和数量。代理服务器响应的第一部分存储在单独的缓存中,使用proxy_buffer_size指令设置该缓存大小。这部分通常包含一个相当小的响应头,响应剩下部分可能小于缓存。

在下面例子中,默认缓存数增加和响应的第一部分缓存的大小小于默认。

location/some/path/{proxy_buffers164k;proxy_buffer_size2k;proxy_passhttp://localhost:8000;}

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

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

location/some/path/{proxy_bufferingoff;proxy_passhttp://localhost:8000;}

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

如果代理服务器有多个网络接口,有时可能需要选择特定源ip地址连接到代理服务器或上游。如果代理服务器配置在nginx后面接收来自特定ip网络或ip地址范围的连接。

指定proxy_bind指令和必要的网络接口的ip地址:

location/app1/{proxy_bind127.0.0.1;proxy_passhttp://example.com/app1/;}location/app2/{proxy_bind127.0.0.2;proxy_passhttp://example.com/app2/;}

ip地址也可以使用变量指定。例如,$server_addr变量传入接收请求的网络接口的ip地址:

location/app3/{proxy_bind$server_addr;proxy_passhttp://example.com/app3/;}

下一篇: Nginx反向代理
相关文章
{{ v.title }}
{{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
你可能感兴趣
推荐阅读 更多>
推荐商标

{{ v.name }}

{{ v.cls }}类

立即购买 联系客服