庄泽波の博客

好记性不如烂笔头

uwsgi_read_timeout超时处理

最近发现一服务器一个奇怪的现象:

  Django的视图函数在浏览器一个请求的情况下,竟然做了两个请求的函数处理。不可思议,找了几天也不知道为什么,

只发现只要用uwsgi_read_timeout之后,如果请求时间超时,Nginx acess log便会记两条同样的log。uwsgi_read_timeout

指令的含义是如果视图函数处理的时间超时,uwsgi便会关闭连接,这个关闭只是针对Nginx这边的关闭,视图函数还会继续执

行,处理完成后,视图函数那边会报IO写入错误[不了解的人可以去看看《TCP详解》,关于TCP全双工和半双工]。

  一个请求怎么会有两个处理呢?最后找了问题所在,以下是简单的nginx配置片段:

uwsgi_connect_timeout 15;
uwsgi_write_timeout 8;
uwsgi_read_timeout 8;

upstream up_app {
    server unix:/var/run/socket.sock;
    server 127.0.0.1:9001 backup;   
}

server {
     ...
    location / {
        inclue uwsgi_param;
        uwsgi_pass up_app;
    }   
    ...
}

  如果Django 函数视图超过8sec,超时关闭连接,并半请求再次转到backup进程。只要是upstream server超时关闭连接,

请求便会转到backup进程,从而导致一个请求两个处理。

  那么怎么解决呢,我只要一个请求一个处理,超时就返回504即可。答案就在这里uwsgi_next_upstream。在nginx配置中

加入uwsgi_next_upstream error即可,原默认为uwsgi_next_upstream error timeout,即只要超时便会将请求转给下一个server.

问题到此结束!

posted on 2014-07-15 23:27  庄泽波  阅读(5643)  评论(0编辑  收藏  举报

导航