Nginx反向代理和負載均衡應用實戰

本文檔主要介紹CentOS6.9系統用Nginx服務實現負載均衡功能html


基本流程:linux

  1. Nginx負載均衡的環境準備nginx

  2. Nginx實現一個簡單的負載均衡
    git

  3. Nginx負載均衡配置實戰github

  4. Nginx負載均衡監測節點狀態web




步驟一:Nginx負載均衡的環境準備
後端


1.硬件準備(準備四臺VM虛擬機或物理服務器,兩臺作負載均衡,兩臺作web,以下表所示)服務器

                          hostname                                 IP                              說明與介紹
                           fzMaster                         192.168.1.59                       Nginx主負載均衡器
                           fzBackup                        192.168.1.58                       Nginx備負載均衡器
                           web01                        192.168.1.23                          web01服務器
                           web02                        192.168.1.25                          web02服務器


2.系統和軟件準備app

系統:負載均衡

[root@fzMaster ~]# cat /etc/redhat-release 

CentOS release 6.9 (Final)


[root@fzMaster ~]# uname -r

2.6.32-696.20.1.el6.x86_64


軟件: nginx-1.6.3.tar.gz (下載連接:http://nginx.org/download/nginx-1.6.3.tar.gz;其它版本只需改存在的版本號便可)


3.四臺服務器上都要源碼安裝nginx

1)yum安裝依賴軟件包

配置yum源請參考  http://www.javashuo.com/article/p-ojmyrvjw-bw.html

yum install openssl openssl-devel pcre pcre-devel -y

rpm -qa openssl openssl-devel pcre pcre-devel (命令執行完後檢查,這是運維專業的規範)


2)源碼安裝Nginx,命令集以下:

mkdir -p /home/ywxi/tools

cd /home/ywxi/tools/

wget -q http://nginx.org/download/nginx-1.6.3.tar.gz

ls -l nginx-1.6.3.tar.gz

useradd nginx -s /sbin/nologin -M

tar xf nginx-1.6.3.tar.gz

cd nginx-1.6.3

 ./configure --user=nginx --group=nginx --prefix=/application/nginx-1.6.3 --with-http_stub_status_module --with-http_ssl_module

make 

make install

echo $?

ln -s /application/nginx-1.6.3/ /application/nginx

ll /application/nginx

ls -l /application/nginx/

/application/nginx/sbin/nginx -t

/application/nginx/sbin/nginx

lsof -i :80

netstat -tnlp | grep 80


3)配置用於測試的web服務(web01和web02都要配置)

[root@web01 conf]# cat nginx.conf

worker_processes  1;

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request"'

                      '$status $body_bytes_sent "$http_referer" '

                      '"$http_user_agent" "$http_x_forwarded_for"';

    server {

        listen       80;

        server_name  ywxi.com;

        location / {

            root   html/ywxi;

            index  index.html index.htm;

        }

        access_log logs/access_ywxi.log main;

}

    server {

        listen       80;

        server_name  back.com;

        location / {

            root   html/back;

            index  index.html index.htm;

        }

        access_log logs/access_back.log main;

}

}


3)向nginx代碼目錄下放置數據,用來測試

mkdir /application/nginx/html/{ywxi,back}    (兩臺web都執行)


web01這臺主機上的操做

echo "192.168.1.23 web01 back" > /application/nginx/html/back/index.html

echo "192.168.1.23 web01 ywxi" > /application/nginx/html/ywxi/index.html


web02這臺主機上的操做

echo "192.168.1.25 web02 back" > /application/nginx/html/back/index.html

echo "192.168.1.25 web02 ywxi" > /application/nginx/html/ywxi/index.html


添加好後用fzMaster這臺服務器測試

[root@fzMaster ~]# tail -2 /etc/hosts

192.168.1.25  ywxi.com

192.168.1.23  back.com

[root@fzMaster ~]# curl ywxi.com

192.168.1.25 web02 ywxi

