Nginx 详解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx 详解 相关的知识,希望对你有一定的参考价值。
13、反向代理模块
(1)、常用指令:
l proxy_connect_timeout:nginx将一个请求发送至upstream server之前等待的最大时长;
l proxy_cookie_domain:将upstreamserver通过Set-Cookie首部设定的domain属性修改为指定的值,其值可以为一个字符串、正则表达式的模式或一个引用的变量;
l proxy_cookie_path: 将upstream server通过Set-Cookie首部设定的path属性修改为指定的值,其值可以为一个字符串、正则表达式的模式或一个引用的变量;
l proxy_hide_header:设定发送给客户端的报文中需要隐藏的首部;
l proxy_pass:指定将请求代理至upstreamserver的URL路径;
l proxy_set_header:将发送至upsreamserver的报文的某首部进行重写;
l proxy_redirect:重写location并刷新从upstream server收到的报文的首部;
l proxy_send_timeout:在连接断开之前两次发送至upstreamserver的写操作的最大间隔时长;
例:
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 30;
proxy_send_timeout 15;
proxy_read_timeout 15;
(2)、proxy_pass 指令详解及案例
使用格式:
location / {
proxy_pass http://192.168.61.88/;
注意:这里backserver/最后面的/,要和location /的一致,有就要加上
}
这里location有2个例外:
n 当使用模式匹配,例~* xxx ,这里的uri就会补在http://back/后面
n 使用了url重定向rewrite的话,nginx将使用重定向后的uri补在http://back/后面
例1:
除了整个网站的代理,也可以代理一部分:
location /bbs/ {
proxy_pass http://192.168.61.88/bbs/;
}
例2:
特定后缀名反代,只要是jpeg结尾的都代理到后端服务器
location ~*\.(jpeg|gif)$ {
proxy_pass http://192.168.61.88;
}
注意:这个场景中\.(jpeg|gif)$ 这个uri是没有任何意义的,后端服务器只能保留服务器端地址,不然会出错。匹配到什么都会
原封不动补在服务器地址http://192.168.61.88后
例3:
还可以在location里面再嵌套一个location,某网站案例是这样写的
location / {
location /bbs {
。。。
}
}
例4:
在nginx中配置proxy_pass时,如果是按照^~匹配路径时,要注意proxy_pass后的url最后的/,当加上了/,相当于是绝对根路径,
则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走。
location ^~/static_js/
{
proxy_cache js_cache;
proxy_set_header Hostjs.test.com;
proxy_pass http://js.test.com/;
}
如上面的配置,如果请求的url是http://servername/static_js/test.html
会被代理成http://js.test.com/test.html
而如果这么配置
location ^~ /static_js/
{
proxy_cache js_cache;
proxy_set_header Hostjs.test.com;
proxy_pass http://js.test.com;
}
则会被代理到http://js.test.com/static_js/test.htm
当然,我们可以用如下的rewrite来实现/的功能
location ^~/static_js/
{
proxy_cache js_cache;
proxy_set_header Hostjs.test.com;
rewrite/static_js/(.+)$ /$1 break;
proxy_pass http://js.test.com;
}
例5:
在nginx中配置proxy_pass时,当在后面的url加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;
如果没有/,则会把匹配的路径部分也给代理走。
下面四种情况分别用http://192.168.1.4/proxy/test.html 进行访问。
第一种:
location /proxy/ {
proxy_pass http://127.0.0.1:81/;
}
会被代理到http://127.0.0.1:81/test.html 这个url
第二种(相对于第一种,最后少一个 /)
location /proxy/ {
proxy_pass http://127.0.0.1:81;
}
会被代理到http://127.0.0.1:81/proxy/test.html 这个url
第三种:
location /proxy/ {
proxy_pass http://127.0.0.1:81/ftlynx/;
}
会被代理到http://127.0.0.1:81/ftlynx/test.html 这个url。
第四种情况(相对于第三种,最后少一个 / ):
location /proxy/ {
proxy_passhttp://127.0.0.1:81/ftlynx;
}
会被代理到http://127.0.0.1:81/ftlynxtest.html 这个url
(3)、反代上游服务器记录客户端真实IP
向后端发送一些客户端的信息方法:
location /bbs/ {
proxy_passhttp://192.168.61.88/bbs/;
proxy_set_headerHost $host;
向后端发送客户端请求首部中的host信息
proxy_set_headerX-Real-IP $remote_addr;
向后端发送客户端的IP
}
proxy_set_header X-Real-IP $remote_addr;
这里发送了客户端的IP,后端服务器的日志记录格式也要做出一点修改才能把这个传过来的IP记录下来,以httpd的日志为例:
vim /etc/httpd/conf/httpd.conf
定位LogFormat第一行%h改为%{X-Real-IP}i 即可
注意:当后端服务器有多个虚拟主机,必须要加上proxy_set_headerHost $host; 把Host信息给后端虚拟主机做判断
(4)、前后端使用长连接和短连接的意义
模型:客户端----》Nginx反向代理----》后端服务器
l 客户端到nginx,这里一般都使用长连接,如果nginx上的缓存有客户端想要的内容,直接就返回给客户端了,没必要再把nginx到后端服务器之间做长连接浪费资源。所以就有proxy_version这个选项,可以对nginx和后端服务器之间指定1.0版本不支持长连接,节省资源
14、缓存
要使用缓存功能,安装的时候要启用才可以哦,这样./configure --add-module=../ngx_cache_purge-2.3
l nginx反向代理到后端服务器之间也可以使用https通信,但要1.7.8版本以后才支持。它有众多的proxy_ssl_xxxxx选项可用
l nginx反向代理可以通过缓存来加速客户端的访问,对应有proxy_cache_xxxx一系列设置指令。
l nginx的缓存用的是键值存储,键放在内存,值放在磁盘上。
l 缓存只能在http段定义,但可在http、server、location使用
proxy_cache指令
例:
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m max_size=5000m
levels=1:2 ,:表示左边1级,该级用1个字符表示,右边2级,该级2个字符表示,如果还有3级就多加一个:表示.
keys_zone指定内存中的名称和大小10m
max_size表示使用多大的缓存空间
例,缓存后的数据存放格式:
/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c
l 什么情况下要缓存?默认GET HEAD,一般不会对Post缓存
proxy_cache_methodsGET HEAD;
l 某个请求被响应多少次才缓存下来?
语法: proxy_cache_min_uses number;
默认1分钟: proxy_cache_min_uses 1;
可用于:http, server, location
l proxy_cache_purge
#用于清除缓存,假设一个URL为http://my.domain.com/test.gif,通过访问http://my.domain.com/purge/test.gif可以清除该
URL的缓存
使用方法:
(a)、先在http段定义一个缓存区和路径,只能在http段定义,例:
proxy_temp_path/data0/proxy_temp_path;
proxy_cache_path/data0/proxy_cache_path levels=1:2 keys_zone=cache_one:200m inactive=1dmax_size=30g;
(b)、再到server段中添加相应的location启用这个缓存区,例如这里针对一些文件的缓存:
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$
{
#使用web缓存区cache_one
proxy_cache cache_one;
#对不同http状态码缓存设置不同的缓存时间
proxy_cache_valid 200304 12h;
proxy_cache_valid 301302 1m;
proxy_cache_valid any1m;
#设置web缓存的key值,nginx根据key值md5哈希存储缓存,这里根据“域名、URI、参数”组合成key
proxy_cache_key$host$uri$is_args$args;
}
(c)、再设置一个用于清除缓存的URL
location ~ /purge(/.*)
{
#设置只允许指定的IP或IP段才可以清除URL缓存
allow 127.0.0.1;
allow 192.168.0.0/16;
deny all;
proxy_cache_purgecache_one $host$uri$is_args$args;
}
l proxy_cache_revalidate on | off
是否对过期的缓存内容重新做检验:
例如客户端请求一个数据,缓存里面发现存在数据,但已经过期,它会再询问服务器端缓存数据是否有改变,没改变的话只需更改
过期时间,不用再重新传输
l proxy_cache_use_stale error|timeout|invalid_header|http_500.....
如果缓存有相应的数据,但时间过期了,恰好后端服务器又故障不能访问了,这时应该怎么办?这里就是对应的设置
l proxy_cache_valid [code ...] time
每一种响应码的缓存时长
缓存时间设定?不用后端服务器定义的缓存时间? 通过后端服务器的响应码。这个选项还不明白具体意思
例:
proxy_cache_valid 200302 10m;
proxy_cache_valid301 1h;
proxy_cache_validany 1m;
l proxy_cache_bypass string
string可以为:$cookie_nocache,$arg_nocache,$http_authorization
设置哪种情况下不从缓存拿数据,例如用户的私人信息,cookie等
l proxy_connect_timeout 600;
nginx重新封装客户端发送到后端服务器的过期时间,发起握手等候响应超时时间
l proxy_read_timeout 600;
连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理
l proxy_send_timeout 600;
后端服务器数据回传时间_就是在规定时间内后端服务器必须传完所有的数据
l proxy_hide_header
nginx重新封装取得的内容返回给客户端时,需要隐藏的头部信息
l proxy_pass_request_header on |off
proxy_pass_request_bodyon | off
这两项说明是否把客户端请求的头部或实体原封不动的发送到后端服务器
l proxy_buffers 4 32k;
接受后端服务器内容的缓存,这里指4段缓存空间,每段32k
l proxy_buffer_size 16k;
代理请求缓存区_这个缓存区间会保存用户的头信息供nginx进行规制处理_一般只要能保存下头信息即可
l proxy_busy_buffers_size 64k;
如果系统很忙的时候可以申请更大的proxy_buffers官方推荐*2
l proxy_temp_file_write_size 64k;
缓存临时文件的大小
l proxy_next_upstream http_502 http_504 error timeout invalid_header;
如果后端的服务器返回502/504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移
l 一个缓存使用案例,只写了必须的,其余内容省略:
...
http
{
#注意:proxy_temp_path和proxy_cache_path指定的路径必须在同一分区
proxy_temp_path/data0/proxy_temp_path;
#设置web缓存区名称为cache_one,内存缓存空间大小为500MB,自动清除超过1天没有被访问的缓存数据,硬盘缓存空间大小为30GB
proxy_cache_path/data0/proxy_cache_path levels=1:2 keys_zone=cache_one:200m inactive=1dmax_size=30g;
server
{
listen 80;
server_name dx.com;
location /
{
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://my_server_pool;
}
location ~.*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$
{
#使用web缓存区cache_one
proxy_cache cache_one;
#对不同http状态码缓存设置不同的缓存时间
proxy_cache_valid 200 304 12h;
proxy_cache_valid 301 302 1m;
proxy_cache_valid any 1m;
#设置web缓存的key值,nginx根据key值md5哈希存储缓存,这里根据“域名、URI、参数”组合成key
proxy_cache_key $host$uri$is_args$args;
#反向代理
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For$remote_addr;
proxy_pass http://my_server_pool;
}
#用于清除缓存,假设一个URL为http://my.domain.com/test.gif,通过访问http://my.domain.com/purge/test.gif可
以清除该URL的缓存
& 以上是关于Nginx 详解 的主要内容,如果未能解决你的问题,请参考以下文章