nginx > uwsgi > django 上的错误网关 (502),但只有一台设备

Bad Gateway (502) on nginx > uwsgi > django, but only one SOME devices

我的网站在我的 Mac 和我的 Windows 笔记本电脑上看起来不错(使用 chrome 访问主页 https://inspidered.org),但如果我尝试任何其他设备,我从 nginx 获取 502 gateway error。 Nginx 是前端服务器 运行 作为 digital ocean droplet 的反向代理,后面有 uwsgi 运行 django 3.1.

这是我的相关配置文件:

我的调试技巧来自这个页面:https://digitalocean.com/community/questions/502-bad-gateway-nginx-2

sudo tail -30 /var/log/nginx/error.log
...
2021/03/01 17:45:47 [crit] 16656#0: *3420 connect() to unix:/run/uwsgi/inspidered.lock failed 
(2: No such file or directory) while connecting to upstream, 
client: 23.100.xxx.yyy, 
server: inspidered.org, 
request: "GET / HTTP/1.1", 
upstream: "uwsgi://unix:/run/uwsgi/inspidered.lock:", 
host: "inspidered.org"

nginx没有明显错误:

sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

此外,nginx 在 droplet 上为其他两个服务器(一个 python2 cherrypy 和一个 python3 cherrypy)提供服务,没有任何问题。只有这个 uwsgi/django 网站受到影响。而且只有部分设备。

[~]# systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2021-03-01 05:05:21 UTC; 13h ago
  Process: 16653 ExecReload=/bin/kill -s HUP $MAINPID (code=exited, status=0/SUCCESS)
  Process: 16399 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 16395 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Process: 16394 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
 Main PID: 16402 (nginx)
   CGroup: /system.slice/nginx.service
           ├─16402 nginx: master process /usr/sbin/nginx
           ├─16655 nginx: worker process
           └─16656 nginx: worker process

Mar 01 05:05:21 centos-divining systemd[1]: Stopped The nginx HTTP and reverse proxy server.
Mar 01 05:05:21 centos-divining systemd[1]: Starting The nginx HTTP and reverse proxy server...
Mar 01 05:05:21 centos-divining nginx[16395]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
Mar 01 05:05:21 centos-divining nginx[16395]: nginx: configuration file /etc/nginx/nginx.conf test is successful
Mar 01 05:05:21 centos-divining systemd[1]: Started The nginx HTTP and reverse proxy server.
Mar 01 05:18:09 centos-divining systemd[1]: Reloading The nginx HTTP and reverse proxy server.
Mar 01 05:18:09 centos-divining systemd[1]: Reloaded The nginx HTTP and reverse proxy server.

我检查了一下,我的 Mac:

上没有特殊的域过滤器
sudo nano /private/etc/hosts
sudo nano /etc/hosts

我的 uwsgi.service 设置

[Unit]
Description=uWSGI Emperor service

[Service]
ExecStartPre=/bin/bash -c 'mkdir -p /run/uwsgi; chown nfsnobody:nfsnobody /run/uwsgi'
ExecStart=/usr/local/bin/uwsgi --emperor /etc/uwsgi/sites --logger file:logfile=/var/log/uwsgi.log,maxsize=500000
Restart=always
KillSignal=SIGQUIT
Type=notify
NotifyAccess=all

[Install]
WantedBy=multi-user.target

inspidered.ini设置


[uwsgi]
project = inspidered
uid = root
base = /root/webapps/insp

chdir = %(base)/%(project)
home = %(base)
module = %(project).wsgi:application

master = true
processes = 5

socket = /run/uwsgi/%(project).sock
chown-socket = %(uid):root
chmod-socket = 666
vacuum = true
logto = /var/log/uwsgi.log

最后,emperor is governing 0 vassals——这似乎是一个错误,但也许他们只是生活在 autonomous collective

[root@centos-divining log]# systemctl status uwsgi.service
● uwsgi.service - uWSGI Emperor service
   Loaded: loaded (/etc/systemd/system/uwsgi.service; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2021-03-01 18:51:10 UTC; 5min ago
  Process: 30019 ExecStartPre=/bin/bash -c mkdir -p /run/uwsgi; chown nfsnobody:nfsnobody /run/uwsgi (code=exited, status=0/SUCCESS)
 Main PID: 30022 (uwsgi)
   Status: "The Emperor is governing 0 vassals"
   CGroup: /system.slice/uwsgi.service
           ├─30022 /usr/local/bin/uwsgi --emperor /etc/uwsgi/sites --logger file:logfile=/var/log/uwsgi.log,maxsize=500000
           └─30050 /usr/local/bin/uwsgi --emperor /etc/uwsgi/sites --logger file:logfile=/var/log/uwsgi.log,maxsize=500000

Mar 01 18:51:10 centos-divining systemd[1]: uwsgi.service holdoff time over, scheduling restart.
Mar 01 18:51:10 centos-divining systemd[1]: Stopped uWSGI Emperor service.
Mar 01 18:51:10 centos-divining systemd[1]: Starting uWSGI Emperor service...
Mar 01 18:51:10 centos-divining systemd[1]: Started uWSGI Emperor service.
Mar 01 18:51:24 centos-divining uwsgi[30022]: Mon Mar  1 18:51:24 2021 - logsize: 18446744073709551615, triggering rotation to /var/log/...24684...
Mar 01 18:51:38 centos-divining uwsgi[30022]: Mon Mar  1 18:51:38 2021 - logsize: 18446744073709551615, triggering rotation to /var/log/...24698...
Hint: Some lines were ellipsized, use -l to show in full.

令人惊奇的是,在尝试了 2 天其他所有方法后,只需强制将所有进入 nginx 反向代理的请求从 http 重定向到 https,就解决了手机和平板电脑上的 502 错误网关问题:

经验教训:chrome 是 smart 并在任何键入的 url 上强制使用 https,但旧手机和 kindle fire 键入的 url 仍默认为 http,并且我的 http 配置设置不正确.所以我只是这样做了:

    server {
        listen 80;
        listen [::]:80;

        server_name inspidered.org inspidered.com;
        return 301 https://$host$request_uri;
    }