nginx主主叢集
在和一些朋友交流Nginx+Keepalived技術時,我雖然已成功多次實Nginx+Keepaived專案方案,但這些都是用的單主Nginx在工作,從Nginx長期只是處於備份狀態,所以我們想將二臺Nginx負載均衡器都處於工作狀態,其實用Nginx+Keepalived也很容易實現。此方法適用場景:適合中小型網站應用場景。
一般為了維護方便,企業網站的伺服器都在自己的內部機房裡,只開放了Keepalived的VIP地址的兩個埠80、443,透過Juniper SSG550防火牆對映出去,外網DNS對應對映後的公網IP。此架構的防火牆及網路安全說明如下:
此係統架構僅對映內網VIP的80及443埠於外網的Juniper SSG550防火牆下,其他埠均關閉,內網所有機器均關閉iptables防火牆;外網DNS指向即透過Juniper SSG550對映出來的外網地址。
Nginx負載均衡作伺服器遇到的故障一般有:1.伺服器網線鬆動等網路故障;2.伺服器硬體故障發生損壞現象而crash;3.Nginx服務程式死掉(這種情況理論上會遇到,但事實上生產環境下的Linux伺服器沒有出現過這種情況,足以證明了Nginx作為負載均衡器/反向代理伺服器的穩定性,我們可以透過技術手段來解決這一問題)。
測試實驗環境:
主Nginx之一:192.168.1.5
主Nginx之二:192.168.1.6
Web伺服器一:192.168.1.17
Web伺服器二:192.168.1.18
VIP地址一:192.168.1.8
VIP地址二:192.168.1.9
一、Nginx和Keepalived的安裝比較簡單,我這裡就不重複了,大家可以參考我的專題系列的文章,如下地址,我這裡附上Nginx.conf配置檔案,如下所示:
user www www;
worker_processes 8;
pid /usr/local/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;
events
{
use epoll;
worker_connections 51200;
}
http{
include mime.types;
default_type application/octet-stream;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 8m;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
upstream backend
{
ip_hash;
server 192.168.1.17:80;
server 192.168.1.18:80;
}
server {
listen 80;
server_name ;
location / {
root /var/www/html ;
index index.php index.htm index.html;
proxy_redirect off;
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 ;
}
location /nginx {
access_log off;
auth_basic "NginxStatus";
#auth_basic_user_file /usr/local/nginx/htpasswd;
}
log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
access_log /data/logs/access.log access;
}
二、配置Keepalived檔案,我這裡簡單說下原理,其實也就是透過Keepalived生成二個例項,二臺Nginx互為備份,即第一臺是第二臺機器的備機,而第二臺機器也是第一臺的備機,而生成的二個VIP地址分別對應我們網站,這樣大家在公網上可以透過DNS輪詢來訪問得到我們的網站,任何一臺Nginx機器如果發生硬體損壞,Keepalived會自動將它的VIP地址切換到另一臺機器,不影響客戶端的訪問,這個跟我們以前的LVS+Keepalived多例項的原理是一樣的,相信大家也能明白。
主Nginx機器之一的Keepalived.conf配置檔案如下:
! Configuration File for keepalived
global_defs {
notification_email {
}
notification_email_from
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1paituan.com
}
virtual_ipaddress {
192.168.1.8
}
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 52
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1paituan.com
}
virtual_ipaddress {
192.168.1.9
}
}
主Nginx之二的keepalivd.conf配置檔案如下:
! Configuration File for keepalived
global_defs {
notification_email {
}
notification_email_from
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1paituan
}
virtual_ipaddress {
192.168.1.8
}
}
vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1paituan
}
virtual_ipaddress {
192.168.1.9
}
}
二臺機器的監控Nginx的程式指令碼,指令碼內容如下:
#!/bin/bash
while :
do
nginxpid=`ps -C nginx --no-header | wc -l`
if [ $nginxpid -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 5
nginxpid=`ps -C nginx --no-header | wc -l`
echo $nginxpid
if [ $nginxpid -eq 0 ];then
/etc/init.d/keepalived stop
fi
fi
sleep 5
done
我們分別在二臺主Nginx上執行,命令如下所示:
nohup sh /root/nginxpid.sh &
此指令碼我是直接從生產伺服器上的,大家不要懷疑它會引起死迴圈和有效性的問題,我稍為解釋一下,這是一個無限迴圈的指令碼,放在主Nginx機器上(因為目前主要是由它提供服務),每隔5秒執行一次,用ps -C 命令來收集nginx的PID值到底是否為0,如果是0的話(即Nginx程式死掉了),嘗試啟動nginx程式;如果繼續為0,即nginx啟動失改, 則關閉本機的Keeplaived程式,VIP地址則會由備機接管,當然了,整個網站就會由備機的Nginx來提供服務了,這樣保證Nginx程式的高可用。
四、正常啟動二臺主Nginx的Nginx和Keealived程式後,二臺機器的正常IP顯示應該如下所示:
這臺是IP為192.168.1.5的機器的ip addr命令顯示結果:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:0c:29:99:fb:32 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.5/24 brd 192.168.1.255 scope global eth0
inet 192.168.1.8/32 scope global eth0
這臺是IP為192.168.1.6的機器的ip addr命令顯示結果:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:0c:29:7d:58:5e brd ff:ff:ff:ff:ff:ff
inet 192.168.1.6/24 brd 192.168.1.255 scope global eth0
inet 192.168.1.9/32 scope global eth0
inet6 fe80::20c:29ff:fe7d:585e/64 scope link
valid_lft forever preferred_lft forever
3: sit0: <NOARP> mtu 1480 qdisc noop
link/sit 0.0.0.0 brd 0.0.0.0
五、測試過程如下:
一、我們要分別在二臺主Nginx上用killall殺掉Nginx程式,然後在客戶端分別訪問192.168.1.8和192.168.1.9這二個IP(模擬DNS輪詢)看能否正常訪問Web伺服器。
二、嘗試重啟192.168.1.5的主Nginx負載均衡器,測試過程如上;
三、嘗試重啟192.168.1.6的主Nginx負載均衡器,測試過程如下;
四、嘗試分別關閉192.168.1.5和192.168.1.6的機器,測試過程如上,看影響網站的正常訪問不?
六、目前投入生產要解決的問題:
一、Cacti和Nagios等監控服務要重新部署,因為現在客戶機是分別訪問二臺負載均衡器;
二、日誌收集要重新部署,現在訪問日誌是分佈在二臺負載均衡器上;
三、要考慮google收錄的問題;
四、證照的問題,二臺機器都需要;
五、其它問題暫時沒有想到,待補充。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9399028/viewspace-2076833/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL叢集之 主從複製 主主複製 一主多從 多主一叢 實現方式MySql
- 基於Dokcer搭建Redis叢集(主從叢集)Redis
- docker 配置 Mysql主從叢集DockerMySql
- Redis主從同步叢集搭建Redis主從同步
- Redis叢集搭建(三主三從)Redis
- Docker Swarms 跨主機叢集搭建DockerSwarm
- Redis叢集搭建 三主三從Redis
- Redis高可用-主從,哨兵,叢集Redis
- RocketMQ雙主雙從叢集搭建MQ
- redis原理及叢集主從配置Redis
- MySQL叢集搭建(1)-主備搭建MySql
- 主從庫與切片叢集機制
- (八)Redis 主從複製、切片叢集Redis
- repmgr 叢集雙主問題處理
- Redis搭建主從複製、哨兵叢集Redis
- Redis叢集的主從切換研究Redis
- 基於 Docker 的 MongoDB 主從叢集DockerMongoDB
- 7、tomcat叢集+MySQL主從複製TomcatMySql
- kubeadm部署一主兩從的kubernetes叢集
- 達夢DEM部署主備守護叢集
- .Net Core微服務——Consul(4):主從、叢集微服務
- Redis學習筆記七:主從叢集Redis筆記
- RocketMQ4.7.1雙主雙從叢集搭建MQ
- docker-compose安裝rocketmq雙主叢集DockerMQ
- MySQL叢集搭建(6)-雙主+keepalived高可用MySql
- Docker Compose搭建MySQL主從複製叢集DockerMySql
- Redis的主從複製,哨兵和Cluster叢集Redis
- Redis三種高可用模式:主從、哨兵、叢集Redis模式
- Etcd叢集的介紹和選主應用
- 三千字介紹Redis主從+哨兵+叢集Redis
- 【Redis】Redis叢集主從調整演算法Redis演算法
- linux系統——Redis叢集搭建(主從+哨兵模式)LinuxRedis模式
- keepalive +nginx (主從)Nginx
- 基於docker環境下搭建redis主從叢集DockerRedis
- redis主從叢集搭建及容災部署(哨兵sentinel)Redis
- redis安裝,主從複製,哨兵機制,叢集Redis
- Nginx反代MogileFS叢集Nginx
- 反問面試官:如何實現叢集內選主面試
- MONGO 叢集 修改linux主機時間後的影響GoLinux