nginx反向代理
Nginx反向代理
Nginx的工作模式是通知机制,nginx一个进程可以派生出多个线程,依赖线程给用户提供服务的,一个线程的并发连接请求最大是65535,所以nginx可以提供大量的并发连接请求,但是nginx不如apache稳定,而apache的最大连接请求是1000。如果nginx结合apache共同为用户提供请求的话,效果会事半功倍,nginx做反向代理,把用户的请求转发给后方的apache,然后把apache发回的结果转交给用户。如果是单纯的使用反向代理的话,每秒的并发连接请求数并不高,还没有直接访问nginx的并发连接请求多,只是可以提供大量的请求,请求数变多,但效率变低了。
反向代理的语法:proxy_passURL;
例子1:
在同一局域网中,前端的nginx服务器所在的linux系统的ip地址是192.168.20.200,后方的apache的地址是192.168.20.100.
默认值:—
上下文:location,ifinlocation,limit_except
server{
listen80;
server_namewww.abc.com;
#charsetkoi8-r;
#access_loglogs/host.access.logmain;
location/{
roothtml;
indexindex.phpindex.htmlindex.htm;
proxy_passhttp://192.168.20.100;
}
例子2:
server{
listen80;
server_namewww.abc.com;
#charsetkoi8-r;
#access_loglogs/host.access.logmain;
location/name/{
proxy_passhttp://127.0.0.1/remote/;
}
设置后端服务器的协议和地址,还可以设置可选的URI以定义本地路径和后端服务器的映射关系。这条指令可以设置的协议是“http”或者“https”,而地址既可以使用域名或者IP地址加端口(可选)的形式来定义:
proxy_passhttp://localhost:8000/uri/;
又可以使用UNIX域套接字路径来定义。该路径接在“unix”字符串后面,两端由冒号所包围,比如:
proxy_passhttp://unix:/tmp/backend.socket:/uri/;
如果解析一个域名得到多个地址,所有的地址都会以轮转的方式被使用。当然,也可以使用服务器组来定义地址。
请求URI按下面规则传送给后端服务器:
?如果proxy_pass使用了URI,当传送请求到后端服务器时,规范化以后的请求路径与配置中的路径的匹配部分将被替换为指令中定义的URI:
location/name/{
proxy_passhttp://127.0.0.1/remote/;
}
?如果proxy_pass没有使用URI,传送到后端服务器的请求URI一般客户端发起的原始URI,如果nginx改变了请求URI,则传送的URI是nginx改变以后完整的规范化URI:
location/some/path/{
proxy_passhttp://127.0.0.1;
}
在1.1.12版以前,如果proxy_pass没有使用URI,某些情况下,nginx改变URI以后,会错误地将原始URI而不是改变以后的URI发送到后端服务器。
某些情况下,无法确定请求URI中应该被替换的部分:
?使用正则表达式定义路径。
这种情况下,指令不应该使用URI。
?在需要代理的路径中,使用rewrite指令改变了URI,但仍使用相同配置处理请求(break):
location/name/{
rewrite/name/([^/]+)/users?name=$1break;
proxy_passhttp://127.0.0.1;
}
这种情况下,本指令设置的URI会被忽略,改变后的URI将被发送给后端服务器。
后端服务器的地址,端口和URI中都可以使用变量:
proxy_passhttp://$host$uri;
甚至像这样:
proxy_pass$request;
这种情况下,后端服务器的地址将会在定义的服务器组中查找。如果查找不到,nginx使用resolver来查找该地址。
为反向代理增加缓
语法:proxy_cache_pathpath[levels=levels]keys_zone=name:size[inactive=time][max_size=size][loader_files=number][loader_sleep=time][loader_threshold=time];
1,proxy_cache_pathpath
上下文:http
设置缓存的路径和其他参数。缓存数据是保存在文件中的,缓存的键和文件名都是在代理URL上执行MD5的结果。levels参数定义了缓存的层次结构。比如,下面配置
proxy_cache_path/data/nginx/cachelevels=1:2keys_zone=one:10m;
把缓存的东西放在/data/nginx/cache这个目录下面,缓存的目录级别一级目录二级目录,开辟的内存空间10M,用于存放被缓存的数据的符号连接、innod。
2,语法:proxy_set_headerfieldvalue;
默认值:proxy_set_headerHost$proxy_host;proxy_set_headerConnectionclose;
上下文:http,server,location
允许重新定义或者添加发往后端服务器的请求头。value可以包含文本、变量或者它们的组合。当且仅当当前配置级别中没有定义proxy_set_header指令时,会从上面的级别继承配置。默认情况下,只有两个请求头会被重新定义:
proxy_set_headerHost$proxy_host;
proxy_set_headerConnectionclose;
如果不想改变请求头“Host”的值,可以这样来设置:
proxy_set_headerHost$http_host;
3,语法:proxy_cachezone|off;
默认值:proxy_cacheoff;
上下文:http,server,location
指定用于页面缓存的共享内存。同一块共享内存可以在多个地方使用。off参数可以屏蔽从上层配置继承的缓存功能。
4,语法:proxy_cache_valid[code...]time;
默认值:—
上下文:http,server,location
为不同的响应状态码设置不同的缓存时间。比如,下面指令
proxy_cache_valid20030210m;响应状态码是200302的数据被缓存10分钟
proxy_cache_valid4041m;响应状态码是404的数据被缓存10分钟
设置状态码为200和302的响应的缓存时间为10分钟,状态码为404的响应的缓存时间为1分钟。
如果仅仅指定了time,
proxy_cache_valid5m;
那么只有状态码为200、300和302的响应会被缓存。
如果使用了any参数,那么就可以缓存任何响应:
proxy_cache_valid20030210m;
proxy_cache_valid3011h;
proxy_cache_validany1m;
缓存参数也可以直接在响应头中设定。这种方式的优先级高于使用这条指令设置缓存时间。“X-Accel-Expires”响应头可以以秒为单位设置响应的缓存时间,如果值为0,表示禁止缓存响应,如果值以@开始,表示自1970年1月1日以来的秒数,响应一直会被缓存到这个绝对时间点。如果不含“X-Accel-Expires”响应头,缓存参数仍可能被“Expires”或者“Cache-Control”响应头设置。如果响应头含有“Set-Cookie”,响应将不能被缓存。这些头的处理过程可以使用指令proxy_ignore_headers忽略。
5,语法:proxy_cache_use_staleerror|timeout|invalid_header|updating|http_500|http_502|http_503|http_504|http_404|off...;
默认值:proxy_cache_use_staleoff;
上下文:http,server,location
如果后端服务器出现状况,nginx是可以使用过期的响应缓存的。这条指令就是定义何种条件下允许开启此机制。这条指令的参数与proxy_next_upstream指令的参数相同。
例子
http{
proxy_cache_path/data/nginx/cachelevels=1:2keys_zone=STATIC:10minactive=24hmax_size=1g;
Server{
listen80;
server_namewww.abc.com;
location/{
proxy_set_headerHOST$host;
proxy_cacheSTATIC;
proxy_cache_valid2001d;
proxy_cache_use_staleerrortimeoutinvalid_headerupdatinghttp_500http_502http_503http_504;
}
}
}
Nginx所在的主机eth0ip地址192.168.20.200eth1ip地址192.168.30.200
后端的apache服务器的地址是192.168.30。100
压力测试:nginx做缓存测试并发连接请求
Nginx做反向代理和缓存
ab-c100-n1000http://192.168.20.200/
hisisApacheBench,Version2.0.40-dev<$Revision:1.146$>apache-2.0
Copyright1996AdamTwiss,ZeusTechnologyLtd,http://www.zeustech.net/
Copyright2006TheApacheSoftwareFoundation,http://www.apache.org/
Benchmarking192.168.20.200(bepatient)
Completed100requests
Completed200requests
Completed300requests
Completed400requests
Completed500requests
Completed600requests
Completed700requests
Completed800requests
Completed900requests
Finished1000requests
ServerSoftware:nginx/1.0.11
ServerHostname:192.168.20.200
ServerPort:80
DocumentPath:/
DocumentLength:273bytes
ConcurrencyLevel:100
Timetakenfortests:1.122019seconds1000次连接请求是消耗1.1222019秒
Completerequests:1000
Failedrequests:0
Writeerrors:0
Totaltransferred:441000bytes
HTMLtransferred:273000bytes
Requestspersecond:891.25[#/sec](mean)
Timeperrequest:112.202[ms](mean)100次并发连接请求是112毫秒
Timeperrequest:1.122[ms](mean,acrossallconcurrentrequests)
Transferrate:383.24[Kbytes/sec]received
ConnectionTimes(ms)
minmean[+/-sd]medianmax
Connect:04930.148120
Processing:28577.65970
Waiting:02515.22657
Total:4710732.1105185
Percentageoftherequestsservedwithinacertaintime(ms)
50%105
66%123
75%133
80%139
90%153
95%160
98%169
99%176
100%185(longestrequest)
Nginx不做反向代理,直接访问后端的nginx服务器
测试并发连接请求
ab-c100-n1000http://192.168.30.100/
ThisisApacheBench,Version2.0.40-dev<$Revision:1.146$>apache-2.0
Copyright1996AdamTwiss,ZeusTechnologyLtd,http://www.zeustech.net/
Copyright2006TheApacheSoftwareFoundation,http://www.apache.org/
Benchmarking192.168.30.100(bepatient)
Completed100requests
Completed200requests
Completed300requests
Completed400requests
Completed500requests
Completed600requests
Completed700requests
Completed800requests
Completed900requests
Finished1000requests
ServerSoftware:Apache/2.4.4
ServerHostname:192.168.30.100
ServerPort:80
DocumentPath:/
DocumentLength:273bytes
ConcurrencyLevel:100
Timetakenfortests:17.770227seconds1000次请求一共消耗17秒多
Completerequests:1000
Failedrequests:0
Writeerrors:0
Totaltransferred:458000bytes
HTMLtransferred:273000bytes
Requestspersecond:56.27[#/sec](mean)
Timeperrequest:1777.023[ms](mean)100次并发连接请求是1.7秒多
Timeperrequest:17.770[ms](mean,acrossallconcurrentrequests)
Transferrate:25.15[Kbytes/sec]received
ConnectionTimes(ms)
minmean[+/-sd]medianmax
Connect:027.5052
Processing:2714021529.38159240
Waiting:2613991526.08149239
Total:2814041531.68159266
Percentageoftherequestsservedwithinacertaintime(ms)
50%815
66%1221
75%1681
80%2176
90%3001
95%3716
98%7517
99%7976
100%9266(longestrequest)
所以根据压力测试,nginx在做反向代理时开启缓存功能,在接受相同的的并发连接请求时要比直接请求nginx服务器的快17倍还多。