Nginx基礎、學習nginx配置及舉例使用端口或域名來區分不同的虛擬主機、nginx配置反向代理、nginx負載均衡、LVS+Nginx負載均衡

Nginx基礎

域名訪問系統
目前訪問系統存在的問題
目前訪問後臺系統:
http://localhost:8081/
目前訪問首頁系統:
http://localhost:8082/
目前訪問搜索結果頁面:
http://localhost:8085
在搜索結果頁面search.jsp中,代碼中寫死了其他的系統的全路徑。
問題:
1.localhost只能訪問本地,不能訪問其他的服務器;
系統應當要部署在測試環境和生產環境。
可以使用ip地址?
2.開發環境的ip地址和測試環境的ip地址是不一樣的。每次環境變化的時候,都需要修改訪問的ip地址
3.頁面加載資源或者請求其他系統的URL時,使用了全路徑,一旦環境發生改變,資源無法加載,請求無法訪問。
4.ip地址沒有意義,不容易記憶,用戶不會通過ip地址進行訪問,一般通過域名訪問。
使用域名訪問
例如:訪問本地開發環境下的商品詳情頁面:
修改本機hosts文件:
存在的問題:
訪問時域名後還需要加上端口。
可以使用nginx進行配置,達到只使用域名訪問的目的。

第一:什麼是Nginx?
Nginx是一款高性能的http 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器。由俄羅斯的程序設計師Igor Sysoev所開發,官方測試nginx能夠支支撐5萬併發鏈接,並且cpu、內存等資源消耗卻非常低,運行非常穩定。

第二:Nginx的應用場景是什麼?
1、http服務器。Nginx是一個http服務可以獨立提供http服務。可以做網頁靜態服務器。
2、虛擬主機。可以實現在一臺服務器虛擬出多個網站。例如個人網站使用的虛擬主機。

(這裏舉個例子,前幾年流行自己創建個個人網站來娛樂,如果要是每個人都買一臺服務器來維護網站的話,費用是比較高的,很划不來,爲了降低費用便催生出虛擬主機,就是在一臺服務器上虛擬出多個"主機"出來,大家可以共用這一臺服務器,費用當然就很低了,但是有個問題,我們知道nginx默認的端口是80,使用nigix訪問靜態網頁的時候,是不用輸入80端口就可以訪問的,如果nginx的端口修改爲別的端口號如81,那麼訪問的時候便需要輸入端口號81才能訪問。多個人共用一臺服務器,訪問地址不能以端口號作爲區分網站的標誌,因爲誰也不想在輸入訪問地址的時候還帶個端口號,大家掏的錢都是一樣的,那麼怎麼讓大家都使用80端口而且區分出不同的個人網站呢?這就用到了域名,不同的用戶輸入自己的域名就可以訪問自己的網站。比如aaaa.com、bbbb.com兩個域名,這兩個域名對應着同一臺服務器並且共用80端口)

3、反向代理,負載均衡。當網站的訪問量達到一定程度後,單臺服務器不能滿足用戶的請求時,需要用多臺服務器集羣可以使用nginx做反向代理。並且多臺服務器可以平均分擔負載,不會因爲某臺服務器負載高宕機而某臺服務器閒置的情況。

第三:nginx的安裝
在這裏插入圖片描述
在這裏插入圖片描述

學習nginx配置及舉例使用端口、域名來區分不同的虛擬主機

在這裏插入圖片描述

nginx下的conf下的nginx.conf已經被改成了這樣!
在這裏插入圖片描述
在這裏插入圖片描述

nginx-1.6.2下的conf下的nginx.conf還沒有進行過改變
在這裏插入圖片描述
在這裏插入圖片描述

總結:conf nginx.conf裏一個server相當於一個虛擬主機
端口號和域名來區分虛擬主機
location配置的事nginx的首頁訪問文件,其中html代表以html爲目錄爲根目錄,在這個目錄下有index.html或index.html
訪問錯誤頁面的配置

下面又一個server是告訴我們可以通過IP或域名或者端口號來區分不同的虛擬主機
nginx支持配置https的虛擬主機,https傳輸內容更加安全,像淘寶和百度已經是全棧使用https來訪問頁面了。雖然https比http的性能方面要差一點,但對當今的互聯網來說已經不是什麼問題了。

我們打開nginx.conf文件,複製一份server配置,修改端口爲81,root目錄指定一個新的目錄html81。
html81在nginx目錄下是沒有的,我們複製一份html目錄並命名爲html81

爲了區分出我們訪問的nginx首頁,我們進入html81目錄,修改index.html,將

Welcome to nginx!

修改爲

Welcome to nginx81!

由於我們修改了nginx的配置文件,我們需要熱重啓nginx(也就是刷新nginx)

[root@taotao-nginx-server nginx]# sbin/nginx -s reload

我們訪問81端口就會看到如下圖所示界面,可以看見訪問到的是81端口的歡迎頁。說明我們配置的虛擬主機起作用了。

上面學習了使用端口號來區分不同的網站,下面我們學習下如何通過域名來區分不同的網址。

我們平時訪問淘寶時只需要在地址欄中輸入taobao.com便可以訪問淘寶首頁,這個"taobao.com"便是域名,而且"taobao.com"是一級域名,我們買域名買的便是一級域名。"www.taobao.com"是二級域名。如果我們想在地址欄中輸入域名訪問我們自己的網站的話,有兩個途徑,第一個途徑是買一個屬於自己的域名,訪問這個域名需要經過DNS服務器,DNS服務器就是爲了將訪問的域名對應到相應的IP上,所以最終還是通過IP實際訪問網站(這個途徑別的人都可以訪問到你的網站),第二個途徑是配置本地的hosts文件,Hosts文件所在windows系統的目錄

