我有一个应用程序容器位于 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 的转换是否出现错误?
非常不太可能。你为什么不测试一下呢?
我应该更改或设置任何标题设置吗?
除非你的应用程序正在寻找不同的标题。
这里有很多文字,但信息很少。一方面,您有一个广为使用/受人尊敬的软件,以其出色的性能特征而闻名;另一方面,您有一个神秘的应用程序,可能是内部编写的,可能会发送电子邮件。您告诉我们前者的一切,但没有告诉我们后者,以及两者之间的内容。
你可以有:
检查了 nginx 日志中的时间信息
修改了 nginx,以包含许多其他时间信息
检查应用程序服务器日志中的时间信息(如果有)。
修正应用服务器日志计时
测试了与应用服务器的直接连接,绕过了反向代理
在运行测试时监控 CPU 和内存使用情况
将反向代理指向具有已知良好性能特征的提供静态内容的 Web 服务器。
...甚至在考虑代码内部可能发生的事情之前就是这样的。
您提供的有关应用程序服务器的少量信息表明它正在连接到 SMTP 服务器 - 在这种情况下,您也可以在那里应用步骤 3、4 和 5。