Nginx 反向署理、负载均衡、页面缓存、URL重写及读写别离详解51CTO博客 - 威尼斯人

Nginx 反向署理、负载均衡、页面缓存、URL重写及读写别离详解51CTO博客

2019-01-03 15:50:51 | 作者: 晋鹏 | 标签: 署理,缓存,负载 | 浏览: 2098

纲要

一、前语

二、环境预备

三、装置与装备Nginx

四、Nginx之反向署理

五、Nginx之负载均衡

六、Nginx之页面缓存

七、Nginx之URL重写

八、Nginx之读写别离

注,操作体系为 CentOS 6.4 x86_64 , Nginx 是版别是最新版的1.4.2,所以试验用到的软件请点击这儿下载:http://yunpan.cn/QXIgqMmVmuZrm


一、前语

       在前面的几篇博文中咱们首要解说了Nginx作为Web效劳器知识点,首要的知识点有nginx的理论详解、nginx作为web效劳器的操作解说、nginx作为LNMP架构的解说,不清楚的博友能够回头看看,在这一篇博客中咱们首要解说, nginx的反向署理、负载均衡、缓存、URL重写以及读写别离详解。好了,下面咱们来详细说一说。

二、环境预备

1. 操作体系

  • CentOS 6.4 x86_64

2.软件版别

  • Nginx 1.4.2

3.试验拓扑

注,试验拓扑见下文。

4.装置yum源

[root@nginx ~]# rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
[root@web1 ~]# rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
[root@web2 ~]# rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

5.各节点时刻同步

[root@nginx ~]# ntpdate 202.120.2.101
[root@web1 ~]# ntpdate 202.120.2.101
[root@web2 ~]# ntpdate 202.120.2.101

6.封闭防火墙与SELinux

[root@nginx ~]# service iptables stop 
[root@nginx ~]# chkconfig iptables off  
[root@nginx ~]# getenforce  
Disabled
[root@web1 ~]# service iptables stop 
[root@web1 ~]# chkconfig iptables off  
[root@web1 ~]# getenforce  
Disabled
[root@web2 ~]# service iptables stop 
[root@web2 ~]# chkconfig iptables off  
[root@web2 ~]# getenforce  
Disabled

三、装置Nginx

1.解压

[root@nginx src]# tar xf nginx-1.4.2.tar.gz

2.新建nginx用户与组

[root@nginx src]# groupadd -g 108  -r nginx 
[root@nginx src]# useradd -u 108 -r -g 108 nginx  
[root@nginx src]# id nginx  
uid=108(nginx) gid=108(nginx) 组=108(nginx)

3.预备编译装备文件

[root@nginx src]# yum install -y pcre-devel openssl-devel
[root@nginx nginx-1.4.2]# ./configure   --prefix=/usr   --sbin-path=/usr/sbin/nginx   --conf-path=/etc/nginx/nginx.conf   --error-log-path=/var/log/nginx/error.log   --http-log-path=/var/log/nginx/access.log   --pid-path=/var/run/nginx/nginx.pid    --lock-path=/var/lock/nginx.lock   --user=nginx   --group=nginx   --with-http_ssl_module   --with-http_flv_module   --with-http_stub_status_module   --with-http_gzip_static_module   --http-client-body-temp-path=/var/tmp/nginx/client/   --http-proxy-temp-path=/var/tmp/nginx/proxy/   --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/   --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi   --http-scgi-temp-path=/var/tmp/nginx/scgi   --with-pcre

4.编译并装置

[root@nginx nginx-1.4.2]# make && make install

5.为nginx供给SysV init脚本

[root@nginx ~]# cat /etc/init.d/nginx 
#!/bin/sh  
#  
# nginx - this script starts and stops the nginx daemon  
#  
# chkconfig:   - 85 15  
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \  
#               proxy and IMAP/POP3 proxy server  
# processname: nginx  
# config:      /etc/nginx/nginx.conf  
# config:      /etc/sysconfig/nginx  
# pidfile:     /var/run/nginx.pid  
# Source function library.  
. /etc/rc.d/init.d/functions  
# Source networking configuration.  
. /etc/sysconfig/network  
# Check that networking is up.  
[ "$NETWORKING" = "no" ] && exit 0  
nginx="/usr/sbin/nginx"  
prog=$(basename $nginx)  
NGINX_CONF_FILE="/etc/nginx/nginx.conf"  
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx  
lockfile=/var/lock/subsys/nginx  
make_dirs() {  
   # make required directories  
   user=`nginx -V 2>&1 | grep "configure arguments:" | sed s/[^*]*--user=\([^ ]*\).*/\1/g -`  
   options=`$nginx -V 2>&1 | grep configure arguments:`  
   for opt in $options; do  
       if [ `echo $opt | grep .*-temp-path` ]; then  
           value=`echo $opt | cut -d "=" -f 2`  
           if [ ! -d "$value" ]; then  
               # echo "creating" $value  
               mkdir -p $value && chown -R $user $value  
           fi  
       fi  
   done  
}  
start() {  
    [ -x $nginx ] || exit 5  
    [ -f $NGINX_CONF_FILE ] || exit 6  
    make_dirs  
    echo -n $"Starting $prog: "  
    daemon $nginx -c $NGINX_CONF_FILE  
    retval=$?  
    echo  
    [ $retval -eq 0 ] && touch $lockfile  
    return $retval  
}  
stop() {  
    echo -n $"Stopping $prog: "  
    killproc $prog -QUIT  
    retval=$?  
    echo  
    [ $retval -eq 0 ] && rm -f $lockfile  
    return $retval  
}  
restart() {  
    configtest || return $?  
    stop  
    sleep 1  
    start  
}  
reload() {  
    configtest || return $?  
    echo -n $"Reloading $prog: "  
    killproc $nginx -HUP  
    RETVAL=$?  
    echo  
}  
force_reload() {  
    restart  
}  
configtest() {  
  $nginx -t -c $NGINX_CONF_FILE  
}  
rh_status() {  
    status $prog  
}  
rh_status_q() {  
    rh_status >/dev/null 2>&1  
}  
case "$1" in  
    start)  
        rh_status_q && exit 0  
        $1  
        ;;  
    stop)  
        rh_status_q || exit 0  
        $1  
        ;;  
    restart|configtest)  
        $1  
        ;;  
    reload)  
        rh_status_q || exit 7  
        $1  
        ;;  
    force-reload)  
        force_reload  
        ;;  
    status)  
        rh_status  
        ;;  
    condrestart|try-restart)  
        rh_status_q || exit 0  
            ;;  
    *)  
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"  
        exit 2  