我們可以在HOSTS文件當中配置IP與域名的對應關係,配置了HOSTS文件後我們在地址欄輸入配置在HOSTS文件中的域名後將不再經過DNS服務器,直接訪問HOSTS文件配置的IP地址,比如我們把nginx所在的虛擬機的IP配置到HOSTS文件中並且配兩個域名(端口一樣,就靠域名來區分不同的網站

下面我們到nginx的配置文件中再添加兩個虛擬主機的配置,如下圖所示,可以看到端口號都是默認的80,只是域名不一樣而已,爲了區分不同的網站,我們分別建一個html目錄命名爲html-163和html-sougou

html-163和html-sougou在nginx目錄下默認是沒有的,我們分別複製html目錄並命名爲html-baidu和html-sougou,cp -r html/ html-163. cp -r html/ html-sougou

爲了在nginx首頁區分出不同的網站,我們分別進入html-baidu和html-sougou目錄下,修改index.html文件

修改完了nginx訪問首頁後,我們重啓nginx. sbin/nginx -s reload

然後,我們在地址欄輸入www.163.com,如下圖所示,可以看到這時訪問的是我們的nginx的首頁而且是我們指定的nginx的首頁。

Mac配置hosts文件
1.本地編輯hosts文件,具體操作如下在空白桌面上點擊,鍵入command+shift+G出來一個前往文件夾的界面
輸入/etc/hosts找到hosts文件 拷貝出來一份,編輯後替換即可,記得備份一下
2.通過終端vim編輯hosts文件,打開終端輸入如下
根據提示進入vim頁面 鍵入I命令可以開始編輯 esc結束編輯 :wq!保存並且退出 退出之後可以通過 cat /etc/hosts查看後編輯的文件

nginx配置反向代理

我們經常聽說反向代理這個概念,既然有反向代理,那麼就應該有正向代理,什麼是正向代理呢?如下圖所示,所謂的正向代理是指當用戶發起請求時無法直接訪問到某個網站(比如我們經常聽到的翻牆),需要經過一箇中間服務器,用戶將請求發給中間服務器,中間服務器可以訪問用戶想要訪問的網站,中間服務器將用戶的請求轉發給想要訪問的網站,然後將那個網站響應的結果再返回給用戶,這就是正向代理。
在這裏插入圖片描述

接着,我們再來看下反向代理,如下圖所示,一般情況下,一個大型網站都是由多個服務器組成的,比如某個網站是由三個tomcat組成的集羣對外提供服務的。那麼當用戶發情一個請求後,應該是哪個tomcat對外提供服務呢?這就是nginx反向代理所要做的事情,nginx會幫我們自動找一個tomcat來處理我們的請求,用戶根本就不需要關心。
在這裏插入圖片描述
現在我們就用實際的例子來學習反向代理,首先我們兩臺虛擬機(僞分佈式沒有什麼實際意義,在工作中是不可能用到僞分佈式的,因此學習的時候最好就按照實際生產環境來學習)。在兩臺虛擬機上都安裝JDK和tomcat(tomcat的運行需要用到JDK)。

兩臺虛擬機我們都在/usr/local目錄下新建software目錄,然後我們將tomcat安裝包上傳到/usr/local/software目錄下,使用tar -zxvf apache-tomcat-7.0.47.tar.gz -C /usr/local/命令解壓tomcat安裝包。

下面我們在nginx服務器上配置下反向代理,添加的內容如下:
upstream tomcat1{
server 192.168.156.32:8080;
}
upstream tomcat2{
server 192.168.156.33:8080;
}

server {
    listen       80;
    server_name  www.ceshi1.com;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        proxy_pass   http://tomcat1;
        index  index.html index.htm;
    }
}
server {
    listen       80;
    server_name  www.ceshi2.com;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        proxy_pass   http://tomcat2;
        index  index.html index.htm;
    }
}

可以看到使用的域名爲www.ceshi1.com、www.ceshi2.com,我們需要在HOSTS文件中添加對應的映射關係,如下所示(大家根據自己虛擬機的實際IP來配置)
192.168.156.31 www.ceshi1.com
192.168.156.31 www.ceshi2.com

由於nginx的配置文件做了修改,因此需要重啓nginx。

爲了區分出我們訪問的tomcat屬於哪個,我們給每個tomcat首頁加上標誌,需要修改的文件路徑是/usr/local/apache-tomcat-7.0.47/webapps/ROOT/index.jsp,tomcat1的修改。在

${pageContext.servletContext.serverInfo}原來的信息後面加上了"-tomcat1",另外一個個tomcat也做下相應修改即可。

啓動兩個tomcat,然後在地址欄輸入www.ceshi1.com,可以看到我們訪問到了tomcat1的首頁。

我們再訪問下www.ceshi2.com,可以看到訪問到的是tomcat2的首頁。這說明我們的反向代理配置的沒問題。

nginx負載均衡

上節我們一起學習了nginx反向代理,這節課我們一起學習下nginx的負載均衡。

再新建一臺虛擬機,參照上節課安裝tomcat,然後我們在nginx配置文件中配置下負載均衡,只需在upstream Tomcat1中添加一行即可,如下。
server 192.168.156.34:8080;

添加完如下圖(不配置任何負載均衡策略的話,默認是輪詢策略,就是機會完全均分),這意味着,當我們訪問www.ceshi1.com的時候會在兩個tomcat之間循環訪問。當然,我們也可以配置其它負載均衡策略,網上有很多,這裏我不囉嗦了。

