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

Nginx服務器

一:什麼是Nginx?

咱們生活的世界中,有的時候須要上網。咱們能夠瀏覽不少不少的網頁,這些網頁都是由一系列的程序組成,可是咱們是否想過,這些程序存儲在什麼地方呢?沒錯,這些程序都是存儲在一種名叫服務器的硬件上,好比咱們的電腦也是一種服務器,只不過咱們的我的電腦做爲服務器的話性能會比較低。咱們的網頁程序存儲在服務器硬件上,是否能夠隨意存儲呢?不是的,咱們須要在服務器硬件的操做系統中搭建一個服務器軟件,那麼這樣,有服務器軟件跟服務器硬件配合,才造成一個完整的服務器。服務器軟件有很是多,好比Apache、tomcat等等都是服務器軟件,而咱們今天要學習的Nginx也是一種服務器軟件之一。html

Nginx是一種服務器軟件,故而其最主要、最基本的功能固然是能夠與服務器硬件結合,讓程序員能夠將程序放在Nginx服務器上,將程序發佈出去,讓成千上萬的網民能夠瀏覽。除此以外,Nginx是一種高性能的HTTP和反向代理服務器,同時也是一個代理郵件服務器。也就是說,咱們Nginx上能夠發佈網站,也能夠實現負載均衡的功能,還能夠做爲郵件服務器實現收發郵件等功能。所謂的負載均衡是指,當同時有N多用戶訪問咱們服務器的時候,爲了減小服務器壓力,咱們須要將用戶分別引入各服務器,分擔服務器的壓力。java

Nginx與其餘服努器的性能比較

首先說IIS, IIS服務器只能在Windows上運行,Windows服務器性能不如Linux— 類服務器。其次說Tomcat,Tomcat服務器面向的是Java語言,是一種重量級的服 務器,而Nginx是輕量級服務器,Tomcat與Nginx不具有可比性。最後,咱們講一 下Apache,Apache優勢很是多,好比穩定、幵源、跨平臺等等,可是Apache不支 持高併發。Nginx能支持處理百萬級的TCP鏈接,10萬以上的併發鏈接,而且是一 個很好的跨平臺服務器。linux

Nginx的主要優勢有能夠實現高併發、部署簡單、內存消耗少、成本低等等。nginx

Nginx的主要缺點有rewrite功能不夠強大,模塊沒有Apache的多。c++

本文版權歸微信公衆號"代碼藝術"(ID:onblog)全部,如果轉載請務必保留本段原創聲明,違者必究。如果文章有不足之處,歡迎關注微信公衆號私信與我進行交流!程序員

二:Linux中搭建Nginx服務器

新建壓縮包下載位置(可選)web

新建目錄
mkdir /usr/local/nginx_down
切換目錄
cd /usr/local/nginx_down

下載解壓 Nginx正則表達式

下載
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算法

./configure --with-http_ssl_module
  1. 這樣會默認安裝nginx在 /usr/local/nginx 目錄,可使用--prefix=/usr/local/nginx指定安裝位置。後端

  2. 若是須要HTTPS(SSL)的支持,須要指定參數--with-http_ssl_module

若是提示錯誤,那麼須要其它環境,請參考下面

安裝 make

yum -y install gcc automake autoconf libtool make

安裝 g++

yum -y install gcc gcc-c++

安裝 PCRE庫

yum -y install pcre pcre-devel

安裝 Zlib

yum -y install zlib zlib-devel

安裝 GD library

yum -y install gd-devel

安裝 openssl

yum -y install openssl openssl-devel

-y:跳過全部手動確認輸入

若是./configure安裝成功,只須要再執行兩個命令:

make
make install

查看是否安裝成功

cd /usr/local/nginx

若是安裝成功,則會出現下列目錄:

conf  html  logs  sbin

切換到sbin目錄

cd /sbin

啓動程序

./nginx

追加參數 -c 能夠指定配置文件。

常見的錯誤

在Linux操做系統下搭建Nginx服務器,不少時候會出現不一樣的錯誤,在此,咱們對搭建過程當中出現的錯誤進行一些總結。主要有這些類型:

防火牆問題,缺乏gc++,缺乏pcre、zlib等庫。

三:Nginx的反向代理和負載均衡

什麼是反向代理

咱們有時候,用本身的計算機A想訪問國外的某個網站B,可是訪問不了,此時,有一臺中間服務器C能夠訪問國外的網站B,那麼,咱們能夠用本身的電腦訪問服務器C,經過C來訪問B這個網站。那麼這個時候,服務器C稱爲代理服務器,這種訪問方式叫作正向代理。正向代理有一個特色,就是咱們明確知道要訪問哪一個網站。再如,當咱們有一個服務器集中,而且服務器集羣中的每臺服務器的內容同樣的時候,一樣咱們要直接從我的電腦訪問到服務器集中的服務器的時候沒法訪問,且此時第三方服務器能訪問集羣,這個時候,我捫經過第三方服務器訪問服務器集羣的內容,可是此吋咱們並不知道是哪一臺服務器提供的內容,此時的代理方式稱爲反向代理。

正向代理

反向代理

什麼是負載均衡

當一臺服務器的單位時間內的訪問量越大的時候,服務器的壓力會越大。當一臺服務器壓力大得超過自身的承受能力的時候,服務器會崩潰。爲了不服務器崩潰,讓用戶有更好地體驗,咱們一般經過負載均衡的方式來分擔服務器的壓力。那麼什麼是負載均衡呢?是這樣,咱們能夠創建不少不少個服務器,這些服務器組成一個服務器集羣,而後,當用戶訪問咱們網站的時候,先訪問一箇中間服務器,再讓這個中間服務器在服務器集羣中選擇一個壓力較小的服務器,而後將該訪問請求引入該選擇的服務器。這樣,用戶的每次訪問,都會保證服務器集羣中的每一個服務器的壓力趨於平衡,分擔了服務器壓力,避免了服務器崩潰的狀況。

基於反向代理的原理實現負載均衡

四:Nginx負載均衡的實現

Nginx 是一款能夠經過反向代理實現負載均衡的服務器,使用 Nginx 服務實現負載均衡的時候,用戶的訪問首先會訪問到 Nginx 服務器,而後 Nginx 服務器再從服務器集羣表中選擇壓力較小的服務器,而後將該訪問請求引向該服務器。若服務器集羣中的某個服務器崩潰,那麼從待選服務器列表中將該服務器刪除,也就是說一個服務器假如崩潰了,那麼 Nginx 就確定不會將訪問請求引入該服務器了。那麼下面,咱們經過實例來說解一下 Nginx 負載均衡的實現。

負載均衡配置文件

默認配置文件nginx.conf 很重要,咱們通常是新建一個配置文件,在啓動時指定加載。

[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配置文件

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

【本文版權歸微信公衆號"代碼藝術"(ID:onblog)全部,如果轉載請務必保留本段原創聲明,違者必究。如果文章有不足之處,歡迎關注微信公衆號私信與我進行交流!】

./sbin/nginx -s reload

如何關閉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權重。

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的下段配置內容:

# 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了。

仍是在此配置文件中,加入下面一句:

server {
        listen       80;
        server_name  localhost;
        
		rewrite ^(.*) https://$host$1 permanent;
		...

版權聲明

本文版權歸微信公衆號"代碼藝術"(ID:onblog)全部,如果轉載請務必保留本段原創聲明,違者必究。如果文章有不足之處,歡迎關注微信公衆號私信與我進行交流!

相關文章
相關標籤/搜索