如何修复 Docker 图片更新导致的 504 错误

How to fix 504 error caused by Docker image update

我有 Django 项目。它适用于 nginx、uwsgi 和 google 云 运行。 该项目正在使用 docker 其中 python:3.9 图像。我从 8 月 17 日开始就收到这个错误。

2021-10-13 17:22:29.654 JSTGET504717 B899.9 sGoogleStackdriverMonitoring-UptimeChecks(https://cloud.google.com/monitoring) https://xxxx/

The request has been terminated because it has reached the maximum request timeout. To change this limit, see https://cloud.google.com/run/docs/configuring/request-timeout

而且这个错误出现在我所有的页面上。然而,当我自己打开我的页面时,我可以看到我的页面。这意味着我看不到 504 错误,我只能从服务器日志中检查它是否发生。

我在 8 月 17 日在 admin.py 中添加了一行。我认为这行与此错误无关。因为此更改仅在管理页面中有效。我在错误之前回滚了我的代码。现在我仍然无法修复这个错误。

已构建 docker 错误前后图像尺寸不同。并且漏洞减少了。我认为这是由于 python 图片上的一些小改动造成的。在这种情况下,我该如何解决这个问题?

我做了什么

我将 docker 图像更改为 python:3.8 和 python:3.9.6-buster。我无法修复错误。

我解决了这个问题。我将套接字更改为端口连接。

这是我的设置。

uwsgi.ini

[uwsgi]
# this config will be loaded if nothing specific is specified
# load base config from below
ini = :base

# %d is the dir this configuration file is in
http = 127.0.0.1:8000
master = true
processes = 4
max-requests = 1000                  ; Restart workers after this many requests
max-worker-lifetime = 3600           ; Restart workers after this many seconds
reload-on-rss = 512                  ; Restart workers after this much resident memory
threaded-logger = true

[dev]
ini = :base
# socket (uwsgi) is not the same as http, nor http-socket
socket = :8001


[local]
ini = :base
http = :8000
# set the virtual env to use
home = /Users/you/envs/env


[base]
# chdir to the folder of this config file, plus app/website
chdir = %dapp/
# load the module from wsgi.py, it is a python path from 
# the directory above.
module = website.wsgi:application
# allow anyone to connect to the socket. This is very permissive
chmod-socket = 666

nginx-app.conf

# the upstream component nginx needs to connect to
upstream django {
    # server unix:/code/app.sock; # for a file socket
    server 127.0.0.1:8000; # for a web port socket (we'll use this first)
}

# configuration of the server
server {
    # the port your site will be served on, default_server indicates that this server block
    # is the block to use if no blocks match the server_name
    listen      8080;

    # the domain name it will serve for
    server_name MY_DOMAIN.COM; # substitute your machine's IP address or FQDN
    charset     utf-8;


    # max upload size
    client_max_body_size 10M;   # adjust to taste
    # set timeout
    uwsgi_read_timeout 900;
    proxy_read_timeout 900;
    # Django media
    location /media  {
        alias /code/app/media;  # your Django project's media files - amend as required
    }

    location /static {
        alias /code/app/static; # your Django project's static files - amend as required
    }

    # Finally, send all non-media requests to the Django server.
    location / {
        proxy_pass  http://127.0.0.1:8000;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        include     /code/uwsgi_params; # the uwsgi_params file you installed
    }
}