在我的 Django 应用程序中,我使用 AWS RDS PostgreSQL 作为我的数据库后端。我在尝试发送 POST 请求以在数据库中存储数据时遇到问题。加载一段时间后,我收到“502 Bad Gateway”错误。有趣的是,我可以成功从数据库读取数据。
我还有一个移动应用程序和一个用 Vue.js 开发的单独的前端应用程序。从移动应用程序发出 POST 请求时,所有操作都可以完美运行,但与 OTP 相关的操作除外,该操作也会出现“502”错误。应用程序中的其他 CRUD 操作按预期运行。此外,从 Django 管理面板和仪表板可以正常读取和写入数据,这两个面板都是在 Django 中构建的。
在前端应用程序中,我可以成功写入数据,但在尝试写入时遇到“502”错误。当我将 Application Load Balancer 的 DNS 点的 CNAME 添加到域时,会特别出现此问题。但是,如果我在 A 记录中使用 IP 地址指向域,则一切都会按预期运行。
此问题的根源可能是什么以及如何解决?
NGINX 设置
server {
# add here the ip address of your server
# or a domain pointing to that ip (like example.com or www.example.com)
server_name example.com www.example.com;
keepalive_timeout 5;
client_max_body_size 4G;
error_log /var/www/app/app-backend/logs/nginx-error.log;
location /static/ {
alias /var/www/app/static/;
}
location /media/ {
proxy_pass https://appbkt.s3.ap-south-1.amazonaws.com;
}
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://unix:/var/www/app/gunicorn.sock;
proxy_send_timeout 300;
proxy_read_timeout 300;
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = www.example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
server_name example.com www.example.com;
listen 80;
return 404; # managed by Certbot
}
这已添加到 django settings.py 文件中
CSRF_TRUSTED_ORIGINS = ['https://www.example.com', 'https://example.com','https://app-alb-asg-3817902479.ap-south-1.elb.amazonaws.com'
]
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
我认为这与您的 SSL 设置有关。 我不明白为什么你在 ALB 上为带有证书的端口 443 定义了一个监听器,同时在 nginx 上定义了一个带有证书的端口 443 监听器。 常见的方法是在 ALB 上设置 SSL,并将所有内容转发到 nginx 上的端口 80。您可以避免在 nginx 上处理 SSL。
所以我建议检查你的 nginx 配置,以便在端口 80 上只有一个服务器块;然后更改您的 ALB 设置以将任何 HTTP 请求重定向到 HTTPS(使用重定向规则),并将端口 443 转发到您的 ec2 实例上的端口 80。