前端的 Nginx 知識梳理

因爲開發中有很多環境,開發環境,測試環境,預生產環境等,所以會經常會用到 nginx 來配置代理。但是我也只是會用,想仔細梳理一下 nginx 的知識。

  1. 什麼是 Nginx ============

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

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

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

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

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

Nginx 根據接收到的請求的端口,域名,url,將請求轉發給不同的機器,不同的端口(或直接返回結果),然後將返回的數據返回給客戶端。

在 Java 設計模式中,代理模式是這樣定義的:給某個對象提供一個代理對象,並由代理對象控制原對象的引用。

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

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

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

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

反向代理特點

有反向就應該有正向。

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

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

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

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

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

2.  Nginx 應用場景


1、 http 服務器。Nginx 是一個 http 服務可以獨立提供 http 服務。可以做網頁靜態服務器。

2、 虛擬主機。可以實現在一臺服務器虛擬出多個網站。例如個人網站使用的虛擬主機。

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

  1. 安裝 Nginx ===========

blog.s135.com/nginx_php_v…

  1. 命令 =====

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

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

  1. Nginx 配置 ===========

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

裏面的配置主要是這樣:

 1# 全局區   有一個工作子進程,一般設置爲CPU數 * 核數
 2        worker_processes  1;
 3
 4        events {
 5                # 一般是配置nginx進程與連接的特性
 6                # 如1個word能同時允許多少連接,一個子進程最大允許連接1024個連接
 7                worker_connections  1024;
 8        }
 9
10        # 配置HTTP服務器配置段
11        http {
12
13                # 配置虛擬主機段
14                    server {
15
16                        # 定位,把特殊的路徑或文件再次定位。
17                location  {
18
19                }
20            }
21
22            server {
23                       ...
24            }
25        }
26
27

我們可以很明顯的將 nginx.conf 配置文件分爲三部分:

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

比如上面第一行配置的:

1worker_processes  1;
2
3

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

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

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

  1. 反向代理 =======

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

 1      server {
 2        listen            80;
 3        server_name       dev-customer.sdyxmall.com ;
 4        gzip              off;
 5        gzip_buffers      4 16k;
 6        gzip_comp_level   5;
 7        gzip_http_version 1.0;
 8        gzip_min_length   1k;
 9        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;
10        gzip_vary         on;
11
12        location / {
13           proxy_pass   http://127.0.0.1:5000;
14           proxy_set_header X-real-ip $remote_addr;
15           proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
16           proxy_set_header Host $host;
17        }
18    }
19
20
21

然後 hosts 中配置:

110.3.100.13 dev-customer.sdyxmall.com
2
3
4

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

11 listen *:80 | *:8080 #監聽所有80端口和8080端口
22 listen  IP_address:port   #監聽指定的地址和端口號
33 listen  IP_address     #監聽指定ip地址所有端口
44 listen port     #監聽該端口的所有IP連接
5
6

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

gzip 的作用是是否需要開啓壓縮傳輸

location 指令用於匹配 URL

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

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

基本上我們瞭解 server_name,location,proxy_pass 就可以配置反向代理

7.Nginx 管理虛擬主機


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

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

7.1 基於域名的虛擬主機

1、在 http 大括號中添加如下代碼段:

 1server {  
 2        #監聽端口 80  
 3        listen 80;   
 4                                
 5        #監聽域名feng.com;  
 6        server_name feng.com;
 7          
 8        location / {              
 9                # 相對路徑,相對nginx根目錄。也可寫成絕對路徑  
10            root    feng;  
11            
12            # 默認跳轉到index.html頁面  
13            index index.html;                 
14        }  
15    }
16
17
18

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

3、創建目錄:mkdir feng

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

 1<html>
 2        <head>
 3            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 4        </head>
 5        <body>
 6            <h2>楓</h2>
 7        </body>
 8    </html>
 9
10
11

5、重新讀取配置文件:

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

kill -HUP 進程號

6、配置 windows 本機 host:

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

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

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

 1server {
 2        listen  2022;
 3        server_name     feng.com;
 4        location / {
 5           root    /home;
 6           index index.html;
 7        }
 8    }
 9
10
11

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

 1    server {
 2      listen  80;
 3      server_name  192.168.197.142;
 4      location / {
 5              root    ip;
 6              index index.html;
 7      }
 8    }
 9
10
11
  1. 負載均衡 =======

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

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

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

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

8.1 輪詢

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

1upstream backserver {
2    server 192.168.0.14;
3    server 192.168.0.15;
4}
5
6

8.2 weight

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

1upstream backserver {
2    server 192.168.0.14 weight=3;
3    server 192.168.0.15 weight=7;
4}
5
6

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

8.3 ip_hash

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

1upstream backserver {
2    ip_hash;
3    server 192.168.0.14:88;
4    server 192.168.0.15:80;
5}
6
7

8.4 fair

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

1upstream backserver {
2    server server1;
3    server server2;
4    fair;
5}
6
7
8

8.5 url_hash

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

1upstream backserver {
2    server squid1:3128;
3    server squid2:3128;
4    hash $request_uri;
5    hash_method crc32;
6}
7
8
9

在需要使用負載均衡的 server 中增加

 1proxy_pass http://backserver/; 
 2upstream backserver{ 
 3    ip_hash; 
 4    server 127.0.0.1:9090 down; (down 表示單前的server暫時不參與負載) 
 5    server 127.0.0.1:8080 weight=2; (weight 默認爲1.weight越大,負載的權重就越大) 
 6    server 127.0.0.1:6060; 
 7    server 127.0.0.1:7070 backup; (其它所有的非backup機器down或者忙的時候,請求backup機器) 
 8 9
10
11

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

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

配置實例:

 1#user  nobody;
 2
 3worker_processes  4;
 4events {
 5# 最大併發數
 6worker_connections  1024;
 7}
 8http{
 9    # 待選服務器列表
10    upstream myproject{
11        # ip_hash指令,將同一用戶引入同一服務器。
12        ip_hash;
13        server 125.219.42.4 fail_timeout=60s;
14        server 172.31.2.183;
15    }
16
17    server{
18        # 監聽端口
19        listen 80;
20        # 根目錄下
21        location / {
22        # 選擇哪個服務器列表
23            proxy_pass http://myproject;
24        }
25
26    }
27}
28
29
30

8.6 深入實踐

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

地址:zhuanlan.zhihu.com/p/32122459

  1. 總結 =====

Nginx 真的很強大,而且使用的越來越廣泛,雖然我目前在公司使用的不多,但是學到了 Nginx 很多知識,對項目的構建,優化,心裏有了更多的想法。或許不一定要了解的很深入,滿足我們的日常需要就可以了,瞭解它,當我們在做項目或者解決問題,能夠作爲我們的一種解決方案,就很 Nice 了。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/mz0PZzfPmT6ALzja1nbv_g