Nginx服務器的安裝與反向代理負載均衡
Nginx服務器
一:什麽是Nginx?
我們生活的世界中,有的時候需要上網。我們可以瀏覽很多很多的網頁,這些網頁都是由一系列的程序組成,但是我們是否想過,這些程序存儲在什麽地方呢?沒錯,這些程序都是存儲在一種名叫服務器的硬件上,比如我們的電腦也是一種服務器,只不過我們的個人電腦作為服務器的話性能會比較低。我們的網頁程序存儲在服務器硬件上,是否可以隨意存儲呢?不是的,我們需要在服務器硬件的操作系統中搭建一個服務器軟件,那麽這樣,有服務器軟件跟服務器硬件配合,才形成一個完整的服務器。服務器軟件有非常多,比如Apache、tomcat等等都是服務器軟件,而我們今天要學習的Nginx也是一種服務器軟件之一。
Nginx是一種服務器軟件,故而其最主要、最基本的功能當然是可以與服務器硬件結合,讓程序員可以將程序放在Nginx服務器上,將程序發布出去,讓成千上萬的網民可以瀏覽。除此之外,Nginx是一種高性能的HTTP和反向代理服務器,同時也是一個代理郵件服務器。也就是說,我們Nginx上可以發布網站,也可以實現負載均衡的功能,還可以作為郵件服務器實現收發郵件等功能。所謂的負載均衡是指,當同時有N多用戶訪問我們服務器的時候,為了減少服務器壓力,我們需要將用戶分別引入各服務器,分擔服務器的壓力。
什麽是Nginx — Nginx與其他服努器的性能比較
首先說IIS, IIS服務器只能在Windows上運行,Windows服務器性能不如Linux— 類服務器。其次說Tomcat,Tomcat服務器面向的是Java語言,是一種重量級的服 務器,而Nginx是輕量級服務器,Tomcat與Nginx不具備可比性。最後,我們講一 下Apache,Apache優點非常多,比如穩定、幵源、跨平臺等等,但是Apache不支 持高並發。Nginx能支持處理百萬級的TCP連接,10萬以上的並發連接,並且是一 個很好的跨平臺服務器。
Nginx的主要優點有可以實現高並發、部署簡單、內存消耗少、成本低等等。
Nginx的主要缺點有rewrite功能不夠強大,模塊沒有Apache的多。
二:如何在Linux中搭建Nginx服務器?
先不要創建/usr/local/nginx
目錄,因為安裝成功後會自動創建。
在Linux終端輸入命令行的主要步驟:
下載
wget http://nginx.org/download/nginx-1.14.0.tar.gz
解壓
tar -zxvf nginx-1.14.0.tar.gz
安裝
./configure
如果安裝錯誤,提示需要其它環境,請參考下面
安裝 make
yum -y install gcc automake autoconf libtool make
安裝 g++
yum install gcc gcc-c++
安裝 PCRE庫
yum -y install pcre pcre-devel
安裝 Zlib
yum -y install zlib zlib-devel
如果./configure
安裝成功,只需要再執行兩個命令:
make
make install
查看是否安裝成功
cd /usr/local/nginx
如果安裝成功,則會出現下列目錄:
conf html logs sbin
切換到sbin目錄
cd /sbin
啟動程序
./nginx
常見的錯誤
在Linux操作系統下搭建Nginx服務器,很多時候會出現不同的錯誤,在此,我們對搭建過程中出現的錯誤進行一些總結。主要有這些類型:
防火墻問題,缺少gc++,缺少pcre、zlib等庫。
三:Nginx的反向代理和負載均衡
什麽是反向代理
我們有時候,用自己的計算機A想訪問國外的某個網站B,但是訪問不了,此時,有一臺中間服務器C可以訪問國外的網站B,那麽,我們可以用自己的電腦訪問服務器C,通過C來訪問B這個網站。那麽這個時候,服務器C稱為代理服務器,這種訪問方式叫做正向代理。正向代理有一個特點,就是我們明確知道要訪問哪個網站。再如,當我們有一個服務器集中,並且服務器集群中的每臺服務器的內容一樣的時候,同樣我們要直接從個人電腦訪問到服務器集中的服務器的時候無法訪問,且此時第三方服務器能訪問集群,這個時候,我捫通過第三方服務器訪問服務器集群的內容,但是此吋我們並不知道是哪一臺服務器提供的內容,此時的代理方式稱為反向代理。
正向代理
反向代理
什麽是負載均衡
當一臺服務器的單位時間內的訪問量越大的時候,服務器的壓力會越大。當一臺服務器壓力大得超過自身的承受能力的時候,服務器會崩潰。為了避免服務器崩潰,讓用戶有更好地體驗,我們通常通過負載均衡的方式來分擔服務器的壓力。那麽什麽是負載均衡呢?是這樣,我們可以建立很多很多個服務器,這些服務器組成一個服務器集群,然後,當用戶訪問我們網站的時候,先訪問一個中間服務器,再讓這個中間服務器在服務器集群中選擇一個壓力較小的服務器,然後將該訪問請求引入該選擇的服務器。這樣,用戶的每次訪問,都會保證服務器集群中的每個服務器的壓力趨於平衡,分擔了服務器壓力,避免了服務器崩潰的情況。
基於反向代理的原理實現負載均衡
四:Nginx負載均衡的實現
Nginx 是一款可以通過反向代理實現負載均衡的服務器,使用 Nginx 服務實現負載均衡的時候,用戶的訪問首先會訪問到 Nginx 服務器,然後 Nginx 服務器再從服務器集群表中選擇壓力較小的服務器,然後將該訪問請求引向該服務器。若服務器集群中的某個服務器崩潰,那麽從待選服務器列表中將該服務器刪除,也就是說一個服務器假如崩潰了,那麽 Nginx 就肯定不會將訪問請求引入該服務器了。那麽下面,我們通過實例來講解一下 Nginx 負載均衡的實現。
負載均衡配置文件
默認配置文件nginx.conf
很重要,我們一般是新建一個配置文件,在啟動時指定加載。
[root@yueshutong conf]# ls //查看目錄
fastcgi.conf koi-win scgi_params
fastcgi.conf.default mime.types scgi_params.default
fastcgi_params mime.types.default uwsgi_params
fastcgi_params.default nginx.conf uwsgi_params.default
koi-utf nginx.conf.default win-utf
[root@yueshutong conf]# touch fzjh.conf //新建負載均衡配置文件
編輯fzjh.conf
配置文件
vi fzjh.conf
worker_processes 1;#工作進程的個數,一般與計算機的cpu核數一致
events {
worker_connections 1024;#單個進程最大連接數(最大連接數=連接數*進程數) 並發
}
http {
include mime.types; #文件擴展名與文件類型映射表
default_type application/octet-stream;#默認文件類型
sendfile on;#開啟高效文件傳輸模式,sendfile指令指定nginx是否調用sendfile函數來輸出文件,對於普通應用設為 on,如果用來進行下載等應用磁盤IO重負載應用,可設置為off,以平衡磁盤與網絡I/O處理速度,降低系統的負載。註意:如果圖片顯示不正常把這個改成off。
keepalive_timeout 65; #長連接超時時間,單位是秒
gzip on;#啟用Gizp壓縮
#服務器的集群
upstream myproject { #服務器集群名字
server 220.181.111.188:80 weight=1;#服務器配置 weight是權重的意思,權重越大,分配的概率越大。
server 42.121.252.58:80 weight=2;
}
#當前的Nginx的配置
server {
listen 80; #監聽80端口,可以改成其他端口
server_name localhost; ############## 當前服務的域名
location / { ##配置路徑/下實現負載均衡
proxy_pass http://myproject; ##對應哪個服務器集群
proxy_redirect default;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html; #根目錄
}
}
}
我們在nginx目錄下執行命令,啟動負載均衡
./sbin/nginx -c ./conf/fzjh.conf
然後嘗試訪問你的服務器,多訪問幾次,你會發現它會訪問2次csdn網站,1次百度。說明我們的負載均衡已經部署完畢。
如何關閉Nginx服務器
1.查看nginx進程號
ps -ef|grep nginx
2.kill掉進程即可 (1709是第二列的進程號)
kill 1709
或者
killall -9 nginx
五:HTTP Upstream 模塊
HTTP Upstream 模塊
Upstream 模塊是 Nginx 服務器的一個重要模塊。 Upstream 模塊實現在輪詢和客戶端 iP 之間實現後端的負載均衡。常用的指令有 ip_hash指令、 server 指令和 upstream 指令等,下面我們分別來講一下。
Http Upstream模塊- ip_hash指令
在負載均衡系統中,假如用戶在某臺服務器上登錄,那麽如果該用戶第二次請求的時候,因為我們是負載均衡系統,每次請求都會重新定位到服務器集群中的一個服務器,那麽此時如果將已經登錄服務器A的用戶再定位到其他服務器,顯然不妥。故而,我們可以采用 ip_hash指令解決這個問題,如果客戶端請求已經訪問了服務器A並登錄,那麽第二次請求的時候,會將該請求通過哈希算法自動定位到該後端服務器中。下面我們通過實例講解。
實例
此時不應該使用weight權重。
http {
....
upstream myproject {
ip_hash; #實現會話跟蹤
server 140.205.140.234;
server 61.135.169.125;
}
....
}
Http Upstream 模塊一 upstream 指令及相關變量
upstream 指令主要是用於設置一組可以在 proxy_pass 和 fastcgi_pass 指令中使用代理服務器,默認負載均衡方式為輪詢。
六:其他負載均衡實現方式
負載均衡的實現方法除了可以使用 Nginx服務器實現外,還可以通過很多種方法來實現。負載均衡的核心就是建立一個服務器集群,然後用戶首先訪問到第三方代理服務器,然後由代理服務器選擇一個集群中的服務器,然後將請求引入選定的服務器。那麽代理服務器可以使用多種方式來充當,故而實現負載均衡的方式也是多種。總的來說,負載均衡實現的方式分為軟件實現和硬件實現兩種,如果中間的代理機構是硬件,那麽就是通過硬件設備來實現負載均衡的方式,如果中間的代理機構為軟件,就是軟件實現負載均衡的方式。而其中,軟件又可以是服務器軟件、系統軟件以及應用軟件等充當。
負載均衡實現方式小結
下面我們簡單總結一下負載均衡不同實現方式的優缺點:
假如使用硬件的方式實現負載均衡,那麽中間的轉發機構就是硬件,這個時候運行的效率非常高,但是對應的成本也非常高。如果我們采用軟件的方式來實現負載均衡,那麽中間的轉發機構就是軟件,這個時候,運行效率不如硬件,但是成本相對來說低得多。而使用Nginx服務器實現負載均衡,那麽就是通過軟件的方式來實現負載均衡,並且 Nginx本身支持高並發等。故而使用 Nginx服務器實現負載均衡,能大大節約企業的成本,並且由於 Nginx是服務器軟件,其執行效率也是非常高。
七:location匹配順序
- "="前綴指令匹配,如果匹配成功,則停止其他匹配
- 普通字符串指令匹配,順序是從長到短,匹配成功的location如果使用^~,則停止其他匹配(正則匹配)
- 正則表達式指令匹配,按照配置文件裏的順序,成功就停止其他匹配
- 如果第三步中有匹配成功,則使用該結果,否則使用第二步結果
註意點
- 匹配的順序是先匹配普通字符串,然後再匹配正則表達式。另外普通字符串匹配順序是根據配置中字符長度從長到短,也就是說使用普通字符串配置的location順序是無關緊要的,反正最後nginx會根據配置的長短來進行匹配,但是需要註意的是正則表達式按照配置文件裏的順序測試。找到第一個比配的正則表達式將停止搜索。
- 一般情況下,匹配成功了普通字符串location後還會進行正則表達式location匹配。有兩種方法改變這種行為,其一就是使用“=”前綴,這時執行的是嚴格匹配,並且匹配成功後立即停止其他匹配,同時處理這個請求;另外一種就是使用“^~”前綴,如果把這個前綴用於一個常規字符串那麽告訴nginx 如果路徑匹配那麽不測試正則表達式。
匹配模式及順序
location = /uri =開頭表示精確匹配,只有完全匹配上才能生效。
location ^~ /uri ^~ 開頭對URL路徑進行前綴匹配,並且在正則之前。
location ~ pattern ~開頭表示區分大小寫的正則匹配。
location ~* pattern ~*開頭表示不區分大小寫的正則匹配。
location /uri 不帶任何修飾符,也表示前綴匹配,但是在正則匹配之後。
location / 通用匹配,任何未匹配到其它location的請求都會匹配到,相當於switch中的default。
Nginx服務器的安裝與反向代理負載均衡