使用keepalived實現nginx的高可用
概述
是這樣子的,我想讓家中所有的應用服務都從nginx中出去,讓nginx處於訪問的最邊緣地帶,為了讓nginx可靠性加強,所以nginx就得實現高可用,分別是下面兩臺機器要做nginx的叢集
- 10.10.10.2
- 10.10.10.3
當然上面的機器同時也要安裝nginx,總的架構就是文章圖片那個樣子
當主10.10.10.2掛了的時候可以自動切換到備10.10.10.3上的nginx,這樣就實現了nginx的高可用
文中的後端應用服務可以有很多個不單單隻有一個web網站
dns解析
我們從頭開始
首先使用者訪問 www.bboysoul.com 這個網站要經過dns解析,所以我們要在dns伺服器上加一條 www.bboysoul.com 到10.10.10.10的解析,我使用的dns伺服器是dnsmasq,這個怎麼安裝使用我就不詳細解釋了,想要了解的可以在我的部落格裡面搜尋
address=/www.bboysoul.com/10.10.10.10
之後使用者就訪問到了我們的vip,這個時候就是下一步安裝keepalived的時候
安裝配置keepalived
安裝keepalived,記得兩臺機器都要安裝哦
yum install keepalived
之後修改配置檔案,同樣兩臺機器都要 修改
vim /etc/keepalived/keepalived.conf
主的keepalived配置檔案
! Configuration File for keepalived global_defs { notification_email { [email protected] [email protected] [email protected] } notification_email_from [email protected] smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.10.10.10/24 } }
從的keepalived配置檔案
! Configuration File for keepalived global_defs { notification_email { [email protected] [email protected] [email protected] } notification_email_from [email protected] smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.10.10.10/24 } }
兩個配置檔案其實就是
priority 99
state BACKUP
兩個地方不一樣
之後重啟服務,兩臺機器都要重啟
systemctl restart keepalived
接著我們就是在這兩臺機器上安裝nginx來實現反向代理,為了簡單呢,我直接使用docker去安裝nginx
安裝nginx,下面的操作兩臺機器都要操作
首先clone我nginx的docker-compose配置檔案
git clone https://github.com/bboysoulcn/awesome-dockercompose.git
cd awesome-dockercompose/nginx
啟動nginx
docker-compose up -d
之後修改配置檔案
vim /var/lib/docker/volumes/nginx_nginx-etc/_data/nginx.conf
usernginx; worker_processes4; error_log/var/log/nginx/error.log warn; pid/var/run/nginx.pid; events { worker_connections1024; } http { include/etc/nginx/mime.types; default_typeapplication/octet-stream; log_formatmain'$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log/var/log/nginx/access.logmain; sendfileon; #tcp_nopushon; keepalive_timeout65; gzipon; # bboysoul web upstream proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=bboysoul-tmp:100m inactive=7d max_size=1000g; upstream bboysoul-web { server 10.10.10.112:8080; } server { listen80; server_namewww.bboysoul.com; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://bboysoul-web/; proxy_cache bboysoul-tmp; proxy_cache_valid200 206 304 301 302 10d; proxy_cache_key $uri; } } include /etc/nginx/conf.d/*.conf; }
之後重啟容器
docker-compose restart
最後我們就要安裝一個後端應用服務來做測試
安裝後端應用服務
同樣的,上面我們再nginx上配置了後端應用服務的地址是10.10.10.112:8080
所以我們要在10.10.10.112:8080上啟動一個服務,為了方便我們直接使用docker來起一個服務
在10.10.10.112上
cd awesome-dockercompose/visualizer
docker-compose up -d
之後我們訪問這個服務,直接在瀏覽器上輸入 www.bboysoul.com
如果看到visualizer的介面就表示成功了
測試
接著我們來到10.10.10.2和10.10.10.3這兩臺機器上
首先執行
systemctl enable keepalived
讓keepalived可以開機啟動
並且都執行下面的命令來看nginx的日誌
docker logs -f nginx
之後我們在瀏覽器上訪問 www.bboysoul.com
不出意外的話10.10.10.2上nginx是會有日誌的,也就是說我們訪問的是10.10.10.2上的nginx
之後我們模擬10.10.10.2宕機,直接在10.10.10.2上執行reboot
接著快速切換到瀏覽器上訪問 www.bboysoul.com 如果不出意外的話是可以訪問的並且我們訪問的是10.10.10.3上的nginx,當10.10.10.2重啟完成之後你會發現流量又回到了10.10.10.2上去
歡迎關注Bboysoul的部落格 www.bboysoul.com
Have Fun