天天看點

建構高可用伺服器之四 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,如需轉載請自行聯系原作者

繼續閱讀