Nginx timeout配置詳解

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

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

keepalive_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沒有數據報文發送探測報文)

發佈了20 篇原創文章 · 獲贊 7 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章