<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          前端的Nginx知識梳理

          共 14389字,需瀏覽 29分鐘

           ·

          2021-03-19 11:41

          因為開發(fā)中有很多環(huán)境,開發(fā)環(huán)境,測試環(huán)境,預生產(chǎn)環(huán)境等,所以會經(jīng)常會用到 nginx 來配置代理。但是我也只是會用,想仔細梳理一下 nginx 的知識。

          1. 什么是 Nginx


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

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

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

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

          這里提到了反向代理,什么是反向代理?

          Nginx 根據(jù)接收到的請求的端口,域名,url,將請求轉(zhuǎn)發(fā)給不同的機器,不同的端口(或直接返回結(jié)果),然后將返回的數(shù)據(jù)返回給客戶端。

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

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

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

          A(客戶端) 想租一個房子, B(代理) 就把這個房子租給了他。
          這時候?qū)嶋H上 C(服務端) 才是房東。
          B(代理) 是中介把這個房子租給了 A(客戶端)。

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

          反向代理特點

          • Nginx 沒有自己的地址,它的地址就是服務器的地址,如 www.baidu.com,對外部來講,它就是數(shù)據(jù)的生產(chǎn)者。
          • Ngxin 明確的知道應該去哪個服務器獲取數(shù)據(jù)(在未接收到請求之前,已經(jīng)確定應該連接哪臺服務器)

          有反向就應該有正向。

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

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

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

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

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

          2.  Nginx 應用場景


          1、 http 服務器。Nginx 是一個 http 服務可以獨立提供 http 服務。可以做網(wǎng)頁靜態(tài)服務器。

          2、 虛擬主機。可以實現(xiàn)在一臺服務器虛擬出多個網(wǎng)站。例如個人網(wǎng)站使用的虛擬主機。

          • 基于端口的,不同的端口
          • 基于域名的,不同域名

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

          3. 安裝 Nginx


          blog.s135.com/nginx_php_v…

          4. 命令


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

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

          5. Nginx 配置


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

          里面的配置主要是這樣:

          # 全局區(qū)   有一個工作子進程,一般設置為CPU數(shù) * 核數(shù)
                  worker_processes  1;

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

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

                          # 配置虛擬主機段
                              server {

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

                          }
                      }

                      server {
                                 ...
                      }
                  }

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

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

          比如上面第一行配置的:

          worker_processes  1;

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

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

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

          6. 反向代理


          上面已經(jīng)解釋過反向代理了,我們現(xiàn)在來寫一個。當我在公司配置反向代理的時候,我會在 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 #監(jiān)聽所有80端口和8080端口
          2 listen  IP_address:port   #監(jiān)聽指定的地址和端口號
          3 listen  IP_address     #監(jiān)聽指定ip地址所有端口
          4 listen port     #監(jiān)聽該端口的所有IP連接

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

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

          location 指令用于匹配 URL

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

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

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

          7.Nginx 管理虛擬主機


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

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

          7.1 基于域名的虛擬主機

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

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

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

          3、創(chuàng)建目錄:mkdir feng

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

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

          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 基于端口的虛擬主機配置

          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;
                }
              }

          8. 負載均衡


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

          ** 負載均衡:** 由于目前現(xiàn)有網(wǎng)絡的各個核心部分隨著業(yè)務量的提高,訪問量和數(shù)據(jù)流量的快速增長,其處理能力和計算強度也相應地增大,使得單一的服務器設備根本無法承擔。

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

          Nginx 實現(xiàn)負載均衡有幾種方案。

          8.1 輪詢

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

          upstream backserver {
              server 192.168.0.14;
              server 192.168.0.15;
          }

          8.2 weight

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

          upstream backserver {
              server 192.168.0.14 weight=3;
              server 192.168.0.15 weight=7;
          }

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

          8.3 ip_hash

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

          upstream backserver {
              ip_hash;
              server 192.168.0.14:88;
              server 192.168.0.15:80;
          }

          8.4 fair

          按后端服務器的響應時間來分配請求,響應時間短的優(yōu)先分配。

          upstream backserver {
              server server1;
              server server2;
              fair;
          }

          8.5 url_hash

          按訪問 url 的 hash 結(jié)果來分配請求,使每個 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 :允許請求失敗的次數(shù)默認為 1. 當超過最大次數(shù)時,返回 proxy_next_upstream 模塊定義的錯誤。

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

          配置實例:

          #user  nobody;

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

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

              }
          }

          8.6 深入實踐

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

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

          9. 總結(jié)


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

          參考資料

          [1]

          Linux知識庫: http://lib.csdn.net/base/linux

          ??愛心三連擊

          1.看到這里了就點個在看支持下吧,你的點贊在看是我創(chuàng)作的動力。

          2.關注公眾號程序員成長指北,回復「1」加入高級前端交流群!「在這里有好多 前端 開發(fā)者,會討論 前端 Node 知識,互相學習」!

          3.也可添加微信【ikoala520】,一起成長。

          “在看轉(zhuǎn)發(fā)”是最大的支持

          瀏覽 48
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲女人在线 | 18禁网站色 | 天天撸一撸 | 三级片无码一区 | 偷拍日本大香蕉 |