nginx高可用集群的部署與優化

一、nginx高可用集群部署

1、安裝nginx

# 安裝依賴包
yum install -y gcc pcre-devel openssl-devel zlib-devel

# 下載安裝包
wget https://nginx.org/download/nginx-1.17.3.tar.gz 
tar zxvf nginx-1.17.3.tar.gz 
cd nginx-1.17.3 

# 配置
./configure 
--prefix=/usr/local/nginx 
--with-http_stub_status_module 
--with-http_ssl_module 

# 編譯
make 

# 安裝
make install 

2、配置nginx集群

# 假設有兩台機器192.168.0.1和192.168.0.2,分別安裝好nginx

# 編輯nginx.conf
http {
    upstream myapp1 {
        server 192.168.0.1:8080 weight=5;
        server 192.168.0.2:8080;
    }

    server {
        listen       80;
        server_name  myapp.com;

        location / {
            proxy_pass  http://myapp1;
        }
    }
}

3、使用Keepalived實現負載均衡

# 安裝keepalived
yum install -y keepalived 

# 編輯keepalived.conf
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id nginx_lvs1
}

vrrp_instance VI_1 {
    state MASTER    # 主機為MASTER,備份機為BACKUP
    interface eth0  # 心跳檢測的網卡
    virtual_router_id 51 # 必須是一樣的
    priority 101  # 主機的優先順序,備份機的默認是100
    advert_int 1 # 每秒發送一次心跳信息
    authentication {
        auth_type PASS
        auth_pass 1111 # 必須一樣
    }
    virtual_ipaddress {
        192.168.10.55/24 dev eth0 label eth0:1 # VIP,必須在同一個網段,必須在同一個子網內
    }
}

# 啟動keepalived
systemctl enable keepalived 
systemctl start keepalived 

二、nginx高可用

1、nginx非同步IO模型

nginx採用了非同步的事件驅動模型,與傳統的阻塞式模型相比,它能夠更高效地將請求分發至後端伺服器。

nginx的進程模型也非常優秀,主進程只負責管理子進程,子進程負責處理具體業務邏輯。當一個請求到來時,nginx會將其分配至一個子進程進行處理,其他子進程仍可正常工作。

因此,即使某個子進程掛了,不會影響整個服務的正常運作。另外,nginx還支持熱部署功能,可以在不停服的情況下更新服務,大大提高了系統的可用性。

2、nginx的健康檢查

nginx支持對後端伺服器進行健康檢查,以保證服務的穩定性。常見的檢查方式包括輪詢檢查和主動健康檢查。

輪詢檢查是指nginx會輪流訪問每個後端伺服器,檢查它們的健康狀態。如果某個後端伺服器掛了,nginx會將其從服務列表中剔除,確保請求不會再分配至該伺服器。

主動健康檢查是指nginx會定時向後端伺服器發送特定的檢查請求(如ping指令或HTTP請求),如果後端伺服器超時或返回異常結果,nginx也會將其從服務列表中剔除。

三、linux高可用集群

1、使用pacemaker和corosync實現linux高可用集群

# 安裝軟體包
yum install -y pacemaker pcs corosync

# 配置集群環境
pcs cluster auth node1 node2 -u hacluster -p password
pcs cluster setup --name my_cluster node1 node2
pcs cluster start --all

# 部署資源
pcs resource create nginx ocf:heartbeat:nginx \
configfile=/etc/nginx/nginx.conf \
statusurl=http://localhost:8080/nginx_status \
force_stop=true

# 部署VIP
pcs resource create vip ocf:heartbeat:IPaddr2 \
ip=192.168.0.100 cidr_netmask=24 \
op monitor interval=30s

# 啟動
pcs constraint location nginx prefers node1=100 \
and nginx has_slave=false
pcs constraint location vip prefers node1=100 \
and vip has_slave=false

2、使用heartbeat和drbd實現linux高可用集群

# 安裝heartbeat和drbd軟體包
yum install -y heartbeat drbd84-utils

