Nginx反向代理

  • 来源:新网
  • 更新日期:2018-04-18

摘要:代理通常用于分发负载给多个服务器,从不同网站无缝显示内容,传递请求给能处理HTTP之外的应用服务器。

代理通常用于分发负载给多个服务器,从不同网站无缝显示内容,传递请求给能处理HTTP之外的应用服务器。

t01b32658b22580b330.jpg

1 传递请求给代理服务器

当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_pass http://127.0.0.1:8000;

}

 

注意,上面的第一个例子,代理服务器的地址后面跟随一个URI /link/。如果指定URI地址,它替

换匹配location参数的请求URI部分。例如,请求URI /some/path/page.html将代理到http:

//www.example.com/link/page.html。如果地址没有指定URI,或不可能决定URI部分替

换,完整URI被传递(可能,修改)。

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

fastcgi_pass传递一个请求给FastGGI服务器。

uwsgi_pass传递一个请求给一个uwsgi服务器。

scgi_pass传递一个请求个SCGI服务器。

memcached_pass传递一个请求给memcached服务器。

注意,在这些例子中,指定地址的规则可能有些不同。你也可能需要传递额外参数给服务器。

proxy_pass指令也能指向服务器组的名称。在这种情况下,请求根据指定的方法分发请求给组中

的服务器。

2 传递请求头

默认,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;

}

3 配置缓存

默认,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中禁用缓存,在location中设置proxy_buffering指令为off:

location /some/path/ {

proxy_buffering off;

proxy_pass http://localhost:8000;

}

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

4 选择流出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/;

}