我在Django应用程序前面有一个Nginx,并且在POST请求方面遇到了令人沮丧的问题。似乎有时POST请求的响应会“丢失”,并且不会返回到浏览器。但是,不会产生任何错误。我已经使用uwsgi和gunicorn进行了测试,并且可以在两个应用程序服务器下重现相同的错误。
我的nginx配置很简单:
upstream django {
server myapp:8000; #
}
server {
listen 8000 default_server;
location / {
charset utf-8;
#include uwsgi_params;
#uwsgi_pass django;
proxy_pass http://django;
client_max_body_size 512M;
# add_header X-XSS-Protection "1; mode=block" always;
# add_header X-Content-Type-Options "nosniff" always;
}
location /media/ {
alias /uploads/;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Cache-Control "no-store" always;
}
location /static/ {
alias /static/;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
expires 1y;
add_header Cache-Control "max-age=31536000";
}
}
问题是,没有一致的方法来再现它。我有时可以通过在django-admin中更改密码来触发它。按下“更改密码”按钮更改密码后,我的浏览器一直在等待,而且似乎从未停止过,它一直在等待永远不会出现的回复...
但是,当我查看我的应用程序服务器日志时,请求已处理:
nginx_1 | 172.27.0.1 - - [22/Oct/2019:11:43:44 +0000] "GET /admin/password_change/ HTTP/1.1" 200 2812 "http://localhost:8000/admin/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" "-"
nginx_1 | 172.27.0.1 - - [22/Oct/2019:11:44:00 +0000] "POST /admin/password_change/ HTTP/1.1" 302 0 "http://localhost:8000/admin/password_change/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" "-"
似乎生成了302(可能只是标准的post-after-post),但它似乎从未到达我的浏览器。
这种情况仅在某些时候发生,这使得调试非常令人沮丧。 Chrome开发人员工具说,连接处于“挂起”状态,无论我等待多长时间,都不会收到任何回复。
以前有没有人经历过类似的事情?
某些版本信息:
django=2.2.6
uwsgi=2.0.18
gunicorn=19.9.0
nginx=1.16.1
此刻,当我直接对应用程序服务器执行POST时,我似乎无法重现该问题。