前端的Nginx知識梳理「乾貨分享」

Nginx是一個高性能、輕量級的Web和反向代理服務器, 其特色是佔有內存及資源少、抗併發能力強。javascript

Nginx安裝簡單、配置簡潔、啓動快速便捷、支持熱部署、支持 SSL、擁有高度模塊化的設計。css

Nginx的主要功能有:html

  • Web服務器
  • 反向代理
  • 負載均衡
  1. 什麼是Nginx

Nginx (engine x) 是一個高性能的HTTP和反向代理web服務器。java

Nginx以事件驅動的方式編寫,因此有很是好的性能,同時也是一個很是高效的反向代理、負載平衡服務器。在性能上,Nginx佔用不多的系統資源,能支持更多的併發鏈接,達到更高的訪問效率;在功能上,Nginx是優秀的代理服務器和負載均衡服務器;在安裝配置上,Nginx安裝簡單、配置靈活。nginx

Nginx支持熱部署,啓動速度特別快,還能夠在不間斷服務的狀況下對軟件版本或配置進行升級,即便運行數月也無需從新啓動。web

在微服務的體系之下,Nginx正在被愈來愈多的項目採用做爲網關來使用,配合Lua作限流、熔斷等控制。數據庫

這裏提到了反向代理,什麼是反向代理?windows

Nginx根據接收到的請求的端口,域名,url,將請求轉發給不一樣的機器,不一樣的端口(或直接返回結果),而後將返回的數據返回給客戶端,在Java設計模式中,代理模式是這樣定義的:給某個對象提供一個代理對象,並由代理對象控制原對象的引用。後端

當咱們有一個服務器集羣,而且服務器集羣中的每臺服務器的內容同樣的時候,一樣咱們要直接從我的電腦訪問到服務器集羣服務器的時候沒法訪問,必須經過第三方服務器才能訪問集羣
這個時候,咱們經過第三方服務器訪問服務器集羣的內容,可是咱們並不知道是哪一臺服務器提供的內容,這種代理方式稱爲反向代理設計模式

反向代理:客戶端 一>代理 <一> 服務端

反向代理用一個租房的例子:

A(客戶端)想租一個房子,B(代理)就把這個房子租給了他。
這時候實際上C(服務端)纔是房東。
B(代理)是中介把這個房子租給了A(客戶端)。

這個過程當中A(客戶端)並不知道這個房子到底誰纔是房東
他都有可能認爲這個房子就是B(代理)的

反向代理特色

  • Nginx沒有本身的地址,它的地址就是服務器的地址,如www.baidu.com,對外部來說,它就是數據的生產者。
  • Ngxin明確的知道應該去哪一個服務器獲取數據(在未接收到請求以前,已經肯定應該鏈接哪臺服務器)

有反向就應該有正向。

所謂正向代理就是順着請求的方向進行的代理,即代理服務器他是由你配置爲你服務,去請求目標服務器地址。正向代理最大的特色是客戶端很是明確要訪問的服務器地址;服務器只清楚請求來自哪一個代理服務器,而不清楚來自哪一個具體的客戶端;正向代理模式屏蔽或者隱藏了真實客戶端信息

正向代理:客戶端 <一> 代理 一>服務端

正向代理也簡單地打個租房的比方:

A(客戶端)想租C(服務端)的房子,可是A(客戶端)並不認識C(服務端)租不到。
B(代理)認識C(服務端)能租這個房子因此你找了B(代理)幫忙租到了這個房子。

這個過程當中C(服務端)不認識A(客戶端)只認識B(代理)
C(服務端)並不知道A(客戶端)租了房子,只知道房子租給了B(代理)。

2.  Nginx應用場景


一、 http服務器。Nginx是一個http服務能夠獨立提供http服務。能夠作網頁靜態服務器。

二、 虛擬主機。能夠實如今一臺服務器虛擬出多個網站。例如我的網站使用的虛擬主機。

  • 基於端口的,不一樣的端口
  • 基於域名的,不一樣域名

三、 反向代理,負載均衡。當網站的訪問量達到必定程度後,單臺服務器不能知足用戶的請求時,須要用多臺服務器集羣可使用nginx作反向代理。而且多臺服務器能夠平均分擔負載,不會由於某臺服務器負載高宕機而某臺服務器閒置的狀況。

  1. 安裝Nginx

  1. 命令

-

nginx -s reopen #重啓Nginx
nginx -s reload #從新加載Nginx配置文件,而後以優雅的方式重啓Nginx
nginx -s stop #強制中止Nginx服務
nginx -s quit #優雅地中止Nginx服務(即處理完全部請求後再中止服務)
nginx -?,-h #打開幫助信息
nginx -v #顯示版本信息並退出
nginx -V #顯示版本和配置選項信息,而後退出
nginx -t #檢測配置文件是否有語法錯誤,而後退出
nginx -T #檢測配置文件是否有語法錯誤,轉儲並退出
nginx -q #在檢測配置文件期間屏蔽非錯誤信息
nginx -p prefix #設置前綴路徑(默認是:/usr/share/nginx/)nginx -c filename #設置配置文件(默認是:/etc/nginx/nginx.conf)
nginx -g directives #設置配置文件外的全局指令
killall nginx #殺死全部nginx進程
複製代碼