# 配置heartbeat
cp /usr/share/doc/heartbeat-3.0.5/authkeys /etc/ha.d/
chmod 600 /etc/ha.d/authkeys
echo "auth 1" >> /etc/ha.d/authkeys
echo "1 sha1 password" >> /etc/ha.d/authkeys

# 配置ha.cf
echo "logfile /var/log/ha-log" >> /etc/ha.d/ha.cf
echo "logfacility local0" >> /etc/ha.d/ha.cf
echo "keepalive 2" >> /etc/ha.d/ha.cf
echo "deadtime 15" >> /etc/ha.d/ha.cf
echo "bcast eth0" >> /etc/ha.d/ha.cf
echo "ucast eth1 192.168.1.2" >> /etc/ha.d/ha.cf
echo "ucast eth1 192.168.1.3" >> /etc/ha.d/ha.cf
echo "node drbd1 drbd2" >> /etc/ha.d/ha.cf

# 配置haresources
echo "drbd1 IPaddr::192.168.1.100/24/eth0/192.168.1.255 nginx" >> /etc/ha.d/haresources

# 啟動heartbeat
systemctl enable heartbeat
systemctl start heartbeat

# 配置DRBD
echo "resource r0 {" >> /etc/drbd.d/global_common.conf
echo "  protocol C;" >> /etc/drbd.d/global_common.conf
echo "  startup { wfc-timeout 15; degr-wfc-timeout 60; }" >> /etc/drbd.d/global_common.conf
echo "  disk {" >> /etc/drbd.d/global_common.conf
echo "    on-io-error detach;" >> /etc/drbd.d/global_common.conf
echo "  }" >> /etc/drbd.d/global_common.conf
echo "  net {" >> /etc/drbd.d/global_common.conf
echo "    cram-hmac-alg sha1;" >> /etc/drbd.d/global_common.conf
echo "    shared-secret-password password;" >> /etc/drbd.d/global_common.conf
echo "    after-sb-0pri discard-zero-changes;" >> /etc/drbd.d/global_common.conf
echo "    after-sb-1pri discard-secondary;" >> /etc/drbd.d/global_common.conf
echo "    after-sb-2pri call-pri-lost-after-sb;" >> /etc/drbd.d/global_common.conf
echo "  }" >> /etc/drbd.d/global_common.conf
echo "}" >> /etc/drbd.d/global_common.conf

echo "resource r0 {" >> /etc/drbd.d/r0.res
echo "  device /dev/drbd1;" >> /etc/drbd.d/r0.res
echo "  disk /dev/sdb1;" >> /etc/drbd.d/r0.res
echo "  meta-disk internal;" >> /etc/drbd.d/r0.res
echo "  on drbd1 {" >> /etc/drbd.d/r0.res
echo "    address 192.168.1.2:7788;" >> /etc/drbd.d/r0.res
echo "  }" >> /etc/drbd.d/r0.res
echo "  on drbd2 {" >> /etc/drbd.d/r0.res
echo "    address 192.168.1.3:7788;" >> /etc/drbd.d/r0.res
echo "  }" >> /etc/drbd.d/r0.res
echo "}" >> /etc/drbd.d/r0.res

# 啟動DRBD
systemctl enable drbd
systemctl start drbd

# 創建文件系統並掛載
mkfs.xfs /dev/drbd1
mkdir /mnt/drbd1
echo "/dev/drbd1 /mnt/drbd1 xfs defaults 0 0" >> /etc/fstab
mount /mnt/drbd1

四、nginx高可用session

1、使用memcached實現nginx高可用session

# 安裝memcached服務和擴展模塊
yum install -y memcached 
yum install -y php-pecl-memcached

# 修改php.ini文件
session.save_handler = memcached 
session.save_path = "127.0.0.1:11211"

