关于django:视图加载时间超过5秒时出现504错误

504 error when the view loading takes more than 5 s

我已经安装了django-nginx-gunicorn-supervisor-postgresql。在Django管理员中,如果加载视图的时间超过5秒,我就得到504。

例如,如果我过滤具有许多记录的更改列表视图并且花费的时间超过该时间,则会出现504。只要花费更少的时间,具有更少记录的相同视图就可以工作。

我也注意到一些视图仍然在后台运行,即使在504之后,因为我可以看到它们在完成后在数据库中进行的修改。

我试图增加我发现的所有超时(nginx,gunicorn),但没有一个被配置为5秒。什么可能是错误配置的猜测?或者哪里可以提高504的超时?

谢谢

我配置的超时时间是:

在/ etc / nginx / sites-enabled / mysite中

1
2
3
4
5
proxy_connect_timeout 60;
proxy_read_timeout 90;
proxy_send_timeout 90;
send_timeout 90;
fastcgi_read_timeout 300;

在/etc/nginx/nginx.conf中

1
2
3
4
5
send_timeout 300;
keepalive_timeout 65;
proxy_connect_timeout 300;
proxy_read_timeout 300;
proxy_send_timeout 300;

在gunicorn_start文件中(由主管发起)

1
2
3
4
5
EXEC gunicorn -c ${CONF_FILE} ${DJANGO_WSGI_MODULE}:application \
        --name ${NAME} \
        --user=${USER} --group=${GROUP} \
        --log-level=debug \
        --timeout=90

在gunicorn.conf文件中(之前的$ {CONF_FILE})

1
2
3
timeout = 90
graceful_timeout = 30
keepalive = 3

我发现调试事情的最好方法是从Django开始,一直向上,直到找出什么是超时。

首先,检查Django是否超时。

在一个终端运行中:

1
python manage.py runserver 127.0.0.1:8000

然后在同一台机器上的终端中执行:

1
wget http://127.0.0.1:8000/<path_to_your_admin_view>

如果有效,那么检查一下Gunicorn是否超时:

在Gunicorn配置文件中,更改设置以使其绑定到本地端口而不是套接字:

1
2
3
4
5
6
EXEC gunicorn -c ${CONF_FILE} ${DJANGO_WSGI_MODULE}:application \
        --name ${NAME} \
        --user=${USER} --group=${GROUP} \
        --log-level=debug \
        --bind=127.0.0.1:8001
        --timeout=90

确保重新启动主管。 然后在同一台机器上的终端上做:

1
 wget http://127.0.0.1:8001/<path_to_your_admin_view>

如果可行,则撤消对gunicorn配置的更改,重新启动supervisor并直接连接到nginx以查看它是否超时:

1
 wget http://127.0.0.1:80/<path_to_your_admin_view>

如果这有效,您的问题可能在代理或负载均衡器的上游。