轉儲: 在內存、CPU、I/O等設備上的數據都是動態的(或者說是易失的),也就是說數據使用完或者發生異常就會丟掉。若是我想獲得某些時刻的數據(有多是調試程序Bug或者收集某些信息),就要把他轉儲(dump)爲靜態(如文件)的形式。不然,這些數據你永遠都拿不到。

  1. Nginx配置

Nginx的主配置文件是:nginx.conf。

裏面的配置主要是這樣:

# 全局區   有一個工做子進程,通常設置爲CPU數 * 核數
        worker_processes  1;

        events {
                # 通常是配置nginx進程與鏈接的特性
                # 如1個word能同時容許多少鏈接,一個子進程最大容許鏈接1024個鏈接
                worker_connections  1024;
        }

        # 配置HTTP服務器配置段
        http {

                # 配置虛擬主機段
                    server {

                        # 定位,把特殊的路徑或文件再次定位。
                location  {

                }
            }

            server {
                       ...
            }
        }
複製代碼

咱們能夠很明顯的將 nginx.conf 配置文件分爲三部分:

全局塊: 從配置文件開始到 events 塊之間的內容,主要會設置一些影響nginx 服務器總體運行的配置指令,主要包括配置運行 Nginx 服務器的用戶(組)、容許生成的 worker process 數,進程 PID 存放路徑、日誌存放路徑和類型以及配置文件的引入等。

好比上面第一行配置的:

worker_processes  1;
複製代碼

這是 Nginx 服務器併發處理服務的關鍵配置,worker_processes 值越大,能夠支持的併發處理量也越多可是會受到硬件、軟件等設備的制約。

events塊:涉及的指令主要影響 Nginx 服務器與用戶的網絡鏈接,經常使用的設置包括是否開啓對多 work process 下的網絡鏈接進行序列化,是否容許同時接收多個網絡鏈接,選取哪一種事件驅動模型來處理鏈接請求,每一個 word process 能夠同時支持的最大鏈接數等。

http塊: Nginx 服務器配置中最頻繁的部分,代理、緩存和日誌定義等絕大多數功能和第三方模塊的配置都在這裏。

  1. 反向代理

上面已經解釋過反向代理了,咱們如今來寫一個。當我在公司配置反向代理的時候,我會在http中添加一個server:

server {
        listen            80;
        server_name       dev-customer.sdyxmall.com ;
        gzip              off;
        gzip_buffers      4 16k;
        gzip_comp_level   5;
        gzip_http_version 1.0;
        gzip_min_length   1k;
        gzip_types        text/plain text/css application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript image/x-icon image/bmp;
        gzip_vary         on;

        location / {
           proxy_pass   http://127.0.0.1:5000;
           proxy_set_header X-real-ip $remote_addr;
           proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header Host $host;
        }
    }
複製代碼

而後hosts中配置:

10.3.100.13 dev-customer.sdyxmall.com
複製代碼

接下來咱們梳理一下語法:

1 listen *:80 | *:8080 #監聽全部80端口和8080端口
2 listen  IP_address:port   #監聽指定的地址和端口號
3 listen  IP_address     #監聽指定ip地址全部端口
4 listen port     #監聽該端口的全部IP鏈接
複製代碼

server_name指令主要用於配置基於名稱虛擬主機

gzip的做用是是否須要開啓壓縮傳輸

location指令用於匹配 URL

proxy_pass指令用於設置被代理服務器的地址

proxy_set_header用來設定被代理服務器接收到的header信息(請求頭)

基本上咱們瞭解server_name,location,proxy_pass就能夠配置反向代理

7.Nginx管理虛擬主機

這部分我工做中沒有接觸過,可是查找資料的時候名字看起來很高大上,就特地研究了一下。當咱們想在一臺服務器虛擬出多個網站,咱們就能夠用虛擬主機來實現。

虛擬主機使用的是特殊的軟硬件技術,它把一臺運行在因特網上的服務器主機分紅一臺臺「虛擬」的主機,每臺虛擬主機均可以是一個獨立的網站,能夠具備獨立的域名,具備完整的Intemet服務器功能(WWW、FTP、Email等),同一臺主機上的虛擬主機之間是徹底獨立的。從網站訪問者來看,每一臺虛擬主機和一臺獨立的主機徹底同樣。

7.1 基於域名的虛擬主機

一、在http大括號中添加以下代碼段:

server {  
        #監聽端口 80  
        listen 80;   
                                
        #監聽域名feng.com;  
        server_name feng.com;
          
        location / {              
                # 相對路徑,相對nginx根目錄。也可寫成絕對路徑  
            root    feng;  
            
            # 默認跳轉到index.html頁面  
            index index.html;                 
        }  
    }
複製代碼

