網路調優
如果不先對nginx和node.js的底層傳輸機制有所了解,並進行針對性優化,可能對兩者再細緻的調優也會徒勞無功。一般情況下,nginx透過tcp socket來連接客戶端與上游應用程式。
我們的系統對tcp有許多閘限值與限制,透過核心參數來設定。這些參數的預設值往往是為一般的用途而定的,並不能滿足web伺服器所需的高流量、短生命的要求。
這裡列出了調優tcp可供候選的一些參數。要使它們生效,可以將它們放在/etc/sysctl.conf檔案裡,或者放入一個新設定文件,例如/etc/sysctl.d/99-tuning.conf,然後運行sysctl -p,讓核心裝載它們。我們是用sysctl-cookbook來幹這個體力活。
要注意的是,這裡列出來的值是可以安全使用的,但還是建議大家研究一下每個參數的意義,以便根據自己的負荷、硬體和使用情況選擇一個更合適的值。
複製程式碼 程式碼如下:
net.ipv4. ip_local_port_range='1024 65000'
net.ipv4.tcp_tw_reuse='1'
net.ipv4.tcp_fin_timeout='15'
net.core.netdev_max_backlog='4096'
net. ='16777216'
net.core.somaxconn='4096'
net.core.wmem_max='16777216'
net.ipv4.tcp_max_syn_backlog='20480'
net。 400000'
net.ipv4.tcp_no_metrics_save='1'
net.ipv4.tcp_rmem='4096 87380 16777216'
net.ipv4.tcp_syn_retries=v#yn'. 2'
net.ipv4.tcp_wmem='4096 65536 16777216'
vm.min_free_kbytes='65536'
1其中幾個重要的。
net.ipv4.ip_local_port_range
為了替上游的應用程式服務下游的客戶端,nginx必須開啟兩條tcp連接,一條連接客戶端,一條連接應用程式。當伺服器收到很多連線時,系統的可用連接埠將很快被耗盡。透過修改net.ipv4.ip_local_port_range參數,可以將可用連接埠的範圍改大。如果在/var/log/syslog 中發現有這樣的錯誤: “possible syn flooding on port 80. sending cookies”,即表示系統找不到可用連接埠。增大net.ipv4.ip_local_port_range參數可以減少這個錯誤。
net.ipv4.tcp_tw_reuse
當伺服器需要在大量tcp連線之間切換時,會產生大量處於time_wait狀態的連線。 time_wait表示連線本身是關閉的,但資源尚未釋放。將net_ipv4_tcp_tw_reuse設定為1是讓核心在安全時盡量回收連接,這比重新建立新連接便宜得多。
net.ipv4.tcp_fin_timeout這是處於time_wait狀態的連線在回收前必須等待的最小時間。改小它可以加快回收。
如何檢查連線狀態
使用netstat:
netstat -tan | awk '{print $6}' | sort | uniq -c
或使用ss:
ss - s
nginx
ss -s
total: 388 (kernel 541)
tcp: 47461 (estab 311, closed 47135, orphaned 4, synrecv 0, timewait 47135, orphaned 4, synrecv 0, timewait 47135/0phaned 4, synrecv 0, timewait 47135/03, 38#3), 38 #transport total ip ipv6
* 541 - -
raw 0 0 0
udp 13 10 3
tcp 326 325 1
inet 339 335 4
frag 0 0 0
隨著web伺服器的負載逐漸升高,我們就會開始遭遇nginx的某些奇怪限制。連接被丟棄,內核不停報syn flood。而這時,平均負載和cpu使用率都很小,伺服器明明是可以處理更多連線的狀態,真是令人沮喪。
經過調查,發現有非常多處於time_wait狀態的連線。這是其中一個伺服器的輸出:
有47135個time_wait連線!而且,從ss可以看出,它們都是已經關閉的連線。這說明,伺服器已經消耗了絕大部分可用端口,同時也暗示我們,伺服器是為每個連接都分配了新端口。調優網路對這個問題有一點幫助,但是連接埠仍然不夠用。
經過繼續研究,我找到了一個關於上行連接keepalive指令的文檔,它寫道:
設置通往上游伺服器的最大空閒保活連接數,這些連接會被保留在工作進程的快取中。
有趣。理論上,這個設定是透過在快取的連線上傳遞請求來盡可能減少連線的浪費。文件中也提到,我們應該把proxy_http_version設為"1.1",並清除"connection"頭部。經過進一步的研究,我發現這是一個很好的想法,因為http/1.1相比http1.0,大大優化了 tcp連接的使用率,而nginx預設用的是http/1.0。
按文件的建議修改後,我們的上行設定檔變成這樣:
upstream backend_nodejs {
server nodejs-3:5016 max_fails=0 fail_timeout=10s;
server nodejs-4:5016 max_fails=0 fail_timeout=10s;
server nodejs-5:5016 max_fails=0 max_fails=0 max_fails fail_timeout=10s;
server nodejs-6:5016 max_fails=0 fail_timeout=10s;
keepalive 512;
}
我還按它的建議修改了server一節的proxy設定。同時,增加了一個 p roxy_next_upstream來跳過故障的伺服器,調整了客戶端的 keepalive_timeout,並關閉存取日誌。設定變成這樣:
複製程式碼 程式碼如下:
server {
listen 80;
server_name fast.gosquared.com;
client_max_body_size 16m;
keepalive_timeout 10;
location / {
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
proxy_set_header connection "";
proxy_http_version 1.1;
access_log off;
error_log /dev/null crit;
}
採用新的設定後,我發現伺服器們佔用的socket 降低了90%。現在可以用少得多的連線來傳輸請求了。新的輸出如下:
total: 558 (kernel 604)
tcp: 4675 (estab 485, closed 4183, orphaned 0, synrecv 0, timewait 4183/0), ports 0, timewait 4183/0), ports 2768# #transport total ip ipv6
* 604 - -
raw 0 0 0
udp 13 10 3
tcp 492 491 1
inet 505 501 4
node.js
得歸功於事件驅動式設計可以非同步處理i/o,node.js開箱即可處理大量的連線和請求。雖然有其它一些調優手段,但這篇文章將主要關注node.js的進程方面。
node是單執行緒的,不會自動使用多核心。也就是說,應用程式不能自動獲得伺服器的全部能力。 實作node程序的叢集化
我們可以修改應用,讓它fork多個線程,在同一個連接埠上接收數據,從而實現負載的跨越多核心。 node有一個cluster模組,提供了實現這個目標所必需的所有工具,但要將它們加入應用中還需要很多體力活。如果你用的是express,ebay有一個叫cluster2的模組可以用。
以上是怎麼為高負載網路優化Nginx和Node.js的詳細內容。更多資訊請關注PHP中文網其他相關文章!

NGINXUnit是一個開源應用服務器,支持多種編程語言,提供動態配置、零停機更新和內置負載均衡等功能。 1.動態配置:無需重啟即可修改配置。 2.多語言支持:兼容Python、Go、Java、PHP等。 3.零停機更新:支持不中斷服務的應用更新。 4.內置負載均衡:可將請求分發到多個應用實例。

NGINXUnit優於ApacheTomcat、Gunicorn和Node.js內置HTTP服務器,適用於多語言項目和動態配置需求。 1)支持多種編程語言,2)提供動態配置重載,3)內置負載均衡功能,適合需要高擴展性和可靠性的項目。

