nginx反向代理

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;

}

}

173531799.png

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倍还多。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章