upstream tomcat1{
server 192.168.156.32:8080;
server 192.168.156.34:8080;
}
upstream tomcat2{
server 192.168.156.33:8080;
}

server {
    listen       80;
    server_name  www.ceshi1.com;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        proxy_pass   http://tomcat1;
        index  index.html index.htm;
    }
}
server {
    listen       80;
    server_name  www.ceshi2.com;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        proxy_pass   http://tomcat2;
        index  index.html index.htm;
    }
}

我們訪問一下www.ceshi1.com,會先看到如下圖所示界面
我們刷新一下頁面,會看到如下圖所示界面,可以看到現在訪問的是tomcat3。

這說明負載均衡起作用了。這裏提醒一點的是,如果是自己創建的三臺安裝tomcat虛擬機的話,很有可能遇到輪詢只起一次作用的情況(就是先顯示訪問tomcat1後顯示tomcat3,之後一直顯示tomcat3),這種情況我們不必理會它,這可能是VMWare虛擬機本身的bug,因爲我用實際的服務器去測試就完全沒有問題。

LVS+Nginx負載均衡

一、課程目標
掌握什麼是負載均衡及負載均衡的作用和意義。
瞭解lvs負載均衡的三種模式。
瞭解lvs-DR負載均衡部署方法。
掌握nginx實現負載均衡的方法。
掌握lvs+nginx負載均衡拓撲結構。

二、負載均衡方案
2.1 什麼是負載均衡?
一臺普通服務器的處理能力是有限的,假如能達到每秒幾萬個到幾十萬個請求,但卻無法在一秒鐘內處理上百萬個甚至更多的請求。但若能將多臺這樣的服務器組成一個系統,並通過軟件技術將所有請求平均分配給所有服務器,那麼這個系統就完全擁有每秒鐘處理幾百萬個甚至更多請求的能力。這就是負載均衡最初的基本設計思想。
負載均衡是由多臺服務器以對稱的方式組成一個服務器集合,每臺服務器都具有等價的地位,都可以單獨對外提供服務而無須其他服務器的輔助。通過某種負載分擔技術,將外部發送來的請求按照某種策略分配到服務器集合的某一臺服務器上,而接收到請求的服務器獨立地迴應客戶的請求。負載均衡解決了大量併發訪問服務問題,其目的就是用最少的投資獲得接近於大型主機的性能。

2.2 相關技術
2.2.1 基於DNS的負載均衡
DNS(Domain Name System,域名系統),因特網上作爲域名和IP地址相互映射的一個分佈式數據庫,能夠使用戶更方便的訪問互聯網,而不用去記住能夠被機器直接讀取的IP數串。通過主機名,最終得到該主機名對應的IP地址的過程叫做域名解析(或主機名解析)。DNS協議運行在UDP協議之上,使用端口號53。
DNS負載均衡技術是最早的負載均衡解決方案,它是通過DNS服務中的隨機名字解析來實現的,在DNS服務器中,可以爲多個不同的地址配置同一個名字,而最終查詢這個名字的客戶機將在解析這個名字時得到其中的一個地址。因此,對於同一個名字,不同的客戶機會得到不同的地址,它們也就訪問不同地址上的Web服務器,從而達到負載均衡的目的。
優點:實現簡單、實施容易、成本低、適用於大多數TCP/IP應用;
缺點:
1、 負載分配不均勻,DNS服務器將Http請求平均地分配到後臺的Web服務器上,而不考慮每個Web服務器當前的負載情況;如果後臺的Web服務器的配置和處理能力不同,最慢的Web服務器將成爲系統的瓶頸,處理能力強的服務器不能充分發揮作用;
2、可靠性低,如果後臺的某臺Web服務器出現故障,DNS服務器仍然會把DNS請求分配到這臺故障服務器上,導致不能響應客戶端。
3、變更生效時間長,如果更改NDS有可能造成相當一部分客戶不能享受Web服務,並且由於DNS緩存的原因,所造成的後果要持續相當長一段時間(一般DNS的刷新週期約爲24小時)。

2.2.2 基於四層交換技術的負載均衡
基於四層交換技術的負載均衡是通過報文中的目標地址和端口,再加上負載均衡設備設置的服務器選擇方式,決定最終選擇的內部服務器與請求客戶端建立TCP連接,然後發送Client請求的數據。
client發送請求至4層負載均衡器,4層負載均衡器根據負載策略把client發送的報文目標地址(原來是負載均衡設備的IP地址)修改爲後端服務器(可以是web服務器、郵件服務等)IP地址,這樣client就可以直接跟後端服務器建立TCP連接併發送數據。
具有代表意義的產品:LVS(開源軟件),F5(硬件)
優點:性能高、支持各種網絡協議
缺點:對網絡依賴較大,負載智能化方面沒有7層負載好(比如不支持對url個性化負載),F5硬件性能很高但成本也高需要人民幣幾十萬,對於小公司就望而卻步了。

2.2.3 基於七層交換技術的負載均衡
基於七層交換技術的負載均衡也稱內容交換,也就是主要通過報文中的真正有意義的應用層內容,再加上負載均衡設備設置的服務器選擇方式,決定最終選擇的服務器。