二、切換安裝目錄:cd/usr/local/software/nginx

三、建立目錄:mkdir feng

四、新建index.html文件:vi /usr/local/software/nginx/feng/index.html,文件內容:

<html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        </head>
        <body>
            <h2>楓</h2>
        </body>
    </html>
複製代碼

五、從新讀取配置文件:

/usr/local/software/nginx/sbin/nginx-s reload

kill -HUP進程號

六、配置windows本機host:

192.168.197.142 feng.com #Linux服務器IP地址

七、訪問:http://feng.com:80/

7.2 基於端口的虛擬主機配置

server {
        listen  2022;
        server_name     feng.com;
        location / {
           root    /home;
           index index.html;
        }
    }
複製代碼

7.3 基於IP地址虛擬主機配置

server {
      listen  80;
      server_name  192.168.197.142;
      location / {
              root    ip;
              index index.html;
      }
    }
複製代碼
  1. 負載均衡

咱們使用Nginx聽到的最多的就是負載均衡,那麼什麼是負載均衡呢?

負載均衡:因爲目前現有網絡的各個核心部分隨着業務量的提升,訪問量和數據流量的快速增加,其處理能力和計算強度也相應地增大,使得單一的服務器設備根本沒法承擔。

針對此狀況而衍生出來的一種廉價有效透明的方法以擴展示有網絡設備和服務器的帶寬、增長吞吐量、增強網絡數據處理能力、提升網絡的靈活性和可用性的技術就是負載均衡(Load Balance)。

Nginx實現負載均衡有幾種方案。

8.1 輪詢

輪詢即Round Robin,根據Nginx配置文件中的順序,依次把客戶端的Web請求分發到不一樣的後端服務器。

upstream backserver {
    server 192.168.0.14;
    server 192.168.0.15;
}
複製代碼

8.2 weight

基於權重的負載均衡即Weighted Load Balancing,這種方式下,咱們能夠配置Nginx把請求更多地分發到高配置的後端服務器上,把相對較少的請求分發到低配服務器。

upstream backserver {
    server 192.168.0.14 weight=3;
    server 192.168.0.15 weight=7;
}
複製代碼

權重越高,在被訪問的機率越大,如上例,分別是30%,70%。

8.3 ip_hash

前述的兩種負載均衡方案中,同一客戶端連續的Web請求可能會被分發到不一樣的後端服務器進行處理,所以若是涉及到會話Session,那麼會話會比較複雜。常見的是基於數據庫的會話持久化。要克服上面的難題,可使用基於IP地址哈希的負載均衡方案。這樣的話,同一客戶端連續的Web請求都會被分發到同一服務器進行處理。

upstream backserver {
    ip_hash;
    server 192.168.0.14:88;
    server 192.168.0.15:80;
}
複製代碼

8.4 fair

按後端服務器的響應時間來分配請求,響應時間短的優先分配。

upstream backserver {
    server server1;
    server server2;
    fair;
}
複製代碼

8.5 url_hash

按訪問url的hash結果來分配請求,使每一個url定向到同一個(對應的)後端服務器,後端服務器爲緩存時比較有效。

upstream backserver {
    server squid1:3128;
    server squid2:3128;
    hash $request_uri;
    hash_method crc32;
}
複製代碼

在須要使用負載均衡的server中增長

proxy_pass http://backserver/; 
upstream backserver{ 
    ip_hash; 
    server 127.0.0.1:9090 down; (down 表示單前的server暫時不參與負載) 
    server 127.0.0.1:8080 weight=2; (weight 默認爲1.weight越大,負載的權重就越大) 
    server 127.0.0.1:6060; 
    server 127.0.0.1:7070 backup; (其它全部的非backup機器down或者忙的時候,請求backup機器) 
} 
複製代碼

max_fails :容許請求失敗的次數默認爲1.當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤。

fail_timeout:max_fails次失敗後,暫停的時間。

配置實例:

#user  nobody;

worker_processes  4;
events {
# 最大併發數
worker_connections  1024;
}
http{
    # 待選服務器列表
    upstream myproject{
        # ip_hash指令,將同一用戶引入同一服務器。
        ip_hash;
        server 125.219.42.4 fail_timeout=60s;
        server 172.31.2.183;
    }

    server{
        # 監聽端口
        listen 80;
        # 根目錄下
        location / {
        # 選擇哪一個服務器列表
            proxy_pass http://myproject;
        }

    }
}
複製代碼

8.6 深刻實踐

上面寫的都是負載均衡的方案,具體實現我看到知乎大佬寫的很不錯,並且看起來帥的起飛。

  1. 總結

Nginx真的很強大,並且使用的愈來愈普遍,雖然我目前在公司使用的很少,可是學到了Nginx不少知識,對項目的構建,優化,內心有了更多的想法。或許不必定要了解的很深刻,知足咱們的平常須要就能夠了,瞭解它,當咱們在作項目或者解決問題,可以做爲咱們的一種解決方案,就很Nice了。

做者:黑色的楓

相關文章
相關標籤/搜索