试验环境:
本次试验中的服务器全用的是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
缺少一个临时目录,那就创建一个:
[root@localhost nginx-1.0.11]# mkdir -pv /var/tmp/nginx/client
此时在浏览器中访问http://192.168.80.10可看到结果如下:
说明nginx安装成功!
现在来实现重定向的几个小实验:
1.只要访问我这个主目录下的任何一个图片文件时,我把它换成本地站点主目录下的index.html文件;
首先来编辑nginx的配置文件:
[root@localhost ~]# vim /etc/nginx/nginx.conf
编辑如下:
所有名称以/开头,以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文件。
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”
编辑配置文件如下:
其中的$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的配置文件:
这表示所有访问到此主目录下的都将会被重定向到www.baidu.com
然后到客户机C:\Windows\System32\drivers\etc中在hosts文件中添加一句:192.168.80.10 www.abc.com (类似一个dns指向)
然后在浏览器中访问www.abc.com。(这个结果真没法截图!!!)
二、反向代理:
先来编辑nginx的配置文件:
只要访问到这台服务器的站点主目录时,都会给反向代理到192.168.80.12服务器上去。
在192.168.80.12服务器主站点目录下建立一个index.html文件,并写入hello。
然后再客户主机上访问http://192.168.80.10会有如下结果:
说明反向代理是成功的。
但是如果反向代理不加缓存,反向代理的效率是很差的。
我们可以来测试一下:
这里需要用到httpd-tools里的一个ab工具,如果没有可以自行安装httpd-tools;
[root@localhost ~]# ab -n 10000 http://192.168.80.12/1.jpg
测试直接访问192.168.80.12下的一个1.jpg文件 10000次:
可以发现每秒可以处理97个请求
[root@localhost ~]# ab -n 10000 http://192.168.80.10/1.jpg
测试通过反向代理访问192.168.80.12下的一个1.jpg文件 10000次:
可以发现每秒可以处理81个请求,说明没有缓存的反向代理效率很差,还不如直接访问。
接下来为反向代理增加缓存:
编辑nginx的配置文件:
测试的时候发现少个缓存目录,那就创建一个:
[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多个请求了,访问效率大大增加:
此时查看/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的配置文件如下:
然后在客户端主机上访问http://192.168.80.10,每次刷新都会使welcome和hello轮流出现,比如这次出现的是hello,则刷新之后必定出现的是welcome。
也可以调节两个服务器的负载比例,比如我把nginx的配置文件修改如下:
这里的weight是设定服务器的权重:
则会使出现三次welcome之后才会出现一次hello,然后再出现三次welcome,再次出现hello,也就是每访问三次192.168.80.11服务器才会访问一次192.168.80.12服务器。
下边来实现负载均衡中对服务器的健康检测,如果检测到某台服务器已经出现故障,则不会向其继续发送请求。
先来编辑nginx的配置文件如下:
这里的stat是调用一个stat函数,用来检测服务器的的运行状况是否良好。
然后到两个服务其中的站点主目录下建立两个.health文件,这是一个隐藏文件,里边随便输入一些内容,只要能够让主服务器能够识别其健康状况是否良好就行;
此时在浏览器中访问:http://192.168.80.10/stat可以看到如下状态界面:
从这张图可以看出,两个台服务器的状态都完好。然后我把192.168.80.11的服务器中httpd服务关掉,就会出现如下状态。
至此,试验完成!