esac

6.为此脚本赋予履行权限

[root@nginx ~]# chmod +x /etc/init.d/nginx

7.增加至效劳办理列表,并让其开机主动发动

[root@nginx ~]# chkconfig --add nginx 
[root@nginx ~]# chkconfig nginx on  
[root@nginx ~]# chkconfig nginx --list  
nginx              0:封闭    1:封闭    2:启用    3:启用    4:启用    5:启用    6:封闭

8.发动nginx

[root@nginx ~]# service nginx start 
正在发动 nginx:                                           [确认]

9.检查一下端口

[root@nginx ~]# netstat -ntlp | grep :80 
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      3889/nginx

10.测验一下

好了,Nginx装置与装备就到这儿,下面咱们来说一说Nginx的反向署理。

四、Nginx之反向署理

在装备nginx反向署理之间咱们得先预备两台测验效劳器,Web1与Web2。

1.装置httpd

[root@web1 ~]# yum install -y httpd
[root@web2 ~]# yum install -y httpd

2.供给测验页面

[root@web1 ~]# echo "<h1>web1.test.com</h1>" > /var/www/html/index.html
[root@web2 ~]# echo "<h1>web2.test.com</h1>" > /var/www/html/index.html

3.发动httpd效劳

[root@web1 ~]# service httpd start 
正在发动 httpd:                                           [确认]
[root@web2 ~]# service httpd start 
正在发动 httpd:                                           [确认]

4.测验一下

5.简略说一下,正向署理与反向署理

(1).正向署理的概念        正向署理,也便是传说中的署理,他的作业原理就像一个跳板,简略的说,我是一个用户,我拜访不了某网站,可是我能拜访一个署理效劳器,这个署理效劳器呢,他能拜访那个我不能拜访的网站,所以我先连上署理效劳器,通知他我需求那个无法拜访网站的内容,署理效劳器去取回来,然后回来给我。从网站的视点,只在署理效劳器来取内容的时分有一次记载,有时分并不知道是用户的恳求,也躲藏了用户的材料,这取决于署理告不通知网站。

       定论便是,正向署理 是一个坐落客户端和原始效劳器(origin server)之间的效劳器,为了从原始效劳器取得内容,客户端向署理发送一个恳求并指定方针(原始效劳器),然后署理向原始效劳器转交恳求并将取得的内容回来给客户端。客户端必需求进行一些特别的设置才干运用正向署理。

(2).反向署理的概念

持续举例:    
       例用户拜访 http://www.test.com/readme,但www.test.com上并不存在readme页面,他是悄悄从别的一台效劳器上取回来,然后作为自己的内容回来用户,但用户并不知情。这儿所提到的 www.test.com 这个域名对应的效劳器就设置了反向署理功用。

       定论便是,反向署理正好相反,关于客户端而言它就像是原始效劳器,而且客户端不需求进行任何特别的设置。客户端向反向署理的命名空间(name-space)中的内容发送一般恳求,接着反向署理将判别向何处(原始效劳器)转交恳求,并将取得的内容回来给客户端,就像这些内容本来便是它自己的相同。

(3).两者差异

从用处上来讲:

       正向署理的典型用处是为在防火墙内的局域网客户端供给拜访Internet的途径。正向署理还能够运用缓冲特性削减网络运用率。反向署理的典型用处是将防火墙后边的效劳器供给给Internet用户拜访。反向署理还能够为后端的多台效劳器供给负载平衡,或为后端较慢的效劳器供给缓冲效劳。别的,反向署理还能够启用高档URL战略和办理技能,从而使处于不同web效劳器体系的web页面一同存在于同一个URL空间下。

从安全性来讲:

       正向署理答应客户端经过它拜访恣意网站而且躲藏客户端自身,因而你有必要采纳安全措施以保证仅为经过授权的客户端供给效劳。反向署理对外都是通明的,拜访者并不知道自己拜访的是一个署理。

6.nginx 署理模块

http 署理官方中文文档:http://www.howtocn.org/nginx:nginx%E6%A8%A1%E5%9D%97%E5%8F%82%E8%80%83%E6%89%8B%E5%86%8C%E4%B8%AD%E6%96%87%E7%89%88:standardhttpmodules:httpproxy

阐明:署理模块的指令有许多我这儿只解说重要的proxy_pass,想了解更多署理指令请参阅官方中文文档。

这个模块能够转发恳求到其他的效劳器。HTTP/1.0无法运用keepalive(后端效劳器将为每个恳求创立而且删去衔接)。nginx为阅读器发送HTTP/1.1并为后端效劳器发送HTTP/1.0,这样阅读器就能够为阅读器处理keepalive。    
如下例:

location / {
  proxy_pass        http://localhost:8000;
  proxy_set_header  X-Real-IP  $remote_addr;
}

留意,当运用http proxy模块(乃至FastCGI),一切的衔接恳求在发送到后端效劳器之前nginx将缓存它们,因而,在丈量从后端传送的数据时,它的进展显现或许不正确。

