Nginx的簡介
Nginx 是一個高性能的網頁服務器,能夠反向代理HTTP、HTTPS、SMTP、POP3、IMAP,也可以作為一個負載均衡器和 HTTP 緩存。是一個免費、開源、高性能的 HTTP 服務器。Nginx 以其高性能、穩定性、豐富的特性、以及簡單配置和低資源消耗而著稱。Nginx 是由 Igor Sysoev 開發設計來供俄羅斯的大型門戶網站和搜索引擎Rambler的使用。此軟件在BSD-like協議下發行,可以在 UNIX、GNU/Linux、BSD、Mac OS X、Solaris和Microsoft Windows等操作系統中運行。
與傳統的服務器不同,Nginx 不依賴線程來處理請求。相反,它使用了一個更具可擴展性的事件驅動(異步)體系結構。這種體系結構使用較小的內存量,但更重要的是,內存的使用量在有負載的時候更加可預測。即使你不希望同時處理數千個請求,但仍然可以從 Nginx 的高性能和小內存占用中受益。Nginx所有方向都可以擴展:從最小的VPS(Virtual Private Servers到大型的服務器集群。
Nginx的配置詳解
Nginx 的配置文件的結構抽象成如下示意圖
Nginx 的架構是以高度模塊化為設計基礎,除了非常少量的核心代碼,其它的一切皆是模塊。高度抽象的模塊接口,結構的設計簡單,使得 Nginx 十分的靈活與高效,默認情況下只會加載默認、必須的模塊,其它的一些功能實現需要加載一些第三方的模塊。而配置文件中的各個指令配置項其實便是對模塊的一個功能配置。Nginx 在運行時至少需要加載幾個核心的模塊和一個事件類模塊,這些模塊運行時所支持的配置項稱為基礎配置,這樣的配置項很多,一般將其分為四大類:
調試配置項
必備配置項
優化配置項
事件類配置項
在 Nginx 中有一個非常重要的核心模塊就是 ngx_http_core_module 模塊,它實現了靜態 Web 服務器的主要功能,而其相關的配置項都放在 http{} 配置塊中。
一個典型、完整的靜態 Web 服務器還會包含多個 server 配置塊和 location 配置塊。
server 配置塊類似于 Apache 中的 VirtualHost 配置塊,用于配置虛擬主機。其中 location 用于匹配請求的 URI(URI 表示的是訪問路徑,除域名以外的內容),匹配的方式有多種:
精準匹配
忽略大小寫的正則匹配
大小寫敏感的正則匹配
前半部分匹配
其語法如下:
其中各個符號的含義:
=:用于精準匹配,需要請求的 uri 與 pattern 表達式完全匹配的時候才會執行 location 中的操作。
~:用于區分大小寫的正則匹配。
~*:用于不區分大小寫的正則匹配。
^~:用于匹配 URI 的前半部分。
負載均衡是優化資源的利用率、最大化吞吐量、減少延遲以及確保容錯配置的常用技術。通過配置 Nginx 實現負載均衡,提高了 Web 應用程序的可伸縮性和可靠性。負載均衡的實現主要依賴于反向代理與upstream相關模塊。
upstream 模塊(模塊名:ngx_http_upstream_module)是 Nginx 負載均衡的主要模塊,它提供了實現后臺服務器負載均衡的方法,還提供對后端服務器健康檢查的功能。
Nginx 模塊一般分為三類:handler、filter、upstream。upstream 模塊本質上屬于 handler 模塊,但是它不會產生自己的內容,而是通過請求其它后端服務器得到需要的內容。
Upstream 模塊,使 Nginx 跨越單機的限制,完成網絡數據的接收、處理和轉發。
數據轉發功能,為 Nginx 提供了跨越單機的橫向處理能力,使 Nginx 擺脫只能為終端節點提供單一功能的限制,而使它具備了網路應用級別的拆分、封裝和整合的戰略功能。
Nginx 有著很強大的高并發、高負載的能力。當客戶端發出靜態文件請求(例如前端頁面)時,Nginx 會作為一個靜態 web 服務器直接向客戶端提供靜態文件服務。當客戶端發出不適合 Nginx 提供服務的動態請求時,Nginx 會作為一個反向代理服務器,將請求轉發到上游服務器中處理,處理后返回的動態應答再由 Nginx 轉發給客戶端。
proxy_pass 便是 HTTP proxy module 中重要配置項,通過該配置項我們可以配置將請求轉發給哪一臺服務節點、或者哪一個服務群。當設置轉發給某一個節點時,其格式為 proxy_pass http://ip或者域名:端口, 當需要轉發給某一個服務器群時,需要結合 upstream 使用。
在默認的負載均衡上,nginx 還支持一些調度算法來配置:
1)最少連接負載均衡:下一個請求被分配給連接數最少的服務器。
2)加權負載均衡:通過使用權重,來實現負載均衡。
3) ip-hash 負載均衡:將客戶端的 IP 地址用作哈希鍵,以決定服務器組中應該為客戶端請求選擇什么服務器。此方法可確保來自同一客戶端的請求將始終定向到同一服務器,除非此服務器不可用。
反向代理(Reverse Proxy)是指:代理服務器接受來自客戶端的請求,然后將請求轉發到內部網絡上的服務器,并將服務器的響應返回給客戶端。與之對應的是正向代理,具體的內容將在后面的實驗中詳細介紹。
反向代理服務器在網絡拓撲中所處的位置(如上圖所示)正好是負載均衡設備所在的位置,因此我們常常使用反向代理服務器作為負載均衡設備。反向代理服務器根據當前后端服務器的負載情況,將請求轉發給一臺合適的服務器,并將處理結果返回給用戶,這就是反向代理負載均衡。
其它常見的 Web 負載均衡方式包括:DNS 輪詢、IP 負載均衡、HTTP 重定向負載均衡等。
正向代理服務器是一個位于客戶端和目標服務器之間的服務器,即下圖中的服務器 Proxy ,它通常和客戶端在同一局域網(也有可能不是)。客戶端為了從目標服務器 Server 取得它想要的內容,它首先向代理服務器發送一個請求并指定目標(即要訪問的目標服務器),然后代理服務器 Proxy 向目標服務器 Server 轉交請求并將獲得的內容返回給客戶端。
正向代理的用途:
隱藏客戶端的信息:客戶端通過代理服務器訪問目標服務器,因此目標服務器只知道請求來自哪個代理服務器,而不清楚來自哪個具體的客戶端,隱藏了真實的客戶端信息。
訪問限制:代理服務器可以對客戶端進行控制管理,提高安全性。
緩存優化、提高訪問速度:通常代理服務器都設置一個較大的硬盤緩沖區,會將部分請求的響應保存到緩沖區中,當其他用戶再訪問相同的信息時,則直接由緩沖區中取出信息,傳給用戶,以提高訪問速度。
正向代理服務器與反向代理服務器兩者的相同點是:所處的位置都是客戶端和服務器之間,都是將客戶端的請求轉發給服務器,再把服務器的響應轉發給客戶端。兩者不同的是:
反向代理是服務器的代理,有負載均衡、安全防護等功能;正向代理是客戶端的代理,幫助客戶端訪問其無法訪問的服務器資源,解決訪問限制問題。
正向代理中,服務器不知道真正的客戶端到底是誰,以為訪問自己的就是真實的客戶端。而在反向代理中,客戶端不知道真正的服務器是誰,以為自己訪問的就是真實的服務器。
proxy_set_header 用于修改或設置請求頭中某個字段 field 的值 value,重定義發往后端服務器的請求頭。
proxy_set_header field value;
常用的有以下兩種:
proxy_set_header Host $http_host;:
在 Nginx 代理向后端服務器(即我們訪問的 Web 服務器)發送的 http 請求頭中加入 Host 字段信息,用于后端服務器識別是哪個主機訪問。
proxy_set_header X-Forwarded-For $remote_addr;:
在 Nginx 代理向后端服務器發送 http 請求頭加入 X-Forwarded-For 字段信息,用于后端服務器中的服務程序記錄真實的客戶端 IP,而不是代理服務器的 IP。
配置請求頭:
設置超時時間是為了保證一個請求占用固定的時間,超出之后返回給客戶端一個狀態碼:504 Gateway Time-out(充當網關或代理的服務器,未及時從遠端服務器獲取請求),可以防止出現一個請求占用過長時間的現象。這里介紹四個關于超時時間設置的指令,分為兩大類:
設置解析超時時間:
resolver_timeout 指令。
解析超時時間使用指令 resolver_timeout 來設置。這個時間是指 Nginx 連接 DNS 解析服務器的時間,如果在指定時間內沒有連接上 DNS 解析服務器,則判定為連接超時。
代理連接超時時間:
proxy_connect_timeout 指令。
proxy_connect_timeout 指令用于設置正向代理服務器與 Web 服務器連接的超時時間(即發起 TCP 握手等候的超時時間)。如果在指定時間內沒有與 Web 服務器建立 TCP 連接,則判定為超時。
proxy_send_timeout 指令。
proxy_send_timeout 指令用于設置 Nginx 代理服務器向 Web 服務器傳輸請求的超時時間。這個時間是指相鄰兩次寫操作之間的最長時間間隔,而不是整個請求傳輸完成的最長時間。如果 Nginx 代理服務器在超時時間段內沒有發送任何數據,TCP 連接將被關閉。
proxy_read_timeout 指令。
proxy_read_timeout 指令用于設置 Nginx 代理服務器從 Web 服務器獲取響應信息的超時時間。連接建立成功后,Nginx 等待 Web 服務器的響應,如果在指定的時間內 Web 服務器沒有發送數據,那么 Nginx 會斷開 TCP 連接。
比如設置解析超時時間為 5 分鐘,配置中應該這么寫:resolver_timeout 5m;
Nginx 正向代理服務器是客戶端和后端服務器溝通的橋梁,后端服務器的響應必然會返回給 Nginx 正向代理服務器,然后 Nginx 代理服務器再將響應傳遞給客戶端。因為客戶端的連接速度往往是不同的,甚至可能速度差距十分大。如果客戶端是緩慢的,在有緩沖的情況下,Nginx 代理會將后端服務的響應臨時存儲到緩沖區,然后按客戶端的連接速度發送給客戶端。如果客戶端連接速度很快,緩沖可以關閉,使數據盡快到達客戶端。在本實驗中,我們配置有緩沖的 Nginx 代理服務器。Nginx 代理服務器將響應臨時存儲到緩沖區中,但是臨時緩沖區是會預設空間大小的,如果超出設定的大小時,緩沖就會寫入到磁盤中。緩沖優化主要是要合理設置緩沖區大小,盡量避免緩沖到硬盤時的情況。
緩沖相關指令:
proxy_buffering on | off
proxy_buffering 的作用是配置是否啟用 Proxy Buffer。
proxy_buffer_size
proxy_buffer_size 指令配置從被代理服務器獲取的第一份響應數據的大小。這個響應數據中一般包含了 http 響應頭,Nginx 通過它來獲取響應數據和被代理數據的一些必要信息。
proxy_buffers
proxy_buffers 指令用于配置接受一次響應的 buffer 個數和每個 buffer 的大小。緩沖區總的大小為 number*size。若某些請求的響應過大,則超過 buffer 的部分將被緩沖到硬盤(緩沖目錄由 proxy_temp_path 指令指定,但一般都選擇關閉磁盤緩沖),如果數據緩沖到硬盤會使響應的速度減慢,影響用戶體驗。
proxy_busy_buffers_size
Nginx 會在沒有完全讀完后端響應的時候就開始向客戶端傳送數據,所以它會劃出一部分緩沖區來專門向客戶端傳送數據(這部分的大小是由 proxy_busy_buffers_size 來控制的),然后它繼續從后端取數據,緩沖區滿了之后就寫到磁盤的臨時文件中。proxy_busy_buffers_size 指令用于配置處于 busy 狀態的 Proxy Buffer 的總大小,一般設置為 proxy_buffers 中單個緩沖區大小的 2 倍。
proxy_max_temp_file_size
proxy_max_temp_file_size 用于配置所有臨時文件的總體積大小。(臨時文件是指緩沖區滿了之后存放到硬盤的文件)
更多精彩干貨分享
點擊下方名片關注
IT那活兒
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/129775.html
摘要:原文地址實戰指南二在中搭建服務器學習最快的方法就是直接使用,在實戰指南一介紹中,我們已經介紹了如何快速搭建,以及如何在中運行我們的第一個程序。 原文地址:Docker實戰指南(二):在Docker中搭建Nginx服務器 Introduction 學習Docker最快的方法就是直接使用,在Docker實戰指南(一):Docker介紹中,我們已經介紹了如何快速搭建Docker,以及如何在D...
摘要:本博客首發在,后因各種原因遷移至先來一波官方站點關于介紹。同時擁有一套緩存機制,可以進一步降低網絡壓力,加速用戶響應。主配置文件中,使用命令引用分支配置文件。接收到一個請求后,先與所有標準進行匹配,并記錄匹配度最高的一個。 本博客首發在cnblogs,后因各種原因遷移至segmentfault 先來一波官方站點關于nginx介紹。nginx相關歷史這里不再贅述啦。showImg(ht...
摘要:經由超文本傳輸協議通信,但是數據包由安全協議加密,實現加密數據與認證功能。該模塊指令定義相關設置證書文件,私鑰文件,會話緩存等內容。允許在客戶端建立會話時傳遞請求服務器名稱,這樣服務器就會知道該發送哪個虛擬主機下的證書文件。 1、nginx基本狀態信息頁面 配置示例: location /basic_status { stub_...
摘要:在上一篇文章里的奇淫技巧字符串截斷中我們介紹過了使用來進行截斷字符串的用法這次我們來了解下的邏輯用法什么是邏輯用法呢就程序中的關系就叫做邏輯了支持的與或者與嗎答案是當你嘗試這樣配置重載時會報出錯誤那么我們應該怎樣來實現和的邏輯關系呢 在上一篇文章:《NGINX里的奇淫技巧 —— 1. 字符串截斷》中, 我們介紹過了使用if來進行截斷字符串的用法, 這次我們來了解下if的邏輯用法: 什...
摘要:在上海研究院的同事們如果想參加這個內部培訓,可以聯系同事。第三行命名執行命令,生成新的鏡像文件。說句題外話雖然今年月份被微軟收購了,但是用戶體驗一點也沒變,一如既往的優秀。關于更多另類用法,請參閱的文章寫在被微軟收購之際的那些另類用法。 2018年只剩最后30天了。Jerry在2017年的最后一天,曾經立下一個目標:這個微信公眾號在2018年保證至少每周發布一篇SAP原創技術文章。 從...
摘要:在上海研究院的同事們如果想參加這個內部培訓,可以聯系同事。第三行命名執行命令,生成新的鏡像文件。說句題外話雖然今年月份被微軟收購了,但是用戶體驗一點也沒變,一如既往的優秀。關于更多另類用法,請參閱的文章寫在被微軟收購之際的那些另類用法。 2018年只剩最后30天了。Jerry在2017年的最后一天,曾經立下一個目標:這個微信公眾號在2018年保證至少每周發布一篇SAP原創技術文章。 從...
閱讀 1346·2023-01-11 13:20
閱讀 1684·2023-01-11 13:20
閱讀 1132·2023-01-11 13:20
閱讀 1860·2023-01-11 13:20
閱讀 4100·2023-01-11 13:20
閱讀 2704·2023-01-11 13:20
閱讀 1385·2023-01-11 13:20
閱讀 3597·2023-01-11 13:20