剖析Nginx 高级用法

Nginx除了众所周之的可以搭建很好的LNMP平台外,它还提供了许多其他高级功能,如反向代理,url重写等。现在就剖析Nginx的深层功能。

安装nginx

  1. # yum -y install pcre-devel  //nginx要用到的包 
  2. # groupadd -r nginx 
  3. # useradd -r -g nginx -s /sbin/nologin 
  4. #tar xf nginx-1.0.14.tar.gz 
  5. # ./configure \ 
  6.   --prefix=/usr \ 
  7.   --sbin-path=/usr/sbin/nginx \ 
  8.   --conf-path=/etc/nginx/nginx.conf \ 
  9.   --error-log-path=/var/log/nginx/error.log \ 
  10.   --http-log-path=/var/log/nginx/access.log \ 
  11.   --pid-path=/var/run/nginx/nginx.pid  \ 
  12.   --lock-path=/var/lock/nginx.lock \ 
  13.   --user=nginx \ 
  14.   --group=nginx \ 
  15.   --with-http_ssl_module \ 
  16.   --with-http_flv_module \ 
  17.   --with-http_stub_status_module \ 
  18.   --with-http_gzip_static_module \ 
  19.   --http-client-body-temp-path=/var/tmp/nginx/client/  
  20.   --http-proxy-temp-path=/var/tmp/nginx/proxy/ \ 
  21.   --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \ 
  22.   --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \ 
  23.   --http-scgi-temp-path=/var/tmp/nginx/scgi \ 
  24.   --with-pcre 
  25. # make && make  install