试验拓扑:

7.装备http反向署理

[root@nginx ~]# cd /etc/nginx/
[root@nginx nginx]# cp nginx.conf nginx.conf.bak #备份一个原装备文件
[root@nginx nginx]# vim nginx.conf
location / {
               proxy_pass      http://192.168.18.201;
       }

指令阐明:proxy_pass

语法:proxy_pass URL
默许值:no      
运用字段:location, location中的if字段      
这个指令设置被署理效劳器的地址和被映射的URI,地址能够运用主机名或IP加端口号的方式,例如:proxy_pass http://localhost:8000/uri/;

8.从头加载一下装备文件

[root@nginx ~]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
从头载入 nginx:                                           [确认]

9.测验一下

注,咱们能够看到,当咱们拜访192.168.18.208时,被署理从头定向到Web1上。

10.检查一下Web效劳器日志

[root@web1 ~]# tail /var/log/httpd/access_log
192.168.18.208 - - [04/Sep/2013:00:14:20 +0800] "GET /favicon.ico HTTP/1.0" 404 289 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"
192.168.18.208 - - [04/Sep/2013:00:14:20 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"
192.168.18.208 - - [04/Sep/2013:00:14:20 +0800] "GET /favicon.ico HTTP/1.0" 404 289 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"
192.168.18.138 - - [04/Sep/2013:00:14:45 +0800] "GET / HTTP/1.1" 200 23 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"
192.168.18.138 - - [04/Sep/2013:00:14:48 +0800] "GET /favicon.ico HTTP/1.1" 404 289 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"
192.168.18.208 - - [04/Sep/2013:00:14:55 +0800] "GET /favicon.ico HTTP/1.0" 404 289 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"
192.168.18.208 - - [04/Sep/2013:00:15:05 +0800] "GET /favicon.ico HTTP/1.0" 404 289 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"
192.168.18.208 - - [04/Sep/2013:00:15:13 +0800] "GET /favicon.ico HTTP/1.0" 404 289 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"
192.168.18.208 - - [04/Sep/2013:00:15:16 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"
192.168.18.208 - - [04/Sep/2013:00:15:16 +0800] "GET /favicon.ico HTTP/1.0" 404 289 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"

注,咱们能够看到咱们这儿的客户的IP满是,nginx署理效劳器的IP,并不是实在客户端的IP。下面咱们修正一下,让日志的IP显现实在的客户端的IP。

11.修正nginx装备文件

location / {
        proxy_pass      http://192.168.18.201;
        proxy_set_header  X-Real-IP  $remote_addr; #加上这一行
}

指令阐明:proxy_set_header

语法:proxy_set_header header value
默许值: Host and Connection
运用字段:http, server, location
这个指令答应将发送到被署理效劳器的恳求头从头界说或许增加一些字段。这个值能够是一个文本,变量或许它们的组合。proxy_set_header在指定的字段中没有界说时会从它的上级字段承继。

12.从头加载一下装备文件

[root@nginx ~]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
从头载入 nginx:                                           [确认]

13.测验并检查日志

[root@web1 ~]# tail /var/log/httpd/access_log
192.168.18.208 - - [03/Sep/2013:16:26:18 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.208 - - [03/Sep/2013:16:26:18 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.208 - - [03/Sep/2013:16:26:18 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.208 - - [03/Sep/2013:16:26:18 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.208 - - [03/Sep/2013:16:26:18 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.208 - - [03/Sep/2013:16:26:18 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.208 - - [03/Sep/2013:16:26:18 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.208 - - [03/Sep/2013:16:26:18 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.208 - - [03/Sep/2013:16:26:18 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.208 - - [03/Sep/2013:16:26:18 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"

注,咱们能够看到日志记载的仍是署理的IP,没有显现实在客户端的IP,为什么呢?咱们来看一下httpd的装备文件。

14.检查并修正httpd装备文件

[root@web1 ~]# vim /etc/httpd/conf/httpd.conf

注,咱们能够这儿记载日志的参数仍是%h,下面咱们修正一下参数。

注,这是修正后的参数,将h%修正为%{X-Real-IP}i,好的下面咱们再来测验一下。

15.重启并测验

[root@web1 ~]# service httpd restart
中止 httpd:                                               [确认]
正在发动 httpd:                                           [确认]
[root@web1 ~]# tail /var/log/httpd/access_log
192.168.18.138 - - [03/Sep/2013:17:09:14 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [03/Sep/2013:17:09:14 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [03/Sep/2013:17:09:15 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [03/Sep/2013:17:09:15 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [03/Sep/2013:17:09:15 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [03/Sep/2013:17:09:15 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [03/Sep/2013:17:09:15 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [03/Sep/2013:17:09:15 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [03/Sep/2013:17:09:15 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [03/Sep/2013:17:09:15 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"

注,咱们能够看到现在的日志里记载的IP地址便是实在的客户端地址了。好了,到这儿Nginx署理后端一台效劳器就演示到这儿,下面咱们持续说。

五、Nginx之负载均衡

注,咱们能够看到,由于咱们网站是开展初期,nginx只署理了后端一台效劳器,但由于咱们网站名望大涨拜访的人越来越多一台效劳器实在是顶不住,所以咱们加了多台效劳器,那么多台效劳器又怎样装备署理呢,咱们这儿以两台效劳器为事例,为咱们做演示。

1.upstream 负载均衡模块阐明

事例:

下面设定负载均衡的效劳器列表。

upstream test.net{
ip_hash;
server 192.168.10.13:80;
server 192.168.10.14:80  down;
server 192.168.10.15:8009  max_fails=3  fail_timeout=20s;
server 192.168.10.16:8080;
}
server {
  location / {
    proxy_pass  http://test.net;
  }
}

       upstream是Nginx的HTTP Upstream模块,这个模块经过一个简略的调度算法来完结客户端IP到后端效劳器的负载均衡。在上面的设定中,经过upstream指令指定了一个负载均衡器的称号test.net。这个称号能够恣意指定,在后边需求用到的当地直接调用即可。

2.upstream 支撑的负载均衡算法

Nginx的负载均衡模块现在支撑4种调度算法,下面进行别离介绍,其间后两项归于第三方调度算法。  

  • 轮询(默许)。每个恳求按时刻次序逐个分配到不同的后端效劳器,假如后端某台效劳器宕机,毛病体系被主动除掉,运用户拜访不受影响。Weight 指定轮询权值,Weight值越大,分配到的拜访机率越高,首要用于后端每个效劳器功用不均的情况下。

  • ip_hash。每个恳求按拜访IP的hash成果分配,这样来自同一个IP的访客固定拜访一个后端效劳器,有用处理了动态网页存在的session同享问题。

  • fair。这是比上面两个愈加智能的负载均衡算法。此种算法能够依据页面巨细和加载时刻长短智能地进行负载均衡,也便是依据后端效劳器的呼应时刻来分配恳求,呼应时刻短的优先分配。Nginx自身是不支撑fair的,假如需求运用这种调度算法,有必要下载Nginx的upstream_fair模块。

  • url_hash。此办法按拜访url的hash成果来分配恳求,使每个url定向到同一个后端效劳器,能够进一步进步后端缓存效劳器的功率。Nginx自身是不支撑url_hash的,假如需求运用这种调度算法,有必要装置Nginx 的hash软件包。

3.upstream 支撑的状况参数

在HTTP Upstream模块中,能够经过server指令指定后端效劳器的IP地址和端口,一同还能够设定每个后端效劳器在负载均衡调度中的状况。常用的状况有:      

  • down,表明当时的server暂时不参加负载均衡。

  • backup,预留的备份机器。当其他一切的非backup机器呈现毛病或许忙的时分,才会恳求backup机器,因而这台机器的压力最轻。

  • max_fails,答应恳求失利的次数,默许为1。当超越最大次数时,回来proxy_next_upstream 模块界说的过错。

  • fail_timeout,在阅历了max_fails次失利后,暂停效劳的时刻。max_fails能够和fail_timeout一同运用。

注,当负载调度算法为ip_hash时,后端效劳器在负载均衡调度中的状况不能是weight和backup。

4.试验拓扑

5.装备nginx负载均衡

[root@nginx ~]# vim /etc/nginx/nginx.conf
upstream webservers {
      server 192.168.18.201 weight=1;
      server 192.168.18.202 weight=1;
  }
  server {
      listen       80;
      server_name  localhost;
      #charset koi8-r;
      #access_log  logs/host.access.log  main;
      location / {
              proxy_pass      http://webservers;
              proxy_set_header  X-Real-IP  $remote_addr;
      }
}

注,upstream是界说在server{ }之外的,不能界说在server{ }内部。界说好upstream之后,用proxy_pass引证一下即可。

6.从头加载一下装备文件

[root@nginx ~]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
从头载入 nginx:                                           [确认]

7.测验一下

注,咱们能够不断的改写阅读的内容,能够发现web1与web2是替换呈现的,达到了负载均衡的作用。

8.检查一下Web拜访效劳器日志

Web1:

[root@web1 ~]# tail /var/log/httpd/access_log
192.168.18.138 - - [04/Sep/2013:09:41:58 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:41:58 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:41:59 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:41:59 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:42:00 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:42:00 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:42:00 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:44:21 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:44:22 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:44:22 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"

Web2:

先修正一下,Web效劳器记载日志的格局。

[root@web2 ~]# vim /etc/httpd/conf/httpd.conf
LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
[root@web2 ~]# service httpd restart
中止 httpd:                                               [确认]
正在发动 httpd:                                           [确认]

接着,再拜访屡次,持续检查日志。

[root@web2 ~]# tail /var/log/httpd/access_log
192.168.18.138 - - [04/Sep/2013:09:50:28 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:50:28 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:50:28 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:50:28 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:50:28 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:50:28 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:50:28 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:50:28 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:50:29 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
192.168.18.138 - - [04/Sep/2013:09:50:29 +0800] "GET / HTTP/1.0" 200 23 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"

注,咱们能够看到,两台效劳器日志都记载是192.168.18.138拜访的日志,也阐明晰负载均衡装备成功。

9.装备nginx进行健康状况检查

  • max_fails,答应恳求失利的次数,默许为1。当超越最大次数时,回来proxy_next_upstream 模块界说的过错。

  • fail_timeout,在阅历了max_fails次失利后,暂停效劳的时刻。max_fails能够和fail_timeout一同运用,进行健康状况检查。

[root@nginx ~]# vim /etc/nginx/nginx.conf
upstream webservers {
        server 192.168.18.201 weight=1 max_fails=2 fail_timeout=2;
        server 192.168.18.202 weight=1 max_fails=2 fail_timeout=2;
    }

10.从头加载一下装备文件

[root@nginx ~]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
从头载入 nginx:                                           [确认]

11.中止效劳器并测验

先中止Web1,进行测验。
[root@web1 ~]# service httpd stop
中止 httpd:                                               [确认]

注,咱们能够看到,现在只能拜访Web2,再从头发动Web1,再次拜访一下。

[root@web1 ~]# service httpd start
正在发动 httpd:                                           [确认]

注,咱们能够看到,现在又能够从头拜访,阐明nginx的健康状况查检装备成功。但咱们想一下,假如不幸的是一切效劳器都不能供给效劳了怎样办,用户翻开页面就会呈现犯错页面,那么会带来用户体会的下降,所以咱们能不能像装备LVS是装备sorry_server呢,答案是能够的,但这儿不是装备sorry_server而是装备backup。

12.装备backup效劳器

[root@nginx ~]# vim /etc/nginx/nginx.conf
server {
                listen 8080;
                server_name localhost;
                root /data/www/errorpage;
                index index.html;
        }
upstream webservers {
        server 192.168.18.201 weight=1 max_fails=2 fail_timeout=2;
        server 192.168.18.202 weight=1 max_fails=2 fail_timeout=2;
        server 127.0.0.1:8080 backup;
    }
[root@nginx ~]# mkdir -pv /data/www/errorpage
[root@nginx errorpage]# cat index.html
<h1>Sorry......</h1>

13.从头加载装备文件

[root@nginx errorpage]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
从头载入 nginx:                                           [确认]

14.封闭Web效劳器并进行测验

[root@web1 ~]# service httpd stop
中止 httpd:                                               [确认]
[root@web2 ~]# service httpd stop
中止 httpd:                                               [确认]

注,咱们能够看到,当一切效劳器都不能作业时,就会发动备份效劳器。好了,backup效劳器就装备到这儿,下面咱们来装备ip_hash负载均衡。

15.装备ip_hash负载均衡

  • ip_hash,每个恳求按拜访IP的hash成果分配,这样来自同一个IP的访客固定拜访一个后端效劳器,有用处理了动态网页存在的session同享问题。(一般电子商务网站用的比较多)

[root@nginx ~]# vim /etc/nginx/nginx.conf
upstream webservers {
        ip_hash;
        server 192.168.18.201 weight=1 max_fails=2 fail_timeout=2;
        server 192.168.18.202 weight=1 max_fails=2 fail_timeout=2;
        #server 127.0.0.1:8080 backup;
    }

注,当负载调度算法为ip_hash时,后端效劳器在负载均衡调度中的状况不能有backup。(有人或许会问,为什么呢?咱们想啊,假如负载均衡把你分配到backup效劳器上,你能拜访到页面吗?不能,所以了不能装备backup效劳器)

16.从头加载一下效劳器

[root@nginx ~]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
从头载入 nginx:                                           [确认]

17.测验一下

注,咱们能够看到,你不断的改写页面一向会显现的民Web2,阐明ip_hash负载均衡装备成功。下面咱们来计算一下Web2的拜访衔接数。

18.计算Web2的拜访衔接数

[root@web2 ~]# netstat -an | grep :80 | wc -l
304

注,你不断的改写,衔接数会越来越多。好了,nginx的负载均衡就悉数演示到这儿下面咱们来说一说,页面缓存。

六、Nginx之页面缓存

1.指令阐明

proxy_cache_path

语法:proxy_cache_path path [levels=number] keys_zone=zone_name:zone_size [inactive=time] [max_size=size];  
默许值:None  
运用字段:http  
指令指定缓存的途径和一些其他参数,缓存的数据存储在文件中,而且运用署理url的哈希值作为关键字与文件名。levels参数指定缓存的子目录数,例如:

proxy_cache_path  /data/nginx/cache  levels=1:2   keys_zone=one:10m;

文件名相似于:

/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c

levels指定目录结构,能够运用恣意的1位或2位数字作为目录结构,如 X, X:X,或X:X:X 例如: “2”, “2:2”, “1:1:2“,可是最多只能是三级目录。  
一切活动的key和元数据存储在同享的内存池中,这个区域用keys_zone参数指定。one指的是同享池的称号,10m指的是同享池的巨细。  
留意每一个界说的内存池有必要是不重复的途径,例如:

proxy_cache_path  /data/nginx/cache/one    levels=1      keys_zone=one:10m;
proxy_cache_path  /data/nginx/cache/two    levels=2:2    keys_zone=two:100m;
proxy_cache_path  /data/nginx/cache/three  levels=1:1:2  keys_zone=three:1000m;

假如在inactive参数指定的时刻内缓存的数据没有被恳求则被删去,默许inactive为10分钟。一个名为cache manager的进程操控磁盘的缓存巨细,它被用来删去不活动的缓存和操控缓存巨细,这些都在max_size参数中界说,当现在缓存的值超出max_size指定的值之后,超越其巨细后最少运用数据(LRU替换算法)将被删去。内存池的巨细依照缓存页面数的份额进行设置,一个页面(文件)的元数据巨细依照操作体系来定,如FreeBSD/i386下为64字节,FreeBSD/amd64下为128字节。

proxy_cache

语法:proxy_cache zone_name;  
默许值:None  
运用字段:http, server, location  
设置一个缓存区域的称号,一个相同的区域能够在不同的当地运用。  
在0.7.48后,缓存遵从后端的”Expires”, “Cache-Control: no-cache”, “Cache-Control: max-age=XXX”头部字段,0.7.66版别今后,”Cache-Control:“private”和”no-store”头相同被遵从。nginx在缓存过程中不会处理”Vary”头,为了保证一些私有数据不被一切的用户看到,后端有必要设置 “no-cache”或许”max-age=0”头,或许proxy_cache_key包括用户指定的数据如$cookie_xxx,运用cookie的值作为proxy_cache_key的一部分能够防止缓存私有数据,所以能够在不同的location中别离指定proxy_cache_key的值以便分隔私有数据和公有数据。  
缓存指令依靠署理缓冲区(buffers),假如proxy_buffers设置为off,缓存不会收效。

proxy_cache_valid

语法:proxy_cache_valid reply_code [reply_code …] time;  
默许值:None  
运用字段:http, server, location  
为不同的应对设置不同的缓存时刻,例如:

proxy_cache_valid  200 302  10m;
proxy_cache_valid  404      1m;

为应对代码为200和302的设置缓存时刻为10分钟,404代码缓存1分钟。  
假如只界说时刻:

proxy_cache_valid 5m;

那么只对代码为200, 301和302的应对进行缓存。  
相同能够运用any参数任何应对。

proxy_cache_valid  200 302 10m;
proxy_cache_valid  301 1h;
proxy_cache_valid  any 1m;

2.界说一个简略nginx缓存效劳器

[root@nginx ~]# vim /etc/nginx/nginx.conf
proxy_cache_path /data/nginx/cache/webserver levels=1:2 keys_zone=webserver:20m max_size=1g;
   server {
       listen       80;
       server_name  localhost;
       #charset koi8-r;
       #access_log  logs/host.access.log  main;
       location / {
               proxy_pass      http://webservers;
               proxy_set_header  X-Real-IP  $remote_addr;
               proxy_cache webserver;
               proxy_cache_valid 200 10m;
       }
}

3.新建缓存目录

[root@nginx ~]# mkdir -pv /data/nginx/cache/webserver

4.从头加载一下装备文件

[root@nginx webserver]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
从头载入 nginx:                                           [确认]

5.下面咱们来测验一下(谷歌阅读器)

注,咱们用谷歌阅读器测验的时分,能够按F12调用开发工具,挑选Network选项,咱们能够看到,Response Headers,在这儿咱们能够看到,咱们恳求的是否是缓存,但现在还看不到,下面咱们来装备一下,再来测验。

6. 缓存变量阐明

$server_addr

效劳器地址,在完结一次体系调用后能够确认这个值,假如要绕开体系调用,则有必要在listen中指定地址而且运用bind参数。

$upstream_cache_status

0.8.3版别中其值或许为:

  • MISS 未射中

  • EXPIRED - expired。恳求被传送到后端。

  • UPDATING - expired。由于proxy/fastcgi_cache_use_stale正在更新,将运用旧的应对。

  • STALE - expired。由于proxy/fastcgi_cache_use_stale,后端将得到过期的应对。

  • HIT 射中

[root@nginx ~]# vim /etc/nginx/nginx.conf
proxy_cache_path /data/nginx/cache/webserver levels=1:2 keys_zone=webserver:20m max_size=1g;
    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_pass      http://webservers;
                proxy_set_header  X-Real-IP  $remote_addr;
                proxy_cache webserver;
                proxy_cache_valid 200 10m;
        }
}

7.从头加载一下装备文件

[root@nginx ~]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
从头载入 nginx:                                           [确认]

8.测验一下

注,从图中咱们能够看到,咱们拜访的效劳器是192.168.18.208,缓存射中。咱们能够看到是不是很直观啊。下面咱们看一下缓存目录。

9.检查一下缓存目录

[root@nginx ~]# cd /data/nginx/cache/webserver/f/63/
[root@nginx 63]# ls
681ad4c77694b65d61c9985553a2763f

注,缓存目录里的确有缓存文件。好了,nginx缓存装备就到这边了,更多装备请依据需求看装备文档。下面咱们来说一下,URL重写。

七、Nginx之URL重写

1.URL重写模块(Rewrite)

摘要

这个模块答应运用正则表达式重写URI(需PCRE库),而且能够依据相关变量重定向和挑选不同的装备。假如这个指令在server字段中指定,那么将在被恳求的location确认之前履行,假如在指令履行后所挑选的location中有其他的重写规矩,那么它们也被履行。假如在location中履行这个指令发生了新的URI,那么location又一次确认了新的URI。这样的循环能够最多履行10次,超越今后nginx将回来500过错。

指令break

语法:break  
默许值:none  
运用字段:server, location, if  
完结当时设置的规矩,中止履行其他的重写指令。  
示例:

if ($slow) {
  limit_rate  10k;
  break;
}
if

语法:if (condition) { … }  
默许值:none  
运用字段:server, location  
留意:在运用if指令之前请检查if is evil page而且尽量考虑用try_files替代。  
判别一个条件,假如条件建立,则后边的大括号内的句子将履行,相关装备从上级承继。  
能够在判别句子中指定下列值:

  • 一个变量的称号;不建立的值为:空字符传”“或许一些用“0”开端的字符串。

  • 一个运用=或许!=运算符的比较句子。

  • 运用符号~*和~形式匹配的正则表达式:

  • ~为区别巨细写的匹配。

  • ~*不区别巨细写的匹配(firefox匹配FireFox)。

  • !~和!~*意为“不匹配的”。

  • 运用-f和!-f检查一个文件是否存在。

  • 运用-d和!-d检查一个目录是否存在。

  • 运用-e和!-e检查一个文件,目录或许软链接是否存在。

  • 运用-x和!-x检查一个文件是否为可履行文件。

正则表达式的一部分能够用圆括号,便利之后依照次序用$1-$9来引证。  
示例装备:

if ($http_user_agent ~ MSIE) {
  rewrite  ^(.*)$  /msie/$1  break;
}
                                                                                                                                                       
if ($http_cookie ~* "id=([^;] +)(?:;|$)" ) {
  set  $id  $1;
}
                                                                                                                                                       
if ($request_method = POST ) {
  return 405;
}
                                                                                                                                                       
if (!-f $request_filename) {
  break;
  proxy_pass  http://127.0.0.1;
}
                                                                                                                                                       
if ($slow) {
  limit_rate  10k;
}
                                                                                                                                                       
if ($invalid_referer) {
  return   403;
}
                                                                                                                                                       
if ($args ~ post=140){
  rewrite ^ http://example.com/ permanent;
}

内置变量$invalid_referer用指令valid_referers指定。

return

语法:return code  
默许值:none  
运用字段:server, location, if  
这个指令完毕履行装备句子并为客户端回来状况代码,能够运用下列的值:204,400,402-406,408,410, 411, 413, 416与500-504。此外,非规范代码444将封闭衔接而且不发送任何的头部。

rewrite

语法:rewrite regex replacement flag  
默许值:none  
运用字段:server, location, if  
依照相关的正则表达式与字符串修正URI,指令依照在装备文件中呈现的次序履行。  
能够在重写指令后边增加符号。  
假如替换的字符串以http://最初,恳求将被重定向,而且不再履行剩余的rewrite指令。  
尾部的符号(flag)能够是以下的值:

  • last - 完结重写指令,之后查找相应的URI或location。

  • break - 完结重写指令。

  • redirect - 回来302暂时重定向,假如替换字段用http://最初则被运用。

  • permanent - 回来301永久重定向。

留意假如一个重定向是相对的(没有主机名部分),nginx将在重定向的过程中运用匹配server_name指令的“Host”头或许server_name指令指定的第一个称号,假如头不匹配或不存在,假如没有设置server_name,将运用本地主机名,假如你总是想让nginx运用“Host”头,能够在server_name运用“*”通配符(检查http中心模块中的server_name)。例如:

rewrite  ^(/download/.*)/media/(.*)\..*$  $1/mp3/$2.mp3  last;
rewrite  ^(/download/.*)/audio/(.*)\..*$  $1/mp3/$2.ra   last;
return   403;

可是假如咱们将其放入一个名为/download/的location中,则需求将last符号改为break,不然nginx将履行10次循环并回来500过错。

location /download/ {
  rewrite  ^(/download/.*)/media/(.*)\..*$  $1/mp3/$2.mp3  break;
  rewrite  ^(/download/.*)/audio/(.*)\..*$  $1/mp3/$2.ra   break;
  return   403;
}

假如替换字段中包括参数,那么其他的恳求参数将附加到后边,为了防止附加,能够在最终一个字符后边跟一个问号:

rewrite  ^/users/(.*)$  /show?user=$1?  last;

留意:大括号({和}),能够一同用在正则表达式和装备块中,为了防止抵触,正则表达式运用大括号需求用双引号(或许单引号)。例如要重写以下的URL:

/photos/123456

为:

/path/to/photos/12/1234/123456.png

则运用以下正则表达式(留意引号):

rewrite  "/photos/([0-9] {2})([0-9] {2})([0-9] {2})" /path/to/photos/$1/$1$2/$1$2$3.png;

假如指定一个“?”在重写的结束,Nginx将丢掉恳求中的参数,即变量$args,当运用$request_uri或$uri&$args时能够在rewrite结束运用“?”以防止nginx处理两次参数串。  
在rewrite中运用$request_uri将www.example.com重写到example.com:

server {
   server_name www.example.com;
   rewrite ^ http://example.com$request_uri? permanent;
}

相同,重写只对途径进行操作,而不是参数,假如要重写一个带参数的URL,能够运用以下替代:

if ($args ^~ post=100){
  rewrite ^ http://example.com/new-address.html? permanent;
}

留意$args变量不会被编译,与location过程中的URI不同(参阅http中心模块中的location)。

rewrite_log

语法:rewrite_log on | off  
默许值:rewrite_log off  
运用字段:server, location, if  
变量:无  
启用时将在error log中记载notice 符号的重写日志。

set

语法:set variable value  
默许值:none  
运用字段:server, location, if  
指令设置一个变量并为其赋值,其值能够是文本,变量和它们的组合。  
你能够运用set界说一个新的变量,可是不能运用set设置$http_xxx头部变量的值。

uninitialized_variable_warn

语法:uninitialized_variable_warn on|off  
默许值:uninitialized_variable_warn on  
运用字段:http, server, location, if  
敞开或封闭在未初始化变量中记载正告日志。  
事实上,rewrite指令在装备文件加载时现已编译到内部代码中,在解说器发生恳求时运用。  
这个解说器是一个简略的仓库虚拟机,如下列指令:

location /download/ {
  if ($forbidden) {
    return   403;
  }
  if ($slow) {
    limit_rate  10k;
  }
  rewrite  ^/(download/.*)/media/(.*)\..*$  /$1/mp3/$2.mp3  break;

将被编译成以下次序:

variable $forbidden
checking to zero
recovery 403
completion of entire code
variable $slow
checking to zero
checkings of regular excodession
copying "/"
copying $1
copying "/mp3/"
copying $2
copying ".mp3"
completion of regular excodession
completion of entire sequence

留意并没有关于limit_rate的代码,由于它没有提及ngx_http_rewrite_module模块,“if”块能够相似”location”指令在装备文件的相同部分一同存在。  
假如$slow为真,对应的if块将收效,在这个装备中limit_rate的值为10k。  
指令:

rewrite  ^/(download/.*)/media/(.*)\..*$  /$1/mp3/$2.mp3  break;

假如咱们将第一个斜杠括入圆括号,则能够削减履行次序:

rewrite  ^(/download/.*)/media/(.*)\..*$  $1/mp3/$2.mp3  break;

之后的次序相似如下:

checking regular excodession
copying $1
copying "/mp3/"
copying $2
copying ".mp3"
completion of regular excodession
completion of entire code
2.简略事例
注,由于装备文件内容较多,为了让咱们看着便利,咱们备份一下装备文件,翻开一个新的装备文件。
[root@nginx ~]# cd /etc/nginx/
[root@nginx nginx]# mv nginx.conf nginx.conf.proxy
[root@nginx nginx]# cp nginx.conf.bak nginx.conf
[root@nginx nginx]# vim /etc/nginx/nginx.conf
server {
      listen       80;
      server_name  localhost;
      #charset koi8-r;
      #access_log  logs/host.access.log  main;
      location / {
          root   html;
          index  index.html index.htm;
          rewrite ^/bbs/(.*)$ http://192.168.18.201/forum/$1;
      }
}
预备forum目录与测验文件
[root@web1 ~]# cd /var/www/html/
[root@web1 html]# ls
index.html
[root@web1 html]# mkdir forum
[root@web1 html]# cd forum/
[root@web1 forum]# vim index.html
<h1>forum page!</h1>

测验一下

好了,下面咱们来测验一下rewrite重写。

3.从头加载一下装备文件
[root@nginx 63]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
从头载入 nginx:                                           [确认]

4.测验一下

注,咱们能够从图中看出,status code 302指的是暂时重定向,那就阐明咱们rewrite重写装备成功。咱们知道302是暂时重定向而301是永久重定向,那么怎样完结永久重定向呢。一般效劳器与效劳器之间是暂时重定向,效劳器内部是永久重定向。下面咱们来演示一下永久重定向。

5.装备永久重定向

[root@nginx nginx]# vim /etc/nginx/nginx.conf
server {
        listen       80;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location / {
            root   html;
            index  index.html index.htm;
            rewrite ^/bbs/(.*)$ /forum/$1;
        }
}
预备forum目录与测验文件
[root@nginx ~]# cd /usr/html/
[root@nginx html]# ls
50x.html  index.html
[root@nginx html]# mkdir forum
[root@nginx html]# cd forum/
[root@nginx forum]# vim index.html
<h1>192.168.18.208 forum page</h1>

6.从头加载一下装备文件

[root@nginx ~]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
从头载入 nginx:                                           [确认]

7.测验一下

注,咱们从图中能够看到,咱们拜访bbs/是直接帮咱们跳转到forum/下,这种本机的跳转便是永久重定向也叫隐式重定向。好了,rewrite重定向咱们就提到这儿了,想要查询更多关于重定向的指令请参阅官方文档。最终,咱们来说一下读写别离。

八、Nginx之读写别离

1.试验拓扑

       需求剖析,前端一台nginx做负载均衡反向署理,后边两台httpd效劳器。整个架构是供给BBS(论坛)效劳,有一需求得完结读写别离,便是上传附件的功用,咱们上传的附件只能上传到Web1,然后在Web1上使用rsync+inotify完结附件同步,咱们都知道rsync+inotify只能是主向从同步,不能双向同步。所以Web1可进行写操作,而Web2只能进行读操作,这就带来读写别离的需求,下面咱们就来说一下,读写别离怎样完结。

2.WebDAV功用阐明

       WebDAV (Web-based Distributed Authoring and Versioning) 一种根据 HTTP 1.1协议的通信协议。它扩展了HTTP 1.1,在GET、POST、HEAD等几个HTTP规范办法以外增加了一些新的办法,使应用程序可直接对Web Server直接读写,并支撑写文件确认(Locking)及解锁(Unlock),还能够支撑文件的版别操控。这样咱们就能装备读写别离功用了,下面咱们来详细装备一下。

3.修正装备文件

[root@nginx nginx]# vim /etc/nginx/nginx.conf
server {
        listen       80;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location / {
                proxy_pass http://192.168.18.202;
                if ($request_method = "PUT"){
                        proxy_pass http://192.168.18.201;
                }
        }
}

4.从头加载一下装备文件

[root@nginx ~]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
从头载入 nginx:                                           [确认]

5.装备httpd的WebDAV功用

[root@web1 ~]# vim /etc/httpd/conf/httpd.conf

注,在<Directory "/var/www/html">下启用就行。

6.从头发动一下httpd

[root@web1 ~]# service httpd restart
中止 httpd:                                               [确认]
正在发动 httpd:                                           [确认]

7.测验一下

[root@nginx ~]# curl http://192.168.18.201
<h1>web1.test.com</h1>
[root@nginx ~]# curl http://192.168.18.202
<h1>web2.test.com</h1>

注,web1与web2拜访都没问题。

[root@nginx ~]# curl -T /etc/issue  http://192.168.18.202
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>405 Method Not Allowed</title>
</head><body>
<h1>Method Not Allowed</h1>
The requested method PUT is not allowed for the URL /issue.
<hr>
<address>Apache/2.2.15 (CentOS) Server at 192.168.18.202 Port 80</address>
</body></html>

注,咱们上传文件到,web2上时,由于web2只人读功用,所以没有开户WebDAV功用,所以显现是405 Method Not Allowed。  

[root@nginx ~]# curl -T /etc/issue  http://192.168.18.201
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
You dont have permission to access /issue
on this server.
<hr>
<address>Apache/2.2.15 (CentOS) Server at 192.168.18.201 Port 80</address>
</body></html>

注,咱们在Web1敞开了WebDAV功用,但咱们目录是root目录是不答应apache用户上传的,所以显现的是403 Forbidden。下面咱们给apache授权,答应上传。

[root@web1 ~]# setfacl -m u:apache:rwx /var/www/html/

下面咱们再来测验一下,

[root@nginx ~]# curl -T /etc/issue  http://192.168.18.201
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>201 Created</title>
</head><body>
<h1>Created</h1>
Resource /issue has been created.
<hr />
<address>Apache/2.2.15 (CentOS) Server at 192.168.18.201 Port 80</address>
</body></html>

注,咱们能够看到咱们成功的上传了文件,阐明nginx读写别离功用装备完结。最终,咱们来检查一下上传的文件。

[root@web1 ~]# cd /var/www/html/
[root@web1 html]# ll
总用量 12
drwxr-xr-x 2 root   root   4096 9月   4 13:16 forum
-rw-r--r-- 1 root   root     23 9月   3 23:37 index.html
-rw-r--r-- 1 apache apache   47 9月   4 14:06 issue

好了,到这儿nginx的反向署理、负载均衡、页面缓存、URL重写及读写别离就悉数解说完结。期望咱们有所收成,^_^……


版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表威尼斯人立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章