七層負載均衡服務器起了一個代理服務器的作用,client要訪問webserver要先與七層負載設備進行三次握手後建立TCP連接,把要訪問的報文信息發送給七層負載均衡;然後七層負載均衡再根據設置的均衡規則選擇特定的webserver,然後通過三次握手與此臺webserver建立TCP連接,然後webserver把需要的數據發送給七層負載均衡設備,負載均衡設備再把數據發送給client。
具有代表意義的產品:nginx(軟件)、apache(軟件)
優點:對網絡依賴少,負載智能方案多(比如可根據不同的url進行負載)
缺點:網絡協議有限,nginx和apache支持http負載,性能沒有4層負載高

2.3 使用四層+七層負載均衡結合方案
四層負載使用lvs軟件或F5硬件實現。
七層負載使用nginx實現。
如下圖是lvs+nginx的拓撲結構:
在這裏插入圖片描述

三、LVS實現四層負載DR模式
3.1 什麼是LVS?

LVS是Linux Virtual Server的簡寫,意即Linux虛擬服務器,是一個虛擬的服務器集羣系統。本項目在1998年5月由章文嵩博士成立,是中國國內最早出現的自由軟件項目之一。

3.2 LVS實現負載的三種方式
運行 IPVS軟件的服務器,在整個負載均衡集羣中承擔一調度角色 軟件的服務器,(即 向真實服務器分配從客戶端過來的請求。LVS中的調度方法有三種 :NAT(Network Address Translation網絡地址轉換)、TUN(tunnel 隧道)、DR(direct route 直接路由)

3.2.1 LVS-DR模式
請求由LVS接受,由真實提供服務的服務器(RealServer, RS)直接返回給用戶,返回的時候不經過LVS。
DR模式下需要LVS服務器和RS綁定同一個VIP, 一個請求過來時,LVS只需要將網絡幀的MAC地址修改爲某一臺RS的MAC,該包就會被轉發到相應的RS處理,注意此時的源IP和目標IP都沒變,RS收到LVS轉發來的包,發現MAC是自己的,發現IP也是自己的,於是這個包被合法地接受,而當RS返回響應時,只要直接向源IP(即用戶的IP)返回即可,不再經過LVS。
DR模式下,lvs接收請求輸入,將請求轉發給RS,由RS輸出響應給用戶,性能非常高。它的不足之處是要求負載均衡器與RS在一個物理段上。

3.2.2 LVS-NAT模式
NAT(Network Address Translation)是一種外網和內網地址映射的技術。NAT模式下,LVS需要作爲RS的網關,當網絡包到達LVS時,LVS做目標地址轉換(DNAT),將目標IP改爲RS的IP。RS接收到包以後,處理完,返回響應時,源IP是RS IP,目標IP是客戶端的IP,這時RS的包通過網關(LVS)中轉,LVS會做源地址轉換(SNAT),將包的源地址改爲VIP,對於客戶端只知道是LVS直接返回給它的。
NAT模式請求和響應都需要經過lvs,性能沒有DR模式好。

3.2.3 LVS-TUN模式
TUN模式是通過ip隧道技術減輕lvs調度服務器的壓力,許多Internet服務(例如WEB服務器)的請求包很短小,而應答包通常很大,負載均衡器只負責將請求包分發給物理服務器,而物理服務器將應答包直接發給用戶。所以,負載均衡器能處理很巨大的請求量。相比NAT性能要高的多,比DR模式的優點是不限制負載均衡器與RS在一個物理段上。但是它的不足需要所有的服務器(lvs、RS)支持"IP Tunneling"(IP Encapsulation)協議。

上節課我們一起了解了一下LVS+Nginx負載均衡的理論知識,這節課我們一起學習下如何搭建LVS-DR模式的負載均衡環境。
首先我們還是看一下LVS-DR負載均衡圖
在這裏插入圖片描述
我們用三臺虛擬機,一臺虛擬機安裝lvs-director,另外兩臺服務器安裝nginx。並且我們要配置一個虛擬IP供外界用戶訪問。

下面我們便來安裝lvs-director。新建一臺虛擬機,建完虛擬機後需要配置靜態IP地址並且要能上網。

CentOS6.8自帶lvs,檢查linux內核是否集成lvs模塊,使用的命令是"modprobe -l | grep ipvs"。

我們還需要安裝lvs管理工具ipvsadm,安裝前需要先安裝如下依賴
yum install -y gcc gcc-c++ makepcre pcre-devel kernel-devel openssl-devel libnl-devel popt*

下一步是下載lvs管理管理工具所需要的源碼包,大家可以到http://download.csdn.net/detail/u012453843/9854573這個地址下載。下載的源碼包要上傳到服務器上,我習慣在服務器的/usr/local目錄下新建一個software目錄,如下所示
[root@lvs-DR ~]# mkdir /usr/local/software

我們進入到/usr/local/software目錄下,要使用XShell工具上傳文件的話,需要先安裝rzsz命令,如下
[root@lvs-DR ~]# yum install -y lrzsz

然後輸入命令rz上傳ipvsadm-1.26.tar.gz到/usr/local/software目錄下,上傳完後使用ls命令查看是否已經上傳成功了,如下所示。
[root@lvs-DR software]# rz
[root@lvs-DR software]# ls
ipvsadm-1.26.tar.gz

下面解壓該文件,解壓到/usr/local目錄下,如下所示。
[root@lvs-DR software]# tar -zxvf ipvsadm-1.26.tar.gz -C /usr/local/

進入到/usr/local/ipvsadm-1.26目錄,在使用make命令之前要先安裝vim-enhanced命令(因爲最小化安裝的CentOS6是沒有安裝過vim命令模塊的)
[root@lvs-DR ipvsadm-1.26]# yum install -y vim-enhanced

下面便可以使用make命令進行編譯
[root@lvs-DR ipvsadm-1.26]# make

下面便是安裝,使用make install進行安裝
[root@lvs-DR ipvsadm-1.26]# make install

下面檢驗ipvsadm安裝是否成功,使用命令ipvsadm -h,如下圖所示,說明安裝成功。

下面我們我們來搭建兩個nginx服務器。

下面我們接着配置ipvs-director服務器,在eth0上綁定虛擬IP,使用命令ifconfig eth0:0 192.168.156.110 broadcast 192.168.156.110 netmask 255.255.255.255 up,如下圖所示。綁定完之後使用ifconfig查看IP信息,可以看到多了一個IP爲192.168.156.110的虛擬IP。

接着添加路由規則,如下所示。
[root@lvs-DR ipvsadm-1.26]# route add -host 191.168.156.110 dev eth0:0

接着啓用系統的包轉發功能,如下所示。
[root@lvs-DR ipvsadm-1.26]# echo “1” >/proc/sys/net/ipv4/ip_forward

清除原有轉發規則,如下所示。
[root@lvs-DR ipvsadm-1.26]# ipvsadm --clear

添加虛擬IP規則,如下所示。其中-s rr表示採用輪詢策略。:80表示負載轉發的端口是80
[root@lvs-DR ipvsadm-1.26]# ipvsadm -A -t 192.168.156.110:80 -s rr

在虛擬IP中添加服務規則,如下所示。在新加虛擬IP記錄中添加兩條新的Real Server記錄,-g表示指定LVS 的工作模式爲直接路由模式。
lvs進行負載轉發需要保證lvs負載的端口要和nginx服務的端口的一致,這裏都爲80。
[root@lvs-DR ipvsadm-1.26]# ipvsadm -a -t 192.168.156.110:80 -r 192.168.156.36:80 -g
[root@lvs-DR ipvsadm-1.26]# ipvsadm -a -t 192.168.156.110:80 -r 192.168.156.37:80 -g

下面重啓ipvsadm,如下所示。
[root@lvs-DR ipvsadm-1.26]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.156.110:http rr
-> 192.168.156.36:http Route 1 0 0
-> 192.168.156.37:http Route 1 0 0
[root@lvs-DR ipvsadm-1.26]#

配置Real Server(兩臺nginx服務器)在lvs的DR和TUn模式下,用戶的訪問請求到達真實服務器後,是直接返回給用戶的,而不再經過前端的Director Server,因此,就需要在每個Real server節點上增加虛擬的VIP地址,這樣數據才能直接返回給用戶。
在迴環設備上綁定一個虛擬IP地址,如下所示
[root@lvs-nginx1 sbin]# ifconfig lo:0 192.168.156.110 broadcast 192.168.156.110 netmask 255.255.255.255 up
[root@lvs-nginx1 sbin]# /sbin/route add -host 192.168.156.110 dev lo:0

綁定後使用ifconfig查看IP信息,如下圖所示。

下面關閉arp解析

arp_announce :定義不同級別:當ARP請求通過某個端口進來是否利用這個接口來回應。
0 -利用本地的任何地址,不管配置在哪個接口上去響應ARP請求;
1 - 避免使用另外一個接口上的mac地址去響應ARP請求;
2 - 儘可能使用能夠匹配到ARP請求的最佳地址。
arp_ignore:當ARP請求發過來後發現自己正是請求的地址是否響應;
0 - 利用本地的任何地址,不管配置在哪個接口上去響應ARP請求;
1 - 哪個接口上接受ARP請求,就從哪個端口上回應。
[root@lvs-nginx1 conf]# echo “1” >/proc/sys/net/ipv4/conf/lo/arp_ignore
[root@lvs-nginx1 conf]# echo “2” >/proc/sys/net/ipv4/conf/lo/arp_announce
[root@lvs-nginx1 conf]# echo “1” >/proc/sys/net/ipv4/conf/all/arp_ignore
[root@lvs-nginx1 conf]# echo “2” >/proc/sys/net/ipv4/conf/all/arp_announce
[root@lvs-nginx1 conf]# sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
[root@lvs-nginx1 conf]#

上面只是配置了一臺nginx服務器,另外一臺也一樣配置一下。

配置完之後,我們來進行測試一下,預期目標:由於lvs設置爲rr輪詢策略,當訪問虛IP http://192.168.101.100,每次刷新請求通過lvs負載到不同的服務器。有兩條注意事項:

1、測試時需要在nginx的http中設置keepalive_timeout 0; 取消使用http持久連接模式,保證每次客戶端發起請求都需要向服務端建立連接,這樣做是爲了每次刷新頁面都要經過lvs負載轉發。(注意:nginx2也要將keepalive_timeout設置爲0)。
2、lvs進行負載轉發需要保證lvs負載的端口要和nginx服務的端口的一致,這裏都爲80。
keepalive_timeout說明:
在nginx中keepalive_timeout的默認值是75秒,默認使用http持久連接模式,可使客戶端到服務器端的連接持續有效,當出現對服務器的後繼請求時,可避免建立或重新建立連接。生產環境建議keepalive_timeout不要設置爲0。keepalive_timeout位置如下圖所示

爲了區分nginx,修改下index.html,其中lvs-nginx1的修改如下圖所示。同理修改下lvs-nginx2.

下面啓動兩個nginx服務

[root@lvs-nginx1 nginx]# sbin/nginx
[root@lvs-nginx2 nginx]# sbin/nginx
我們在地址欄輸入http://192.168.156.110/index.html,剛開始看到訪問的是lvs-nginx1,刷新一次便可以看到訪問的是lvs-nginx2。再刷新就又是36了,如此循環往復。

注意:由於配置虛擬IP等操作重啓後會失效,因此需要將一些命令設置爲開機就自動執行。我們先設置lvs-director服務器的開機啓動,在/usr/local/ipvsadm-1.26目錄下新建一個startup.sh文件,並在文件中添加如下內容。

cd /usr/local/ipvsadm-1.26
ifconfig eth0:0 192.168.156.110 broadcast 192.168.156.110 netmask 255.255.255.255 up
route add -host 191.168.156.110 dev eth0:0
echo "1" >/proc/sys/net/ipv4/ip_forward
ipvsadm --clear
ipvsadm -A -t 192.168.156.110:80 -s rr
ipvsadm -a -t 192.168.156.110:80 -r 192.168.156.36:80 -g
ipvsadm -a -t 192.168.156.110:80 -r 192.168.156.37:80 -g
ipvsadm

由於新建的startup.sh文件沒有執行權限,因此要給它添加執行權限
[root@lvs-DR ipvsadm-1.26]# chmod +x startup.sh

添加完執行權限後startup.sh文件的顏色會變化,如下圖所示,並且可以看到文件的權限"-rwxr-xr-x"當中有"x"(執行權限了)。

要想讓設備啓動的時候就執行這個腳本,我們需要修改/etc/rc.local文件,在該文件中添加一行內容,如下所示。
/usr/local/ipvsadm-1.26/startup.sh

這樣,ipvs-director服務器的開機啓動就配置好了,現在我們再給lvs-nginx1和lvs-nginx2兩臺服務器配置開機啓動。在/usr/local/nginx目錄下使用vim startup.sh命令新建一個startup.sh,並且在該文件中輸入如下內容:
cd /usr/local/nginx/sbin
ifconfig lo:0 192.168.156.110 broadcast 192.168.156.110 netmask 255.255.255.255 up
/sbin/route add -host 192.168.156.110 dev lo:0
cd …/conf
echo “1” >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo “2” >/proc/sys/net/ipv4/conf/lo/arp_announce
echo “1” >/proc/sys/net/ipv4/conf/all/arp_ignore
echo “2” >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p

由於startup.sh文件默認沒有執行權限,因此我們使用命令chmod +x startup.sh來添加執行權限。
[root@lvs-nginx1 nginx]# chmod +x startup.sh

下面在/etc/rc.local文件中添加執行腳本的命令和nginx啓動命令,如下所示。

[root@lvs-nginx1 nginx]# vim /etc/rc.local 
 
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
 
touch /var/lock/subsys/local
/usr/local/nginx/startup.sh
/usr/local/nginx/sbin/nginx

這樣,lvs-nginx1服務器便配置好了,同樣,nginx2也需要像ninx1配置一樣配置一下。

下面我們便重啓lvs-director、lvs-nginx1、lvs-nginx2三臺服務器,重啓後我們訪問http://192.168.156.110/index.html,多刷新幾次,可以看到訪問的首頁在lvs-nginx1、lvs-nginx2之間互相均勻切換。這說明我們配置的開機自啓動是沒問題的。

我們還可以將lvs-director和lvs-nginx做成系統服務。爲了避免上面開機自啓動的影響,我們暫且把lvs-director和lvs-nginx1、lvs-nginx2的/etc/rc.local文件中新添加的內容註釋掉。

首先在lvs-director服務器的/etc/rc.d/init.d目錄下新建一個名爲lvsdr的文件,可以直接在/etc/rc.d/init.d目錄上右鍵,點擊"Create new file",如下圖所示。

在彈出的對話框中輸入名稱lvsdr然後點擊"OK"

在粘貼配置內容之前,要先確保該文件的編碼格式是UTF-8無BOM格式,如下圖所示。

把腳本內容粘貼到lvsdr腳本文件中,如下所示。

#!/bin/sh
# 定義虛擬ip
VIP=192.168.156.110 #虛擬 ip根據需求修改
# 定義realserver,並已空格分開,根據需求修改
RIPS="192.168.156.36 192.168.156.37"
 
# 定義提供服務的端口
SERVICE=80
 
# 調用init.d腳本的標準庫
. /etc/rc.d/init.d/functions
case $1 in
        start)
        echo "Start LVS of DR Mode"
        # 開啓ip轉發
        echo "1" > /proc/sys/net/ipv4/ip_forward
        # 綁定虛擬ip
        ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up
        route add -host $VIP dev eth0:0
        # 清除lvs規則
        ipvsadm -C
        # 添加一條虛擬服務器記錄
    # -p指定一定的時間內將相同的客戶端分配到同一臺後端服務器
    # 用於解決session的問題,測試時或有別的解決方案時建議去掉
        ipvsadm -A -t $VIP:$SERVICE -s rr
 
        # 添加真實服務器記錄
        for RIP in $RIPS
	do
		echo $RIP:$SERVICE;
                ipvsadm -a -t $VIP:$SERVICE -r $RIP:$SERVICE -g
        done
        # 設置tcp tcpfin  udp的超時連接值
        ipvsadm --set 30 120 300
        ipvsadm
        ;;
 
        stop)
        echo "Stop LVS DR"
        ifconfig eth0:0 down
        ipvsadm -C
        ;;
        *)
        echo "Usage:$0 {start | stop}"
        exit 1
