RPM包安裝Nginx實現反代和集羣功能

    當服務器的訪問量大量飆升的時候,一臺服務器就會承受不了那麼大的壓力,所以我們可以將例如web這種服務進行分流,轉發到其他服務器進行處理,這種轉發的方式使用的是Nginx的ngx_http_proxy_module模塊和upstream功能。

一、機器準備和軟件安裝

    首先要準備三臺虛擬機,一臺虛擬機安裝Nginx進行代理功能的實現,另外兩臺安裝Httpd進行Web功能的實現。在這裏,我準備了一臺IP爲172.16.2.1的主機安裝Nginx,另兩臺IP分別爲172.16.2.2和172.16.2.3的主機安裝Httpd(三臺都是CentOS 6):

配置yum源:
[nginx]
name=nginx
enabled=1
baseurl=http://nginx.org/packages/centos/6/x86_64/
gpgcheck=0

    使用yum -y install nginx和yum -y install httpd來進行安裝,安裝完成之後,啓動服務,就可以通過瀏覽器來進行查看(修改主頁在這裏不贅述nginx在“/usr/share/nginx/html/index.html”,httpd在“/var/www/html/index.html”):

37ffa873fba0a4cb2aec1fd498a9ca93.png-wh_

92151c354458b14679d3559c510437b1.png-wh_

c3797fc9ff8877859f118cedc9dfd3ad.png-wh_

二、ngx_http_proxy_module模塊

    反代轉發能夠實現的功能是當我們訪問172.16.2.1的時候,Nginx服務器自動的將我們的訪問請求轉發到172.16.2.2上(172.16.2.3暫時不用),這個功能是使用ngx_http_proxy_module模塊來實現的,這個模塊中主要使用的參數是:proxy_pass URL,它的功能是:設置一個被代理的服務器的地址和協議以及一個用於被映射位置的可選的URI;可以反代http協議和https協議;服務器地址可以是一個域名或者IP地址再加上一個可選的端口號;

 注意:

  1) proxy_pass後面的路徑不帶uri時,其會將location的uri傳遞給後端主機;

  location /uri/ {

  proxy_pass http://HOST;

  }

  2) proxy_pass後面的路徑是一個uri,其會將location的uri替換成proxy_pass指令後面的uri,我們可以在目標地址後面加上一個“/”來達到不更改目錄的轉發方式,例如:“http://HOST/”;

  location /uri/ {

proxy_pass http://HOST/new_uri/;

  }

  3) 如果location定義uri時使用正則表達式的模式匹配(~|~*),則proxy_pass指令之後絕對不能使用uri;否則nginx會將之視爲語法錯誤;

  location ~(區分大小寫)|~*(不區分大小寫) PATTERN {

proxy_pass http://HOST;

  }

    我們在IP爲172.16.2.1的Nginx反代服務器上修改其配置文件“/etc/nginx/conf.d/default.conf”(有的配置文件在其主配置文件中),在這個配置文件中找到如圖所示的地方,將圖中所示的那行代碼添加上,就可以實現將對“172.16.2.1”的請求轉發到“172.16.2.2”上。(在上邊的注意中提到了對URI的匹配,在這裏就能夠用到,將這條語句加在了這裏,實現的功能就是將所有的請求進行轉發,我們也可以另外寫一個“location”來匹配對應的URI)修改之後,保存退出並使用命令“nginx -t”來檢查拼寫是否有誤,使用命令“nginx -s reload”來重啓服務。在重啓之後,我們再次通過瀏覽器訪問“172.16.2.1”,發現頁面爲我們展示的就是“172.16.2.2”的內容了:

96ab1dba04b0b021513b37fff8e7128d.png-wh_


三、ngx_http_upstream_module模塊

    上頭我們已經可以將前邊來的Web請求轉發到後端Web服務器上了,但是僅僅只能轉發到一臺服務器上,所以在這裏我們可以使用ngx_http_upstream_module模塊來實現集羣,使其能夠轉發到多個後端Web服務器上。在上面我們準備了三臺主機,一臺作爲Nginx代理服務器,兩臺作爲Web服務器。在上面的實驗之後,我們將其轉變爲集羣是一件很簡單的事情,只需要在Nginx配置文件的http上下文(server外邊)中(如果片段配置文件中沒有http上下文,可以在主配置文件中添加)添加下面這幾行代碼,並在location中引用即可:

    upstream httpserv {    #“httpserv”是一個隨便啓的名字,在location引用時使用
        server 172.16.2.2 weight=2 fail_timeout=1 max_fail=3;
            #這條指令是定義後端Web服務器的地址
            #weight是定義其權重
            #fail_timeout是定義失敗超時時間
            #max_fail是定義最大失敗次數
        server 172.16.2.3 weight=1 fail_timeout=1 max_fail=3;
        server 127.0.0.1 backup;
            #這條指令是定義當所有的Web服務器都掛掉之後使用自己的Web服務
    }

6acc406e22580483082fd836b877e805.png-wh_

    在這裏使用“location”指令將符合條件的轉發到服務器組中:

97b5820ca2733208a51e7db8f9741b76.png-wh_

    在保存退出並重新加載配置文件之後,我們隨便使用一臺主機使用命令來訪問此反代服務器:

fc5dd24cc1422cfdcd8fc8c2cd95ee9b.png-wh_

    從圖中我們可以看到集羣的基本功能已經實現了,這是基於Nginx的反向代理功能實現的,它的功能比ipvsadm更加靈活,可以基於URI進行詳細或不詳細的匹配,而且其還可以自動的對後端Web服務器進行檢測,一旦測試到後端Web服務器掛掉,就能夠立即做出應急處理,例如,我們可以將“172.16.2.2”上的httpd服務關閉,然後在“172.16.2.1”上再次進行請求,可以發現,Nginx服務器已經將“172.16.2.2”從Web服務器組中剔除了:

e26af2b3f6a3054c83906f1df5aff256.png-wh_

8bb57bc2de956f62cdbbd7b83164a4e6.png-wh_










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