前段时间做一个django的项目,因为之前项目只是一个后台程序,因此数据库设计的并不满足后面新添加的前端的需求,所以查询显示什么的特别冗余,造成了大量的坑。今天就分享一个爬坑的过程。
1先看看需求
项目要求在一个报告中显示一个列表,这个列表包含这个报告中包含的所有任务文件。在发生问题这个报告中包含了大约200个文件,平均每个文件的大小差不多在1.5M左右。对于每个文件,发送请求的时候包含两个参数,一个是文件名,另一个是文件生成时间。
基本的需求就是这样,结果前端在转了一阵圈圈之后成功返回了500,WTF。
2 如何定位问题
打开nginx的日志(nginx日志默认的路径\var\log\nginx\error.log
),输出中由如下这行:*42 upstream time out(110: Connection timed out) while reading response header from upstream...
日志写的很清楚,就是连接时间超时了。因此决定上网查询如何解决这个问题。
通过nginx官方nginx给出的文档,发现了问题所在。
官方文档
文档中指出:
Syntax:
uwsgi_connect_timeout time;
Default:
uwsgi_connect_timeout 60s;
Context:
http, server, location
Defines a timeout for establishing a connection with a uwsgi server. It should be noted that this timeout cannot usually exceed 75 seconds.
ok,可以看到,nginx默认的设置时间是60s,如果你的链接时间超过这个了,那必须指明具体提时间。这里官方说最好不要超过75s,那就要看具体实现的水平能否控制在这个范围内了。因为我在这里爬坑,并不想去优化代码,所以设置600s足够。
3 如何修改
修改你的nginx配置文件,我的样例如下:
# interface.conf
# configuration of the server
server {
# the port your site will be served on
listen 8099;
# the domain name it will serve for
server_name 127.0.0.1; # substitute your machine's IP address or FQDN
charset utf-8;
# max upload size
client_max_body_size 75M; # adjust to taste
# Django media
location /media {
alias /home/jason/code/interface/media; # your Django project's media files - amend as required
}
location /static {
expires 30d;
autoindex on;
add_header Cache-Control private;
alias /home/jason/code/interface/static; # your Django project's static files - amend as required
}
# Finally, send all non-media requests to the Django server.
location / {
# 注意这儿,一般这三个配套修改
uwsgi_send_timeout 600; # 指定向uWSGI传送请求的超时时间,完成握手后向uWSGI传送请求的超时时间。
uwsgi_connect_timeout 600; # 指定连接到后端uWSGI的超时时间。
uwsgi_read_timeout 600; # 指定接收uWSGI应答的超时时间,完成握手后接收uWSGI应答的超时时间。
uwsgi_pass 127.0.0.1:8000;
include /home/jason/code/interface/conf/uwsgi_params; # the uwsgi_params file you installed
}
}
4 一些说明
如果你使用的不是uwsgi,那么你就要注意了,你应该在nginx找到对应的nginx模块介绍。
例如你使用nginx只是作为反向代理,那么你修改的这个时间应该对应调整为:
# 注意这儿,一般这三个配套修改
proxy_send_timeout 600;
proxy_connect_timeout 600;
proxy_read_timeout 600;
例如你使用的是fastcgi, 那么你修改的这个时间应该对应调整为:
# 注意这儿,一般这三个配套修改
fastcgi_send_timeout 600;
fastcgi_connect_timeout 600;
fastcgi_read_timeout 600;
以此类推。