[root@fzMaster ~]# curl back.com    

192.168.1.23 web01 back

經過上面這些配置就實現了兩臺Web服務器基於域名的虛擬主機配置了。




步驟二:Nginx實現一個簡單的負載均衡

                                                             

                                                                                         第一臺Nginx負載均衡器的準備信息

                             hostname                                      IP                                  說明與介紹
                              fzMaster                              192.168.1.59                           Nginx主負載均衡器


下面進行一個簡單的Nginx負載均衡配置,代理ywxi.com服務,節點爲web01和web02。nginx.conf配置文件內容以下:

worker_processes  1;

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    upstream www_server_pools {                       #這裏是定義web服務器池,包含了23和25兩個web節點

            server 192.168.1.23:80 weight=1;

            server 192.168.1.25:80 weight=1;

    }

    server {                                                           #定義虛擬主機

        listen       80;

        server_name  ywxi.com;

        location / {

        proxy_pass http://www_server_pools;      #訪問ywxi.com,請求會發送給www_server_pools裏面的節點

        }

    }

}


報錯:[root@fzMaster conf]# nginx -s reload

nginx: [error] invalid PID number "" in "/application/nginx-1.6.3/logs/nginx.pid"

解決:ps -ef | grep nginx|head -1 |awk '{print $2}' > /application/nginx-1.6.3/logs/nginx.pid


netstat -tnlp |grep nginx

而後,檢查負載均衡測試結果。用linux做爲客戶端來測試:

[root@fzMaster conf]# tail -1 /etc/hosts

192.168.1.59  ywxi.com   #192.168.1.59爲主負載均衡器的IP

[root@fzMaster conf]# curl ywxi.com 

192.168.1.23 web01 ywxi

[root@fzMaster conf]# curl ywxi.com 

192.168.1.25 web02 ywxi

[root@fzMaster conf]# curl ywxi.com 

192.168.1.23 web01 ywxi

[root@fzMaster conf]# curl ywxi.com 

192.168.1.25 web02 ywxi


能夠看見請求都是一比一的分配,如今咱們假設宕掉兩臺web服務器:

[root@fzMaster conf]# curl ywxi.com 

<html>

<head><title>502 Bad Gateway</title></head>

<body bgcolor="white">

<center><h1>502 Bad Gateway</h1></center>

<hr><center>nginx/1.6.3</center>

</body>

</html>

Nginx代理下面沒有了節點,由於Nginx向用戶報告了502錯誤。


若是隻宕掉一臺web,代理就不會去訪問宕機的web服務,只會訪問正常的web服務器

[root@fzMaster conf]# curl ywxi.com 

192.168.1.23 web01 ywxi

[root@fzMaster conf]# curl ywxi.com 

192.168.1.25 web02 ywxi

[root@fzMaster conf]# curl ywxi.com 

192.168.1.25 web02 ywxi

[root@fzMaster conf]# curl ywxi.com 

192.168.1.25 web02 ywxi

到這裏一臺簡單的Ngxin負載均衡器就搭建好了。




步驟三:Nginx負載均衡配置實戰

                                                                                                           

                                                                                     Nginx  Web 服務器節點信息

                             hostname                                      IP                                  說明與介紹
                              web01                             192.168.1.23                              web01服務器
                              web02                             192.168.1.25                              web02服務器

前文已經配置好兩臺web的nginx的配置文件

1)建立站點目錄及對應測試文件,命令以下:

[root@web01 conf]# for n in ywxi back;do cd /application/nginx/html/;mkdir -p $n;echo "$n.com23" >$n/index.html;done

[root@web02 html]# for n in ywxi back;do cd /application/nginx/html/;mkdir -p $n;echo "$n.com25" >$n/index.html;done

[root@web01 html]# cat ywxi/index.html 

ywxi.com23

[root@web01 html]# cat back/index.html     

back.com23


2)兩臺都作一樣的操做:

ln -s /application/nginx/sbin/nginx /bin/nginx   

