nginx反向代理結合keepalived實現高可用

一、概念

正向代理

正向代理最大的特點是客戶端非常明確要訪問的服務器地址。服務器只清楚請求來自哪個代理服務器,而不清楚來自哪個具體的客戶端;正向代理模式屏蔽或者隱藏了真實客戶端信息。
總結
  始服務器(origin server)之間的服務器,爲了從原始服務器取得內容,客戶端向代理髮送一個請求並指定目標(原始服務器),然後代理向原始服務器轉交請求並將獲得的內容返回給客戶端。客戶端必須要進行一些特別的設置才能使用正向代理。客戶端必須設置正向代理服務器,當然前提是要知道正向代理服務器的IP地址,還有代理程序的端口

用途
(1)訪問原來無法訪問的資源,如Google
(2) 可以做緩存,加速訪問資源
(3)對客戶端訪問授權,上網進行認證
(4)代理可以記錄用戶訪問記錄(上網行爲管理),對外隱藏用戶信息

反向代理:

多個客戶端給服務器發送的請求,Nginx服務器接收到之後,按照一定的規則分發給了後端的業務處理服務器進行處理了。此時~請求的來源也就是客戶端是明確的,但是請求具體由哪臺服務器處理的並不明確了,Nginx扮演的就是一個反向代理角色。
總結
  客戶端是無感知代理的存在的,反向代理對外都是透明的,訪問者並不知道自己訪問的是一個代理。因爲客戶端不需要任何配置就可以訪問。
  反向代理,“它代理的是服務端,代服務端接收請求”,主要用於服務器集羣分佈式部署的情況下,反向代理隱藏了服務器的信息。
用途
(1)保證內網的安全,通常將反向代理作爲公網訪問地址,Web服務器是內網
(2)負載均衡,通過反向代理服務器來優化網站的負載

二、nginx安裝

原理結構如下:
在這裏插入圖片描述

安裝相關依賴

yum install pcre-devel zlib zlib-devel openssl openssl-devel

上傳解壓壓縮包

tar zxvf nginx-1.12.2.tar.gz

創建目錄,檢測配置

mkdir -p /usr/local/nginx

./configure --prefix=/usr/local/nginx

預編譯和安裝

make && make install

啓動、停止相關命令

cd /usr/local/nginx/sbin/
./nginx
./nginx -s stop
./nginx -s start

常見錯誤

在進行./configure 命令的時候經常會因爲缺少庫文件而報錯,如下:

錯誤一:缺少gc++庫文件

解決方式:在線安裝gcc gcc-++

錯誤二:缺少PCRE庫
./configure: error: the HTTP rewrite module requires the PCRE library.

解決方式:安裝pcre-devel解決問題

yum -y install pcre-devel

錯誤三:
錯誤提示:./configure: error: the HTTP cache module requires md5 functions
from OpenSSL library. You can either disable the module by using
–without-http-cache option, or install the OpenSSL library into the system,
or build the OpenSSL library statically from the source with nginx by using
–with-http_ssl_module –with-openssl= options.

解決方式:

yum  -y install openssl openssl-devel

安裝後繼續執行configure命令,即可完成Nginx的安裝

./configure --prefix=/usr/local/nginx

nginx的配置文件如下:

user  root;
worker_processes  8;
worker_cpu_affinity  00000001 00000010 00000100 00001000 00010000 00100000 01000000 1000000;
worker_rlimit_nofile 65535;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  3750;
    #accept_mutex on;
    #multi_accept on;
    use epoll;
}

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;    # 激活 TCP_CORK socket 選擇
    tcp_nodelay   on;    # 數據在傳輸的過程中不進緩存

   keepalive_timeout  65 60;

    client_header_timeout 15;
    client_body_timeout 15;
    send_timeout 25;
    client_max_body_size 8m;    # 設置客戶端最大的請求主體大小爲 8 M

    gzip  on;
    gzip_min_length  1k;         # 允許壓縮的對象的最小字節
    gzip_buffers  4 32k;         # 壓縮緩衝區大小,表示申請4個單位爲32k的內存作爲壓縮結果的緩存
    gzip_http_version  1.1;      # 壓縮版本,用於設置識別HTTP協議版本
    gzip_comp_level  9;          # 壓縮級別,1級壓縮比最小但處理速度最快,9級壓縮比最高但處理速度最慢
    gzip_types  text/plain application/x-javascript text/css application/xml;    # 允許壓縮的媒體類型
    gzip_vary  on;               # 該選項可以讓前端的緩存服務器緩存經過gzip壓縮的頁面,例如用代理服務器緩存經過Nginx壓縮的數據    

    include vhosts.conf;
    server_tokens off;
}
stream {

     upstream openldap {
         hash $remote_addr consistent;
         server 10.1.2.93:389 max_fails=4 fail_timeout=30s;
         server 10.1.2.94:389 max_fails=6 fail_timeout=30s;
     }

    server {
        listen 389;
        proxy_pass openldap;
        proxy_connect_timeout 60;
    }
}

