系统响应请求很慢。该怎么办?

系统响应请求很慢。该怎么办?

我有一个应用程序容器位于 Nginx 反向代理后面。当我通过 https 访问该应用程序时,POST 请求返回 302,然后 GET 返回 200。通过浏览器查看监控:

Request URL: https://myapp.com
Request Method: POST
Status Code: 302 Found
Remote Address: 192.168.10.20:443
Referrer Policy: no-referrer-when-downgrade
Request URL: https://myapp.com
Request Method: GET
Status Code: 200 OK
Remote Address: 192.168.10.20:443
Referrer Policy: no-referrer-when-downgrade

系统需要很长时间才能响应。当我同时进行多次访问时,POST 和 GET 时间会按比例增加,直到容器处于“退出”状态。当 Django 应用程序尝试发送多封密码重置电子邮件时,就会出现问题。HTTP 到 HTTPS 或反之亦然的转换是否错误?我应该更改或设置任何标头设置吗?我之所以问这些问题,是因为我有一个反向代理在另一个代理后面。第一个代理处理 DNS 名称,第二个代理(容器)处理 Django 静态文件。第二个代理将请求传递给使用 mysql 数据库的应用程序容器。

以下是一些基本设置:

主服务器 - 反向代理服务器

myapp.conf:

server {
    listen              443 ssl http2;
    server_name         myapp.com;

    proxy_intercept_errors on;
    include /usr/share/nginx/html/nginx-errors-ptbr/nginx-errors.conf;

    # SSL
    ssl_certificate     /etc/nginx/ssl/myapp.crt;
    ssl_certificate_key /etc/nginx/ssl/myapp.key;


    # logging
    access_log          /var/log/nginx/id.access.log;
    error_log           /var/log/nginx/id.error.log warn;

    # reverse proxy
    location / {
        proxy_pass http://192.168.2.15:8080;
        include    proxy.conf;
    }

}

# HTTP redirect
server {
    listen      80;
    server_name myapp.com;
    return      301 https://myapp.com$request_uri;
}

代理服务器配置文件(proxy.conf):

proxy_http_version                 1.1;
proxy_cache_bypass                 $http_upgrade;

# Proxy headers
proxy_set_header Upgrade           $http_upgrade;
proxy_set_header Connection        $connection_upgrade;
proxy_set_header Host              $host;
proxy_set_header X-Real-IP         $remote_addr;
proxy_set_header Forwarded         $proxy_add_forwarded;
proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host  $host;
proxy_set_header X-Forwarded-Port  $server_port;

# Proxy timeouts
proxy_connect_timeout              60s;
proxy_send_timeout                 60s;
proxy_read_timeout                 60s;

辅助服务器 - 反向代理容器

upstream django {
    server cont-django-01:8001;
}

server {

    listen 8080;

    location / {
        proxy_pass http://django;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
    }

    location /static/ {
        alias /var/www/app/static/;
    }

}

Django 容器日志(cont-django-01):

File "/usr/local/lib/python3.9/smtplib.py", line 255, in __init__
    (code, msg) = self.connect(host, port)
  File "/usr/local/lib/python3.9/smtplib.py", line 341, in connect
    self.sock = self._get_socket(host, port, self.timeout)
  File "/usr/local/lib/python3.9/smtplib.py", line 312, in _get_socket
    return socket.create_connection((host, port), timeout,
  File "/usr/local/lib/python3.9/socket.py", line 844, in create_connection
    raise err
  File "/usr/local/lib/python3.9/socket.py", line 832, in create_connection
    sock.connect(sa)
TimeoutError: [Errno 110] Connection timed out

答案1

从 HTTP 到 HTTPS 或从 HTTPS 到 HTTPS 的转换是否出现错误?

非常不太可能。你为什么不测试一下呢?

我应该更改或设置任何标题设置吗?

除非你的应用程序正在寻找不同的标题。

这里有很多文字,但信息很少。一方面,您有一个广为使用/受人尊敬的软件,以其出色的性能特征而闻名;另一方面,您有一个神秘的应用程序,可能是内部编写的,可能会发送电子邮件。您告诉我们前者的一切,但没有告诉我们后者,以及两者之间的内容。

你可以有:

  1. 检查了 nginx 日志中的时间信息

  2. 修改了 nginx,以包含许多其他时间信息

  3. 检查应用程序服务器日志中的时间信息(如果有)。

  4. 修正应用服务器日志计时

  5. 测试了与应用服务器的直接连接,绕过了反向代理

  6. 在运行测试时监控 CPU 和内存使用情况

  7. 将反向代理指向具有已知良好性能特征的提供静态内容的 Web 服务器。

...甚至在考虑代码内部可能发生的事情之前就是这样的。

您提供的有关应用程序服务器的少量信息表明它正在连接到 SMTP 服务器 - 在这种情况下,您也可以在那里应用步骤 3、4 和 5。

相关内容