esac

添加完內容後,修改lvsdr文件的執行權限
[root@lvs-DR rc.d]# chmod +x /etc/rc.d/init.d/lvsdr

到這裏還沒完,由於腳本是我們利用NodePad++工具新建並添加內容的,Windows系統與Linux系統對回車的字符解釋不一樣,對Windows系統來說,文件的格式是dos,對Linux系統來說,文件的格式應該是unix,我們可以使用vim lvsdr打開該文件並且輸入:set ff便可以看到此時lvsdr文件的格式爲dos,如下圖所示。

要把它變成unix格式可以使用命令set ff=unix,回車即可執行該命令。如下圖所示。

執行完set ff=unix命令後,我們按Shift鍵並且連續兩次按Z鍵來保存。爲了確認此時文件的格式是否是unix,我們按照上面說的方式查看該文件格式,發現此時已經是"unix"了。

寫完了腳本文件內容,我們現在來測試下我們添加的lvs服務是否成功。由於我們的ipvs-director處於運行狀態,我們把它們都重啓(由於我們已經把開機自啓動文件中的相關內容註釋掉了,因此不會開機自啓動了)重啓lvs-director服務器之後,我們使用命令service lvsdr start來啓動lvs服務,如下所示,發現可以正常啓動lvs服務了。

[root@lvs-DR ~]# service lvsdr start
Start LVS of DR Mode
192.168.156.36:80
192.168.156.37:80
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.156.110:http rr
-> 192.168.156.36:http Route 1 0 0
-> 192.168.156.37:http Route 1 0 0
[root@lvs-DR ~]#
使用ifconfig來查看IP信息,如下所示,可以看到虛擬IP(192.168.156.110的信息)
[root@lvs-DR init.d]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:55:74:53
inet addr:192.168.156.35 Bcast:192.168.156.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe55:7453/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:550 errors:0 dropped:0 overruns:0 frame:0
TX packets:382 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:51261 (50.0 KiB) TX bytes:54611 (53.3 KiB)

