试验环境:

本次试验中的服务器全用的是CentOS-6.4-x86_64操作系统;

nginx服务器地址:192.168.80.10

客户端主机地址:192.168.80.1

软件包下载地址:

healthcheck_nginx_upstreams-master.zip http://pan.baidu.com/s/1c0w0rL2

nginx-1.0.11.tar.gz http://pan.baidu.com/s/1o67Bl9o

一、rewrite重定向:

安装nginx:

[root@localhost ~]# unzip healthcheck_nginx_upstreams-master.zip

这是一个在做负载均衡时需要的一个补丁,前期不会用到。

[root@localhost ~]# mv healthcheck_nginx_upstreams-master /tmp/

,把解压好的文件放入/tmp/目录下,此时在/tmp/healthcheck_nginx_upstreams-master/目录下有一个nginx.patch文件,这就是需要的补丁文件

[root@localhost ~]# groupadd -r nginx

[root@localhost ~]# useradd -r -g nginx -s /sbin/nologin -M nginx

按照安装nginx的惯例,先创建一个nginx组,并添加一个系统账户nginx,也加入nginx组,shell是/sbin/nologin -M 表示不给它创建家目录

[root@localhost ~]# tar -zxvf nginx-1.0.11.tar.gz -C /usr/local/src/

解压安装包

[root@localhost ~]# cd /usr/local/src/nginx-1.0.11/

[root@localhost nginx-1.0.11]# patch -p1 </tmp/healthcheck_nginx_upstreams-master/nginx.patch

把补丁运用在nginx上

[root@localhost nginx-1.0.11]# ./configure   --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/   --with-pcre  --add-module=/tmp/healthcheck_nginx_upstreams-master/

[root@localhost nginx-1.0.11]# make && make install

为nginx编写一个控制脚本,

[root@localhost nginx-1.0.11]# vim /etc/init.d/nginx

[root@localhost nginx-1.0.11]# chmod a+x /etc/init.d/nginx

并给它执行权限

脚本代码如下:

#!/bin/bash

prog=/usr/local/nginx/sbin/nginx

lockfile=/var/lock/nginx.lock


start () {

      if [ -e $lockfile ];then

      echo "the nginx server is started" && exit

      else

      echo -n "the nginx server is starting......"

      sleep 1

      $prog && echo ok && touch $lockfile || echo "fail"

      fi

}

stop () {

      if [ ! -e $lockfile ];then

      echo "the nginx server is stoped " && exit

      else

      echo -n "the nginx server is stopping...."

      $prog -s stop && echo ok && rm -rf $lockfile

      fi

}


configtest () {

      $prog -t


}


case "$1" in

start)

      start

      ;;

stop)

      stop

      ;;

restart)

      stop

      start

      ;;

configtest)

      configtest

      ;;

*)

      echo "USAGE:start|stop|restart"

esac

执行语法测试,发现有错误:

[root@localhost nginx-1.0.11]# service nginx configtest

wKiom1Ljx4eg5SlAAADU3Wqe4Fs619.jpg


缺少一个临时目录,那就创建一个:

[root@localhost nginx-1.0.11]# mkdir -pv /var/tmp/nginx/client

此时在浏览器中访问http://192.168.80.10可看到结果如下:

wKioL1Ljx3WD5QtmAACzTN5m_EU817.jpg

说明nginx安装成功!

现在来实现重定向的几个小实验:

1.只要访问我这个主目录下的任何一个图片文件时,我把它换成本地站点主目录下的index.html文件;

首先来编辑nginx的配置文件:

[root@localhost ~]# vim /etc/nginx/nginx.conf

编辑如下:

wKiom1Ljx7yjT67DAABaihhhwFw775.jpg

所有名称以/开头,以bmp结尾的站点都重定向到主目录下的index.html 文件,

然后重新nginx服务:

[root@localhost ~]# service nginx restart

然后来到客户端主机浏览器中访问http://192.168.80.10/1.bmp,http://192.168.80.10/2.bmp等,只要站点名是以bmp结尾的,都会访问到index.html文件。

wKiom1Ljx-OxzNfcAACxvmvYmQY213.jpg

wKioL1Ljx7-hqA51AAC4JfOsvR8828.jpg

2.如果要访问主目录/usr/local/nginx/html下的qq/1.bmp文件,则给它重定向到另一台服务器192.168.80.12下的qq/1.jpg文件,如果要访问主目录/usr/local/nginx/html下的abc/1.bmp文件,则给它重定向到另一台服务器192.168.80.12下的abc/1.jpg文件

首先我在192.168.80.12的服务器html站点主目录/var/www/html/下创建了两个文件夹qq和abc,并分别都添加了两个文件1.jpg和2.jpg,1.jpg内容是一个字母“q”,2.jpg的内容是一个数字“2”

编辑配置文件如下:

wKiom1LjyAvwgYd3AACGckX5nYw520.jpg

其中的$1和$2分别就是指两个括号里的变量。

当我在浏览器中输入:http://192.168.80.10/qq/1.bmp时它会自动跳转到http://192.168.80.12/qq/1.jpg

当我在浏览器中输入:http://192.168.80.10/qq/2.bmp时它会自动跳转到http://192.168.80.12/qq/2.jpg

