這篇文章主要簡單的介紹下 Nginx 的相關知識,主要包括如下幾部份內容:css
如圖所示,一個請求會先通過 Nginx 到達應用服務層,而後再去訪問數據層(好比 Redis、MySQL 等),提供基本的數據功能。咱們的應用服務由於要求開發效率是很是高的,因此它的運行效率是很低的,它的 qps、tps或者併發都是受限的,因此咱們須要把不少這樣的應用服務組成集羣,向用戶提供高可用服務。而一旦不少服務構成集羣的時候,咱們須要 Nginx 具有反向代理功能,能夠把動態請求傳遞給應用服務。nginx
而當應用服務構成集羣,必定會帶來兩個需求:web
這樣反向代理必須具有負載均衡功能。數據庫
其次在這樣的一個鏈路中, Nginx 是處在企業內網的一個邊緣節點,隨着網絡鏈路的增加,用戶體驗到的時延會增長,因此須要把用戶看起來不變的或者在一段時間內看起來不變的動態內容緩存在 Nginx 部分,由 Nginx 直接向用戶提供訪問,這樣用戶時延就會減小不少。因此反向代理延伸出另一個功能就是緩存,來減小用戶訪問的時延。api
像不少 css、js、img 靜態資源,是沒有必要經過應用服務來訪問的,只須要本地文件系統上放置的靜態資源,直接由 Nginx 提供訪問就能夠了。這是 Nginx 的靜態資源服務。緩存
應用服務自己的性能存在不少問題,像數據庫服務比應用服務好的多,由於業務場景比較簡單,併發性能和tps都要遠高於應用服務,因此延伸出第三個應用場景:由 Nginx 直接去訪問數據庫、Redis,利用 Nginx 強大的併發性能實現如 web防火牆 複雜的一些業務功能。這就須要api服務有很強的業務處理功能,因此像 OpenResty、 Nginx 集成的 JavaScript,應用 JavaScript、lua 這樣的語言功能和它們語言自帶的一些工具庫來提供完整的 API服務。服務器
伴隨着互聯網的快速普及、以及全球化和物聯網的快速發展,致使互聯網的數據量快速增加。網絡
CPU 核數從當初的單核發展到 16 核,甚至 32 核,可是因爲操做系統和大量的軟件沒有作好服務於多核架構的準備,導致服務的性能一般不會有成倍的提高。架構
Apache 的架構模型一個進程同一時間只會處理一個連接一個請求,處理完之後纔會處理下一個請求。它實際上在使用操做系統的進程間切換的特性,由於操做系統微觀上只有有限的 CPU,可是操做系統被設計爲同時服務數百甚至上千的進程,而 Apache 一個進程只能服務於一個連接,這樣的模式會致使當 Apache 須要面對幾十萬、幾百萬連接的時候,它沒有辦法去開幾十萬、幾百萬的進程;而進程間切換的代價成本又過高了,當併發的鏈接數越多,這種無謂的進程間切換引起的性能消耗也就越大,而 Nginx 是專門爲了這樣的應用場景而生的,Nginx 能夠處理數百萬甚至上千萬的併發連接。併發
1、高併發,高性能
只要咱們對每一個連接使用的內存足夠少就能實現高併發;既要達到高併發又要達到高性能,每每須要很好的設計。
好比如今的主流雲服務器,nginx 在 32 核 64G 的配置中能夠輕鬆達到數千萬的併發連接;若是是處理簡單的靜態資源請求,nginx 能夠達到 100w 的 RPS 。
RPS(Requests Per Second)爲每秒能處理的請求數目,等效於 QPS(Queries Per Second),也就是每秒能處理查詢數目。是一臺服務器每秒可以相應的查詢次數,是對一個特定的查詢服務器在規定時間內所處理流量多少的衡量標準。
2、可擴展性好
可擴展性主要體如今模塊化設計;模塊化設計很是穩定,使得 Nginx 的生態圈、第三方模塊很是豐富。甚至於有 Tengine、OpenResty 這樣的第三方插件在他的基礎之上又生成了新的生態圈。豐富的生態圈和第三方模塊爲 Nginx 的豐富功能提供了保證。
3、高可靠性
高可靠性指的是 Nginx 能夠服務器上持續不間斷的運行數年,而不少web服務器每每運行幾周or幾個月,就須要進行一次重啓。對於 Nginx 這樣一個高併發、高性能的反向代理服務器而言,每每運行在企業內網的邊緣節點上,這個時候若是咱們企業想提供4個九、5個九、甚至更高的高可用性時,對於 Nginx 持續運行可以宕機的時間一年可能只能以秒來計,因此在這樣一個角色中,Nginx 的高可靠性給咱們提供了很是好的保證。
4、熱部署
熱部署是指在不中止服務的狀況下升級Nginx。這個功能對於 Nginx 來講很是重要,由於在服務器上跑了數百萬的併發連接,若是是普通的服務器,咱們只能 kill 掉進程再重啓的方式進行升級操做。可是對於 Nginx 而言,由於直接 kill 掉 nginx 進程會給全部的已經創建連接的客戶端一個很很差的體驗。
5、BSD 許可證
BSD許可證是指 Nginx 不僅是開源的、免費的,並且咱們能夠在有定製需求的場景下,去修改 Nginx 的源碼,再運行在咱們的商業場景下且屬於合法的。
Nginx 主要由如下 4 部分組成:
接下來,咱們就要動手去編譯 Nginx 了。
# 下載
wget http://nginx.org/download/nginx-1.14.0.tar.gz
# 解壓
tar -xzvf nginx-1.14.0.tar.gz
cd nginx-1.14.0
# 配置
./configure --prefix=/usr/local/nginx
# 編譯
make
# 安裝
make install複製代碼
在 configure 過程當中可能遇到的問題:
./configure: error: the HTTP rewrite module requires the PCRE library. You can either disable the module by using --without-httprewritemodule option, or install the PCRE library into the system, or build the PCRE library statically from the source with nginx by using --with-pcre= option.
./configure: error: the HTTP gzip module requires the zlib library. You can either disable the module by using --without-httpgzipmodule option, or install the zlib library into the system, or build the zlib library statically from the source with nginx by using --with-zlib= option.
出錯的緣由是 Nginx 模塊須要依賴一些 lib 庫,解決辦法以下:
安裝 pcre-devel 和 zlib-devel 依賴庫:yum -y install pcre-devel zlib-devel複製代碼
示例中的全部指令都是由 Nginx 中的 http 模塊去執行的,其中 server 127.0.0.1:8000
爲須要解析的域名,location 後面跟的爲對應的匹配規則,expires 3m
表示 3 分鐘後 cache 刷新,zone=one:10m
表示開闢了一個 10m 大小的共享內存空間,給不一樣的 worker 去使用。
這篇文章主要介紹了 Nginx 出現的緣由和使用場景,並分析 Nginx 的優勢,最後動手去編譯屬於本身的 Nginx,並進行簡單配置。