三、keepalived安裝

爲了滿足系統的高可用,在搭建nginx時使用Keepalived檢測服務器的狀態,如果有一臺web服務器宕機,或工作出現故障,Keepalived將檢測到,並將有故障的服務器從系統中剔除,同時使用其他服務器代替該服務器的工作,當服務器工作正常後Keepalived自動將服務器加入到服務器羣中。keepalived高可用結構如下:
在這裏插入圖片描述

安裝keepalived

yum install -y keepalived

keepalived.conf配置文件如下:

! 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 proxy.hep.com  
                vrrp_skip_check_adv_addr
                vrrp_strict
                vrrp_garp_interval 0
                vrrp_gna_interval 0
}

vrrp_script chk_nginx {
        script "/etc/keepalived/nginx_check.sh"   #檢測 nginx 狀態的腳本
                interval 2 #每2秒檢測一次nginx的運行狀態
                weight -20 #失敗一次,將自己的優先級-20
}
vrrp_instance VI_1 {
        state BACKUP #BACKUP備狀態,防止資源搶佔,主備節點均採用BACKUP
                interface ens32 #網卡名,可使用ifconfig查看本機網卡名
                virtual_router_id 51 #虛擬路由ID,主備節點必須一致
                mcast_src_ip 10.1.2.91 #本機IP
                priority 100 #優先級,值越大,優先級越高,主節點優先級比備節點高
                nopreempt #設置不搶佔資源,在主節點故障,備節點啓用時,主節點恢復不搶佔備節點,依舊使用備節點來進行請求
                advert_int 1 #組播信息發送間隔,主備節點必須一致
#設置驗證信息,主備節點必須一致
                authentication {
                        auth_type PASS
                                auth_pass Zgjm0817
#  smtp_connect_timeout 30
#  smtp_connect_timeout 30
        router_id proxy.hep.com
                vrrp_skip_check_adv_addr
                vrrp_strict
                vrrp_garp_interval 0
                vrrp_gna_interval 0
}

vrrp_script chk_nginx {
        script "/etc/keepalived/nginx_check.sh"
                interval 2
                weight -20
}
vrrp_instance VI_1 {
        state BACKUP #BACKUP備狀態,防止資源搶佔,主備節點均採用BACKUP
                interface ens32 #網卡名,可使用ifconfig查看本機網卡名
                virtual_router_id 51 #虛擬路由ID,主備節點必須一致
                mcast_src_ip 10.1.2.91 #本機IP
                priority 100 #優先級,值越大,優先級越高,主節點優先級比備節點高
                nopreempt #設置不搶佔資源,在主節點故障,備節點啓用時,主節點恢復不搶佔備節點,依舊使用備節點來進行請求
                advert_int 1 #組播信息發送間隔,主備節點必須一致
#設置驗證信息,主備節點必須一致
                authentication {
                        auth_type PASS
                                auth_pass Zgjm0817
                }
        track_script {
                chk_nginx
        }
        virtual_ipaddress {
                10.1.2.90  #虛擬IP地址
        }
}

keepalived.conf中的所有配置文件參數詳解參考:
https://blog.csdn.net/mofiu/article/details/76644012

從機配置文件與主機幾乎相同,只有vrrp_instance VI_1中的 mcast_src_ip和 priority 不同,變化如下:

vrrp_instance VI_1 {
                mcast_src_ip 10.1.2.92#本機IP
                priority 90#優先級,值越大,優先級越高,主節點優先級比備節點高
}

chk_nginx 中的檢查腳本如下:

#!/bin/bash
if [  `ps -C nginx --no-header |wc -l` -eq 0 ];then
	/usr/local/nginx/sbin/nginx
	sleep 2
if [  `ps -C nginx --no-header |wc -l` -eq 0 ];then
	killall keepalived
	fi
fi

腳本解析

ps -C nginx –no-header
這裏涉及ps 的用法,我們一般用ps查看相關進程,一般都是用 ps -ef | grep XX 但是這樣通常都會覆蓋一個grep的進程
我們可以用ps -C 或ps -c 的方式, -C 後面接命令的名字 ,–no-header 不打印頭信息,如下:
在這裏插入圖片描述

wc -l 行數計算,如果
ps -C nginx --no-header|wc -l
如果值爲0,即代表服務未啓動
如果值爲非0,即代表服務已啓動
killall keepalived以服務名稱殺死進程

上面那段完整的腳本意思即爲:
判斷nginx 服務是否啓動,如果未啓動,執行啓動命令,睡眠2秒。再次判斷,如果啓動失敗,關掉keepalived,進入從節點。

啓動keepalived服務

service keepalived start

查看虛擬ip
在這裏插入圖片描述
啓動後可以通過訪問虛擬ip測試keepalived是否跳轉ip成功,然後kill掉該ip的keepalived再重新訪問,測試是否能正常訪問跳到另外一個ip。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章