为nginx提供服务脚本

  1. #!/bin/sh 
  2. # nginx - this script starts and stops the nginx daemon 
  3. # chkconfig:   - 85 15  
  4. # description:  Nginx is an HTTP(S) server, HTTP(S) reverse \ 
  5. #               proxy and IMAP/POP3 proxy server 
  6. # processname: nginx 
  7. # config:      /etc/nginx/nginx.conf 
  8. # config:      /etc/sysconfig/nginx 
  9. # pidfile:     /var/run/nginx.pid 
  10.   
  11. # Source function library. 
  12. . /etc/rc.d/init.d/functions 
  13.   
  14. # Source networking configuration. 
  15. . /etc/sysconfig/network 
  16.   
  17. # Check that networking is up. 
  18. [ "$NETWORKING" = "no" ] && exit 0 
  19.   
  20. nginx="/usr/sbin/nginx" 
  21. prog=$(basename $nginx) 
  22.   
  23. NGINX_CONF_FILE="/etc/nginx/nginx.conf" 
  24.   
  25. [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx 
  26.   
  27. lockfile=/var/lock/subsys/nginx 
  28.   
  29. make_dirs() { 
  30.    # make required directories 
  31.    user=`nginx -V 2>&1 | grep "configure arguments:" | 
  32. sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -` 
  33.    options=`$nginx -V 2>&1 | grep 'configure arguments:'` 
  34.    for opt in $options; do 
  35.        if [ `echo $opt | grep '.*-temp-path'` ]; then 
  36.            value=`echo $opt | cut -d "=" -f 2` 
  37.            if [ ! -d "$value" ]; then 
  38.                # echo "creating" $value 
  39.                mkdir -p $value && chown -R $user $value 
  40.            fi 
  41.        fi 
  42.    done 
  43.   
  44. start() { 
  45.     [ -x $nginx ] || exit 5 
  46.     [ -f $NGINX_CONF_FILE ] || exit 6 
  47.     make_dirs 
  48.     echo -n $"Starting $prog: " 
  49.     daemon $nginx -c $NGINX_CONF_FILE 
  50.     retval=$? 
  51.     echo 
  52.     [ $retval -eq 0 ] && touch $lockfile 
  53.     return $retval 
  54.   
  55. stop() { 
  56.     echo -n $"Stopping $prog: " 
  57.     killproc $prog -QUIT 
  58.     retval=$? 
  59.     echo 
  60.     [ $retval -eq 0 ] && rm -f $lockfile 
  61.     return $retval 
  62.   
  63. restart() { 
  64.     configtest || return $? 
  65.     stop 
  66.     sleep 1 
  67.     start 
  68.   
  69. reload() { 
  70.     configtest || return $? 
  71.     echo -n $"Reloading $prog: " 
  72.     killproc $nginx -HUP 
  73.     RETVAL=$? 
  74.     echo 
  75.   
  76. force_reload() { 
  77.     restart 
  78.   
  79. configtest() { 
  80.   $nginx -t -c $NGINX_CONF_FILE 
  81.   
  82. rh_status() { 
  83.     status $prog 
  84.   
  85. rh_status_q() { 
  86.     rh_status >/dev/null 2>&1 
  87.   
  88. case "$1" in 
  89.     start) 
  90.         rh_status_q && exit 0 
  91.         $1 
  92.         ;; 
  93.     stop) 
  94.         rh_status_q || exit 0 
  95.         $1 
  96.         ;; 
  97.     restart|configtest) 
  98.         $1 
  99.         ;; 
  100.     reload) 
  101.         rh_status_q || exit 7 
  102.         $1 
  103.         ;; 
  104.     force-reload) 
  105.         force_reload 
  106.         ;; 
  107.     status) 
  108.         rh_status 
  109.         ;; 
  110.     condrestart|try-restart) 
  111.         rh_status_q || exit 0 
  112.             ;; 
  113.     *) 
  114.         echo $"Usage: $0 {start|stop|status|restart|
  115. condrestart|try-restart|reload|force-reload|configtest}" 
  116.         exit 2 
  117. esac 
  118. #chmod +x /etc/rc.d/init.d/nginx
  119. #chkconfig --add nginx
  120. #chkconfig nginx on
  121. #service nginx start //启动服务

一、Nginx---反向代理服务

 

所用有关服务器:

Nginx服务器:192.168.0.100

Web服务器:  192.168.0.11

 

在配置nginx反向代理服务之前,先说说什么是反向代理。反向代理其实就是以代理服务器来接受Internet连接请求,然后,再把请求转发给真正的服务器来响应。

  1. 编辑nginx服务器的配置文件 
  2.  location / { 
  3.   proxy_pass        http://192.168.0.11 //代理服务器的地址 
  4.   } 

在Web服务器上

  1. 首先安装httpd提供Web服务  
  2. #service httpd start  
  3. #echo "<h1>192.168.0.11</h1>> /var/www/html/index.html  

此时访问http://192.168.0.100,查看结果。

请求成功的转发到了web服务器上。反向代理服务器工作正常。

二、为反向代理启用缓存功能

反向代理虽然保证了web服务器资源的安全性,但转发过程却降低了请求的响应速度。因此开启缓存功能尤为重要。下面通过两组数据对比来展现缓存的优越性。以上述例子为例。

在其他服务器上对http://192.168.0.100/index.html做压力测试。

#ab -n 10000 -c 500 http://192.168.0.100

在开启缓存服务前

每秒可平均处理152.17个请求,每个请求的平均响应时间约为3.3s。

配置nginx反向代理的缓存功能

  1. 编辑nginx服务的配置文件 
  2. http { 
  3.   proxy_cache_path /var/www/cache levels=1:2 keys_zone=mycache:20m   
  4.      max_size=2048m inactive=60m;  levels:缓存级别 keys_zone保存了元数据,
  5. 名字为mycache,大小为20M 缓存数据最大为2G  
  6.   proxy_temp_path /var/www/cache/tmp; 
  7.   ... 
  8.     location / { 
  9.       proxy_pass http://192.168.0.100/; 
  10.       proxy_cache mycache; 
  11.       proxy_cache_valid 200 302 60m;
  12.       proxy_cache_valid 404 1m; 
  13.     } 
  14.   } 
  15. #service nginx restart

此时再次测试网页访问压力

此时的每秒可平均处理612.27个请求,每个请求的平均响应时间为0.8s。对比可知缓存大大减少了响应时间。

三、反向代理多台服务器实现负载均衡

实验所需,此时再添加一台Web服务器。地址为:192.168.0.66

  1. #echo "<h1>192.168.0.66</h1>> /var/www/html/index.html 

在nginx服务上

  1. 编辑配置文件 
  2. upstream cluster {  
  3.     server 192.168.0.11 weight=1;  
  4.         server 192.168.0.66 weight=2
  5.    } 
  6. //使用upstream声明一组可以被proxy_pass引用的服务器,weight指定权重,
  7. cluser是定义的名字 
  8. server{ 
  9.      listen       80; 
  10.         server_name  localhost; 
  11.         location / { 
  12.         proxy_pass  http://cluster; 
  13.         } 
  14. }   
  15. #service nginx restart

访问服务:

 

轮询响应成功。

四、URL重写

url重写使用的格式为:rewrite  regex  replacement  flag

rewrite是关键字,regex是需要重定向的内容,replacement是重定向后的格式,flag表示以什么的方法重写。

flag有四种格式:

last:匹配规则后再次对全部规则进行匹配

这种方法有时会产生死循环,如

 rewrite ^/images/(.*\.jpg)$ http://192.168.0.100/images/$1 last

break:匹配后不再匹配后面的规则

redirect:临时重定向标识,http协议代码为302

permanent:永久重定向标识,http协议代码为301

 

rewrite还支持if指令,用法为:

    if (condition) { ... }

条件可以是:

(1)变量名; false values are: empty string ("", or any string starting with "0";)

(2)对于变量进行的比较表达式,可使用=或!=进行测试;

(3)正则表达式的模式匹配:

      ~  区分大小的模式匹配

     ~* 不区分字母大小写的模式匹配

     !~ 和 !~* 分别对上面的两种测试取反

(4)测试文件是否存在-f或!-f

(5)测试目录是否存在-d或!-d

(6)测试目录、文件或链接文件的存在性-e或!-e

(7)检查一个文件的执行权限-x或!-x

 

在正则表达式中,可以使用圆括号标记匹配到的字符串,并可以分别使用$1,$2,...,$9进行引用

还是以例子说明吧。

如果用户请求的页面不存在,实现自定义跳转。

  1. 编辑nginx配置文件 
  2.  location / { 
  3.          root   html; 
  4.          index  index.html index.htm; 
  5.          if (!-f $request_filename) { 
  6.          rewrite ^(/.*)$  /error.html permanent; 
  7.      } 
  8. #echo "ERROR" > /usr/html/error.html  
  9. #service nginx restart 

此时在浏览中输入一个不存在网页,如:http://192.168.0.100/aa.html

此时服务器自动跳转到了error.html页面上。url重写成功。

那么我们如何将访问forum站点的请求重定向到bbs站点上呢?

  1. 编辑配置文件 
  2.  location / { 
  3.          root   html; 
  4.          index  index.html index.htm; 
  5.          rewrite ^/forum/(.*)$  http://bbs/$1  last; 
  6. #cd /usr/html 
  7. #mkdir bbs 
  8. #cd bbs 
  9. #vim index.html 
  10. This is BBS page 
  11. #service nginx restart 

访问http://192.168.0.100/forum/

访问页面为bbs站点的内容,url重写成功。

五、安装配置第三方模块,实现upstream中对后端http server的健康状态检测

要实现此功能需额外的功能模块对nginx打补丁。

下载地址:https://github.com/cep21/healthcheck_nginx_upstreams,模块名称为ngx_http_healthcheck_module

在此使用的模块为healthcheck_nginx_upstreams.zip。须注意的是此模块适用于nginx的1.0版本,若nginx版本过高则需要其他的模块。

  1. #unzip healthcheck_nginx_upstreams.zip 
  2. 解压后的文件为cep21-healthcheck_nginx_upstreams-16d6ae7 
  3. #mv cep21-healthcheck_nginx_upstreams-16d6ae7 health  
  4. # tar xf nginx-1.0.14.tar.gz 
  5. # cd nginx-1.0.14 
  6. # patch -p1 < /root/health/nginx.patch  //对nginx大补丁 
  7. #./configure \    //重新编译nginx 
  8.   --prefix=/usr \ 
  9.   --sbin-path=/usr/sbin/nginx \ 
  10.   --conf-path=/etc/nginx/nginx.conf \ 
  11.   --error-log-path=/var/log/nginx/error.log \ 
  12.   --http-log-path=/var/log/nginx/access.log \ 
  13.   --pid-path=/var/run/nginx/nginx.pid  \ 
  14.   --lock-path=/var/lock/nginx.lock \ 
  15.   --user=nginx \ 
  16.   --group=nginx \ 
  17.   --with-http_ssl_module \ 
  18.   --with-http_flv_module \ 
  19.   --with-http_stub_status_module \ 
  20.   --with-http_gzip_static_module \ 
  21.   --http-client-body-temp-path=/var/tmp/nginx/client/ \ 
  22.   --http-proxy-temp-path=/var/tmp/nginx/proxy/ \ 
  23.   --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \ 
  24.   --with-pcre \ 
  25.   --add-module=/root/nginx/health  //添加选项 
  26. # make && make install 

编辑配置文件

  1. upstream cluster { 
  2.    server 192.168.0.11 weight=1; //集群服务器 
  3.    server 192.168.0.66 weight=2
  4.     healthcheck_enabled; //启用检查功能 
  5.     healthcheck_delay 1000;//检查节点的间隔 
  6.     healthcheck_timeout 1000;//超时时间 
  7.     healthcheck_failcount 3;//允许的检查失败的次数 
  8.     healthcheck_send "GET /.health.html HTTP/1.0"; //检查页面 
  9.     } 
  10.     server { 
  11.         listen       80; 
  12.         server_name  localhost; 
  13.         location / {       
  14.         proxy_pass  http://cluster; 
  15.         } 
  16.         location /status {   //显示后端服务器状态 
  17.           healthcheck_status; 
  18.         } 
  19.   }     
  20. #service nginx start 
  21.   
  22. 在192.168.0.11服务器上  
  23. #echo "OK" > /var/www/html/.health.html
  24. 在192.168.0.66 #echo "OK" > /var/www/html/.health.html            

访问页面http://192.168.0.100发现轮询服务正常。打开http://192.168.0.100/status

状态显示两服务器工作正常。

在192.168.0.11上执行service httpd stop停止Web服务。再次刷新页面:

状态发生改变。而且此时访问http://192.168.0.100会发现页面只能定义在66节点上。

此时从新启动192.168.0.11的Web服务,一切又恢复正常。

至此,nginx的高级功能介绍完毕。

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