[root@web01 html]# nginx -t

nginx: the configuration file /application/nginx-1.6.3/conf/nginx.conf syntax is ok

nginx: configuration file /application/nginx-1.6.3/conf/nginx.conf test is successful

[root@web01 html]# nginx -s reload

[root@web01 html]# netstat -tnlp | grep 80

tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      12950/nginx  


3)把域名加入hosts解析

[root@web01 html]# echo "192.168.1.23 ywxi.com " >> /etc/hosts  

[root@web01 html]# echo "192.168.1.23 back.com " >> /etc/hosts 

[root@web01 html]# tail -2 /etc/hosts

192.168.1.23 ywxi.com 

192.168.1.23 back.com 

[root@web02 html]# echo "192.168.1.25 ywxi.com " >> /etc/hosts   

[root@web02 html]# echo "192.168.1.25 back.com " >> /etc/hosts 

[root@web02 html]# tail -2 /etc/hosts

192.168.1.25 ywxi.com 

192.168.1.25 back.com

web01測試:

[root@web01 html]# curl ywxi.com

ywxi.com23

[root@web01 html]# curl back.com    

back.com23

web02測試:

[root@web02 back]# curl back.com          

back.com25

[root@web02 back]# curl ywxi.com          

ywxi.com25

到這裏,搭建配置虛擬主機就成功了。


4)Nginx負載均衡實踐

主Nginx負載服務器配置以下:

[root@fzMaster conf]# cat nginx.conf

worker_processes  1;

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    upstream www_server_pools {                       #這裏是定義web服務器池,包含了23和25兩個web節點

            server 192.168.1.23:80 weight=1;

            server 192.168.1.25:80 weight=1;

    }

    server {                                                           #定義虛擬主機

        listen       80;

        server_name  back.com;

        location / {

        proxy_pass http://www_server_pools;      #訪問ywxi.com,請求會發送給www_server_pools裏面的節點

        }

    }

}

配置hosts解析到代理的IP上,而後從新加載下服務,訪問測試:

[root@fzMaster conf]# tail -2 /etc/hosts

192.168.1.59  ywxi.com

192.168.1.59  back.com

[root@fzMaster conf]# nginx -s reload

[root@fzMaster conf]# curl back.com

ywxi.com23

[root@fzMaster conf]# curl back.com     

ywxi.com25

從測試結果來看,已經實現了反向代理、負載均衡功能,可是有一個特殊問題,出來的不是帶back.com的內容,而是ywxi.com的內容。(提示:這裏代理了多個虛擬主機)

解決:

加一行配置便可   proxy_set_header Host $host;

[root@fzMaster conf]# cat nginx.conf

worker_processes  1;

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    upstream www_server_pools {      

            server 192.168.1.23 weight=1;

            server 192.168.1.25 weight=1;

    }

    server {

        listen       80;

        server_name  back.com;

        location / {

        proxy_pass http://www_server_pools;

        proxy_set_header Host $host;       #在代理向後端服務器發送的http請求頭中加入hosts字段信息,用於當後端服務器配置有多個虛擬主機時,能夠識別代理的是哪一個虛擬主機。這是節點服務器多虛擬主機時的關鍵配置

        }

    }

}


從新加載Nginx服務,並用curl測試檢查下,結果以下:

[root@fzMaster conf]# nginx -s reload

[root@fzMaster conf]# curl back.com

back.com23

[root@fzMaster conf]# curl back.com

back.com25

能夠看到此次訪問的結果與訪問的域名就徹底對應上了,這樣代理多虛擬主機的節點服務器就正常了。


5)通過反向代理後的節點服務器記錄用戶真實IP實戰


proxy_set_header   X-Forwarded-For  $remote_addr;   #在代理向後端服務器發送的http請求頭中加入X-Forwarded-For字段信息,用於後端服務器程序,日誌等接收記錄真實用戶的IP,而不是代理服務器的IP。 這個地方對應web01和web02的Nginx配置文件中"$http_x_forwarded_for"'日誌參數

