我想用 nginx 配置我的 dockerized django 应用程序并在 EC2 实例上运行它,但我无法让它工作。我是 nginx 的初学者。
我这样做时的错误docker-compose -f production.yml up
是:
客户端在读取客户端请求行时发送了无效方法,客户端:80.153.184.19,服务器:ec2-XXXXX.eu-central-2.compute.amazonaws.com,请求:“�U�F'��Io�q�+!�P��
我当时就想,这是什么鬼?难道没有任何基本配置可以让它顺利运行吗?
我的 nginx 配置 myconf:
server {
set $my_host $host;
if ($host ~ "\d+\.\d+\.\d+\.\d+") {
set $my_host "ec2-XXXXX.eu-central-2.compute.amazonaws.com";
}
listen 80;
server_name ec2-XXXXX.eu-central-2.compute.amazonaws.com;
charset utf-8;
error_log /dev/stdout info;
access_log /dev/stdout;
location / {
proxy_pass http://django:5000;
proxy_set_header Host $my_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
我的docker-compose:
version: '3'
#volumes:
# production_caddy: {}
services:
django:
build:
context: .
dockerfile: ./compose/production/django/Dockerfile
image: heatbeat_website_production_django
env_file:
- ./.envs/.production/.django
- ./.envs/.production/.postgres
command: /start
nginx:
build:
context: .
dockerfile: ./compose/production/nginx/Dockerfile
ports:
- "0.0.0.0:8080:80"
depends_on:
- django
redis:
image: redis:5.0
我的 nginx dockerfile:
FROM tutum/nginx
RUN rm /etc/nginx/sites-enabled/default
COPY ./compose/production/nginx/myconf.conf /etc/nginx/sites-enabled/default
我非常感谢任何帮助...我很困惑...提前谢谢您!
答案1
我对这个部分很好奇:
set $my_host $host;
if ($host ~ "\d+\.\d+\.\d+\.\d+") {
set $my_host "ec2-XXXXX.eu-central-2.compute.amazonaws.com";
}
我在我的应用程序日志中看到如下异常:
django.core.exceptions.DisallowedHost: Invalid HTTP_HOST header: '54.148.178.171'...
当我执行反向代理时,我看到 IP 在 AWS 内部。但我无法识别资源。我看到您正在使用规范的服务器名称并将 IP 重写为它,但这是否违背了 ALLOWED_HOSTS 的目的?
好的,我明白了为什么你的解决方案让我感到不舒服。你正在获取任何 IP 地址并进行映射。典型的问题是捕获随时间变化的 ELB IP 地址。因此,将其放在位置块中要安全得多。在下面的示例中,我的 ALLOWED_HOSTS 列表中有“aws.elb.com”,并且在 ELP Health Check 选项卡上,我将 ping 目标指定为 ELB-health-check。这应该是一种更安全的方法。
location /ELB-health-check {
set $my_host $host;
if ($host ~ "\d+\.\d+\.\d+\.\d+") {
set $my_host "aws.elb.com";
}
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# set $my_host "aws.elb.com";
proxy_set_header Host $my_host;
# now send the request to the app
proxy_pass http://app_server;
}