原文发表于cu:2016-08-25php
参考文档:html
本文针对Nginx几个经常使用特性作简单验证(高手请略过),经过简单的验证熟悉配置。nginx
CentOS-7-x86_64-Everything-1511web
Nginx-1.11.3: http://nginx.org/download/nginx-1.11.3.tar.gz 正则表达式
安装配置请见:http://www.javashuo.com/article/p-zogfgooc-e.html算法
web1: vim
[root@e84e8f6ba866 ~]# echo "<h1>Welcome to test site web1!</h1>" > /usr/local/nginx/html/index.html 后端
web2: 浏览器
[root @56f610597bcd ~]# echo "<h1>Welcome to test site web2!</h1>" > /usr/local/nginx/html/index.html 缓存
指令:proxy_pass
语法:proxy_pass URL
使用字段:location字段
#URL能够是被代理服务器的ip地址,ip地址+端口或者被映射的url
#被代理服务器暂时设置web1; #重要:从新加载nginx配置文件,从新加载以前能够经过” /usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf”测试配置文件修改是否正确 [root@localhost ~]# cd /usr/local/nginx/conf/ [root@localhost conf]# vim nginx.conf location / { proxy_pass http://172.19.200.241; } [root@localhost conf]# service nginx reload
方式1:经过浏览器访问代理服务器,返回结果是web1的测试页面,以下:
方式2:经过curl命令访问代理服务器,返回结果是web1的测试页面,以下:
[root@localhost ~]# curl http://x.140.246.55
#从访问日志看到,客户端ip都是nginx代理服务器的后端ip,后端web服务器并无捕获到真实客户端ip [root@e84e8f6ba866 ~]# cd /usr/local/nginx/logs/ [root@e84e8f6ba866 logs]# tail -f access.log 172.19.200.215 - - [24/Aug/2016:09:20:49 +0000] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" 172.19.200.215 - - [24/Aug/2016:09:20:49 +0000] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" 172.19.200.215 - - [24/Aug/2016:09:20:52 +0000] "GET / HTTP/1.0" 200 36 "-" "curl/7.29.0" 172.19.200.215 - - [24/Aug/2016:09:20:53 +0000] "GET / HTTP/1.0" 200 36 "-" "curl/7.29.0"
#”proxy_set_header X-Real-IP $remote_addr”指令将发送到被代理服务器的请求头从新定义或者增长一些字段;此值能够是一个文本,变量或它们的组合; #proxy_set_header在指定的字段中没有定义时会从它的上级字段继承。 [root@localhost ~]# cd /usr/local/nginx/conf/ [root@localhost conf]# vim nginx.conf location / { proxy_set_header X-Real-IP $remote_addr; proxy_pass http://172.19.200.241; } [root@localhost conf]# service nginx reload
#”set_real_ip_from IP”指令在http字段内,但在server字段以外,IP为nginx代理服务器可访问到后端web服务器的地址。 [root@e84e8f6ba866 ~]# cd /usr/local/nginx/conf/ [root@e84e8f6ba866 conf]# vim nginx.conf set_real_ip_from 172.19.200.215; [root@e84e8f6ba866 conf]# service nginx reload
#在客户端使用curl命令访问代理服务器,查看后端web服务器访问日志; #从访问日志看到,后端web服务器已捕获到真实客户端ip [root@e84e8f6ba866 logs]# tail -f access.log
upstream是Nginx的HTTP Upstream模块,此模块经过一个简单的调度算法来实现客户端ip到后端服务器的负载均衡。
每一个请求按时间顺序逐一分配到不一样的后端服务器,若是后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。能够经过weight 指定轮询权值,weight值越大,分配到的访问机率越高,主要用于后端每一个服务器性能不均的状况下。
每一个请求按访问ip的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,可有效解决动态网页存在的session共享问题。
比上面两个更加智能的负载均衡算法。此算法能够依据页面大小和加载时间长短智能地进行负载均衡,即根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx自己不支持fair,若是须要使用这种调度算法,必须下载Nginx的upstream_fair模块。
此方法按访问url的hash结果来分配请求,使每一个url定向到同一个后端服务器,可进一步提升后端缓存服务器的效率。Nginx自己不支持url_hash,若是须要使用这种调度算法,必须安装Nginx 的hash软件包。
在upstream模块中,能够在每一个后端服务器后设置负载均衡调度中的状态。经常使用的状态有:
表示当前的server暂时不参与负载均衡。
预留的备份机器,当其余全部的非backup机器出现故障或者忙的时候,才会请求backup机器,所以这台机器的压力最轻。
容许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
在经历了max_fails次失败后,暂停服务的时间,max_fails能够和fail_timeout一块儿使用。
[root@localhost ~]# cd /usr/local/nginx/conf/ #upstream模块在http字段内, server模块以外;upstream指定的负载均衡名可自定义,后面location字段中”proxy_pass”指令调用自定义的负载均衡名便可; #weight值默承认不用配置,若是后端服务器性能不均,能够经过weight值负载调度; #能够经过backup状态参数预留备份服务器; #默认使用轮询调度算法,若是使用ip_hash调度算法,后端服务器的负载均衡调度状态不能是backup [root@localhost conf]# vim nginx.conf upstream test.backend { # ip_hash; server 172.19.200.241 weight=1; server 172.19.200.242 weight=1; # server 127.0.0.1:8080 backup; } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { proxy_set_header X-Real-IP $remote_addr; proxy_pass http://test.backend; } } [root@localhost conf]# service nginx reload
采用curl命令访问代理服务器,交替返回web1与web2的测试页面,以下:
[root@localhost ~]# date ; curl http://x.140.246.55
指令:proxy_cache_path
语法:proxy_cache_path path [levels=number] keys_zone=zone_name:zone_size [inactive=time] [max_size=size];
使用字段:http字段,server字段以外
#指令指定缓存的路径和一些其余参数,缓存的数据存储在文件中,缓存文件使用代理url的哈希值做为关键字与文件名;
#levels参数指定指定目录结构,指定缓存的子目录数,能够使用任意的1位或2位数字做为目录结构,但最多只能是三级目录,格式如X, X:X,或X:X:X,转换为指令如"2", "2:2", "1:1:2"等;
#全部活动的key和元数据存储在共享的内存池中,这个区域用keys_zone参数指定。共享池的名称自定义,共享池的大小可用"m"表明单位;内存池的大小按照缓存页面数的比例进行设置,一个页面(文件)的元数据大小按照操做系统来定,如FreeBSD/i386下为64字节,FreeBSD/amd64下为128字节;
#inactive参数指定缓存超时时间,指定时间内没有被请求的数据则删除,默认inactive为10分钟;
#一个名为cache manager的进程控制磁盘的缓存大小,它被用来删除不活动的缓存与控制缓存大小,这些都在max_size参数中定义,当目前缓存的值超出max_size指定的值以后,超过其大小后最少使用数据(LRU替换算法)将被删除。
指令:proxy_cache
语法:proxy_cache zone_name;
使用字段:http, server, location
#设置一个缓存区域的(自定义)名称,一个相同的区域能够在不一样的地方使用;
#缓存指令依赖代理缓冲区(buffers),若是proxy_buffers设置为off,缓存不会生效。
指令:proxy_cache_valid
语法: proxy_cache_valid reply_code [reply_code …] time;
使用字段: http, server, location
#为不一样的应答设置不一样的缓存时间,如:"proxy_cache_valid 200 302 10m;"
即应答代码为200和302时,设置缓存时间为10分钟;
#若是只定义时间:如:"proxy_cache_valid 5m;" 那只对代码为200, 301和302的应答进行缓存;
#能够使用any参数应答,如:" proxy_cache_valid any 1m;"
若是不在代理服务器的配置文件中配置页面缓存变量,则验证时查看结果不方便。
服务器地址,在完成一次系统调用后可肯定这个值;若是要绕开系统调用,则必须在listen中指定地址而且使用bind参数。
MISS:未命中
EXPIRED – expired:请求被传送到后端
UPDATING – expired:因为proxy/fastcgi_cache_use_stale正在更新,将使用旧的应答
STALE – expired:因为proxy/fastcgi_cache_use_stale超期,后端将获得过时的应答
HIT:命中
[root@localhost ~]# cd /usr/local/nginx/conf/ #缓存路径自定义,注意key_zone定义的共享内存池与location字段中”proxy_cache”对应; #两个”add_header”指令增长了头部,如不设置,验证时不方便查看结果; #”proxy_buffering”若是是”off”,则缓存不生效 [root@localhost conf]# vim nginx.conf proxy_cache_path /usr/local/nginx/cache/testcache levels=1:2 keys_zone=testcache:20m max_size=1g; upstream test.backend { # ip_hash; server 172.19.200.241; server 172.19.200.242; # server 127.0.0.1:8080 backup } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; add_header X-Via $server_addr; add_header X-Cache $upstream_cache_status; location / { proxy_set_header X-Real-IP $remote_addr; proxy_pass http://test.backend; # proxy_buffering off; proxy_cache testcache; proxy_cache_valid 200 10m; } } #在”proxy_cache_path”中定义的路径须要补充完整,并赋予权限 [root@localhost conf]# mkdir -p /usr/local/nginx/cache/testcache [root@localhost conf]# chown www:www /usr/local/nginx/cache [root@localhost conf]# service nginx reload
采用浏览器访问代理服务器,F5不断刷新,返回web2(或者web1)的测试页面,以下:
重写模块Rewrite容许使用正则表达式从新URI,但须要PCRE库的支持,而且可根据相关变量重定向和选择不一样的配置。
若是rewrite指令在server字段中指定,那么将在被请求的location肯定以前执行;若是在指令执行后所选择的location中有其余的重写规则,那么指令也被执行。若是在location中执行这个指令产生了新的URI,那么location又一次肯定了新的URI,这样的循环可最多执行10次,超出后nginx将返回500错误。
重定向验证方案:将客户端到web1上的请求重定向到web2。
设计:
[root@localhost ~]# cd /usr/local/nginx/conf/ [root@localhost conf]# vim nginx.conf upstream test.backend { # ip_hash; server 172.19.200.241 weight=1; # server 172.19.200.242 weight=1; # server 127.0.0.1:8080 backup } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { proxy_set_header X-Real-IP $remote_addr; proxy_pass http://test.backend; } [root@localhost conf]# service nginx reload
[root@e84e8f6ba866 ~]# cd /usr/local/nginx/conf/ [root@e84e8f6ba866 conf]# vim nginx.conf location / { root html; index index.html index.htm index.php; rewrite ^/ http://172.19.200.242; } [root@e84e8f6ba866 conf]# service nginx reload