實驗目的:
使用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,如需轉載請自行聯系原作者