【问题标题】:Get server URL in django docker在 django docker 中获取服务器 URL
【发布时间】:2018-06-23 10:20:25
【问题描述】:

我正在 docker 中运行 Django 项目。我有 3 个 docker 容器。

  1. 对于 Django 应用程序
  2. 对于 Postgres
  3. 对于 Nginx

我的docker-compose.yml 文件如下

version: "3"
services:
  db:
    restart: always
    container_name: tts-db
    image: postgres:9.6
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=tts
    expose:
      - "5432"

  nginx:
    image: nginx:latest
    container_name: tts-nginx
    ports:
      - "8000:8000"
    volumes:
      - ./nginx/site-enabled:/etc/nginx/conf.d
    depends_on:
      - web

  web:
    build: .
    container_name: tts-app
    environment:
      - DATABASE=db
      - DEBUG=False
      - STATICFILES_STORAGE=whitenoise.storage.CompressedManifestStaticFilesStorage
    depends_on:
      - db
    expose:
      - "8888"
    entrypoint: ./entry_point.sh
    command: gunicorn urdu_tts.wsgi:application -w 2 -b :8888
    restart: always

在我的 django 应用程序中,我需要访问主机地址。我使用了在本地主机中工作的request.get_host()。当我在 Docker 中运行它时,我得到像 http://web/media/voice/voice.wav 这样的 URL。我的nginx配置如下。

upstream web {
  ip_hash;
  server web:8888;
}

server {

    location ^/static/ {
        autoindex on;
        alias /static/;
    }

    location ~ ^/media/?(.*)$ {
        try_files /media/$1 /mediafiles/$1 =404;
    }

    location / {
        proxy_pass http://web;
        client_max_body_size 20m;
    }
    listen 8000;
    server_name localhost;
}

如何在 Docker 中获取服务器 url?

【问题讨论】:

  • 或许设置一个名为 SERVER_URL 的环境变量并通过您的设置在代码中访问它?
  • 在这种情况下,我每次在任何机器上运行时都必须设置它。
  • 但我想,无论您将代码部署到哪个服务器,您的 URL 都将保持不变?
  • 我还没有部署到任何实时服务器。这将是一个开源项目,因为任何人都可以在他们的机器上运行它。在环境变量中设置服务器 url 将解决我的问题,但我想要一个动态的解决方案。
  • 简单地说,您可以在撰写文件中添加一个hostname 字段,以便 django 以正确的方式使用主机名。例如。 hostname: yourserver.com

标签: python django docker nginx docker-compose


【解决方案1】:

在 Nginx 配置中使用以下配置对我有用。

proxy_set_header Host $http_host; # Define host as http_host.

现在我的 nginx 配置如下所示:

upstream web {
  ip_hash;
  server web:8888;
}

server {

    location ^/static/ {
        autoindex on;
        alias /static/;
    }

    location ~ ^/media/?(.*)$ {
        try_files /media/$1 /mediafiles/$1 =404;
    }

    location / {
        proxy_pass http://web;
        client_max_body_size 20m;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Protocol "";
        proxy_set_header X-Forwarded-Ssl "";
    }
    listen 8000;
    server_name localhost;
}

【讨论】:

  • 以防万一你写了这将是一个开源程序:不是每个人都使用 Nginx,如果你在 docker 之外部署,这可能会改变故事。此外,提供环境变量通常是生产使用的推荐方式。因此,我建议您至少在产品文档中提及使用 env var 或任何与 django 相关的配置。
  • 根据您使用的场景和系统,可以有多种方式。这里是根据所问的问题来回答的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多