文章目錄
- 前言
- 一、nginx簡介
- 二、Nginx 的安裝(Linux:centos爲例)
- 三、 Nginx 的常用命令和配置文件
- 四、 Nginx 反向代理 配置實例 1.1
- 五、 Nginx 反向代理 配置實例 1.2
- 六、 Nginx 負載均衡 配置實例 2
- 六、 Nginx 動靜分離 配置實例 3
- 七、 Nginx 的高可用集羣
- 八、 Nginx 的原理
前言
一、nginx簡介
1. 什麼是 nginx 和可以做什麼事情
-
Nginx 是高性能的 HTTP 和反向代理的web服務器,處理高併發能力是十分強大的,能經受高負 載的考驗,有報告表明能支持高達 50,000 個併發連接數。
-
其特點是佔有內存少,併發能力強,事實上nginx的併發能力確實在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。
2.Nginx 作爲 web 服務器
- Nginx 可以作爲靜態頁面的 web 服務器,同時還支持 CGI 協議的動態語言,比如 perl、php 等。但是不支持 java。Java 程序只能通過與 tomcat 配合完成。Nginx 專爲性能優化而開發, 性能是其最重要的考量,實現上非常注重效率 ,能經受高負載的考驗,有報告表明能支持高 達 50,000 個併發連接數。
https://lnmp.org/nginx.html
3. 正向代理
Nginx 不僅可以做反向代理,實現負載均衡。還能用作正向代理來進行上網等功能。 正向代理:如果把局域網外的 Internet 想象成一個巨大的資源庫,則局域網中的客戶端要訪 問 Internet,則需要通過代理服務器來訪問,這種代理服務就稱爲正向代理。
- 簡單一點:通過代理服務器來訪問服務器的過程 就叫 正向代理。
- 需要在客戶端配置代理服務器進行指定網站訪問
4. 反向代理
- 反向代理,其實客戶端對代理是無感知的,因爲客戶端不需要任何配置就可以訪問。
- 我們只 需要將請求發送到反向代理服務器,由反向代理服務器去選擇目標服務器獲取數據後,在返 回給客戶端,此時反向代理服務器和目標服務器對外就是一個服務器,暴露的是代理服務器 地址,隱藏了真實服務器 IP 地址。
5. 負載均衡
-
增加服務器的數量,然後將請求分發到各個服務器上,將原先請求集中到單個服務器上的 情況改爲將請求分發到多個服務器上,將負載分發到不同的服務器,也就是我們所說的負 載均衡
-
客戶端發送多個請求到服務器,服務器處理請求,有一些可能要與數據庫進行交互,服 務器處理完畢後,再將結果返回給客戶端。
這種架構模式對於早期的系統相對單一,併發請求相對較少的情況下是比較適合的,成 本也低。但是隨着信息數量的不斷增長,訪問量和數據量的飛速增長,以及系統業務的複雜 度增加,這種架構會造成服務器相應客戶端的請求日益緩慢,併發量特別大的時候,還容易 造成服務器直接崩潰。很明顯這是由於服務器性能的瓶頸造成的問題,那麼如何解決這種情 況呢?
我們首先想到的可能是升級服務器的配置,比如提高 CPU 執行頻率,加大內存等提高機 器的物理性能來解決此問題,但是我們知道摩爾定律的日益失效,硬件的性能提升已經不能 滿足日益提升的需求了。最明顯的一個例子,天貓雙十一當天,某個熱銷商品的瞬時訪問量 是極其龐大的,那麼類似上面的系統架構,將機器都增加到現有的頂級物理配置,都是不能 夠滿足需求的。那麼怎麼辦呢?上面的分析我們去掉了增加服務器物理配置來解決問題的辦法,也就是說縱向解決問題 的辦法行不通了,那麼橫向增加服務器的數量呢?這時候集羣的概念產生了,單個服務器解 決不了,我們增加服務器的數量,然後將請求分發到各個服務器上,將原先請求集中到單個服務器上的情況改爲將請求分發到多個服務器上,將負載分發到不同的服務器,也就是我們 所說的負載均衡
6.動靜分離
爲了加快網站的解析速度,可以把動態頁面和靜態頁面由不同的服務器來解析,加快解析速 度。降低原來單個服務器的壓力。
二、Nginx 的安裝(Linux:centos爲例)
nginx安裝時,用到的包,我都準備好啦,方便使用:
https://download.csdn.net/download/qq_40036754/11891855
本來想放百度雲的,但是麻煩,所以我就直接上傳到我的資源啦,大家也可以直接聯繫我,我直接給大家的。
1. 準備工作
- 打開虛擬機,使用finallshell鏈接Linux操作系統
- 到nginx下載軟件
http://nginx.org/
- 先安裝其依賴軟件,最後安裝nginx。
- 依賴工具:pcre-8.3.7.tar.gz, openssl-1.0.1t.tar.gz, zlib-1.2.8.tar.gz, nginx-1.11.1.tar.gz。 我這裏也提供下。
2. 開始安裝
- 都有兩種方式,一種直接下載,第二種使用解壓包方式。這裏大多使用解壓包方式。
- 我的安裝路徑:/usr/feng/
- 安裝pcre
方式一、wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz 。
方拾二、上傳源碼壓縮包,解壓、編譯、安裝 三部曲。
1)、解壓文件, 進入pcre目錄,
2)、./configure 完成後,
3)、執行命令: make && make install - 安裝 openssl
下載OpenSSL的地址:
http://distfiles.macports.org/openssl/
1)、解壓文件, 回到 pcre 目錄下,
2)、./configure 完成後,
3)、執行命令: make && make install - 安裝zlib
1)、解壓文件, 回到 pcre 目錄下,
2)、./configure 完成後,
3)、執行命令: make && make install - 安裝nginx
1)、解壓文件, 回到 pcre 目錄下,
2)、./configure 完成後,
3)、執行命令: make && make install
3. 運行nginx
- 安裝完nginx後,會在 路徑 /usr/local 下nginx 的文件夾。這是自動生成的。
- 進入這個目錄:
cd /usr/local/nginx
目錄內容如下:
- 進入sbin文件夾,裏面有兩個文件:nginx 和 nginx.old。
- 執行命令:./nginx 即可執行
- 測試啓動: ps -ef | grep nginx
已經啓動。 - 查看nginx默認端口(默認爲80),使用網頁的形式測試,(像Tomcat一樣。)
- 進入目錄查看端口:cd /usr/local/nginx/conf 下的 nginx.conf文件。這個文件也是nginx的配置文件。vim 下:
如下 - 輸入IP:80,則顯示:
4. 防火牆問題
在 windows 系統中訪問 linux 中 nginx,默認不能訪問的,因爲防火牆問題 (1)關閉防火牆 (2)開放訪問的端口號,80 端口
查看開放的端口號
firewall-cmd --list-all
設置開放的端口號
firewall-cmd --add-service=http –permanent
firewall-cmd --add-port=80/tcp --permanent
重啓防火牆
firewall-cmd –reload
三、 Nginx 的常用命令和配置文件
1. Nginx常用命令
a. 使用nginx操作命令前提
使用nginx操作命令前提:必須進入到nginx的自動生成目錄的下/sbin文件夾下。
nginx有兩個目錄:
第一個:安裝目錄,我放在:
/usr/feng/
第二個:自動生成目錄:
/usr/local/nginx/
b. 查看 nginx 的版本號
./nginx -v
c. 啓動 nginx
./nginx
d. 關閉nginx
./nginx -s stop
e. 重新加載 nginx
在目錄:/usr/local/nginx/sbin 下執行命令,不需要重啓服務器,自動編譯。
./nginx -s reload
2. Nginx配置文件
a. 配置文件位置
/usr/local/nginx/conf/nginx.conf
b. nginx 的組成部分
配置文件中有很多#, 開頭的表示註釋內容,我們去掉所有以 # 開頭的段落,精簡之後的 內容如下:
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost;
location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
- nginx 配置文件有三部分組成
第一部分:全局塊
從配置文件開始到 events 塊之間的內容,主要會設置一些影響nginx 服務器整體運行的配置指令,主要包括配 置運行 Nginx 服務器的用戶(組)、允許生成的 worker process 數,進程 PID 存放路徑、日誌存放路徑和類型以 及配置文件的引入等。
比如上面第一行配置的:
worker_processes 1;
- 1
這是 Nginx 服務器併發處理服務的關鍵配置,worker_processes 值越大,可以支持的併發處理量也越多,但是 會受到硬件、軟件等設備的制約。
第二部分:events塊
比如上面的配置:
events {
worker_connections 1024;
}
events 塊涉及的指令**主要影響 Nginx 服務器與用戶的網絡連接,常用的設置包括是否開啓對多 work process 下的網絡連接進行序列化,是否 允許同時接收多個網絡連接,選取哪種事件驅動模型來處理連接請求,每個 word process 可以同時支持的最大連接數等。**
上述例子就表示每個 work process 支持的最大連接數爲 1024.
這部分的配置對 Nginx 的性能影響較大,在實際中應該靈活配置。
第三部分:
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
這算是 Nginx 服務器配置中最頻繁的部分,代理、緩存和日誌定義等絕大多數功能和第三方模塊的配置都在這裏。
需要注意的是:http 塊也可以包括 http全局塊、server 塊。
- http全局塊
http全局塊配置的指令包括文件引入、MIME-TYPE 定義、日誌自定義、連接超時時間、單鏈接請求數上限等。 - server 塊
這塊和虛擬主機有密切關係,虛擬主機從用戶角度看,和一臺獨立的硬件主機是完全一樣的,該技術的產生是爲了 節省互聯網服務器硬件成本。
每個 http 塊可以包括多個 server 塊,而每個 server 塊就相當於一個虛擬主機。
而每個 server 塊也分爲全局 server 塊,以及可以同時包含多個 locaton 塊。
- 全局 server 塊
最常見的配置是本虛擬機主機的監聽配置和本虛擬主機的名稱或IP配置。 - location 塊
一個 server 塊可以配置多個 location 塊。
這塊的主要作用是基於 Nginx 服務器接收到的請求字符串(例如 server_name/uri-string),對虛擬主機名稱 (也可以是IP 別名)之外的字符串(例如 前面的 /uri-string)進行匹配,對特定的請求進行處理。 地址定向、數據緩 存和應答控制等功能,還有許多第三方模塊的配置也在這裏進行。
四、 Nginx 反向代理 配置實例 1.1
1. 實現效果
- 打開瀏覽器,在瀏覽器地址欄輸入地址 www.123.com,跳轉到 liunx 系統 tomcat 主頁 面中
2. 準備工作
(1)在 liunx 系統安裝 tomcat,使用默認端口 8080,我這裏8080被其他應用佔用,所以我已修改端口爲8081。在conf目錄下的server.xml配置文件中,如下,將port改爲 8081,其實下面也有類似的Connector 標籤,但是要看protocol協議爲HTTP/1.1的標籤修改即可。
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
- tomcat 安裝文件放到 liunx 系統中,解壓。
Tomcat的路徑:/usr/feng/apach-tomcat/tomcat8081下 - 進入 tomcat 的 bin 目錄中,./startup.sh 啓動 tomcat 服務器。
(2)對外開放訪問的端口 (我這裏不需要)
- firewall-cmd --add-port=8080/tcp --permanent
- firewall-cmd –reload
- 查看已經開放的端口號 firewall-cmd --list-all
(3)在 windows 系統中通過瀏覽器訪問 tomcat 服務器
別忘了開啓tomcat,在bin目錄下,使用 命令:
./startup.sh
3. 訪問過程的分析
4、具體配置
a. 第一步 在 windows 系統的 host 文件進行域名和 ip 對應關係的配置
添加內容在 host 文件中
2. 第二步 在 nginx 進行請求轉發的配置(反向代理配置)
5、最終測試
如上配置,我們監聽 80 端口,訪問域名爲 www.123.com,不加端口號時默認爲 80 端口,故 訪問該域名時會跳轉到 127.0.0.1:8081 路徑上。在瀏覽器端輸入 www.123.com 結果如下:
五、 Nginx 反向代理 配置實例 1.2
1. 實現效果
實現效果:使用 nginx 反向代理,根據訪問的路徑跳轉到不同端口的服務中
nginx 監聽端口爲 9001,
訪問 http://127.0.0.1:9001/edu/ 直接跳轉到 127.0.0.1:8081
訪問 http://127.0.0.1:9001/vod/ 直接跳轉到 127.0.0.1:8082
2. 準備工作
a. 第一步,兩個tomcat端口和測試頁面
- 準備兩個 tomcat,一個 8081 端口,一個 8082 端口。
在**/usr/feng/apach-tomcat/下 新建tomcat8081和tomcat8082兩個文件夾,將 Tomcat安裝包 分別上傳到兩個文件夾,進行解壓縮安裝,8081的Tomcat只改一個http協議默認端口號** 就行,直接啓動即可。
這裏需要改8082的端口號,需要修改三個端口,只修改一個端口號的話,是啓動不了的,我已經測試過了(如果只修改http協議默認端口的話,8081和8082只會啓動一個)。因爲默認的都是8080(沒有的直接創建文件夾,好多都是剛建的,與上面的第一個示例示例有點改動)
-
tomcat8081 解壓包,然後進入到 /bin 下 ,使用命令 ./startup 啓動
-
tomcat8082
使用命令 編輯 文件 :/conf/server.xml 文件
vim server.xml
修改後如下:
1、修改server 的默認端口,由默認8005->8091
2、修改http協議的默認端口,由默認的8080->8082
3、修改默認ajp協議的默認端口,由默認的8009->9001
- 並準備好測試的頁面
寫一個a.html頁面,
tomcat8081的tomcat,放到目錄 /webapp/vod 下,內容:
<h1>fengfanchen-nginx-8081!!!</h1>
tomcat8082的tomcat,放到目錄 /webapp/edu 下,內容:
<h1>fengfanchen-nginx-8082!!!</h1>
- 測試頁面
b. 第二步,修改 nginx 的配置文件
修改 nginx 的配置文件 在 http 塊中添加 server{}
修改其中註釋的就行。
修改成功後
- 開發的端口: nginx監聽端口:8001,tomcat8081端口:8081,tomcat8082端口:8082。
- 測試結果
- location 指令說明
該指令用於匹配 URL。
語法如下:
1、= :用於不含正則表達式的 uri 前,要求請求字符串與 uri 嚴格匹配,如果匹配 成功,就停止繼續向下搜索並立即處理該請求。
2、~:用於表示 uri 包含正則表達式,並且區分大小寫。
3、~*:用於表示 uri 包含正則表達式,並且不區分大小寫。
4、^~:用於不含正則表達式的 uri 前,要求 Nginx 服務器找到標識 uri 和請求字 符串匹配度最高的 location 後,立即使用此 location 處理請求,而不再使用 location 塊中的正則 uri 和請求字符串做匹配。
注意:如果 uri 包含正則表達式,則必須要有 ~ 或者 ~*標識。
六、 Nginx 負載均衡 配置實例 2
1. 實現效果
瀏覽器地址欄輸入地址 http://208.208.128.122/edu/a.html,負載均衡效果,平均 8081 和 8082 端口中
2. 準備工作
a.準備兩臺 tomcat 服務器
- 準備兩臺 tomcat 服務器,一臺 8081,一臺 8082
- 上面的反向代理第二個實例中已經配置成功了。但是需要添加點東西,如下哦。
b. 修改一處
- 在兩臺 tomcat 裏面 webapps 目錄中,創建名稱是 edu 文件夾,在 edu 文件夾中創建 頁面 a.html,用於測試。
- 由於第二個實例中,8082中有了 edu 的文件夾,所以只在8081 文件夾下創建即可。
然後使用在vod文件下使用命令:
cp a.html ../edu/
即可完成,
查看命令
cd ../edu/ # 進入到 edu 目錄下
cat a.html #查看內容
c. 測試頁面
測試URL
http://208.208.128.122:8081/edu/a.html
http://208.208.128.122:8082/edu/a.html
3. 在 nginx 的配置文件中進行負載均衡的配置
修改了第一個示例的 配置
upstream myserver {
server 208.208.128.122:8081;
server 208.208.128.122:8082;
}
server {
listen 80;
server_name 208.208.128.122;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
proxy_pass http://myserver;
#proxy_pass http://127.0.0.1:8081;
index index.html index.htm;
}
4. 最終測試
測試url
http://208.208.128.122/edu/a.html
4. nginx 分配服務器策略
隨着互聯網信息的爆炸性增長,負載均衡(load balance)已經不再是一個很陌生的話題, 顧名思義,負載均衡即是將負載分攤到不同的服務單元,既保證服務的可用性,又保證響應 足夠快,給用戶很好的體驗。快速增長的訪問量和數據流量催生了各式各樣的負載均衡產品, 很多專業的負載均衡硬件提供了很好的功能,但卻價格不菲,這使得負載均衡軟件大受歡迎, nginx 就是其中的一個,在 linux 下有 Nginx、LVS、Haproxy 等等服務可以提供負載均衡服 務,而且 Nginx 提供了幾種分配方式(策略):
a. 輪詢(默認)
每個請求按時間順序逐一分配到不同的後端服務器,如果後端服務器 down 掉,能自動剔除。
配置方式:
b. weight
weight 代表權重, 默認爲 1,權重越高被分配的客戶端越多
upstream myserver {
server 208.208.128.122:8081 weight=10; # 在這兒
server 208.208.128.122:8082 weight=10;
}
server {
listen 80;
server_name 208.208.128.122;
location / {
root html;
proxy_pass http://myserver;
index index.html index.htm;
}
c. ip_hash
ip_hash 每個請求按訪問 ip 的 hash 結果分配,這樣每個訪客固定訪問一個後端服務器
upstream myserver {
ip_hash; // 在這兒
server 208.208.128.122:8081 ;
server 208.208.128.122:8082 ;
}
server {
listen 80;
server_name 208.208.128.122;
location / {
root html;
proxy_pass http://myserver;
index index.html index.htm;
}
d. fair(第三方)
fair(第三方),按後端服務器的響應時間來分配請求,響應時間短的優先分配。
upstream myserver {
server 208.208.128.122:8081 ;
server 208.208.128.122:8082 ;
fair; # 在這兒
}
server {
listen 80;
server_name 208.208.128.122;
location / {
root html;
proxy_pass http://myserver;
index index.html index.htm;
}
六、 Nginx 動靜分離 配置實例 3
1. 什麼是動靜分離
Nginx 動靜分離簡單來說就是把動態跟靜態請求分開,不能理解成只是單純的把動態頁面和 靜態頁面物理分離。嚴格意義上說應該是動態請求跟靜態請求分開,可以理解成使用 Nginx 處理靜態頁面,Tomcat 處理動態頁面。動靜分離從目前實現角度來講大致分爲兩種:
-
一種是純粹把靜態文件獨立成單獨的域名,放在獨立的服務器上,也是目前主流推崇的方案;
-
另外一種方法就是動態跟靜態文件混合在一起發佈,通過 nginx 來分開。
通過 location 指定不同的後綴名實現不同的請求轉發。通過 expires 參數設置,可以使 瀏覽器緩存過期時間,減少與服務器之前的請求和流量。具體 Expires 定義:是給一個資 源設定一個過期時間,也就是說無需去服務端驗證,直接通過瀏覽器自身確認是否過期即可, 所以不會產生額外的流量。此種方法非常適合不經常變動的資源。(如果經常更新的文件, 不建議使用 Expires 來緩存),我這裏設置 3d,表示在這 3 天之內訪問這個 URL,發送 一個請求,比對服務器該文件最後更新時間沒有變化,則不會從服務器抓取,返回狀態碼 304,如果有修改,則直接從服務器重新下載,返回狀態碼 200。
2. 準備工作
- 在Linux 系統中準備 靜態資源,用於進行訪問。
- www文件夾中 a.html
<h1>fengfanchen-test-html</h1>
- image 中的 01.jpg
我的照片哈!!!(自動忽略)
3. 具體配置
a. 在 nginx 配置文件中進行配置
4. 最終測試
a. 測試 image
http://208.208.128.122/image/
http://208.208.128.122/image/01.jpg
- 1
- 2
b. 測試 www
http://208.208.128.122/www/a.html
- 1
七、 Nginx 的高可用集羣
1. 什麼是nginx 高可用
配置示例流程:
- 需要兩臺nginx 服務器
- 需要keepalived
- 需要虛擬IP
2. 配置高可用的準備工作
- 需要兩臺服務器 208.208.128.122 和 208.208.128.85
- 在兩臺服務器安裝 nginx(流程最上面有)
第二臺服務器的默認端口 改爲 9001 ,運行並測試,如下:
- 在兩臺服務器安裝 keepalived
2. 在兩臺服務器安裝keepalived
a)安裝:
第一種方式:命令安裝
yum install keepalived -y
# 查看版本:
rpm -q -a keepalived
第二種方式:安裝包方式(這裏我使用這個)
將壓縮包上傳至:/usr/feng/
命令如下:
cd /usr/feng/
tar -zxvf keepalived-2.0.18.tar.gz
cd keepalived-2.0.18
./configure
make && make install
b) 配置文件
安裝之後,在 etc 裏面生成目錄 keepalived,有文件 keepalived.conf 。
這個就是主配置文件。
主從模式主要在這個文件裏配置。
完成高可用配置(主從配置)
a) 修改 keepalived.conf 配置文件
修改/etc/keepalived/keepalivec.conf 配置文件
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 208.208.128.122
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 #(檢測腳本執行的間隔)
weight 2
}
vrrp_instance VI_1 {
state MASTER # 備份服務器上將 MASTER 改爲 BACKUP
interface ens192 //網卡
virtual_router_id 51 # 主、備機的 virtual_router_id 必須相同
priority 100 # 主、備機取不同的優先級,主機值較大,備份機值較小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
208.208.128.50 // VRRP H 虛擬地址
}
}
b) 添加檢測腳本
在/usr/local/src 添加檢測腳本
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
c) 開啓nginx 和 keepalived
把兩臺服務器上 nginx 和 keepalived 啓動 :
啓動 nginx:./nginx
啓動 keepalived:systemctl start keepalived.service
85服務一樣。
4. 最終測試
a)在瀏覽器地址欄輸入 虛擬 ip 地址 192.168.17.50
b)把主服務器(192.168.17.129)nginx 和 keepalived 停止,再輸入 192.168.17.50
八、 Nginx 的原理
1. mater 和 worker
-
nginx 啓動後,是由兩個進程組成的。master(管理者)和worker(工作者)。
-
一個nginx 只有一個master。但可以有多個worker
-
,過來的請求由master管理,worker進行爭搶式的方式去獲取請求。
2. master-workers 的機制的好處
- 首先,對於每個 worker 進程來說,獨立的進程,不需要加鎖,所以省掉了鎖帶來的開銷, 同時在編程以及問題查找時,也會方便很多。
- 可以使用 nginx –s reload 熱部署,利用 nginx 進行熱部署操作
- 其次,採用獨立的進程,可以讓互相之間不會 影響,一個進程退出後,其它進程還在工作,服務不會中斷,master 進程則很快啓動新的 worker 進程。當然,worker 進程的異常退出,肯定是程序有 bug 了,異常退出,會導致當 前 worker 上的所有請求失敗,不過不會影響到所有請求,所以降低了風險。
3. 設置多少個 worker
Nginx 同 redis 類似都採用了 io 多路複用機制,每個 worker 都是一個獨立的進程,但每個進 程裏只有一個主線程,通過異步非阻塞的方式來處理請求, 即使是千上萬個請求也不在話 下。每個 worker 的線程可以把一個 cpu 的性能發揮到極致。所以 worker 數和服務器的 cpu 數相等是最爲適宜的。設少了會浪費 cpu,設多了會造成 cpu 頻繁切換上下文帶來的損耗。
- worker 數和服務器的 cpu 數相等是最爲適宜
4. 連接數 worker_connection
第一個:發送請求,佔用了 woker 的幾個連接數?
- 答案:2 或者 4 個
第二個:nginx 有一個 master,有四個 woker,每個 woker 支持最大的連接數 1024,支持的 最大併發數是多少?
- 普通的靜態訪問最大併發數是: worker_connections * worker_processes /2,
- 而如果是 HTTP 作 爲反向代理來說,最大併發數量應該是 worker_connections * worker_processes/4。
這個值是表示每個 worker 進程所能建立連接的最大值,所以,一個 nginx 能建立的最大連接 數,應該是 worker_connections * worker_processes。當然,這裏說的是最大連接數,對於 HTTP 請 求 本 地 資 源 來 說 , 能 夠 支 持 的 最 大 並 發 數 量 是 worker_connections * worker_processes,如果是支持 http1.1 的瀏覽器每次訪問要佔兩個連接,所以普通的靜態訪 問最大併發數是: worker_connections * worker_processes /2,而如果是 HTTP 作 爲反向代 理來說,最大併發數量應該是 worker_connections * worker_processes/4。因爲作爲反向代理服務器,每個併發會建立與客戶端的連接和與後端服 務的連接,會佔用兩個連接。