前言
根據 Netcraft 公佈的最新的(2019年10月)Web 伺服器調查報告,Nginx 的市場份額達到了 32.69%,毫無爭議地成為了最流行的 Web 伺服器。這主要得益於 Nginx 在效能、穩定性和可擴充套件等方面優異的表現。
Nginx 以高效能著稱,為什麼 Nginx 的效能這麼高呢?要回答這個問題,得先從 Nginx 的程序模型說起。Nginx 是多程序的,簡單來說,Nginx 包含兩種程序:Master 和 Worker 。Master 程序是管理程序,負責控制和監控 Worker 程序:接收命令,切割日誌檔案,停止、重新啟動 Worker 程序;監控 Worker 程序,如果發現 Worker 程序異常退出,就重新啟動(respawn)一個新的 Worker 程序。Worker 程序是工作程序,負責處理客戶端請求。Worker 程序可以有多個,Worker 程序之間是獨立且對等的,分別競爭(epoll_wait)處理請求(這種競爭有可能發生驚群效應)。Nginx 使用了 I/O 多路複用技術,也就是說,一個 Worker 也可以同時處理成千上萬個請求。
官方測試,Nginx 單機使用 8 個核可以支撐起百萬併發。於是你興致勃勃地安裝了 Nginx,測試一看 Nginx 的 RPS 最高到十幾萬,再增加核心就沒啥作用了,增加的多了反而下降了。
說好的百萬併發呢?當然首先要說明的是: 十幾萬 RPS 已經很高了,要是我的產品能達到十幾萬 RPS,做夢都能笑醒了。但是追求極致效能是每一個有夢想的開發者的自我修養!萬一有一天用到了呢!
那麼,Nginx 單機效能如何才能突破十幾萬呢?答案是,需要調優,從多個角度對 Nginx 進行調優,比如快取、CPU 親和性、事件處理模型、IO 操作等等。如果你對高效能伺服器開發感興趣,你會發現這些調優的方法正好是高效能伺服器開發的關鍵原則!
Nginx的作用是什麼?(1)Nginx 是一個很強大的高效能Web伺服器,在高連線併發的情況下,Nginx是Apache伺服器不錯的替代品,能夠支援高達 50,000 個併發連線數的響應。
(2)Nginx作為反向代理伺服器,Nginx在反向代理時,提供效能穩定,並且能夠提供配置靈活的轉發功能,Nginx可以根據不同的正則匹配,採取不同的轉發策略,比如在圖片檔案結尾的走檔案伺服器,動態頁面走web伺服器,對返回結果進行錯誤頁跳轉,異常判斷等。如果被分的伺服器存在異常,他可以將請求重新轉發給另外一臺伺服器,然後自動去除異常伺服器。
(3)Nginx作為負載均衡伺服器:Nginx 既可以在內部直接支援 Rails 和 PHP 程式對外進行服務,也可以支援作為 HTTP代理伺服器對外進行服務。
(4)Nginx作為郵件代理伺服器:Nginx 同時也是一個非常優秀的郵件代理伺服器(最早開發這個產品的目的之一也是作為郵件代理伺服器)。
什麼是反向代理反向代理(Reverse Proxy)方式是指以==代理伺服器來接受 internet 上的連線請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給 internet 上請求連線的客戶端==,此時代理伺服器對外就表現為一個反向代理伺服器。
首先我們理解正向代理:代理客戶端,統一請求網路資源
正向代理是針對你的客戶端,而反向代理是針對伺服器的:
這樣操作除了方便外,也更安全,便於統一安全部署,比如:加防火牆
配置反向代理(1)修改 nginx.conf 配置檔案:
worker_processes 1;events { worker_connections 1024;}http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; # 配置要代理的 網址 upstream tomcat-travel{ server 192.168.245.129:8080; } # 配置 index 訪問資源 server { listen 80; server_name www.travel.com; location / { # root index; # 對應要代理的網址 proxy_pass http://tomcat-travel; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }}
(2)重新啟動 Nginx 然後用瀏覽器測試:http://www.travel.com (此域名須配置域名指向)
常見問題在WEB服務前端配置Nginx的好處是什麼?
配置Nginx伺服器,最大的好處得益於反向代理以及負載均衡的功能。
反向代理
客戶端本來可以直接透過HTTP協議訪問某網站應用伺服器,網站管理員可以在中間加上一個Nginx,客戶端請求Nginx,Nginx請求應用伺服器,然後將結果返回給客戶端,此時Nginx就是反向代理伺服器。
既然伺服器可以直接HTTP訪問,為什麼要在中間加上一個反向代理,不是多此一舉嗎?反向代理有什麼作用?繼續往下看,下面的負載均衡、虛擬主機等,都基於反向代理實現,當然反向代理的功能也不僅僅是這些。
反向代理
負載均衡負載均衡 建立在現有網路結構之上,它提供了一種廉價有效透明的方法擴充套件網路裝置和伺服器的頻寬、增加吞吐量、加強網路資料處理能力、提高網路的靈活性和可用性。 負載均衡,英文名稱為 Load Balance,其意思就是分攤到多個操作單元上進行執行,例如 Web 伺服器、FTP 伺服器、企業關鍵應用伺服器和其它關鍵任務伺服器等,從而共同完成工作任務。
1.將請求輪詢分配到應用伺服器,也就是一個客戶端的多次請求,有可能會由多臺不同的伺服器處理。
2.伺服器的硬體配置可能有好有差,想把大部分請求分配給好的伺服器,把少量請求分配給差的伺服器,可以透過weight來控制。
負載均衡方式
配置負載均衡(1)修改 nginx.conf 配置檔案:
worker_processes 1;events { worker_connections 1024;}http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; # 配置要代理的 網址 upstream tomcat-travel{ server 192.168.245.129:8080; server 192.168.245.129:8081; server 192.168.245.129:8082; } # 配置 index 訪問資源 server { listen 80; server_name www.travel.com; location / { # root index; # 對應要代理的網址 proxy_pass http://tomcat-travel; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }}
三種隨機可以訪問到:
(2)如果此時我想要一個 2:1:1 的機率選擇:
虛擬主機有的網站訪問量大,需要負載均衡。然而並不是所有網站都如此出色,有的網站,由於訪問量太小,需要節省成本,將多個網站部署在同一臺伺服器上。
例如將www.aaa.com和www.bbb.com兩個網站部署在同一臺伺服器上,兩個域名解析到同一個IP地址,但是使用者透過兩個域名卻可以開啟兩個完全不同的網站,互相不影響,就像訪問兩個伺服器一樣,所以叫兩個虛擬主機。虛擬主機的原理是透過HTTP請求頭中的Host是否匹配server_name來實現的,客戶端透過不同的域名訪問,根據server_name可以反向代理到對應的應用伺服器。
還有別的反向代理伺服器嗎?其他反向代理伺服器
文章到這裡就結束了!Nginx調優