chan

朝生暮死不足笑 但悲百年不足道

【Django】再记一次Django部署遇到的错误及解决


502 Bad Gateway
nginx/1.20.1
这样的错误一般是什么原因呢 

————————————————————————————–

502 Bad Gateway 错误通常表示代理服务器(如 Nginx)在与上游服务器(如应用服务器)进行通信时出现了问题。这种错误通常发生在反向代理架构中。可能的原因有很多,以下是一些常见的原因和排查方法:

1. 应用服务器不可用

如果应用服务器(例如,Django、uWSGI、Gunicorn 等)不可用或崩溃,Nginx 会尝试访问它时返回 502 Bad Gateway 错误。检查应用服务器是否正常运行。

排查方法

  • 检查应用服务器(例如,gunicornuWSGI)是否正在运行:ps aux | grep gunicornps aux | grep uwsgi
  • 查看应用服务器的日志文件,检查是否有崩溃或其他错误信息。

2. 应用服务器与 Nginx 的连接问题

Nginx 可能无法与后端应用服务器建立连接,这可能是由于以下原因:

  • 端口或地址配置错误:Nginx 配置文件中指向的应用服务器地址或端口错误。
  • 网络问题:Nginx 和应用服务器之间的网络连接有问题。

排查方法

  • 确保 Nginx 配置文件中的 proxy_passuwsgi_pass 指向正确的地址和端口。
  • 使用 curltelnet 测试 Nginx 和应用服务器之间的连接。

3. 超时设置

如果应用服务器响应较慢,Nginx 可能会在超时后返回 502 错误。

排查方法

  • 检查 Nginx 配置文件中的超时设置(proxy_read_timeoutproxy_connect_timeoutproxy_send_timeout 等)。
  • 如果是 uWSGI 或 Gunicorn,检查其超时设置(例如,timeoutkeep-alive)。

4. Nginx 配置错误

有时,Nginx 配置文件本身可能有问题,导致无法正确地代理请求。

排查方法

  • 检查 Nginx 配置文件中与代理相关的设置(如 proxy_passupstream)。
  • 通过 nginx -t 测试 Nginx 配置文件是否正确,并重新加载配置:sudo systemctl reload nginx

5. 资源限制

如果应用服务器或 Nginx 服务器受到资源限制(如内存、文件描述符等),可能会导致连接失败。

排查方法

  • 检查应用服务器和 Nginx 服务器的资源使用情况(如内存、CPU、磁盘空间)。
  • 检查系统日志 /var/log/syslog/var/log/messages,查看是否有资源相关的错误。

6. 防火墙或安全设置

防火墙或安全软件可能阻止了 Nginx 和应用服务器之间的通信。

排查方法

  • 检查服务器的防火墙设置(如 iptablesfirewalld)。
  • 确保 Nginx 和应用服务器之间的端口是开放的,并且没有被安全软件阻挡。

7. uWSGI 或 Gunicorn 配置错误

如果使用 uWSGIGunicorn 等 WSGI 服务器来运行 Django 应用程序,可能是它们的配置出了问题。

排查方法

  • 查看 uWSGIGunicorn 的配置文件,确保它们监听正确的端口,并与 Nginx 配合。
  • 检查 WSGI 服务器的日志文件,确保没有崩溃或配置错误。

8. 查看 Nginx 错误日志

最重要的排查步骤是查看 Nginx 的错误日志,它通常会提供有关问题的详细信息。

排查方法

  • 查看 Nginx 错误日志:/var/log/nginx/error.log
  • 查看应用服务器的日志:/var/log/syslog/var/log/gunicorn/gunicorn.log/var/log/uwsgi/uwsgi.log

如果在排查中遇到困难,可以将相关日志内容发给我,我可以帮你更具体地分析问题。

———————————————————————————————————–

1.没问题

————————————————————–

2.

nginx将在80端口收到的非静态文件转发给 /www/day16/uwsgi.sock

反观uwsgi,一直监听这个端口

从初步形式上看,没问题

查看uwsgi日志,发现,当我访问ip 8.138.2.44时,没有相关记录,即,未监听到

说明信息并没有传到uwsgi监听的sockets

再来看nginx的错误日志有什么信息,如下所示

可见,nginx无权访问/www/day16/uwsgi.sock

显然,这是一个权限问题

查看uwsgi.sock的权限,如下

ls -l 的输出看,uwsgi.sock 的所有者是 root,且只有 root 用户有读写权限

首先,你可以查找 Nginx 进程的运行用户是什么ps aux | grep nginx

从中可以看到运行用户是nginx。如果是其他用户(如 nginxnobody),你可以根据实际情况调整。

————————————————————————-

可以运行以下命令更改套接字文件的所有者:

———————————————————————————–

此时再次访问,如下

来看对应的服务日志,先看uwsgi的

可见,虽然报错,但是有对刚才访问的记录了

再看nginx的

nginx的日志中,error的日志,已经没有更新内容了,只有access中有相对应的内容

可见,不再是之前的500了,而是400

众所周知,500-599是服务端错误,而400-499是客户端错误

——————————————————————————-

按照提示,我们做如下修改

此时,访问此ip,仍未有所改变,提示还是一样的

尝试重启nginx和uwsgi服务

可见,重启了nginx,但是uwsgi没重启成功,于是我杀了uwsgi的进程,继而发现,uwsgi.sock的拥有者,再次变为了root,而此时再去访问,又回到了最初的起点,呆呆的502网关错误

—————————————————————————-

所以,这个问题出在uwsgi.ini的配置文件设置不合理上面

————————————————————————-

通过研究,按照如下配置下,可以解决上述问题

此时再访问,页面如下

——————————————————————————

上面还有个瑕疵,图片裂开了,没传过来。

以下是nginx的access的日志记录

以下是uwsgi的日志记录

为什么会这样呢

验证码图片,是在app01这个应用文件夹下的static文件夹下的img文件夹下的

如上,最开始app01这个权限就过不去,故而,拿不到验证码图片。

递归修改app01及其所有子文件夹及子文件为nginx权限

但是奇怪的是,图片还是裂开的。。。你别裂开了,我他妈要裂开了大爹

—————————————————————————

今天不看了,感觉今天的能量都被榨干了。明天继续了

好吧,我又回来了,突然有点思路

虽然我给app01都修改为nginx的权限,但是生成图片的模块,代码运行时,是否还会去其他文件夹中调用呢。索性将整个项目文件夹day16全部修改为nginx的权限,于是解决了此问题。

至于这样的做法,会不会带来安全及其他问题,暂不做深究。

访问对应地址,如下

【PS】其实权限这个问题,我遇到过,在第一次手动部署Django项目的时候。但是时间久了,忘了之前的一些细节。可见,一些重要的东西,尤其是刚学会,还不算了然于胸的较为重要的东西,得做记录,如此,往后可以做复用,节省不必要的时间浪费。

评论
还没有评论
    发表评论 说点什么