Nginx做为反向代理服务器时转发请求的流程
客户端请求处理
-
- 当客户端请求来时,Nginx并不会马上转发到上游服务器,而是想完整的接收到Nginx所在的服务器,
- 而后再把缓存的客户端的请求转发到上游服务器。
- 优缺点
- 缺点:请求处理延迟
- 优势:下降上游服务器的负载
- 因为网络,以及TCP分包的缘由;一个大的数据包,极可能须要多个TCP链接来接受,这样若是一接受到就转发,那么传完一个请求就须要多个TCP链接,对并发性提出考验。
- Nginx先把整个请求都放到本身的内存或硬盘中,等待这个请求的全部包都过来了,而后一次性 传到上游服务器,这样下降了对上游服务器的并发要求,并且由Nginx于上游服务器时内网,传输速度更快。
使用场景
非模式匹配定义--uri 不带入上游
location /bbs {
proxy_pass http://www.magedu.com:8080/;
}
访问 www.localhost.com/bbs -->
代理到 www.mageedu.com:8080/
模式匹配定义--
uri带入上游
若是location的URI是经过模式匹配定义的,其URI将直接被传递至上游服务器,而不能为其指定转换的另外一个URI。
location ^~ /bbs {
proxy_pass http://www.magedu.com;
}
访问: www.localhost.com/bbs
代理到 www.mageedu.com/bbs
注意:此时的上游服务器是不容许有URI 的,不然URL都无效 转至上游服务器的主页;
而若是使用正则表达式的URI如 ~ ~* 此时上游服务器带URI则报错
具体报错
"proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except"
重定向--使用重定向URI 替代反向代理URI
若是在loation中使用的URL重定向,那么nginx将使用重定向后的URI处理请求,而再也不考虑上游服务器上定义的URI。
以下面所示的例子中,传送给上游服务器的URI为/index.php?page=<match>,而不是/index。.
location / {
rewrite /(.*)$ /index.php?page=$1 break;
proxy_pass www.mageedu.com:8080/index;
}
访问: www.localhost.com/index.php
代理到 www.mageedu.com:8080/index.php?page=$1
proxy模块指令
- proxy_connect_timeout
- nginx将一个请求发送至upstream server以前等待的最大时长;
- proxy_cookie_domain:
- 将upstream server经过Set-Cookie首部设定的domain属性修改成指定的值,
- 其值能够为一个字符串、正则表达式的模式或一个引用的变量;
- proxy_cookie_path:
- 将upstream server经过Set-Cookie首部设定的path属性修改成指定的值,
- 其值能够为一个字符串、正则表达式的模式或一个引用的变量;
- proxy_hide_header:
- proxy_pass:
- 指定将请求代理至upstream server的URL路径;
- proxy_set_header:
- 将发送至upsream server的报文的某首部进行重写;
- proxy_redirect:
- 重写location并刷新从upstream server收到的报文的首部;
- proxy_send_timeout:
- 在链接断开以前两次发送至upstream server的写操做的最大间隔时长;
- proxy_read_timeout:
- 在链接断开以前两次从接收upstream server接收读操做的最大间隔时长;
反向代理性能优化
在反向代理场景中,nginx有一系列指令可用于定义其工做特性,如缓冲区大小等,给这些指令设定一个合理的值,能够有效提高其性能。
缓冲区设定
nginx在默认状况下在将其响应给客户端以前会尽量地接收来自upstream服务器的响应报文,它会将这些响应报文存暂存于本地并尽可能一次性地响应给客户端。
然而,在来自于客户端的请求或来自upsteam服务器的响应过多时,nginx会试图将之存储于本地磁盘中,这将大大下降nginx的性能。
所以,在有着更多可用内存的场景中,应该将用于暂存这些报文的缓冲区调大至一个合理的值。
- proxy_buffer_size size
- 设定用于暂存来自于upsteam服务器的第一个响应报文的缓冲区大小;
- proxy_buffering on|off:
- 启用缓冲upstream服务器的响应报文,
- 不然,若是proxy_max_temp_file_size指令的值为0,来自upstream服务器的响应报文在接收到的那一刻将同步发送至客户端;
- 通常状况下,启用proxy_buffering并将proxy_max_temp_file_size设定为0可以启用缓存响应报文的功能,并可以避免将其缓存至磁盘中;
- proxy_buffers 8 4k|8k
- 用于缓冲来自upstream服务器的响应报文的缓冲区大小;