1. 程式人生 > >nginx keepalive_timeout 設定策略問題分析

nginx keepalive_timeout 設定策略問題分析

1.專案環境:nginx(前段代理,僅作代理用途)+3個tomcat(都在同一個伺服器上),做的web專案
2.涉及到的業務邏輯:檔案上傳(可能有大檔案,比如說android遊戲,100m);客戶端介面請求;網站後臺管理
3.問題重現流程:
3.1 配置好tomcat後,直接加上nginx前段代理(僅配置了http代理)
3.2 問題一:當管理員後臺上傳檔案時,大檔案無法上傳成功,出現time-out,經重複測試,發現上傳時間超過1分鐘以後,就會返回超時資訊,小檔案沒有問題
3.2 經調研得知nginx預設設定的http連線超時時間為75s,超過75s,會斷掉當前的http連線,而大檔案上傳時經常會超過75s,這就導致大檔案無法上傳成功,當時的解決方案是,設定nginx http連線超時時間為30分鐘,即引數keepalive_timeout=1800;檔案上傳問題基本解決;
3.4專案執行2天后,發現伺服器突然宕機了,重啟nginx可以解決問題,但是2個小時後又再次宕機,重啟nginx又解決了問題,調研了一箇中午,並且檢視nginx的錯誤日誌(socket() failed (24: Too many open files) while connecting to upstream),發現問題來源與nginx的連線數(設定的預設值為1024)達到上限
3.5發現這個問題後,我就想應該把nginx的連線數調大點,於是設定 worker_connections  10240;重啟nginx,短時間沒有出現問題,但是執行過程中,我再次檢視錯誤日誌,發現(socket() failed (24: Too many open files) while connecting to upstream)時不時的出現
3.6 此時發現調整nginx的連線數並不能完全解決問題,於是google,百度之,發現問題所在,罪魁禍首是:nginx的keepalive_timeout設定項時間太長,客戶端介面訪問其實是一個比較快速的過程,訪問完成了已經不需要繼續使用http連線了,但是由於對nginx的錯誤配置,導致介面訪問完成後http連線並沒有被釋放掉,所以導致連線數越來越大,最終nginx崩潰。

4.那麼這個問題應該如何解決呢?
將keepalive_timeout時間調小會導致上傳操作可能無法完成;調大點的話,許多無效的http連線佔據著nginx的連線數
這貌似是一個兩難的問題!

下面重點來了:

Nginx的TCP KeepAlive如何設定

開篇提到我最近遇到的問題,Client傳送一個請求到Nginx服務端,服務端需要經過一段時間的計算才會返回, 時間超過了LVS Session保持的90s,在服務端使用Tcpdump抓包,本地通過wireshark分析顯示的結果如第二副圖所示,第5條報文和最後一條報文之間的時間戳大概差了90s。在確定是LVS的Session保持時間到期的問題之後,我開始在尋找Nginx的TCP KeepAlive如何設定,最先找到的選項是keepalivetimeout,從同事那裡得知keepalivetimeout的用法是當keepalivetimeout的值為0時表示關閉keepalive,當keepalivetimeout的值為一個正整數值時表示連結保持多少秒,於是把keepalivetimeout設定成75s,但是實際的測試結果表明並不生效。顯然keepalivetimeout不能解決TCP層面的KeepAlive問題,實際上Nginx涉及到keepalive的選項還不少,Nginx通常的使用方式如下:

從TCP層面Nginx不僅要和Client關心KeepAlive,而且還要和Upstream關心KeepAlive, 同時從HTTP協議層面,Nginx需要和Client關心Keep-Alive,如果Upstream使用的HTTP協議,還要關心和Upstream的Keep-Alive,總而言之,還比較複雜。所以搞清楚TCP層的KeepAlive和HTTP的Keep-Alive之後,就不會對於Nginx的KeepAlive設定錯。我當時解決這個問題時候不確定Nginx有配置TCP keepAlive的選項,於是我開啟Ngnix的原始碼,在原始碼裡面搜尋TCP_KEEPIDLE,相關的程式碼如下:

從程式碼的上下文我發現TCP KeepAlive可以配置,所以我接著查詢通過哪個選項配置,最後發現listen指令的so_keepalive選項能對TCP socket進行KeepAlive的配置。

以上三個引數只能使用一個,不能同時使用, 比如so_keepalive=on, so_keepalive=off或者so_keepalive=30s::(表示等待30s沒有資料報文傳送探測報文)。通過設定listen 80,so_keepalive=60s::之後成功解決Nginx在LVS保持長連結的問題,避免了使用其他高成本的方案。在商用負載裝置上如果遇到類似的問題同樣也可以通過這種方式解決。

相關推薦

nginx keepalive_timeout 設定策略問題分析

1.專案環境:nginx(前段代理,僅作代理用途)+3個tomcat(都在同一個伺服器上),做的web專案 2.涉及到的業務邏輯:檔案上傳(可能有大檔案,比如說android遊戲,100m);客戶端介面請求;網站後臺管理 3.問題重現流程: 3.1 配置好tomcat後,

Nginx keepalive_timeout 的超時時間設定問題

Nginx keepalive_timeout 的時間沒有超時時,服務端一直顯示ESTABLISHED連結狀態 nginx服務端配置keepalive_timeout 為125s或者比125更多的時間以後, 客戶端連線到114s時會主動斷開連線 此時客戶端連線的狀態為TIM

Nginx Log日誌統計分析常用命令

php baidu netstat 顯示 acc 嗅探 性能分析 dump class IP相關統計 統計IP訪問量(獨立ip訪問數量) awk ‘{print $1}‘ access.log | sort -n | uniq | wc -l 查看某一時間段的IP訪問量