eth0:0 Link encap:Ethernet HWaddr 00:0C:29:55:74:53
inet addr:192.168.156.110 Bcast:192.168.156.110 Mask:255.255.255.255
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
下面我們一起來把nginx來做成服務,我們用上面同樣的方式,在lvs-nginx1和lvs-nginx2兩臺服務器的/etc/rc.d/init.d目錄下新建一個lvsdr文件,在文件中添加如下內容。要注意像上面那樣將文件的格式由dos轉變爲unix格式。

#!/bin/sh
VIP=192.168.156.110 #虛擬ip,根據需求修改
. /etc/rc.d/init.d/functions
case $1 in
start)
echo “lo:0 port starting”
# 爲了相應lvs調度器轉發過來的包,需在本地lo接口上綁定vip
ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
# 限制arp請求
echo “1” > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo “2” > /proc/sys/net/ipv4/conf/lo/arp_announce
echo “1” > /proc/sys/net/ipv4/conf/all/arp_ignore
echo “2” > /proc/sys/net/ipv4/conf/all/arp_announce
;;
stop)
echo “lo:0 port closing”
ifconfig lo:0 down
echo “0” > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo “0” > /proc/sys/net/ipv4/conf/lo/arp_announce
echo “0” > /proc/sys/net/ipv4/conf/all/arp_ignore
echo “0” > /proc/sys/net/ipv4/conf/all/arp_announce
;;
*)
echo “Usage: $0 {start ¦ stop}”
exit 1
esac
需要給lvsdr文件添加執行權限,如下
[root@lvs-nginx1 init.d]# chmod +x /etc/rc.d/init.d/lvsdr
[root@lvs-nginx2 rc.d]# chmod +x /etc/rc.d/init.d/lvsdr
爲了測試我們做成的服務是否成功,我們先把lvs-nginx1和lvs-nginx2兩臺服務器重啓(因爲lvs在這兩臺服務器上已經處於運行狀態,由於我們把開機自動動文件中的內容註釋掉了,因此開機不會自動啓動)。兩臺nginx服務器重啓後,我們使用service lvsdr start ,啓動服務後使用ifconfig來查看IP信息,如下所示,說明正常啓動了。同樣,我們啓動lvs-nginx2的lvs服務。