配置以下:

[root@fzMaster conf]# cat nginx.conf

worker_processes  1;

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    upstream www_server_pools {      

            server 192.168.1.23 weight=1;

            server 192.168.1.25 weight=1;

    }

    server {

        listen       80;

        server_name  back.com;

        location / {

        proxy_pass http://www_server_pools;

        proxy_set_header Host $host;

        proxy_set_header   X-Forwarded-For  $remote_addr;

        }

    }

}

配置了日誌參數後,用客戶端192.168.1.10測試訪問:

[root@web01 conf]# tail -2  /application/nginx/logs/access_back.log 

192.168.1.59 - - [24/Apr/2018:16:05:15 +0800] "GET / HTTP/1.0"200 11 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" "192.168.1.10"

192.168.1.59 - - [24/Apr/2018:16:05:16 +0800] "GET / HTTP/1.0"200 11 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" "192.168.1.10"


192.168.1.59爲反向代理的IP,192.168.1.10爲客戶端的真實IP。到這裏,Nginx負載均衡配置實戰已經完成了。




步驟四:Nginx負載均衡監測節點狀態

   Tengine(Nginx的分支)模塊nginx_upstream_check_module,用於提供主動式後端服務器健康檢查。經過它能夠檢測後端realserver的健康狀態,若是後端realserver不可用,則全部請求就不會轉發到該節點上。咱們這裏用Nginx打補丁的方式將該模塊添加到Nginx中。

  https://codeload.github.com/yaoweibin/nginx_upstream_check_module/zip/master   #模塊下載地址

1)安裝nginx_upstream_check_module模塊。

[root@fzMaster conf]# nginx -v 

nginx version: nginx/1.6.3


命令集以下:

cd /home/ywxi/tools/

unzip nginx_upstream_check_module-master.zip

patch -p1 < ../nginx_upstream_check_module-master/check_1.5.12+.patch

cd nginx-1.6.3

./configure --user=nginx --group=nginx --prefix=/application/nginx-1.6.3 --with-http_stub_status_module --with-http_ssl_module --add-module=../nginx_upstream_check_module-master

make    #若是是新裝的nginx接下來須要make install ,這個是給已經安裝的nginx系統打監控補丁就不須要make install了。make的做用就是從新生成Nginx二進制啓動命令而已

mv /application/nginx/sbin/nginx{,.ori}

cp ./objs/nginx /application/nginx/sbin/

nginx -t


[root@fzMaster nginx-1.6.3]# nginx -V

nginx version: nginx/1.6.3

built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC) 

TLS SNI support enabled

configure arguments: --user=nginx --group=nginx --prefix=/application/nginx-1.6.3 --with-http_stub_status_module --with-http_ssl_module --add-module=../nginx_upstream_check_module-master


2)配置Nginx健康檢查,配置文件以下:

worker_processes  1;

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    upstream www_server_pools {      

            server 192.168.1.23:80 weight=1;

            server 192.168.1.25:80 weight=1;

            check interval=3000 rise=2 fall=5 timeout=1000 type=http;

    }

    server {

        listen       80;

        server_name  back.com;

        location / {

        proxy_pass http://www_server_pools;

        proxy_set_header Host $host;

        proxy_set_header   X-Forwarded-For  $remote_addr;

        }

        location /status {

        check_status;

        access_log off;

            }   

        } 

}

[root@fzMaster conf]# nginx -s stop #此處必須重啓,從新加載不生效

[root@fzMaster conf]# nginx


訪問http://192.168.1.59/status頁面以下。這是正常狀態下Nginx節點健康檢查狀態

image.png


[root@web01 conf]# nginx -s stop  #假設宕掉一臺web01

訪問http://192.168.1.59/status頁面以下。這是不正常狀態下Nginx節點健康檢查狀態

image.png

到這裏本文章就完成了。

相關文章
相關標籤/搜索