Nginx:為什麼Nginx無處不在?Nginx概述與應用場景
--- 閱讀時間約 20 分鐘 ---
Nginx概述
眾所周知,網際網路已經離不開 WEB伺服器,技術領域中 WEB伺服器不止 Nginx一個,其他還有很多如 Apache、 Tomcat、 Lighthttpd等,相信能看到這篇文章的友友們對這幾個單詞都不陌生。而 Nginx 因其高效能、輕量性、健壯性讓技術大廠們無法忽視它的存在。
這是 Nginx官網首頁貼出的 Partners 名單,啥概念看圖吧:
包括 由淘寶發起的專案Tengine、由章亦春發起 連錘子科技把T2釋出會門票收入都捐贈的開源專案OpenResty,都是基於Nginx進行的定向開發。國內幾乎所有大廠都使用到了 Nginx
- WEB服務
“ WEB服務 ”,這個概念其實很簡單,個人理解大致分為以下幾個部分:
大部分程式設計師的工作就是下進行服務編寫和專案搭構,再由 Nginx 這樣的工具,對外持續提供服務,當然不僅是WEB服務,我們平時通過網路訪問的絕大部分資源,其內部都有 Nginx 的身影。
Nginx 是一個高效能處理 HTTP協議 的服務軟體,而網際網路在我們日常生活中,凡是用於給使用者展示的,絕大多數都是 HTTP協議,因此像 Nginx 這種以高效能穩定執行的解析HTTP協議軟體理所當然會無處不在。當然如果僅僅是這樣我們大可以用其他軟體來代替, Nginx
WEB伺服器
- 概述
Nginx本身也是一個靜態資源的伺服器,當只有靜態資源的時候,就可以使用它來做伺服器,同時現在也很流行動靜分離,亦可通過它來實現。
- Nginx配置
server { listen 80; server_name localhost; location / { root e:/www/data; index index.html; } }
通過以上配置,我們在訪問 http://localhost 時就會預設訪問到 E://www/data 目錄下的 index.html。
- 應用場景
專案只有靜態資源
- 實現方式
更改Nginx配置並啟動,即可完成部署。
反向代理
- 概述
反向代理是大部分使用者通過 Nginx 完成最多的一件工作, 反向代理(Reverse Proxy)方式是指以代理伺服器來接受 Internet 上的連線請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給 Internet 上請求連線的客戶端,此時代理伺服器對外就表現為一個反向代理伺服器。
簡單來說就是真實的伺服器不能直接被外部網路訪問,所以需要一臺代理伺服器,而代理伺服器能被外部網路訪問的同時又跟真實伺服器處於同一個網路環境,當然也可能是同一臺伺服器的不同埠,這就是國內市場上大部分中小型企業的伺服器中存在 Nginx服務的原因,甚至隔壁 SegmentFault 也經常會全站訪問 502 Bad Gateway —— Nginx xx.xx.xx(版本號)。
- Nginx配置
server { listen 80; server_name localhost; location / { proxy_pass http://localhost:8080; proxy_set_header Host $host:$server_port; } }
- 應用場景
業務伺服器不能直接被外部網路訪問,即不能直接對映外網ip,需要一臺代理伺服器,而代理伺服器能被外部網路訪問同時又和業務伺服器的網路相通。
- 實現方式
使用反向代理功能。將 Nginx伺服器對映外網ip,業務伺服器無需對映,外網使用者訪問時首先訪問 Nginx 伺服器,然後再由 Nginx 伺服器訪問業務伺服器資源後轉發給使用者,這是目前網際網路伺服器的主流方案,既滿足了業務外網訪問的需求,又保證了業務伺服器的安全。
動靜分離
- 概述
動靜分離是讓動態網站裡的動態網頁根據一定規則把不變的資源和經常變的資源區分開來,動靜資源做好拆分後,我們就可以根據靜態資源(如html、css、js、圖片檔案)的特點對其做快取操作,這樣就完成了網站靜態化處理的核心思路。並且Nginx安裝在伺服器上的http 和反向代理服務元件,除了WEB服務意外還提供了負載均衡服務,這對使用者訪問伺服器尤其在高併發的時候尤其關鍵,可以將使用者訪問靜態資源和動態請求區分開,分配給不同的執行單元,提高響應速度,具體會在下文中提出。
- Nginx配置
upstream test{ server localhost:8080; server localhost:8081; } server { listen 80; server_name localhost; location / { root e:/wwwroot; index index.html; } # 所有靜態請求都由nginx處理,存放目錄為html location ~ .(gif|jpg|jpeg|png|bmp|swf|css|js)$ { root e:/wwwroot; } # 所有動態請求都轉發給tomcat處理 location ~ .(do)$ { proxy_pass http://test; } error_page 500 502 503 504 /50x.html; location = /50x.html { root e:/wwwroot; } }
- 應用場景
專案對效能有要求,需要寫出對併發和健壯性有要求的WEB服務。
- 實現方式
上述需求我們就可以使用靜態伺服器及反向代理模組,將靜態資源由Nginx本地提供,動態資源反向代理到後端的Tomcat提供,其中Tomcat和Nginx可以在同一臺伺服器也可以在不同伺服器中。
訪問入口統一
- 應用場景
最近開發公司一個專案就是,不同地級市分別對應不同的業務首頁,就是用 Nginx 實現的。多套業務系統使用同一個ip或者域名進行訪問,以不同字尾進行區分,需要一臺 Nginx 伺服器做統一的訪問入口。
- 實現方式
使用 Nginx 對入口專案進行部署,再使用反向代理模組將所有 Nginx 伺服器作為外網或內網使用者統一的訪問入口,然後根據設定的 localtion 規則匹配不同的字尾轉發至不同的業務伺服器。通常和前文提到的反向代理場景結合使用實現一個域名來訪問多個業務系統,同時甚至還可以實現統一的 https 訪問,通過在 Nginx 伺服器上配置證書,後端所有業務伺服器無需每臺額外配置證書即可實現 https 訪問。
瀏覽器跨域
- 概述
將前後端專案都部署在伺服器之後,因為請求和服務放在一起所以不存在跨域問題。但在非維護的開發時,如果後端沒有為自己的服務提供跨域,我們必須自己來完成以請求資料來完成開發。不過我們在工作中並不是每個專案都使用了 webpack或者引入了類似http-proxy-middleware的中介軟體,甚至還有可能維護 JSP 專案,所以我們有必要了解一個輕量級即開即用的跨域工具。
這一場景其實就是使用了 反向代理模組,由於伺服器不存在 同源策略,因此通過 Nginx 代理伺服器將請求中轉即可解決開發時臨時請求跨域問題,這應該是前端開發用 Nginx 做的最多的事。詳細請閱讀我的另一篇文章:Nginx:多專案開發配置跨域代理
還有幾個坑和重頭菜明天再填,預告:
正向代理
負載均衡
行為分析