http1.1支持長鏈接,而http1.0不支持,所以,在切換http版本號或者升級服務端版本時候,尤其要注意這個造成的影響。
當客戶端以http1.1長鏈接方式連接服務端時,服務端如果不支持1.1,客戶端會進行協議降級,用1.0通信,即使用短連接,此時服務端可以正常提供服務;
一旦服務端http版本由於某種原因切換到1.1,則長鏈接就會生效,如果服務端不支持長鏈接,則就會造成頻繁的502發生;
因為,短連接在服務端return后就會向客戶端發一個reset消息,客戶端就會切斷鏈路,如果客戶端認為是長鏈接,就會復用該通道,此時reset,會造成內核態的數據被清空,造成數據丟失,表現為502;
如果發現http1.0正常,1.1會經常出現502,則可以考慮此種可能。
附一個檢測長鏈接的腳本:
def query(): i = 2000 conn = httplib2.HTTPConnectionWithTimeout("*.*.*.*", port, timeout=60) while i > 0: headers = { 'content-type': 'application/json', 'accept': 'application/json', 'Connection': 'Keep-Alive', } conn.request('GET', '***', headers=headers) response = conn.getresponse() resp_status = str(response.status) rsp = response.read() print rsp status_ok_list = [HTTP_200_OK, HTTP_201_CREATED, HTTP_204_NO_CONTENT, HTTP_202_ACCEPTED] if resp_status not in status_ok_list: print 'get error rsp, resp_status is %s' % resp_status i -= 1
django1.11之前,不支持http 1.1,因為不會自動添加Content_Length,但1.1后會,所以,1.1后是可以支持1.1的,一般情況下,我們配置uwsgi是采用短連接的方式,即,http_socket = :8000或socket = 0.0.0.0:8000,protocol = http;此種配置不支持長鏈接,如要支持長鏈接,需要使用http11_soscket = :8000,http-keepalive = true,具體配置如下:
[uwsgi] http11-socket = :8000 http-keepalive = true master = true hara-kiri = 180 chdir = /home/test_server manage-script-name = true mount = /client=/home/test_server/test/wsgi.py processes = 4 threads = 40 pidfile = /usr/local/bin/uwsgi.pid daemonize = /home/test_server/logs/uwsgi.log buffer-size = 32768 listen = 1024 reload-on-rss = 1024 cheaper = 2 cheaper-initial = 2 die-on-term = true py-tracebacker = /tmp/tbsocket. log-maxsize = 50000000