天天看点

构建高可用服务器之四 Keepalive冗余Nginx

实验目的:

使用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]:&lt;info&gt;   prefix 24 (255.255.255.0)</code>

<code>May 21 22:18:25 nginx NetworkManager[1517]:&lt;info&gt;   gateway 192.168.33.2</code>

<code>May 21 22:18:25 nginx NetworkManager[1517]:&lt;info&gt;   nameserver </code><code>'192.168.33.2'</code>

<code>May 21 22:18:25 nginx NetworkManager[1517]:&lt;info&gt;   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,如需转载请自行联系原作者

继续阅读