操做系統:centos7javascript
nginx+keepalived:106.53.73.200 masterphp
nginx+keepalived:182.254.184.102 backupcss
VIP:106.53.73.222 負載均衡器上配置的域名都解析到這個VIP上html
PS:兩臺服務器都需安裝nginx和keepalived(nginx已經安裝,這裏不做解釋)java
安裝依賴:node
# yum -y install gcc pcre-devel zlib-devel openssl-devel
關閉selinux和防火牆:linux
# 查看selinux # getenforce Disabled # 設置selinux(臨時修改) # setenforce 0 # 永久修改(寫進配置文件,重啓服務器生效) # vim /etc/sysconfig/selinux SELINUX=enforcing 改成 SELINUX=disabled
# 查看狀態(關閉只需將status改成stop便可) # systemctl status firewalld
下載最新安裝包:nginx
# wget https://www.keepalived.org/software/keepalived-2.0.19.tar.gz [root@VM_0_10_centos tmp]# tar -zxvf keepalived-2.0.19.tar.gz [root@VM_0_10_centos tmp]# cd keepalived-2.0.19/ [root@VM_0_10_centos keepalived-2.0.19]# ./configure
出現如下錯誤,是沒有安裝依賴包,安裝依賴包便可shell
[root@VM_0_10_centos keepalived-2.0.19]# yum -y install libnl libnl-devel
[root@VM_0_10_centos keepalived-2.0.19]# yum -y install libnfnetlink-devel
再次編譯安裝便可:apache
[root@VM_0_10_centos keepalived-2.0.19]# make && make install
加入到系統啓動服務:
# 將nginx和keepalived加入到開機自啓 [root@VM_0_10_centos keepalived-2.0.19]# cp -r /tmp/keepalived-2.0.19/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/ [root@VM_0_10_centos keepalived-2.0.19]# cp -r /usr/local/etc/sysconfig/keepalived /etc/sysconfig/ [root@VM_0_10_centos keepalived-2.0.19]# mkdir /etc/keepalived [root@VM_0_10_centos keepalived-2.0.19]# cp -r /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/ [root@VM_0_10_centos keepalived-2.0.19]# cp -r /usr/local/sbin/keepalived /usr/sbin/ [root@VM_0_10_centos keepalived-2.0.19]# echo "/usr/local/nginx/sbin/nginx" >> /etc/rc.local [root@VM_0_10_centos keepalived-2.0.19]# echo "/etc/init.d/keepalived start" >> /etc/rc.local
參考博客:http://www.javashuo.com/article/p-hrnbfcpv-bb.html
配置文件接入:
[root@centos6-1 conf]# vim /usr/local/nginx/conf/nginx.conf user www; worker_processes 8; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 65535; } http { include mime.types; default_type application/octet-stream; charset utf-8; ###### ## set access log format ###### log_format main '$http_x_forwarded_for $remote_addr $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_cookie" $host $request_time'; ####### ## http setting ####### sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; #便於測試,緩存功能先取消 #proxy_cache_path /var/www/cache levels=1:2 keys_zone=mycache:20m max_size=2048m inactive=60m; #proxy_temp_path /var/www/cache/tmp; fastcgi_connect_timeout 3000; fastcgi_send_timeout 3000; fastcgi_read_timeout 3000; fastcgi_buffer_size 256k; fastcgi_buffers 8 256k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; fastcgi_intercept_errors on; client_header_timeout 600s; client_body_timeout 600s; # client_max_body_size 50m; client_max_body_size 100m; #容許客戶端請求的最大單個文件字節數 client_body_buffer_size 256k; #緩衝區代理緩衝請求的最大字節數,能夠理解爲先保存到本地再傳給用戶 gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 9; gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php; gzip_vary on; ## includes vhosts include vhosts/*.conf; }
[root@centos6-1 conf]# mkdir /usr/local/nginx/conf/vhosts [root@centos6-1 conf]# mkdir /var/www/cache [root@centos6-1 conf]# ulimit 65535 [root@centos6-1 conf]# cd vhosts/ [root@centos6-1 vhosts]# vim LB.conf upstream LB-WWW { ip_hash; server 192.168.139.129:8080 max_fails=3 fail_timeout=30s; #max_fails = 3 爲容許失敗的次數,默認值爲1 server 192.168.139.130:8080 max_fails=3 fail_timeout=30s; #fail_timeout = 30s 當max_fails次失敗後,暫停將請求分發到該後端服務器的時間 } server { listen 80; server_name dev.hanginx.com; access_log /usr/local/nginx/logs/dev-access.log; error_log /usr/local/nginx/logs/dev-error.log; location / { proxy_pass http://LB-WWW; proxy_redirect off ; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 300; #跟後端服務器鏈接超時時間,發起握手等候響應時間 proxy_send_timeout 300; #後端服務器回傳時間,就是在規定時間內後端服務器必須傳完全部數據 proxy_read_timeout 600; #鏈接成功後等待後端服務器的響應時間,已經進入後端的排隊之中等候處理 proxy_buffer_size 256k; #代理請求緩衝區,會保存用戶的頭信息以供nginx進行處理 proxy_buffers 4 256k; #同上,告訴nginx保存單個用幾個buffer最大用多少空間 proxy_busy_buffers_size 256k; #若是系統很忙時候能夠申請最大的proxy_buffers proxy_temp_file_write_size 256k; #proxy緩存臨時文件的大小 proxy_next_upstream error timeout invalid_header http_500 http_503 http_404; proxy_max_temp_file_size 128m; # proxy_cache mycache; proxy_cache_valid 200 302 60m; proxy_cache_valid 404 1m; } }
在兩個tomcat服務下建立index文件進行測試,經過ip訪問以下(需重啓nginx和tomcat服務)
本身本人的配置文件是在nginx.conf配置文件中配置的,而不是經過include接入的方式:
[root@VM_0_10_centos ~]# less /usr/local/nginx/conf/nginx.conf #user nobody; user apache apache; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #便於測試,緩存功能先取消 #proxy_cache_path /var/www/cache levels=1:2 keys_zone=mycache:20m max_size=2048m inactive=60m; #proxy_temp_path /var/www/cache/tmp; client_max_body_size 100m; #容許客戶端請求的最大單個文件字節數 client_body_buffer_size 256k; #緩衝區代理緩衝請求的最大字節數,能夠理解爲先保存到本地再傳給用戶 #gzip on; #20190827添加 upstream testTomcat{ #設置分權,權重越高優先訪問 server 106.53.73.200:8888 weight=1; server 182.254.184.102:8888 weight=1; } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; #全部請求都在這裏去找分配 location / { #root html; index index.html index.htm index.php; #使用test分配規則,即剛剛自定義添加的upstream節點 proxy_pass http://testTomcat/test/; # proxy_pass http://testTomcat/; proxy_redirect off ; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 300; #跟後端服務器鏈接超時時間,發起握手等候響應時間 proxy_send_timeout 300; #後端服務器回傳時間,就是在規定時間內後端服務器必須傳完全部數據 proxy_read_timeout 600; #鏈接成功後等待後端服務器的響應時間,已經進入後端的排隊之中等候處理 proxy_buffer_size 256k; #代理請求緩衝區,會保存用戶的頭信息以供nginx進行處理 proxy_buffers 4 256k; #同上,告訴nginx保存單個用幾個buffer最大用多少空間 proxy_busy_buffers_size 256k; #若是系統很忙時候能夠申請最大的proxy_buffers proxy_temp_file_write_size 256k; #proxy緩存臨時文件的大小 proxy_next_upstream error timeout invalid_header http_500 http_503 http_404; proxy_max_temp_file_size 128m; # proxy_cache mycache; proxy_cache_valid 200 302 60m; proxy_cache_valid 404 1m; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} }
mail配置參考博客:http://www.javashuo.com/article/p-vgzwqdau-bu.html
# 修改以前先備份 [root@VM_0_10_centos ~]# cd /etc/keepalived/ [root@VM_0_10_centos keepalived]# pwd /etc/keepalived [root@VM_0_10_centos keepalived]# cp -r keepalived.conf keepalived.conf.bak [root@VM_0_10_centos keepalived]# less keepalived.conf ! Configuration File for keepalived global_defs { notification_email { # 指定keepalived在發生事件時(好比切換)發送通知郵件的郵箱 acassen@firewall.loc # 設置報警郵件地址,能夠設置多個,每行一個。 需開啓本機的sendmail服務 failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc # keepalived在發生諸如切換操做時須要發送email通知地址 smtp_server 192.168.200.1 # 指定發送email的smtp服務器 smtp_connect_timeout 30 # 設置鏈接smtp server的超時時間 router_id MASTER-200 # 運行keepalived的機器的一個標識,一般可設爲hostname。故障發生時,發郵件時顯示在郵件主題中的信息。 vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } #調用 shell 腳本對 haproxy 服務進行監控 vrrp_script check_pid { script "/etc/keepalived/check_pid.sh /var/run/nginx/nginx.pid" interval 2 # 檢測間隔 weight -5 # 權重起伏 fall 2 # 檢測連續2次失敗纔算肯定是真失敗。會用weight減小優先級(1-255之間) rise 1 # 檢測1次成功就算成功。但不修改優先級 } vrrp_instance VI_1 { state MASTER # 指定keepalived的角色,MASTER表示此主機是主服務器,BACKUP表示此主機是備用服務器。注意這裏的state指定instance(Initial)的初始狀態,就是 說在配置好後,這臺服務器的初始狀態就是這裏指定的,但這裏指定的不算,仍是得要經過競選經過優先級來肯定。若是這裏設置爲MASTER,但如若他的優先級不及另一臺,那麼這臺在發送通告時,會發送本身的優先級,另一臺發現優先級不如本身的高,那麼他會就回搶佔爲MASTER interface eth0 # 指定HA監測網絡的接口。實例綁定的網卡,由於在配置虛擬IP的時候必須是在已有的網卡上添加的 mcast_src_ip 106.53.73.200 # 發送多播數據包時的源IP地址,這裏注意了,這裏實際上就是在哪一個地址上發送VRRP通告,這個很是重要,必定要選擇穩定的網卡端口來 發送,這裏至關於heartbeat的心跳端口,若是沒有設置那麼就用默認的綁定的網卡的IP,也就是interface指定的IP地址 virtual_router_id 51 # 虛擬路由標識,這個標識是一個數字,同一個vrrp實例使用惟一的標識。即同一vrrp_instance下,MASTER和BACKUP必須是一致的 priority 101 # 定義優先級,數字越大,優先級越高,在同一個vrrp_instance下,MASTER的優先級必須大於BACKUP的優先級 advert_int 1 # 設定MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒 authentication { # 設置驗證類型和密碼。主從必須同樣 auth_type PASS # 設置vrrp驗證類型,主要有PASS和AH兩種 auth_pass keepalived } virtual_ipaddress { #VRRP HA 虛擬地址 若是有多個VIP,繼續換行填寫 106.53.73.222 } failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc # keepalived在發生諸如切換操做時須要發送email通知地址 smtp_server 192.168.200.1 # 指定發送email的smtp服務器 smtp_connect_timeout 30 # 設置鏈接smtp server的超時時間 router_id MASTER-200 # 運行keepalived的機器的一個標識,一般可設爲hostname。故障發生時,發郵件時顯示在郵件主題中的信息。 vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } #調用 shell 腳本對 haproxy 服務進行監控 vrrp_script check_pid { script "/etc/keepalived/check_pid.sh /var/run/nginx/nginx.pid" interval 2 # 檢測間隔 weight -5 # 權重起伏 fall 2 # 檢測連續2次失敗纔算肯定是真失敗。會用weight減小優先級(1-255之間) rise 1 # 檢測1次成功就算成功。但不修改優先級 } vrrp_instance VI_1 { state MASTER # 指定keepalived的角色,MASTER表示此主機是主服務器,BACKUP表示此主機是備用服務器。注意這裏的state指定instance(Initial)的初始狀態,就是 說在配置好後,這臺服務器的初始狀態就是這裏指定的,但這裏指定的不算,仍是得要經過競選經過優先級來肯定。若是這裏設置爲MASTER,但如若他的優先級不及另一臺,那麼這臺在發送通告時,會發送本身的優先級,另一臺發現優先級不如本身的高,那麼他會就回搶佔爲MASTER interface eth0 # 指定HA監測網絡的接口。實例綁定的網卡,由於在配置虛擬IP的時候必須是在已有的網卡上添加的 mcast_src_ip 106.53.73.200 # 發送多播數據包時的源IP地址,這裏注意了,這裏實際上就是在哪一個地址上發送VRRP通告,這個很是重要,必定要選擇穩定的網卡端口來 發送,這裏至關於heartbeat的心跳端口,若是沒有設置那麼就用默認的綁定的網卡的IP,也就是interface指定的IP地址 virtual_router_id 51 # 虛擬路由標識,這個標識是一個數字,同一個vrrp實例使用惟一的標識。即同一vrrp_instance下,MASTER和BACKUP必須是一致的 priority 101 # 定義優先級,數字越大,優先級越高,在同一個vrrp_instance下,MASTER的優先級必須大於BACKUP的優先級 advert_int 1 # 設定MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒 authentication { # 設置驗證類型和密碼。主從必須同樣 auth_type PASS # 設置vrrp驗證類型,主要有PASS和AH兩種 auth_pass keepalived } virtual_ipaddress { #VRRP HA 虛擬地址 若是有多個VIP,繼續換行填寫 106.53.73.222 } #服務端口監控 track_script { check_pid } }
[root@VM_0_10_centos keepalived]# less check_pid.sh #!/bin/bash #keepalived 根據進程 Pid 監控服務腳本 # #使用方法: #vrrp_script check_pid {#建立一個vrrp_script腳本,檢查配置 # script "/etc/keepalived/check_pid.sh /var/run/nginx.pid" #配置須要監控進程的PID 文件完整路徑 # interval 2 #檢查腳本的頻率,單位(秒) # weight -5 #權重起伏 #} PidPath=$1 echo $PidPath if [ -e $PidPath ];then echo "$PidPath is run !!!" exit 0; else echo "$PidPath File does not exist !!!" exit -1; fi
[root@VM_0_16_centos tomcat-8.5.45]# cd /etc/keepalived/ [root@VM_0_16_centos keepalived]# ls keepalived.conf [root@VM_0_16_centos keepalived]# pwd /etc/keepalived [root@VM_0_16_centos keepalived]# cp -r keepalived.conf keepalived.conf.bak [root@VM_0_16_centos keepalived]# cp /thyclient/keepalived.conf . cp: overwrite ‘./keepalived.conf’? y [root@VM_0_16_centos keepalived]# less keepalived.conf ! Configuration File for keepalived global_defs { notification_email { # 指定keepalived在發生事件時(好比切換)發送通知郵件的郵箱 acassen@firewall.loc # 設置報警郵件地址,能夠設置多個,每行一個。 需開啓本機的sendmail服務 failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc # keepalived在發生諸如切換操做時須要發送email通知地址 smtp_server 192.168.200.1 # 指定發送email的smtp服務器 smtp_connect_timeout 30 # 設置鏈接smtp server的超時時間 router_id BACKUP-102 # 運行keepalived的機器的一個標識,一般可設爲hostname。故障發生時,發郵件時顯示在郵件主題中的信息。 vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } #調用 shell 腳本對 haproxy 服務進行監控 vrrp_script check_pid { script "/etc/keepalived/check_pid.sh /var/run/nginx/nginx.pid" interval 2 # 檢測間隔 weight -5 # 權重起伏 fall 2 # 檢測連續2次失敗纔算肯定是真失敗。會用weight減小優先級(1-255之間) rise 1 # 檢測1次成功就算成功。但不修改優先級 } vrrp_instance VI_1 { state BACKUP # 指定keepalived的角色,MASTER表示此主機是主服務器,BACKUP表示此主機是備用服務器。注意這裏的state指定instance(Initial)的初始狀態,就是 說在配置好後,這臺服務器的初始狀態就是這裏指定的,但這裏指定的不算,仍是得要經過競選經過優先級來肯定。若是這裏設置爲MASTER,但如若他的優先級不及另一臺,那麼這臺在發送通告時,會發送本身的優先級,另一臺發現優先級不如本身的高,那麼他會就回搶佔爲MASTER interface eth0 # 指定HA監測網絡的接口。實例綁定的網卡,由於在配置虛擬IP的時候必須是在已有的網卡上添加的 mcast_src_ip 182.254.184.102 # 發送多播數據包時的源IP地址,這裏注意了,這裏實際上就是在哪一個地址上發送VRRP通告,這個很是重要,必定要選擇穩定的網卡端口 來發送,這裏至關於heartbeat的心跳端口,若是沒有設置那麼就用默認的綁定的網卡的IP,也就是interface指定的IP地址 virtual_router_id 51 # 虛擬路由標識,這個標識是一個數字,同一個vrrp實例使用惟一的標識。即同一vrrp_instance下,MASTER和BACKUP必須是一致的 priority 100 # 定義優先級,數字越大,優先級越高,在同一個vrrp_instance下,MASTER的優先級必須大於BACKUP的優先級 advert_int 1 # 設定MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒 authentication { # 設置驗證類型和密碼。主從必須同樣 auth_type PASS # 設置vrrp驗證類型,主要有PASS和AH兩種 auth_pass keepalived } virtual_ipaddress { #VRRP HA 虛擬地址 若是有多個VIP,繼續換行填寫 106.53.73.222 } failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc # keepalived在發生諸如切換操做時須要發送email通知地址 smtp_server 192.168.200.1 # 指定發送email的smtp服務器 smtp_connect_timeout 30 # 設置鏈接smtp server的超時時間 router_id BACKUP-102 # 運行keepalived的機器的一個標識,一般可設爲hostname。故障發生時,發郵件時顯示在郵件主題中的信息。 vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } #調用 shell 腳本對 haproxy 服務進行監控 vrrp_script check_pid { script "/etc/keepalived/check_pid.sh /var/run/nginx.pid" interval 2 # 檢測間隔 weight -5 # 權重起伏 fall 2 # 檢測連續2次失敗纔算肯定是真失敗。會用weight減小優先級(1-255之間) rise 1 # 檢測1次成功就算成功。但不修改優先級 } vrrp_instance VI_1 { state BACKUP # 指定keepalived的角色,MASTER表示此主機是主服務器,BACKUP表示此主機是備用服務器。注意這裏的state指定instance(Initial)的初始狀態,就是 說在配置好後,這臺服務器的初始狀態就是這裏指定的,但這裏指定的不算,仍是得要經過競選經過優先級來肯定。若是這裏設置爲MASTER,但如若他的優先級不及另一臺,那麼這臺在發送通告時,會發送本身的優先級,另一臺發現優先級不如本身的高,那麼他會就回搶佔爲MASTER interface eth0 # 指定HA監測網絡的接口。實例綁定的網卡,由於在配置虛擬IP的時候必須是在已有的網卡上添加的 mcast_src_ip 182.254.184.102 # 發送多播數據包時的源IP地址,這裏注意了,這裏實際上就是在哪一個地址上發送VRRP通告,這個很是重要,必定要選擇穩定的網卡端口 來發送,這裏至關於heartbeat的心跳端口,若是沒有設置那麼就用默認的綁定的網卡的IP,也就是interface指定的IP地址 virtual_router_id 51 # 虛擬路由標識,這個標識是一個數字,同一個vrrp實例使用惟一的標識。即同一vrrp_instance下,MASTER和BACKUP必須是一致的 priority 100 # 定義優先級,數字越大,優先級越高,在同一個vrrp_instance下,MASTER的優先級必須大於BACKUP的優先級 advert_int 1 # 設定MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒 authentication { # 設置驗證類型和密碼。主從必須同樣 auth_type PASS # 設置vrrp驗證類型,主要有PASS和AH兩種 auth_pass keepalived } virtual_ipaddress { #VRRP HA 虛擬地址 若是有多個VIP,繼續換行填寫 106.53.73.222 } #服務端口監控 track_script { check_pid } }
1)前後在master、slave服務器上啓動nginx和keepalived,保證這兩個服務都正常開啓:
[root@VM_0_10_centos keepalived]# /usr/local/nginx/sbin/nginx -s reload [root@VM_0_10_centos keepalived]# /etc/init.d/keepalived restart
這裏使用ip a查看vip、地址,並無顯示
解決:將keepalived.conf文件中的virtual_router_id參數設置成其它便可,如:7九、8九、101。只要取值範圍在取值0-255就行。(我這裏是改成了79,上面配置文件中也已修改)
而後重啓keepalived服務便可
2)查看backup服務的vip地址(目前是沒有的)
咱們將master服務的keepalived服務中止,看下backup主機的vip地址是否漂移過去
[root@VM_0_10_centos keepalived]# /etc/init.d/keepalived stop Stopping keepalived (via systemctl): [ OK ]
master主機的vip地址已經沒有了
在backup主機上查看,此時從服務已經接管
參考博客
http://www.javashuo.com/article/p-hrnbfcpv-bb.html