# 修改nginx.conf文件
http {
    upstream myapp1 {
        server 192.168.0.1:8080 weight=5;
        server 192.168.0.2:8080;
    }

    server {
        listen       80;
        server_name  myapp.com;

        location / {
            proxy_pass  http://myapp1;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            # 將Session保存到memcached伺服器上
            proxy_set_header SessionID $http_cookie;
            proxy_cache_bypass $http_cookie;
            proxy_cache_key $scheme$proxy_host$request_uri$cookie_SessionID;
        }
    }
}

2、使用Redis實現nginx高可用session

# 安裝Redis服務和擴展模塊
yum install -y redis 
yum install -y php-pecl-redis

# 修改php.ini文件
session.save_handler = redis 
session.save_path = "tcp://127.0.0.1:6379"

# 修改nginx.conf文件
http {
    upstream myapp1 {
        server 192.168.0.1:8080 weight=5;
        server 192.168.0.2:8080;
    }

    server {
        listen       80;
        server_name  myapp.com;

        location / {
            proxy_pass  http://myapp1;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            # 將Session保存到Redis伺服器上
            proxy_set_header SessionID $http_cookie;
            proxy_cache_bypass $http_cookie;
            proxy_cache_key $scheme$proxy_host$request_uri$cookie_SessionID;
        }
    }
}

以上的實現方式都採用了代理伺服器,將session保存在分散式緩存中,以達到高可用的目的。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/185830.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-26 21:08
下一篇 2024-11-26 21:08

相關推薦

  • 使用Go-Redis獲取Redis集群內存使用率

    本文旨在介紹如何使用Go-Redis獲取Redis集群的內存使用率。 一、Go-Redis簡介 Go-Redis是一個用於連接Redis伺服器的Golang客戶端。它支持Redis…

    編程 2025-04-28
  • Redis5.0集群擴容用法介紹

    Redis是一個內存資料庫,越來越受到開發者的歡迎。在開發中,我們經常需要考慮Redis集群的擴容問題。而Redis5.0針對集群擴容方面進行了多項優化和改進,本文將從多個方面詳細…

    編程 2025-04-27
  • Java如何從Nginx下載文件

    本文將從以下幾個方面詳細介紹如何使用Java從Nginx下載文件。 一、準備工作 在Java中下載文件需要使用到Apache HttpClient庫,這個庫是一個基於Java的HT…

    編程 2025-04-27
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web伺服器。nginx是一個高性能的反向代理web伺服器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25
  • NGINX許可權被拒絕問題

    NGINX是一款常見的Web伺服器軟體,但是在使用中常會遇到「permission denied」許可權被拒絕的問題。下文將從多個方面介紹本問題和解決方法。 一、系統許可權問題 1、檢…

    編程 2025-04-25
  • 關閉nginx命令詳解

    一、linux系統中關閉nginx命令 1、使用ps命令找到nginx的進程ID $ ps -ef | grep nginx 2、發送信號給nginx進程結束 $ kill -QU…

    編程 2025-04-25
  • 淺談Docker集群

    一、Docker簡介 Docker可以理解為是一種容器技術,可以將應用程序及其所有依賴項打包在一個標準化單元中,以便在不同的計算機上交付。這種單元被稱為容器。相比於傳統的虛擬機技術…

    編程 2025-04-24
  • 深入淺出:理解nginx unknown directive

    一、概述 nginx是目前使用非常廣泛的Web伺服器之一,它可以運行在Linux、Windows等不同的操作系統平台上,支持高並發、高擴展性等特性。然而,在使用nginx時,有時候…

    編程 2025-04-24
  • Docker Redis 集群詳解

    一、Docker Redis 集群簡介 Docker Redis 集群是一種通過 Docker 容器實現的分散式 Redis 資料庫解決方案。通過將 Redis 資料庫實例分散在多…

    編程 2025-04-24
  • nginx指定配置文件詳解

    一、配置文件介紹 nginx的配置文件主要由指令和塊組成,以「;」分號作為結束符號,以「{}」大括弧作為塊的開始和結束標誌。 nginx的默認配置文件在安裝目錄下的conf文件夾中…

    編程 2025-04-24

發表回復

登錄後才能評論