1. 程式人生 > >Nginx伺服器的使用與反向代理負載均衡

Nginx伺服器的使用與反向代理負載均衡

# Nginx伺服器 ## 一:什麼是Nginx? 我們生活的世界中,有的時候需要上網。我們可以瀏覽很多很多的網頁,這些網頁都是由一系列的程式組成,但是我們是否想過,這些程式儲存在什麼地方呢?沒錯,這些程式都是儲存在一種名叫伺服器的硬體上,比如我們的電腦也是一種伺服器,只不過我們的個人電腦作為伺服器的話效能會比較低。我們的網頁程式儲存在伺服器硬體上,是否可以隨意儲存呢?不是的,我們需要在伺服器硬體的作業系統中搭建一個伺服器軟體,那麼這樣,有伺服器軟體跟伺服器硬體配合,才形成一個完整的伺服器。伺服器軟體有非常多,比如Apache、tomcat等等都是伺服器軟體,而我們今天要學習的Nginx也是一種伺服器軟體之一。 Nginx是一種伺服器軟體,故而其最主要、最基本的功能當然是可以與伺服器硬體結合,讓程式設計師可以將程式放在Nginx伺服器上,將程式釋出出去,讓成千上萬的網民可以瀏覽。除此之外,Nginx是一種高效能的HTTP和反向代理伺服器,同時也是一個代理郵件伺服器。也就是說,我們Nginx上可以釋出網站,也可以實現負載均衡的功能,還可以作為郵件伺服器實現收發郵件等功能。所謂的負載均衡是指,當同時有N多使用者訪問我們伺服器的時候,為了減少伺服器壓力,我們需要將使用者分別引入各伺服器,分擔伺服器的壓力。 ![](https://img2020.cnblogs.com/blog/1944294/202006/1944294-20200604161622594-1130383557.png) ### Nginx與其他服努器的效能比較 首先說IIS, IIS伺服器只能在Windows上執行,Windows伺服器效能不如Linux— 類伺服器。其次說Tomcat,Tomcat伺服器面向的是Java語言,是一種重量級的服 務器,而Nginx是輕量級伺服器,Tomcat與Nginx不具備可比性。最後,我們講一 下Apache,Apache優點非常多,比如穩定、幵源、跨平臺等等,但是Apache不支 持高併發。Nginx能支援處理百萬級的TCP連線,10萬以上的併發連線,並且是一 個很好的跨平臺伺服器。 Nginx的主要優點有可以實現高併發、部署簡單、記憶體消耗少、成本低等等。 Nginx的主要缺點有rewrite功能不夠強大,模組沒有Apache的多。 > 本文版權歸微信公眾號"程式碼藝術"(ID:onblog)所有,若是轉載請務必保留本段原創宣告,違者必究。若是文章有不足之處,歡迎關注微信公眾號私信與我進行交流! ## 二:Linux中搭建Nginx伺服器 **新建壓縮包下載位置(可選)** ```java 新建目錄 mkdir /usr/local/nginx_down 切換目錄 cd /usr/local/nginx_down ``` **下載解壓 Nginx** ```java 下載 wget http://nginx.org/download/nginx-1.14.0.tar.gz 解壓 tar -zxvf nginx-1.14.0.tar.gz 切換目錄 cd nginx-1.14.0 ``` **配置 Nginx** ```java ./configure --with-http_ssl_module ``` 1. 這樣會預設安裝nginx在 /usr/local/nginx 目錄,可以使用`--prefix=/usr/local/nginx`指定安裝位置。 2. 如果需要HTTPS(SSL)的支援,需要指定引數`--with-http_ssl_module`。 如果提示錯誤,那麼需要其它環境,請參考下面 **安裝 make** ```java yum -y install gcc automake autoconf libtool make ``` **安裝 g++** ```java yum -y install gcc gcc-c++ ``` **安裝 PCRE庫** ```java yum -y install pcre pcre-devel ``` **安裝 Zlib** ```java yum -y install zlib zlib-devel ``` **安裝 GD library** ```java yum -y install gd-devel ``` **安裝 openssl** ```java yum -y install openssl openssl-devel ``` > -y:跳過所有手動確認輸入 如果`./configure`安裝成功,只需要再執行兩個命令: ```java make ``` ```java make install ``` 檢視是否安裝成功 ```java cd /usr/local/nginx ``` 如果安裝成功,則會出現下列目錄: ```java conf html logs sbin ``` 切換到sbin目錄 ```java cd /sbin ``` 啟動程式 ```java ./nginx ``` 追加引數 `-c` 可以指定配置檔案。 ### 常見的錯誤 在Linux作業系統下搭建Nginx伺服器,很多時候會出現不同的錯誤,在此,我們對搭建過程中出現的錯誤進行一些總結。主要有這些型別: 防火牆問題,缺少gc++,缺少pcre、zlib等庫。 ## 三:Nginx的反向代理和負載均衡 ### 什麼是反向代理 我們有時候,用自己的計算機A想訪問國外的某個網站B,但是訪問不了,此時,有一臺中間伺服器C可以訪問國外的網站B,那麼,我們可以用自己的電腦訪問伺服器C,通過C來訪問B這個網站。那麼這個時候,伺服器C稱為代理伺服器,這種訪問方式叫做正向代理。正向代理有一個特點,就是我們明確知道要訪問哪個網站。再如,當我們有一個伺服器集中,並且伺服器叢集中的每臺伺服器的內容一樣的時候,同樣我們要直接從個人電腦訪問到伺服器集中的伺服器的時候無法訪問,且此時第三方伺服器能訪問叢集,這個時候,我捫通過第三方伺服器訪問伺服器叢集的內容,但是此吋我們並不知道是哪一臺伺服器提供的內容,此時的代理方式稱為反向代理。 ### 正向代理 ![](https://img2020.cnblogs.com/blog/1944294/202006/1944294-20200604161623053-911559921.png) ### 反向代理 ![](https://img2020.cnblogs.com/blog/1944294/202006/1944294-20200604161623509-335593208.png) ### 什麼是負載均衡 當一臺伺服器的單位時間內的訪問量越大的時候,伺服器的壓力會越大。當一臺伺服器壓力大得超過自身的承受能力的時候,伺服器會崩潰。為了避免伺服器崩潰,讓使用者有更好地體驗,我們通常通過負載均衡的方式來分擔伺服器的壓力。那麼什麼是負載均衡呢?是這樣,我們可以建立很多很多個伺服器,這些伺服器組成一個伺服器叢集,然後,當用戶訪問我們網站的時候,先訪問一箇中間伺服器,再讓這個中間伺服器在伺服器叢集中選擇一個壓力較小的伺服器,然後將該訪問請求引入該選擇的伺服器。這樣,使用者的每次訪問,都會保證伺服器叢集中的每個伺服器的壓力趨於平衡,分擔了伺服器壓力,避免了伺服器崩潰的情況。 > 基於反向代理的原理實現負載均衡 ## 四:Nginx負載均衡的實現 Nginx 是一款可以通過反向代理實現負載均衡的伺服器,使用 Nginx 服務實現負載均衡的時候,使用者的訪問首先會訪問到 Nginx 伺服器,然後 Nginx 伺服器再從伺服器叢集表中選擇壓力較小的伺服器,然後將該訪問請求引向該伺服器。若伺服器叢集中的某個伺服器崩潰,那麼從待選伺服器列表中將該伺服器刪除,也就是說一個伺服器假如崩潰了,那麼 Nginx 就肯定不會將訪問請求引入該伺服器了。那麼下面,我們通過例項來講解一下 Nginx 負載均衡的實現。 ### 負載均衡配置檔案 預設配置檔案`nginx.conf` 很重要,我們一般是新建一個配置檔案,在啟動時指定載入。 ```java [root@hostname 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@hostname conf]# touch fzjh.conf //新建負載均衡配置檔案 ``` 編輯`fzjh.conf`配置檔案 ```java vi fzjh.conf ``` ```java 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目錄下執行命令,啟動負載均衡 ```java ./sbin/nginx -c ./conf/fzjh.conf ``` 然後嘗試訪問你的伺服器,多訪問幾次,你會發現它會訪問2次csdn網站,1次百度。說明我們的負載均衡已經部署完畢。 ### 如何重啟Nginx >【本文版權歸微信公眾號"程式碼藝術"(ID:onblog)所有,若是轉載請務必保留本段原創宣告,違者必究。若是文章有不足之處,歡迎關注微信公眾號私信與我進行交流!】 ```java ./sbin/nginx -s reload ``` ### 如何關閉Nginx伺服器 1.檢視nginx程序號 ```java ps -ef|grep nginx ``` 2.kill掉程序即可 (1709是第二列的程序號) ```java kill 1709 ``` 或者 ```java killall -9 nginx ``` ## 五:HTTP Upstream 模組 ### HTTP Upstream 模組 Upstream 模組是 Nginx 伺服器的一個重要模組。 Upstream 模組實現在輪詢和客戶端 iP 之間實現後端的負載均衡。常用的指令有 ip_hash指令、 server 指令和 upstream 指令等,下面我們分別來講一下。 ### Http Upstream模組- ip_hash指令 在負載均衡系統中,假如使用者在某臺伺服器上登入,那麼如果該使用者第二次請求的時候,因為我們是負載均衡系統,每次請求都會重新定位到伺服器叢集中的一個伺服器,那麼此時如果將已經登入伺服器A的使用者再定位到其他伺服器,顯然不妥。故而,我們可以採用 ip_hash指令解決這個問題,如果客戶端請求已經訪問了伺服器A並登入,那麼第二次請求的時候,會將該請求通過雜湊演算法自動定位到該後端伺服器中。下面我們通過例項講解。 **例項** 此時不應該使用weight權重。 ```java tp { .... 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匹配順序 1. "="字首指令匹配,如果匹配成功,則停止其他匹配 2. 普通字串指令匹配,順序是從長到短,匹配成功的location如果使用^~,則停止其他匹配(正則匹配) 3. 正則表示式指令匹配,按照配置檔案裡的順序,成功就停止其他匹配 4. 如果第三步中有匹配成功,則使用該結果,否則使用第二步結果 ### 注意點 1. 匹配的順序是先匹配普通字串,然後再匹配正則表示式。另外普通字串匹配順序是根據配置中字元長度從長到短,也就是說使用普通字串配置的location順序是無關緊要的,反正最後nginx會根據配置的長短來進行匹配,但是需要注意的是正則表示式按照配置檔案裡的順序測試。找到第一個比配的正則表示式將停止搜尋。 2. 一般情況下,匹配成功了普通字串location後還會進行正則表示式location匹配。有兩種方法改變這種行為,其一就是使用“=”字首,這時執行的是嚴格匹配,並且匹配成功後立即停止其他匹配,同時處理這個請求;另外一種就是使用“^~”字首,如果把這個字首用於一個常規字串那麼告訴nginx 如果路徑匹配那麼不測試正則表示式。 ### 匹配模式及順序   location = /uri    =開頭表示精確匹配,只有完全匹配上才能生效。   location ^~ /uri   ^~ 開頭對URL路徑進行字首匹配,並且在正則之前。   location ~ pattern  ~開頭表示區分大小寫的正則匹配。   location ~* pattern  ~*開頭表示不區分大小寫的正則匹配。   location /uri     不帶任何修飾符,也表示字首匹配,但是在正則匹配之後。   location /      通用匹配,任何未匹配到其它location的請求都會匹配到,相當於switch中的default。 ## 八:配置HTTPS **1.獲取證書** 獲得SSL證書檔案 1_www.domain.com_bundle.crt 和私鑰檔案 2_www.domain.com.key **2.證書安裝** 將域名 www.domain.com 的證書檔案1_www.domain.com_bundle.crt 、私鑰檔案2_www.domain.com.key儲存到同一個目錄,例如/usr/local/nginx/conf目錄下。 **3.配置conf** 開啟nginx.conf檔案,找到nginx.conf的下段配置內容: ```java # HTTPS server # #server { # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} ``` 開啟註釋,修改server_name為繫結證書的域名(如:www.domain.com),修改ssl_certificate 為 1_www.domain.com_bundle.crt,修改 ssl_certificate_key 為 2_www.domain.com.key 即可。 **4.HTTP自動跳轉HTTPS** 對於使用者不知道網站可以進行https訪問的情況下,讓伺服器自動把http的請求重定向到https。 在伺服器這邊的話配置的話,可以在頁面里加js指令碼,也可以在後端程式裡寫重定向,當然也可以在web伺服器來實現跳轉。 Nginx是支援rewrite的(只要在編譯的時候沒有去掉pcre) 在http的server裡增加`rewrite ^(.*) https://$host$1 permanent;` 這樣就可以實現80進來的請求,重定向為https了。 還是在此配置檔案中,加入下面一句: ```java server { listen 80; server_name localhost; rewrite ^(.*) https://$host$1 permanent; ... ``` ## 版權宣告 本文版權歸微信公眾號"程式碼藝術"(ID:onblog)所有,若是轉載請務必保留本段原創宣告,違者必究。若是文章有不足之處,歡迎關注微信公眾號私信與我進行交流! ![](https://img2020.cnblogs.com/blog/1944294/202006/1944294-20200604161623955-1923331