1. nginx 報 readv() failed
uwsgi+nginx搭建的server,發現當用post請求時,會返回數據超時。查了一下nginx中的error.log:
[error] 16833#0: *158 readv() failed (104: Connection reset by peer) while reading upstream, client: 10.20.138.44, server: my.cn, request: "POST /openapi/auth/Login HTTP/1.1", upstream: "uwsgi://127.0.0.1:8001", host: "my.cn"
uwsgi中是接收到請求並正常處理的。但ngx報錯,client那邊不能正常接收返回。
參考鏈接說明,http://simple-is-better.com/news/301,此文章還提到post-buffering-bufsize參數。
但,他沒說明白post-buffering與post-buffering-bufsize參數的關係,即如果第二設置爲64k,第一個post-buffering是不是應該要比64k更大。
因爲按我理解,bufsize是讀post數據,然後寫到post-buffering中,post-buffering不夠POST的body大時,就會寫文件。
所以,最終我配置是:
post-buffering=131072 # 128K
post-buffering-busize=65536 # 64K
問題解決。
2. uwsgi也支持異步任務與定時任務等。
使用詳情參看官方文檔兩篇文章 -->
http://uwsgi-docs.readthedocs.org/en/latest/PythonDecorators.html
http://uwsgi-docs.readthedocs.org/en/latest/Spooler.html
說下注意點:
1).使用例子中的timer裝飾器,感覺任務沒跑起來,沒成功輸出 print到uwsgi指定的log文件。
2)最後使用rbtimer成功輸出log。誰知道原因可以告訴下我。所以我們項目中還是使用rbtimer代替timer。
3)文檔裏說uwsgi.spooler 比較弱,相對celery來說。 應該是指celery所包含豐富功能:分佈式、重試、優先級、任務持久化、結果持久化等。
但,簡單功能應用,spooler足夠了。