GG資源網

伺服器排障nginx 499 錯誤地解決(Nginx timeout超時配置詳解)

伺服器排障nginx 499 錯誤地解決

問題描述:

近期平台對外開放了數據查詢介面,在數據量特別大時,返回結果時間可能會超過3秒,介面開放後,系統本身調用沒有問題,其他第三方平台接入時,總會報鏈接超時問題;

問題原因:

查看tomcat日誌無任何錯誤,一開始以為是tomcat接收參數最大限制問題,對tomcat做了一次整體優化,修改連接數、修改post限制,問題仍存在;那問題可能出在nginx轉發上面;

經排查,而在nginx中出現了499的錯誤,官方解釋是nginx定義的一個狀態碼,用於表示這樣的錯誤:

錯誤原因

1、nignx做proxy時,頻繁的post,nginx認為不安全,記錄499

可以在nignx的proxy配置中開啟 proxy_ignore_client_abort on 功能是確定在客戶端關閉連接時是否應該關閉與代理伺服器的連接,而不再等待響應

如果使用了proxy_ignore_client_abort on那麼客戶端主動斷掉連接之後,Nginx 會等待後端伺服器處理完(或者超時),然後記錄「後端的返回信息」到日誌。因此,如果後端返回200,就記錄200 ;如果後端返回5XX ,那麼就記錄 5XX。

如果超時(默認60s,可以用 proxy_read_timeout 和proxy_send_timeout設置),Nginx 會主動斷開連接,記錄504

2、伺服器返回http頭之前,客戶端就提前關閉了http連接,客戶端請求服務端時,服務端響應慢,客戶端覺得時間長主動關閉了連接, 比如瀏覽器(客戶端)請求一個介面覺得很慢,就關掉了瀏覽器、 nginx做proxy的時候,後端執行時間長(如執行sql慢,調用其它介面慢)等,應該從後端去優化下,

通用解決方案:

1.499網上的解釋是客戶端主動關閉了連接

在一個項目上傳文件的時候,nginx log報499,關閉iptables就可以

2.從排除故障的方法來說

nginx->tomcat,問題就出在這兩個上面
看nginx的請求是否在日誌裡面能發現,這次是post請求是499
看tomcat的日誌,是否有異常

3.從網路層,應用層,從下至上排除

iptables和網路方面的問題

4.使用工具

tcpdump
tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854 -w /tmp/post.log
tcpdump -i eth0 '((port 8000) and (tcp[(tcp[12]>>2):4]=0x47455420))' -nnAl -w /tmp/GET.log
0x4745 是post請求

5、設置客戶端連接超時時間

發現第三方的請求是用的httpclient代理模式,而httpclient的鏈接超時時間設置的是2秒,在服務端還未返回數據是,就關閉了鏈接,調大httpclient的鏈接超時時間即可;

Nginx timeout超時配置詳解

最近項目中用到了nginx,後台用的是Java, 發現有一個請求後台處理操過了1分鐘,結果請求Status Code為504 Gateway Time-out.

理解了下nginx 所有timeout相關的配置,如下:

HTTP 有一個 KeepAlive 模式,它告訴 webserver 在處理完一個請求後保持這個 TCP 連接的打開狀態。若接收到來自客戶端的其它請求,服務端會利用這個未被關閉的連接,而不需要再建立一個連接。

http keep-alive, 網頁的每一個請求都是HTTP (圖片, CSS等), 而打開HTTP 請求是要先建立TCP 連接, 而如果一個頁面每個請求都要打開及關閉一個TCP 連接就會做成資源的浪費. keepalive_timeout 就是當一個HTTP 請求完成, 其TCP 連接會存留下來的時間, 如果這時有另一個HTTP 請求過來, 會複用這個TCP 連接, 如果再沒有新的請求過來, 才會關閉其TCP連接

user nginx;

worker_processes 1;

error_log /var/log/nginx/error.log warn;

pid    /var/run/nginx.pid;

events {

worker_connections 1024;

}

http {

include    /etc/nginx/mime.types;

default_type application/octet-stream;

log_format main \'$remote_addr - $remote_user [$time_local] \"$request\" \'

\'$status $body_bytes_sent \"$http_referer\" \'

\'\"$http_user_agent\" \"$http_x_forwarded_for\"\';

access_log /var/log/nginx/access.log main;

sendfile    on;

tcp_nopush   on;

tcp_nodelay on;

keepalive_timeout 65;

client_max_body_size 8192m;

#gzip on;

#include /etc/nginx/conf.d/*.conf;

server {

listen 80 so_keepalive=30m::;

listen 443 default ssl;

ssl_certificate /etc/nginx/ssl/server.crt;

ssl_certificate_key /etc/nginx/ssl/portalkey.key;

#ssl_password_file /etc/nginx/ssl/ssl.pass;

ssl_session_timeout 5m;

ssl_protocols SSLv2 SSLv3 TLSv1;

ssl_ciphers HIGH:!aNULL:!MD5;

ssl_prefer_server_ciphers on;

location / {

proxy_request_buffering off;

proxy_pass http://127.0.0.1:8011/;

proxy_connect_timeout    180;

proxy_send_timeout     180;

proxy_read_timeout     180;

send_timeout  180;

}

location /test1_url/ {

proxy_pass http://127.0.0.1:8008/;

proxy_connect_timeout    180;

proxy_send_timeout     180;

proxy_read_timeout     180;

send_timeout  180;

}

location /test2_url/ {

proxy_pass http://127.0.0.1:3000/;

proxy_connect_timeout    180;

proxy_send_timeout     180;

proxy_read_timeout     180;

send_timeout  180;

}

}

}

# 配置段: http,默認75s

keepalive_timeout 60;

send_timeout:發送數據至客戶端超時, 默認60s, 如果連續的60s內客戶端沒有收到1個位元組, 連接關閉

proxy_connect_timeout: nginx與upstream server的連接超時時間

proxy_read_timeout: nginx接收upstream server數據超時, 默認60s, 如果連續的60s內沒有收到1個位元組, 連接關閉

proxy_send_timeout: nginx發送數據至upstream server超時, 默認60s, 如果連續的60s內沒有發送1個位元組, 連接關閉

so_timeout:

當用戶跟SERVER開啟了TCP CONNECTION --> 一段長時間這個CONNECTION 沒traffic (so_keepalive timeout) --> SERVER 發出探測包看用戶是否還存在 --> 若探測包沒回, 則關閉TCP CONNECTION

so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]
so_keepalive=30m::10

will set the idle timeout (TCP_KEEPIDLE) to 30 minutes, leave the probe interval (TCP_KEEPINTVL) at its system default, and set the probes count (TCP_KEEPCNT) to 10 probes.

以上三個參數只能使用一個,不能同時使用, 比如so_keepalive=on, so_keepalive=off或者so_keepalive=30s::(表示等待30s沒有數據報文發送探測報文)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多關注本網站。

Nginx timeout超時配置詳解 (https://www.wpmee.com/) WordPress教程 第1張

由於網站搬家,部分鏈接失效,如無法下載,請聯繫站長!謝謝支持!
1. 帶 [親測] 說明源碼已經被站長親測過!
2. 下載後的源碼請在24小時內刪除,僅供學慣用途!
3. 分享目的僅供大家學習和交流,請不要用於商業用途!
4. 本站資源售價只是贊助,收取費用僅維持本站的日常運營所需!
5. 本站所有資源來源於站長上傳和網路,如有侵權請郵件聯繫站長!
6. 沒帶 [親測] 代表站長時間緊促,站長會保持每天更新 [親測] 源碼 !
7. 盜版ripro用戶購買ripro美化無擔保,若設置不成功/不生效我們不支持退款!
8. 本站提供的源碼、模板、插件等等其他資源,都不包含技術服務請大家諒解!
9. 如果你也有好源碼或者教程,可以到審核區發布,分享有金幣獎勵和額外收入!
10.如果您購買了某個產品,而我們還沒來得及更新,請聯繫站長或留言催更,謝謝理解 !
GG資源網 » 伺服器排障nginx 499 錯誤地解決(Nginx timeout超時配置詳解)

發表回復

CAPTCHAis initialing...