[root@lvs-nginx1 init.d]# service lvsdr start
lo:0 port starting
[root@lvs-nginx1 init.d]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:13:7C:39
inet addr:192.168.156.36 Bcast:192.168.156.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe13:7c39/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:379 errors:0 dropped:0 overruns:0 frame:0
TX packets:260 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:35057 (34.2 KiB) TX bytes:54631 (53.3 KiB)

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)

lo:0 Link encap:Local Loopback
inet addr:192.168.156.110 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:65536 Metric:1
雖然我們把lvs做成了服務,但是我們的lvs-ngiinx1和lvs-nginx2兩臺服務器的nginx服務還沒開啓,我們要測試的話就要開啓nginx服務。
[root@lvs-nginx1 init.d]# /usr/local/nginx/sbin/nginx
[root@lvs-nginx2 init.d]# /usr/local/nginx/sbin/nginx
然後我們重新刷新地址http://192.168.156.110/index.html,可以看到頁面在Welcome to nginx!–36和Welcome to nginx!–37之間來回切換。說明負載正常。
服務既然可以啓動,當然可以關閉,我們可以使用service lvsdr stop來關閉所有服務器上的lvs服務,如下所示。

[root@lvs-DR init.d]# service lvsdr stop
Stop LVS DR
[root@lvs-DR init.d]#
[root@lvs-nginx1 init.d]# service lvsdr stop
lo:0 port closing
[root@lvs-nginx1 init.d]#
[root@lvs-nginx2 init.d]# service lvsdr stop
lo:0 port closing
[root@lvs-nginx2 init.d]#
上面把LVS做成了系統服務,如果我們想把Nginx也做成系統服務的話,跟上面很類似,在/etc/init.d(/etc/rc.d/init.d目錄與/etc/init.d目錄實際是同一個目錄,由軟鏈接進行關聯)目錄下新建一個腳本文件,名稱就叫nginx。爲了排版方便,我還是習慣性的用NodePad++,不過要記得在粘貼腳本內容之前要確認腳本文件的編碼格式是UTF-8無BOM格式!

      腳本內容如下:

