文章原創於公眾號:程式猿周先森。本平臺不定時更新,喜歡我的文章,歡迎關注我的微信公眾號。
Nginx同Apache一樣都是一種WEB伺服器。基於REST架構風格,以統一資源描述符URI或者統一資源定位符URL作為溝通依據,通過HTTP協議提供各種網路服務。然而,這些伺服器在設計之初受到當時的使用者規模,網路頻寬,產品特點等侷限並且各自的定位和發展都不盡相同。這也使得各個WEB伺服器有著各自鮮明的特點。Apache的發展時期很長,它有著很多優點:穩定、開源、跨平臺等等。所以它被設計為一個重量級的WEB伺服器,但是它不支援高併發。在Apache上進行併發訪問,會導致伺服器消耗大量記憶體。作業系統對其進行程式或執行緒間的切換也消耗了大量的CPU資源,導致HTTP請求的平均響應速度降低。這時候輕量級高併發伺服器Nginx就應運而生了。
Nginx為什麼會火爆網際網路呢?正是由於Nginx的幾大顯著的特點存在:
- Nginx使用基於事件驅動架構,使得其可以支援數以百萬級別的TCP連線
- 高度的模組化和自由軟體許可證是的第三方模組層出不窮(這是個開源的時代啊~)
- Nginx是一個跨平臺伺服器,可以執行在Linux,Windows,FreeBSD,Solaris, AIX,Mac OS等作業系統上,這些優秀的設計帶來的極大的穩定性
眾所周知,Nginx是一款自由的、開源的、高效能的HTTP伺服器和反向代理伺服器;同時也是一個IMAP、POP3、SMTP代理伺服器;Nginx可以作為一個HTTP伺服器進行網站的釋出處理,另外Nginx可以作為反向代理進行負載均衡的實現。而說到代理,又分為正向代理與反向代理。
正向代理
正向代理也是大家最常接觸的到的代理模式,那究竟什麼是正向代理呢?我們都知道Google在國內是無法正常訪問的,但是某些時候我們由於技術問題需要去訪問Google時,我們會先找到一個可以訪問Google的代理伺服器,我們將請求傳送到代理伺服器,代理伺服器去訪問Google,然後將訪問到的資料返回給我們,這樣的過程就是正向代理。
正向代理的特點
正向代理最大的特點是客戶端需要明確知道要訪問的伺服器地址,Google伺服器只清楚請求來自哪個代理伺服器,而不清楚來自哪個具體的客戶端,正向代理可以隱藏真實客戶端的具體資訊。
客戶端必須設定正向代理伺服器,而且需要知道正向代理伺服器的IP地址以及代理程式的埠。一句話來概括就是正向代理代理的是客戶端,是一個位於客戶端和Google伺服器之間的伺服器,為了從Google伺服器取得資料,客戶端向代理伺服器傳送一個請求並指定目標(Google伺服器),然後代理向原始伺服器轉交請求並將獲得的資料返回給客戶端。
正向代理的使用:
- 訪問國外無法訪問的網站
- 做快取,加速訪問資源
- 對客戶端訪問授權,上網進行認證
- 代理可以記錄使用者訪問記錄(上網行為管理),對外隱藏使用者資訊
反向代理
說完了什麼是正向代理,我們接下來看看什麼叫做反向代理,如果我們網站每日訪問量達到某個上限,單個伺服器遠遠不能符合我們日常需求,這時候我們首先會想到分散式部署。通過部署多臺伺服器來解決訪問人數限制的問題,然後我們功能其實大部分都是通過Nginx反向代理來實現的。我們可以看下圖:
反向代理的特點
我們可以清楚的看到,多個客戶端給伺服器傳送的請求,Nginx伺服器接收到請求以後,按照一定的規則轉發到不同的伺服器進行業務邏輯處理。此時請求來源於哪個客戶端是確定的,但是請求由哪臺伺服器處理的並不明確,Nginx扮演的就是一個反向代理角色。可以這樣來理解,反向代理對外都是透明的,訪問者並不知道自己訪問的是一個代理。反向代理代理的是服務端,主要用於伺服器叢集分散式部署的情況下,反向代理隱藏了伺服器的資訊。
反向代理的使用:
- 保證內網的安全,通常將反向代理作為公網訪問地址,Web伺服器是內網
- 負載均衡,通過反向代理伺服器來優化網站的負載
正向代理與反向代理區別
- 在正向代理中,隱藏了請求來源的客戶端資訊;
- 在反向代理中,隱藏了請求具體處理的服務端資訊;
負載均衡
Nginx既然扮演了反向代理的角色,它是以依據什麼樣的規則進行請求分發的呢?分發的規則是否可以控制呢?負載量按照一定的規則進行分發到不同的伺服器處理的規則,就是一種均衡規則。將伺服器接收到的請求按照規則分發的過程,稱為負載均衡。
Nginx支援的負載均衡排程演算法方式如下:
- weight輪詢(預設):接收到的請求按照請求順序逐一分配到不同的後端伺服器,如果在使用過程中,某一臺伺服器當機,Nginx會自動將該伺服器剔除出佇列,請求受理情況不會受到任何影響。這種方式下,可以給不同的後端伺服器設定一個權重值,權重資料越大,伺服器被分配到請求的機率越大。
- ip_hash:每個請求按照發起客戶端的ip的hash結果進行匹配,這樣的演算法下一個固定ip地址的客戶端總會訪問到同一個後端伺服器。
- fair:智慧調整排程演算法,動態的根據後端伺服器的請求響應時間進行均衡分配,響應時間短處理效率高的伺服器分配到請求的概率高,響應時間長處理效率低的伺服器分配到的請求少。
- url_hash:按照訪問的url的hash結果分配請求,每個請求的url會指向後端固定的某個伺服器,可以在Nginx作為靜態伺服器的情況下提高快取效率。
注意:
- Nginx預設不支援fair演算法,如果要使用這種排程演算法,需要安裝upstream_fair模組。
- Nginx預設不支援url_hash排程演算法,要使用的話需要安裝Nginx的hash軟體包。
作為一個Nginx的使用者,在編寫配置檔案肯定出現過問題,可能經常需要將大量時間花費在配置檔案編寫上面。所以接下來順便介紹一個線上快速生成Nginx配置檔案的網站:
https://nginxconfig.io/
這個網站支援http,https,php,python,Node,快取,日誌等各種配置選項,可以線上生成Nginx的配置檔案。而且使用方法極其簡單,只需要在網站內填寫對應的需求,就可以一鍵生成配置檔案。
引數說明:
- Domain:繫結的域名
- Path:根目錄所在
- Document root:根目錄下的實際專案名稱
- Redirect subdomains:如果訪問*.niyueling.cn會重定向跳轉到niyueling.cn
然後在下面就可以生成對應的nginx配置檔案。我們可以下載zip包或者直接複製替換我們的配置檔案:
然後替換結束伺服器nginx的配置檔案,使用nginx -t命令測試檔案是否存在問題,若配置檔案沒問題,則使用 nginx -s reload命令重啟伺服器。替換之前為了確保不會發生意外,最好提前做好配置檔案的備份。
如果喜歡我的文章,歡迎關注我的個人公眾號:程式猿周先森。