当我在浏览器中输入:http://192.168.80.10/abc/1.bmp时它会自动跳转到http://192.168.80.12/2/1.jpg

当我在浏览器中输入:http://192.168.80.10/abc/2.bmp时它会自动跳转到http://192.168.80.12/2/2.jpg

3.无论有谁访问到我本地站点主目录的时候都会跳转到:http://www.baidu.com

先来编辑nginx的配置文件:

wKioL1LjyACSmXU_AABwEgX_NGw169.jpg


这表示所有访问到此主目录下的都将会被重定向到www.baidu.com

然后到客户机C:\Windows\System32\drivers\etc中在hosts文件中添加一句:192.168.80.10 www.abc.com (类似一个dns指向)

然后在浏览器中访问www.abc.com。(这个结果真没法截图!!!)

二、反向代理:

先来编辑nginx的配置文件:

wKioL1LjyFSQBeYZAABwTetUi4w207.jpg

只要访问到这台服务器的站点主目录时,都会给反向代理到192.168.80.12服务器上去。

在192.168.80.12服务器主站点目录下建立一个index.html文件,并写入hello。

然后再客户主机上访问http://192.168.80.10会有如下结果:

wKiom1LjyIWjgJsUAABhaxJP4nk399.jpg


说明反向代理是成功的。

但是如果反向代理不加缓存,反向代理的效率是很差的。

我们可以来测试一下:

这里需要用到httpd-tools里的一个ab工具,如果没有可以自行安装httpd-tools;

[root@localhost ~]# ab -n 10000 http://192.168.80.12/1.jpg

测试直接访问192.168.80.12下的一个1.jpg文件 10000次:

wKioL1LjyI3Qdz1CAAEXlDXg6Os804.jpg


可以发现每秒可以处理97个请求

[root@localhost ~]# ab -n 10000 http://192.168.80.10/1.jpg

测试通过反向代理访问192.168.80.12下的一个1.jpg文件 10000次:

wKiom1LjyJiCyrkCAAEc-LNvegQ224.jpg

可以发现每秒可以处理81个请求,说明没有缓存的反向代理效率很差,还不如直接访问。

接下来为反向代理增加缓存:

编辑nginx的配置文件:

wKiom1LjyN7S_GV-AADxEZvS8OM153.jpg

wKiom1LjyRLiHW-bAADCiGghpMs094.jpg


测试的时候发现少个缓存目录,那就创建一个:

wKioL1LjyMezzYIsAADFvcYhpo0926.jpg

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

然后重启nginx,

然后在浏览器上重新访问一次 http://192.168.80.10/1.jpg

然后再次测试:

[root@localhost ~]# ab -n 10000 http://192.168.80.10/1.jpg

发现此时通过反向代理访问的时候,每秒可以处理1400多个请求了,访问效率大大增加:

wKioL1LjyPmzyZ3xAAF_hGieaEA820.jpg


此时查看/data/nginx/cache/目录下已经有了缓存对象。

三、实现nginx的负载均衡以及健康检测;

在这里就要使用到在开始的时候所安装的补丁。

[root@localhost ~]# vim /tmp/healthcheck_nginx_upstreams-master/sample_ngx_config.conf

这里有一个nginx有关配置的样例文件,下边用到的配置方法可以参考这个 文件里的语法。

添加一台192.168.80.11的服务器,在站点主目录/var/www/html/下创建一个index.html文件,并且写入“welcome!”

实现对服务器192.168.80.11和192.168.80.12的轮询调度:

编辑nginx的配置文件如下:

wKioL1LkaguDeiLZAAB-a4Lqn2c642.jpg

wKioL1Ljyd-C449lAABMfly9CcM338.jpg

然后在客户端主机上访问http://192.168.80.10,每次刷新都会使welcome和hello轮流出现,比如这次出现的是hello,则刷新之后必定出现的是welcome。

也可以调节两个服务器的负载比例,比如我把nginx的配置文件修改如下:

这里的weight是设定服务器的权重:

wKiom1LkahuCMkKGAAB8hv3p2K0896.jpg

则会使出现三次welcome之后才会出现一次hello,然后再出现三次welcome,再次出现hello,也就是每访问三次192.168.80.11服务器才会访问一次192.168.80.12服务器。


下边来实现负载均衡中对服务器的健康检测,如果检测到某台服务器已经出现故障,则不会向其继续发送请求。

先来编辑nginx的配置文件如下:

wKioL1LkaeiD_j6-AADiXazZK-w861.jpg

wKiom1LkbIPjbuANAABGx824DMU163.jpg

这里的stat是调用一个stat函数,用来检测服务器的的运行状况是否良好。

然后到两个服务其中的站点主目录下建立两个.health文件,这是一个隐藏文件,里边随便输入一些内容,只要能够让主服务器能够识别其健康状况是否良好就行;

此时在浏览器中访问:http://192.168.80.10/stat可以看到如下状态界面:

wKiom1LkasXi9-XFAAHCKspXncc889.jpg

从这张图可以看出,两个台服务器的状态都完好。然后我把192.168.80.11的服务器中httpd服务关掉,就会出现如下状态。

wKioL1LkaqPjYV5-AAH9E4Acvjs937.jpg

至此,试验完成!