nginx源代碼分析之內存池實現原理

delete align 業務 -s 首部 ges hand 重置 mar 建議看本文檔時結合nginx源代碼。1.1 什麽是內存池?為什麽要引入內存池?內存池實質上是接替OS進行內存管理。應用程序申請內存時不再與OS打交道。而是從內存池中申請內存或者釋放內存到內存

ExoPlayer Talk 01 緩存策略分析與優化

sca google mes efi allocator method policy 類型 let 操作系統:Windows8.1 顯卡:Nivida GTX965M 開發工具:Android studio 2.3.3 | ExoPlayer r2.5.1 使用 ExoP

apache和nginx的性能分析

apache和nginx的性能分析****簡單分析nginx與apache的性能***** "Apache就像Microsoft的Word,它有一百萬個選項,但你只需要做六個。Nginx只做了這六件事,但他做的這六件事中有五件事比Apache快50倍" 常見的web服務器:nginx a

nginx負載均衡策略

nginxNginx 提供輪詢(round robin)、用戶 IP 哈希(client IP)和指定權重 3 種方式。 輪詢方式 默認選項,當weight不指定時,各服務器weight相同, 每個請求按時間順序逐一分配到不同的後端服務器,如果後端服務器down掉,能自動剔除。 upstream bakend

讀書筆記博客實戰之搜索引擎索引和流量漲跌策略分析[圖]

讀書筆記寫在前面:最近百度動作頻繁,變化十分大,以至於很多網站都出現了流量的大範圍波動,引起了站長們的思考和分析猜測,但通過數據來分析是最可靠的觀點,那麽我們今天就來分析一下這幾天百度在流量漲跌方面有什麽變化吧。實戰分析:讀書筆記博客,主要用於教育類話題的寫作和學習,采用老域名制作的新站,通過該網頁的排名變化

Nginx中AWStats日誌分析系統部署

sha apach wro localhost require ade ping better httpd AWStats介紹 AWStats是使用Perl語言開發的一款開源日誌分析系統,它不僅可用來分析Apache網站服務器的訪問日誌,也可以用來分析Samba、Vsft

centos7 Nginx Log日誌統計分析 常用命令

一、IP相關統計 有時候需要通過nginx日誌檢視網站的訪問情況就需要對nginx日誌分析 進入nginx的日誌 統計IP訪問量 統計PV  awk '{print $7}' access.log|wc -l 獨立ip訪問數量  統計UV awk

ssl證書安裝完後,https訪問後下載index檔案,HTTP訪問正常的。Nginx ssl設定後自動下載根目錄的index.php而不是載入

給Nginx安裝ssl證書,https訪問後,重新自動下載index.php檔案。一開始的Nginx的配置檔案如下: #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.

Nginx使用AWStats日誌分析

AWstats介紹 Awstats是一個免費非常簡潔而且強大有個性的網站日誌分析工具。 它可以統計您站點的如下資訊: 一:訪問量,訪問次數,頁面瀏覽量,點選數,資料流量等 二:精確到每月、每日、每小時的資料 三:訪問者國家 四:訪問者IP 五:Robots/Spiders的統計 六:訪客持

linux安裝nginx設定https(openssl)

linux安裝nginx並設定https(openssl) 關鍵字:linux nginx https openssl   一、安裝依賴包 1.$sudo apt-get install openssl    或者$sudo apt-get inst

鏡像倉庫Harbor私服高可用策略分析及部署

private compose 使用 col 文件 故障 wget ceph https 一.分析指定Harbor高可用策略 主流的策略有那麽幾種: 1.harbor做雙主復制 2.harbor集群掛載分布式cephfs存儲 3.在k8s集群上部署harbor 第

微信Mars策略分析【轉】

轉自 https://blog.dreamtobe.cn/mars/ 前幾年在微信工作時,參加一些內部會議當時也有做了相關簡要整理: Android網路,前端時間也有總結了微信的心跳機制,今天主要是對已開源的Mars進行窺探。如果對目前行業中網際網路現狀感興趣也可以留意下這裡

nginx-fpm設定

PHP-fpm存在兩種方式,一種是直接開啟指定數量的php-fpm程序,不再增加或者減少;  另一種則是開始時開啟一定數量的php-fpm程序,當請求量變大時,動態的增加php-fpm程序數到上限,當空閒時自動釋放空閒的程序數到一個下限。  這兩種不同的執行方式,可以根據伺服器

K8S 原始碼探祕 之 nginx-ingress 工作原理分析

一、引言        Nginx-ingress 是 Kubernetes 生態中的重要成員,主要負責向外暴露服務,同時提供負載均衡等附加功能;        截至目前,nginx-ingress 已經能夠

nginx快取設定proxy_cache nginx快取設定proxy_cache

nginx快取設定proxy_cache http://www.cnblogs.com/dudu/p/4597351.html   http塊:          proxy_cache_path

[Demo實踐]使用Docker測試nginx負載均衡策略

實踐環境: linux主機,已安裝docker 步驟1: 下載伺服器映象,此處直接選擇nginx docker pull nginx 步驟2: 啟動5個容器,分別命名n1~n5,並暴露埠8071 ~ 8075 docker run --name n1 -d -p 8071:80 ng

ELK + Filebeat +Nginx 集中式日誌分析平臺(一)

文檔 bili cti put tin grok NPU puts term 一、環境準備 本次我們采用 yum 官方倉庫進行安裝,之前采用 rpm 包安裝的文檔大家請看 http://blog.51cto.com/wzlinux/2175836 。 1、軟件版本 File