NGINXUnit通過其模塊化架構和動態重配置功能提高了應用的性能和可管理性。 1)模塊化設計包括主控進程、路由器和應用進程,支持高效管理和擴展。 2)動態重配置允許在運行時無縫更新配置,適用於CI/CD環境。 3)多語言支持通過動態加載語言運行時實現,提升了開發靈活性。 4)高性能通過事件驅動模型和異步I/O實現,即使在高並發下也保持高效。 5)安全性通過隔離應用進程提高,減少應用間相互影響。

NGINXUnit可用於部署和管理多種語言的應用。 1)安裝NGINXUnit。 2)配置它以運行不同類型的應用,如Python和PHP。 3)利用其動態配置功能進行應用管理。通過這些步驟,你可以高效地部署和管理應用,提升項目效率。

NGINX更适合处理高并发连接,而Apache更适合需要复杂配置和模块扩展的场景。1.NGINX以高性能和低资源消耗著称,适合高并发。2.Apache以稳定性和丰富的模块扩展闻名,适合复杂配置需求。

NGINXUnit通過其動態配置和高性能架構提升應用的靈活性和性能。 1.動態配置允許在不重啟服務器的情況下調整應用配置。 2.高性能體現在事件驅動和非阻塞架構以及多進程模型上,能夠高效處理並發連接和利用多核CPU。

NGINX和Apache都是強大的Web服務器,各自在性能、可擴展性和效率上有獨特的優勢和不足。 1)NGINX在處理靜態內容和反向代理時表現出色,適合高並發場景。 2)Apache在處理動態內容時表現更好,適合需要豐富模塊支持的項目。選擇服務器應根據項目需求和場景來決定。

NGINX適合處理高並發請求,Apache適合需要復雜配置和功能擴展的場景。 1.NGINX採用事件驅動、非阻塞架構,適用於高並發環境。 2.Apache採用進程或線程模型,提供豐富的模塊生態系統,適合複雜配置需求。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器