#! /bin/bash

chkconfig: 35 22 22

description: Nginx is an HTTP(S) server, HTTP(S) reverse

set -e
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC=“nginx daemon”
NAME=nginx
DAEMON=/usr/local/nginx/sbin/NAMESCRIPTNAME=/etc/init.d/NAME SCRIPTNAME=/etc/init.d/NAME
test -x $DAEMON || exit 0
d_start(){
$DAEMON || echo -n " already running"
}
d_stop() {
$DAEMON -s quit || echo -n " not running"
}
d_reload() {
$DAEMON -s reload || echo -n " counld not reload"
}
case “$1” in
start)
echo -n “Starting DESC:DESC:NAME”
d_start
echo “.”
;;
stop)
echo -n “Stopping DESC:DESC:NAME”
d_stop
echo “.”
;;
reload)
echo -n “Reloading $DESC configuration…”
d_reload
echo “reloaded.”
;;
restart)
echo -n “Restarting $DESC: $NAME”
d_stop
sleep 2
d_start
echo “.”
;;
*)
echo “Usage: $SCRIPTNAME {start|stop|restart|reload}” >&2
exit 3
;;
esac
exit 0
接着一定要像添加LVS服務時那樣,將nginx文件的格式由dos變爲unix格式!!否則將提示找不到該腳本文件。
下面要給nginx這個腳本文件添加執行權限

[root@lvs-nginx1 nginx]# chmod +x /etc/init.d/nginx
下面我們先測試下我們添加的服務是否正確,如果當前nginx正在運行的話,先把它關掉,如果當前nginx沒有運行的話,就可以直接使用命令:service nginx start來測試了,如下所示。說明我們的nginx系統服務正常。
[root@lvs-nginx1 nginx]# service nginx start
Starting nginx daemon:nginx.
[root@lvs-nginx1 nginx]# ps -ef|grep nginx
root 1427 1 0 19:03 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody 1428 1427 0 19:03 ? 00:00:00 nginx: worker process
root 1430 1359 0 19:03 pts/0 00:00:00 grep nginx
[root@lvs-nginx1 nginx]#
那如果我們想要將LVS服務和nginx服務都做成開機自啓動(這樣畢竟可以省我們不少時間)的話,可以使用chkconfig --add lvsdr和chkconfig --add nginx來添加到開機啓動當中。但這裏有個問題,就是添加lvsdr到開機啓動時會報如下錯誤。
[root@lvs-DR ~]# chkconfig --add lvsdr
lvsdr 服務不支持 chkconfig
這是由於我們在lvsdr腳本的頭部沒有添加# chkconfig和# description導致的,那麼我們便添加一下,如下圖所示。關於chkconfig: 35 21 21是什麼意思,大家可以參考http://blog.csdn.net/u012453843/article/details/72801558這篇博客進行學習。

     添加的頭部內容如下:

chkconfig: 35 21 21

description: LVS is a virtual server cluster system

    添加完頭部內容後,我們再將lvsdr添加開機啓動服務當中,如下圖所示,可以看到正常添加到開機啓動服務列表當中了。

      lvs-director已經將服務添加到開機啓動服務列表當中了,lvs-nginx1和lvs-nginx2上的lvsdr服務也要添加到開機服務列表當中,當然了,前提也需要在lvsdr腳本文件中添加上面兩行頭部信息,如下圖所示。注意:lvs-nginx1和lvs-nginx2都在lvsdr腳本文件頭部添加這兩行內容。之後就像上面操作那樣,將lvsdr添加到開機自啓動服務列表當中。


      # chkconfig: 35 21 21三個數字的意思分別是,35代表在第3和第5種情況開機自啓(lvsdr          0:關閉1:關閉2:關閉3:啓用4:關閉5:啓用6:關閉)。第一個21代表服務啓動的順序,第二個21代表服務關閉的順序,這個要根據你服務器上服務的數量而定,而且要根據服務的啓動順序來定,如果服務啓動要有先後順序的話,這個數字就一定要排好序,上面我們把lvsdr的啓動順序定爲了21,那麼nginx的啓動順序我們便定義爲22吧(它和lvsdr倒是沒有什麼先後順序,誰在前誰在後無所謂)。nginx服務的頭部信息如下圖所示。



      添加nginx到開機自啓動服務列表中,如下圖所示。


    同理,我們把lvs-nginx2服務器上的nginx服務也添加到開機自啓動服務列表當中


   好,開機啓動我們都配置好了,現在我們便重新啓動三臺服務器,重啓後,我們來刷新下http://192.168.156.110/index.html這個地址,可以看到訪問的nginx首頁在36和37之間均勻切換,這說明負載均衡沒有問題。


     附:如果要將某服務從開機啓動服務列表中去掉的話,可以使用如下命令(這裏以nginx服務爲例),刪除完之後,在服務列表中便沒有nginx了。

[root@lvs-nginx1 nginx]# chkconfig --del nginx

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