uwsgi支持http長鏈接


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM