实验目的:
使用Keepalive来保证Nginx的高可用,进而实现网站的高可用!
实验拓扑:
<a href="http://s3.51cto.com/wyfs02/M00/6D/30/wKioL1Vd8J_DlQUsAANYKLe5in0201.jpg" target="_blank"></a>
实验环境:
一、配置主机Nginx(192.168.1.2)
nginx服务的配置文件如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<code>[root@nginx ~]</code><code># cat/usr/local/nginx/conf/nginx.conf</code>
<code>worker_processes 1;</code>
<code> </code>
<code>events {</code>
<code> </code><code>worker_connections 1024;</code>
<code>}</code>
<code>http {</code>
<code> </code><code>include mime.types;</code>
<code> </code><code>default_type application</code><code>/octet-stream</code><code>;</code>
<code> </code><code>sendfile on;</code>
<code> </code><code>keepalive_timeout 65;</code>
<code>###############################################################################</code>
<code>upstream discuz {</code>
<code> </code><code>server 192.168.1.3:80 weight=1max_fails=2 fail_timeout=30s;</code>
<code> </code><code>server 192.168.1.4:80 weight=1max_fails=2 fail_timeout=30s;</code>
<code> </code><code>}</code>
<code> </code><code>server {</code>
<code> </code><code>listen 80;</code>
<code> </code><code>server_name localhost;</code>
<code> </code><code>location/ {</code>
<code> </code><code>root html;</code>
<code> </code><code>index index.html index.htm;</code>
<code> </code><code>proxy_set_header Host $host;</code>
<code> </code><code>proxy_set_header X-Real-IP$remote_addr;</code>
<code> </code><code>proxy_set_headerX-Forwarded-For $proxy_add_x_forwarded_for;</code>
<code> </code><code>proxy_pass http:</code><code>//discuz</code><code>;</code>
<code> </code><code>}</code>
<code>################################动静分离#######################################</code>
<code> </code><code>location~ .*\.(php|jsp|cgi|shtml)?$</code>
<code> </code><code>{</code>
<code> </code><code>proxy_set_header Host $host;</code>
<code> </code><code>proxy_set_header X-Real-IP$remote_addr;</code>
<code> </code><code>proxy_set_headerX-Forwarded-For $proxy_add_x_forwarded_for;</code>
<code> </code><code>proxy_pass http:</code><code>//discuz</code><code>;</code>
<code> </code><code>}</code>
<code> </code><code>location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$</code>
<code> </code><code>root</code><code>/usr/local/nginx/html</code><code>;</code>
<code> </code><code>expires 30d;</code>
<code>#######################################################################</code>
<code> </code><code>error_page 500 502 503 504 </code><code>/50x</code><code>.html;</code>
<code> </code><code>location = </code><code>/50x</code><code>.html {</code>
<code> </code><code>root html;</code>
<code> </code><code>}</code>
<code>[root@nginx ~]</code><code>#</code>
keepaive配置文件如下:
<code>[root@nginx ~]</code><code># cat/etc/keepalived/keepalived.conf</code>
<code>! Configuration File </code><code>for</code> <code>keepalived</code>
<code>global_defs {</code>
<code> </code><code>notification_email {</code>
<code> </code><code>[email protected]</code>
<code> </code><code>}</code>
<code> </code><code>notification_email_from [email protected]</code>
<code> </code><code>smtp_server 127.0.0.1</code>
<code> </code><code>smtp_connect_timeout 30</code>
<code> </code><code>router_id LVS_DEVEL</code>
<code>vrrp_script chk_nginx {</code>
<code> </code><code>script</code><code>"/data/sh/check_nginx.sh"</code>
<code> </code><code>interval2</code>
<code> </code><code>weight2</code>
<code>vrrp_instance VI_1 {</code>
<code> </code><code>state BACKUP</code>
<code> </code><code>interface eth0</code>
<code> </code><code>virtual_router_id 251</code>
<code> </code><code>priority 100</code>
<code> </code><code>mcast_src_ip 192.168.1.2</code>
<code> </code><code>advert_int 1</code>
<code> </code><code>nopreempt</code>
<code> </code><code>authentication {</code>
<code> </code><code>auth_type PASS</code>
<code> </code><code>auth_pass 1111</code>
<code> </code><code>virtual_ipaddress {</code>
<code> </code><code>192.168.1.88</code>
<code> </code><code>track_script{</code>
<code> </code><code>chk_nginx</code>
主机nginx上keepalive脚本文件:
<code>[root@nginx ~]</code><code># mkdir -p /data/sh</code>
<code>[root@nginx ~]</code><code># touch check_nginx.sh</code>
<code>[root@nginx ~]</code><code># chmod +x check_nginx.sh</code>
<code>[root@nginx ~]</code><code># vim check_nginx.sh</code>
<code>[root@nginx ~]</code><code># mv check_nginx.sh /data/sh/</code>
<code>[root@nginx ~]</code><code># cat /data/sh/check_nginx.sh</code>
<code>#!/bin/bash</code>
<code>#Target: If Nginx Down, Stop keepalive!</code>
<code>#</code>
<code>killall -0 nginx</code>
<code>if</code> <code>[[ ! $? -</code><code>eq</code> <code>0 ]];</code><code>then</code>
<code> </code><code>/etc/init</code><code>.d</code><code>/keepalived</code> <code>stop</code>
<code>fi</code>
加载模块
<code>[root@nginx ~]</code><code># modprobe ip_vs</code>
<code>[root@nginx ~]</code><code># modprobe ip_vs_rr</code>
<code>[root@nginx ~]</code><code># modprobe ip_vs_wrr</code>
启动服务
<code>[root@nginx ~]</code><code># /etc/init.d/keepalivedrestart</code>
<code>Stopping keepalived: [FAILED]</code>
<code>Starting keepalived: [ OK ]</code>
<code>[root@nginx ~]</code><code># /usr/local/nginx/sbin/nginx</code>
二、配置主机nginx2(192.168.1.5)
关于nginx服务配置文件:
与nginx主机(192.168.1.2完全一致)
关于keepalive
只需要把配置文件keepalived.conf中的mcast_src_ip 192.168.1.2改为mcast_src_ip192.168.1.5
关于keepalived的脚步配置文件
启动nginx与keepalive服务
三、测试
可以通过Nginx上的VIP 192.168.1.88访问
<a href="http://s3.51cto.com/wyfs02/M00/6D/35/wKiom1Vd736gKvcSAAMJ9snZzk0177.jpg" target="_blank"></a>
停止nginx主机上的nginx服务,VIP自动漂移到nginx2上,论坛已经可以访问;
<code>[root@nginx ~]</code><code># ps -ef | grep nginx</code>
<code>root 2067 1 0 21:31 ? 00:00:00 nginx: master process</code><code>/usr/local/nginx/sbin/nginx</code>
<code>nobody 2070 2067 0 21:31 ? 00:00:00 nginx: worker process </code>
<code>root 6302 1946 0 22:24 pts</code><code>/0</code> <code>00:00:00 </code><code>grep</code> <code>nginx</code>
<code>[root@nginx ~]</code><code># /etc/init.d/keepalivedstatus</code>
<code>keepalived (pid 4430) is running...</code>
<code>[root@nginx ~]</code><code># pkill nginx</code>
<code>keepalived is stopped</code>
<code>[root@nginx ~]</code><code># tail /var/log/messages</code>
<code>May 21 22:18:25 nginx NetworkManager[1517]:<info> prefix 24 (255.255.255.0)</code>
<code>May 21 22:18:25 nginx NetworkManager[1517]:<info> gateway 192.168.33.2</code>
<code>May 21 22:18:25 nginx NetworkManager[1517]:<info> nameserver </code><code>'192.168.33.2'</code>
<code>May 21 22:18:25 nginx NetworkManager[1517]:<info> domain name </code><code>'localdomain'</code>
<code>May 21 22:24:20 nginx Keepalived:Terminating on signal</code>
<code>May 21 22:24:20 nginx Keepalived_vrrp:Terminating VRRP child process on signal</code>
<code>May 21 22:24:20 nginx Keepalived_vrrp:VRRP_Instance(VI_1) removing protocol VIPs.</code>
<code>May 21 22:24:20 nginxKeepalived_healthcheckers: Netlink reflector reports IP 192.168.1.88 removed</code>
<code>May 21 22:24:20 nginxKeepalived_healthcheckers: Terminating Healthchecker child process on signal</code>
<code>May 21 22:24:20 nginx Keepalived: StoppingKeepalived v1.1.15 (05</code><code>/21</code><code>,2015)</code>
此时VIP在nginx2主机上(192.168.1.5)
<a href="http://s3.51cto.com/wyfs02/M00/6D/30/wKioL1Vd8SHgVtClAATMwrqe3jc019.jpg" target="_blank"></a>
论坛依旧可以访问,Nginx高可用实现成功。
<a href="http://s3.51cto.com/wyfs02/M01/6D/30/wKioL1Vd8UajXK6lAAK0Ijzd7AY078.jpg" target="_blank"></a>
四、总结
1、 selinux与iptables注意要配置或关闭及清空。
2、 注意加载ip_vs、ip_vs_rr、ip_vs_wrr模块.(根据需要加载即可)。
3、 Nginx做的有动静分离,那么两台nginx上的网站发布目录要和后台apache网站发布目录内容完全一致。
4、编译安装keepalive的时候,指定的内核一定要与本机内核一致。
5、同一组keepalive的virtual_router_id必须一致,同一局域网内有多组keepalive的时候,virtual_router_id不能一致。
(这个拓扑图中,Mysql那一组keepalive的virtual_router_id一致均为51,Nginx那一组keepalive的virtual_router_id一致均为251,因为mysql与nginx在同一局域网内,所以这两组keepalive的virtual_router_id一定不能一样。)
6、 当keepalive中开启nopreempt的时候,两台keepalive的state均为BACKUP
(nopreempt这个选项为非抢占,忽略优先级的存在,当nginx主机宕机的时候,VIP会飘到nginx2主机上,并且即使nginx主机恢复正常,VIP依旧指向nginx2,这样可以减少短暂服务中断的次数,2次变1次)
本文转自Jacken_yang 51CTO博客,原文链接:http://blog.51cto.com/linuxnote/1653680,如需转载请自行联系原作者