網路調優
如果不先對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程序的叢集化
防止上下文切換
當執行多個進程時,應該確保每個cpu核同一時間只忙於一個進程。一般來說,如果cpu有n個核,我們應該產生n-1個應用程式。這樣可以確保每個行程都能得到合理的時間片,而剩下的一個核留給核心調度程序來執行其它任務。我們還要確保伺服器上基本上不執行除node.js外的其它任務,防止出現cpu 的爭用。我們曾經犯過一個錯誤,在伺服器上部署了兩個node.js應用,然後每個應用程式都開了n-1個進程。結果,它們互相之間搶奪cpu,導致系統的負荷急升。雖然我們的伺服器都是8核心的機器,但仍然可以明顯地感覺到由上下文切換引起的效能開銷。上下文切換是指cpu為了執行其它任務而掛起當前任務的現象。在切換時,核心必須掛起目前進程的所有狀態,然後裝載和執行另一個進程。為了解決這個問題,我們減少了每個應用程式開啟的進程數,讓它們公平地分享cpu,結果系統負荷就降了下來:
請注意上圖,看系統負荷(藍線)是如何降到cpu核數(紅線)以下的。在其它伺服器上,我們也看到了同樣的情況。既然總的工作量保持不變,那麼上圖中的效能改善只能歸功於上下文切換的減少。
排列不分先後:1. 當效能遇到問題時,如果能在應用層進行計算和處理,那就把它從資料庫層拿出來。排序和分組就是典型的例子。在應用層做效能提升總是比在資料庫層容易的多。就像對於MySQL,sqlite更容易掌控。
2. 關於平行計算,如果能避免就盡量避免。如果無法避免,記住,能力越大,責任越大。如果有可能,盡量避免直接對執行緒操作。盡可能在更高的抽象層上操作。例如,在iOS中,GCD,分發和佇列操作是你的好朋友。人類的大腦沒有被設計成用來分析那些無窮臨時狀態——這是我的慘痛教訓所得。
###3. 盡可能簡化狀態,盡可能局部在地化。適用至上。 ######4. 短小可組合的方法是你的好朋友。 ######5. 程式碼註解是危險的,因為它們很容易更新不及時或給人誤導,但這不能成為不寫註解的理由。不要註釋雞毛蒜皮的事情,但如果需要,在某些特殊地方,戰略性的長篇註釋是需要的。你的記憶會背叛你,也許明天早上,也許會在一杯咖啡後。 ######6. 如果你認為一個用例場景也許“不會有問題吧”,它也許就是一個月後讓你在發布的產品中遭受慘痛失敗的地方。做一個懷疑主義者,測試,驗證。 ######7. 有疑問時,和團隊中所有相關人交流。 ###8. 做正確的事——你通常會知道這指的是什麼。
9. 你的用戶並不傻,他們只是沒有耐心理解你的捷徑。
10. 如果一個開發人員沒有被安排長期的維護你們開發的系統,對他保持警惕。 80%的血、汗、淚水都是在軟體發布後的時間裡流的——那時你會變成一個厭世者,但也是更聰明的「行家」。
11. 任務清單是你的好朋友。
12. 主動讓你的工作更有樂趣,有時這需要你付出努力。
13. 悄無聲息的崩潰,我仍然會為此從惡夢中驚醒。監控,日誌,警報。清楚各種的假警報和不可避免的感覺鈍化。保持你的系統對故障的敏感和及時警報。
以上是如何為高負載網路最佳化Nginx和Node.js的詳細內容。更多資訊請關注PHP中文網其他相關文章!

使用 Nginx 搭建網站分五步進行:一、安裝 Nginx;二、配置 Nginx,主要配置監聽端口、網站根目錄、索引文件和錯誤頁面;三、創建網站文件;四、測試 Nginx;五、可根據需要進行進階配置,如 SSL 加密、反向代理、負載均衡和緩存。

Nginx 通過讀取配置文件獲取配置信息,位於 /etc/nginx/nginx.conf。讀取過程包括解析、驗證、加載和應用配置。熱重啟允許在不停止服務器的情況下重新加載配置,只需重新解析、重新加載和應用新配置。如有問題,可在錯誤日誌中查找錯誤消息。

在 Nginx 中配置日誌,至關重要的是為了跟踪服務器性能、識別問題和進行故障排除。以下是步驟:在 Nginx.conf 中,配置日誌格式和路徑。設置日誌格式,例如常用的 main 格式。指定訪問和錯誤日誌的路徑。設置日誌級別,如 info 以記錄所有消息。重新啟動 Nginx 以使更改生效。驗證 access.log 和 error.log 文件中是否有日誌內容。

本指南介紹瞭如何設置 Nginx 防火牆,步驟如下:啟用 Firewall 模塊定義防火牆策略(例如,允許特定 IP 地址訪問,禁止特定端口訪問)應用防火牆策略重新加載 Nginx 配置測試防火牆是否正常工作

可以通過以下方法查看 nginx 運行狀態:nginx -t:檢查配置文件語法是否正確。 nginx -V:顯示 nginx 版本和其他編譯信息。 service nginx status:查看 nginx 服務的運行狀態(適用於 Linux 系統)。 ps -ef | grep nginx:查找正在運行的 nginx 進程。 netstat -nlp | grep nginx:查看 nginx 監聽的端口和地址。

使用命令行命令“sudo service nginx restart”可以重啟 Nginx 服務。替代命令包括:Systemd(“sudo systemctl restart nginx”)、Upstart(“sudo service nginx restart”)和 Red Hat System Services(“sudo rcctl restart nginx”)。

如何解決 Nginx 302 錯誤?檢查服務器配置中的重定向規則。禁用導致錯誤的重定向規則。檢查 .htaccess 文件中的重定向規則。檢查 DNS 記錄並確保解析正確。檢查 SSL 證書是否有效且安裝正確。禁用防火牆或安全規則,檢查服務器日誌,或聯繫主機提供商尋求支持。

Nginx 中配置偽靜態可將動態網址轉換為靜態網址,從而提升安全性、增強用戶體驗並優化 SEO。具體步驟包括:1. 啟用偽靜態模塊;2. 定義偽靜態規則,將動態 URL 重寫為靜態 URL,並將動態部分作為參數傳遞;3. 在處理腳本中使用代碼處理參數,顯示動態內容。偽靜態配置的好處包括:提高安全性、改善用戶體驗和增強 SEO。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

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

Dreamweaver CS6
視覺化網頁開發工具

WebStorm Mac版
好用的JavaScript開發工具

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

禪工作室 13.0.1
強大的PHP整合開發環境