nginx recv() failed (104: Connection reset by peer) while reading response header from upstream解決方法

首先說下 先看 按照ab 每秒請求的結果 看看 都有每秒能請求幾個 若是併發量超出你請求的個數 會這樣 因此通常圖片和代碼服務器最好分開 還有看看io瓶ding 和有沒有延遲的PHP代碼執行php

0 先修改內核參數nginx

<pre>
一、調整同時打開文件數量服務器

ulimit -n 20480
二、TCP最大鏈接數(somaxconn)cookie

echo 10000 > /proc/sys/net/core/somaxconn
三、TCP鏈接當即回收、回用(recycle、reuse)併發

echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
四、不作TCP洪水抵禦負載均衡

echo 0 > /proc/sys/net/ipv4/tcp_syncookies
</pre>
也能夠直接使用優化後的配置,在/etc/sysctl.conf中加入:
<pre>
net.core.somaxconn = 20480
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 4096 16777216
net.ipv4.tcp_wmem = 4096 4096 16777216
net.ipv4.tcp_mem = 786432 2097152 3145728
net.ipv4.tcp_max_syn_backlog = 16384
net.core.netdev_max_backlog = 20000
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_max_orphans = 131072
net.ipv4.tcp_syncookies = 0
</pre>tcp


而後修改nginx.conf 好比worker_processes等等php-fpm

 

 

 

 


1 查看nginx錯誤日記 error.log日誌獲得connect() to unix:/tmp/php-cgi.sock failed xxxxx........
若是是由於忽然的網站訪問量大(這裏說明這個是說tcp太高,並不能說明cpu太高和內存使用率太高,帶寬太高)致使那麼通常是由於子進程數不足:
到php-fpm.conf找到max_children也就是子進程最大數改成:<value name="max_children">128</value>性能

 


2優化

<pre>
tail -n 10 /var/log/messages


Dec 1 15:33:31 iZ238qupob7Z kernel: TCP: time wait bucket table overflow
Dec 1 15:33:31 iZ238qupob7Z kernel: TCP: time wait bucket table overflow
Dec 1 15:33:31 iZ238qupob7Z kernel: TCP: time wait bucket table overflow
Dec 1 15:33:31 iZ238qupob7Z kernel: TCP: time wait bucket table overflow
Dec 1 15:33:31 iZ238qupob7Z kernel: TCP: time wait bucket table overflow
Dec 1 15:33:31 iZ238qupob7Z kernel: TCP: time wait bucket table overflow
Dec 1 15:33:31 iZ238qupob7Z kernel: TCP: time wait bucket table overflow
Dec 1 15:33:32 iZ238qupob7Z kernel: TCP: time wait bucket table overflow
Dec 1 15:33:32 iZ238qupob7Z kernel: TCP: time wait bucket table overflow
Dec 1 15:33:32 iZ238qupob7Z kernel: TCP: time wait bucket table overflow
</pre>
time wait bucket table overflow 這種表明 服務器的TCP鏈接數,超出了內核定義最大數

查看當前的內核定義最大數
<pre>
cat /proc/sys/net/ipv4/tcp_max_tw_buckets
</pre>


<pre>
解決方法:
修改內核參數 /proc/sys/net/ipv4/tcp_max_tw_buckets
# echo 30000 > /proc/sys/net/ipv4/tcp_max_tw_buckets
寫入/etc/sysctl.conf使之永久生效
echo 'net.ipv4.tcp_max_tw_buckets = 30000' >> /etc/sysctl.conf && sysctl -p
</pre>

 

 

 


3 固然也有可能PHP代碼 消耗太多CPU 執行時間過長 將採起以下方法 看看裏面的錯誤鏈接的連接是否是請求時間過長

 

nginx recv() failed (104: Connection reset by peer) while reading response header from upstream解決方法 除了升級服務器配置還有如下方法能夠參考下


request_terminate_timeout = 0//這樣 就不怕了 以前是PHP執行時間由於超過了設置的值因此報錯 這個時候須要重啓php-fpm 或者等他本身重啓時間至關漫長
還有另外設置下PHP限制執行時間 設置2秒便可 超過2秒就直接報錯讓用戶不要繼續訪問了 就不影響服務器性能了
<pre>
max_execution_time = 10;
</pre>

好比像導出excel耗時的 在代碼中加
<pre>
set_time_limit(0);
</pre>


ps:能夠開啓慢查詢日記 PHP執行超過1秒的記錄下
<pre>
slowlog = /data/logs/php-fpm.log.slow
request_slowlog_timeout = 6
</pre>

 

 

 


4 若是以上都不行 圖片都用CDN 或者就直接再買個服務器負載均衡就行了 買1個星期的 估計能抗幾下

複製ecs實例的方法 一、系統盤 經過建立自定義鏡像的方式,建立一個自定義鏡像,而後使用這個自定義鏡像建立ECS便可。 http://help.aliyun.com/knowledge_detail.htm?spm=5176.7114037.1996646101.1.uamHK9&categoryId=8314847&knowledgeId=5974456&pos=1 二、數據盤 對已經配置完成的數據盤進行打快照。 而後在購買或者升級頁面,添加磁盤的地方點:「用快照建立磁盤」,選擇你要的快照便可。

相關文章
相關標籤/搜索