如何修复生产环境中的 502 Bad Gateway Error (Nginx)?
How to fix 502 Bad Gateway Error in production(Nginx)?
当我尝试在托管在数字海洋中的项目中上传一个大小约为 600MB 的大型 csv 文件时,它尝试上传但显示 502 Bad Gateway Error (Nginx)。
该应用程序是一个数据转换应用程序。
这在本地工作时工作正常。
sudo tail -30 /var/log/nginx/error.log
显示
[error] 132235#132235: *239 upstream prematurely closed connection while reading response header from upstream, client: client's ip , server: ip, request: "POST /submit/ HTTP/1.1", upstream: "http://unix:/run/gunicorn.sock:/submit/", host: "ip", referrer: "http://ip/"
sudo nano /etc/nginx/sites-available/myproject
显示
server {
listen 80;
server_name ip;
client_max_body_size 999M;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
alias /root/static/;
}
location / {
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
}
}
nginx.conf
user root;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
在进行转换过程时,我还有 javascript 加载器 运行。
我该如何解决这个问题?
如果您使用的是 django 3.1 或更高版本,您可以通过这种方式使您的文件处理异步,并且 return 在文件转换发生时对用户做出响应。
您的视图应如下所示...
import asyncio
from django.http import JsonResponse
from asgiref.sync import sync_to_async
@sync_to_async
def crunching_stuff(my_file):
# do your conversion here
async def upload(request):
json_payload = {
"message": "Your file is being converted"
}
my_file = request.POST.get('file')
asyncio.create_task(crunching_stuff(my_file))
return JsonResponse(json_payload)
在前端,如果您使用 Dropzone.js,您的用户可以看到文件上传进度,并且会更快地得到响应。这是更好的用户体验。
https://www.dropzonejs.com/
此错误可能表示存在多个问题。它在本地对您有效的事实加强了问题依赖于 nginx 方面的可能性。
您可以尝试通过增加超时阈值(如建议)和缓冲区大小来解决它。将此添加到您服务器的 nginx.conf:
proxy_read_timeout 300s;
proxy_connect_timeout 300s;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
502 错误可以是任何东西。
检查你的 Nginx 错误日志如下
tail /var/log/nginx/error.log -f
在我的例子中是因为 header 太大了。因此,必须像 Chen.A 所描述的那样增加 /etc/nginx/sites-enabled/default
中的缓冲区大小。
当我尝试在托管在数字海洋中的项目中上传一个大小约为 600MB 的大型 csv 文件时,它尝试上传但显示 502 Bad Gateway Error (Nginx)。
该应用程序是一个数据转换应用程序。
这在本地工作时工作正常。
sudo tail -30 /var/log/nginx/error.log
显示
[error] 132235#132235: *239 upstream prematurely closed connection while reading response header from upstream, client: client's ip , server: ip, request: "POST /submit/ HTTP/1.1", upstream: "http://unix:/run/gunicorn.sock:/submit/", host: "ip", referrer: "http://ip/"
sudo nano /etc/nginx/sites-available/myproject
显示
server {
listen 80;
server_name ip;
client_max_body_size 999M;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
alias /root/static/;
}
location / {
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
}
}
nginx.conf
user root;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
在进行转换过程时,我还有 javascript 加载器 运行。 我该如何解决这个问题?
如果您使用的是 django 3.1 或更高版本,您可以通过这种方式使您的文件处理异步,并且 return 在文件转换发生时对用户做出响应。 您的视图应如下所示...
import asyncio
from django.http import JsonResponse
from asgiref.sync import sync_to_async
@sync_to_async
def crunching_stuff(my_file):
# do your conversion here
async def upload(request):
json_payload = {
"message": "Your file is being converted"
}
my_file = request.POST.get('file')
asyncio.create_task(crunching_stuff(my_file))
return JsonResponse(json_payload)
在前端,如果您使用 Dropzone.js,您的用户可以看到文件上传进度,并且会更快地得到响应。这是更好的用户体验。 https://www.dropzonejs.com/
此错误可能表示存在多个问题。它在本地对您有效的事实加强了问题依赖于 nginx 方面的可能性。
您可以尝试通过增加超时阈值(如建议
proxy_read_timeout 300s;
proxy_connect_timeout 300s;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
502 错误可以是任何东西。 检查你的 Nginx 错误日志如下
tail /var/log/nginx/error.log -f
在我的例子中是因为 header 太大了。因此,必须像 Chen.A 所描述的那样增加 /etc/nginx/sites-enabled/default
中的缓冲区大小。