EC2 上 Nginx 与 django 的基本配置:

EC2 上 Nginx 与 django 的基本配置:

我想用 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;
     }

相关内容