【问题标题】:How to setup dynamic subdomains in docker with NGINX如何使用 NGINX 在 docker 中设置动态子域
【发布时间】:2019-04-12 17:37:15
【问题描述】:

基本上,我需要动态子域,因此该站点应该可以在 Docker 中的任何子域中使用,如下所示:

admin.example.com adrian.example.com files.example.com.

我没有固定数量的子域,所以我不能把它们都放在 hosts 文件中。

Server_name 也没有帮助:server_name www.$hostname;

它们都应该指向同一个网站。 我尝试了 jwilder 反向代理,但无法正确设置。

我有一个docker-compose.ymlDockerfile

谁能给我一个我可以使用的工作代码,然后根据我的需要进行更改。如果我还需要更改我的主机文件。

我做了一些研究,但是我的nginx和docker知识还不够。

Nginx.conf

server {
    server_name .example.local;

    listen 80 default;
    client_max_body_size 1008M;
    access_log /var/log/nginx/application.access.log;
    error_log  /var/log/nginx/error.log;
    root /application/web;
    index index.php;

    if (!-e $request_filename) {
        rewrite ^.*$ /index.php last;
    }

    location ~ \.php$ {
        fastcgi_pass php-fpm:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PHP_VALUE "error_log=/var/log/nginx/application_php_errors.log";
        include fastcgi_params;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        proxy_buffer_size   128k;
        proxy_buffers   4 256k;
        proxy_busy_buffers_size   256k;
    }

}

Dockerfile

FROM phpdockerio/php73-fpm:latest

RUN mkdir /application
WORKDIR "/application"
COPY . /application

# Fix debconf warnings upon build
ARG DEBIAN_FRONTEND=noninteractive

RUN apt-get update                                                                                                  && \
    # Installing packages
    apt-get -y --no-install-recommends --assume-yes --quiet install                                                    \
    nano curl git ca-certificates ruby-dev gcc automake libtool rubygems build-essential make php-pear                 \
    php7.3-mysql php7.3-bcmath php-imagick php7.3-intl php7.3-gd php-yaml php7.3-soap php7.3-dev mysql-client       && \
    # Xdebug
    pecl install xdebug                                                                                             && \
    # Cleaning up after installation
    apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

docker-compose.yml

version: "3.1"
services:

  db:
    image: mysql:5.6
    container_name: ls-db
    working_dir: /application
    volumes:
      - .:/application:cached      # User-guided caching
      - ./phpdocker/sql:/docker-entrypoint-initdb.d
    environment:
      MYSQL_DATABASE: ls
      MYSQL_USER: drupal
      MYSQL_PASSWORD: drupal
      MYSQL_ROOT_PASSWORD: root
    ports:
      - "6006:3306"
    networks:
      - ls

  web:
    image: nginx:alpine
    container_name: ls-webserver
    working_dir: /application
    volumes:
      - .:/application:cached      # User-guided caching
      - ./phpdocker/nginx/nginx.conf:/etc/nginx/conf.d/default.conf
    ports:
      - "6060:80"
    networks:
      - ls

  php-fpm:
    build: phpdocker/php-fpm
    container_name: ls-php-fpm
    working_dir: /application
    volumes:
      - .:/application:cached      # User-guided caching
      - ./phpdocker/php-fpm/php-ini-overrides.ini:/etc/php/7.3/fpm/conf.d/99-overrides.ini
    networks:
      - ls

networks:
  ls: # this network (app1)
    driver: bridge

volumes:
  db:

【问题讨论】:

  • 你能提供你目前写的代码吗?
  • @kuba ,完成 :)
  • 作为对未来问题的建设性建议:如果您将代码压缩到理解和重现问题所需的最低限度,它将帮助其他人帮助您。作为额外的奖励,它还将帮助您更好地理解它。

标签: php docker nginx


【解决方案1】:

不确定您使用 jwilder 的反向代理进行了哪些尝试和失败,但它是解决手头确切问题的绝佳方法,无需处理 nginx 配置和复杂的 compose 配置。

这是一个工作代码,您甚至不必更改您的主机文件

version: '3.7'

services:
  nginx:
    image: jwilder/nginx-proxy
    ports: ["80:80"]
    volumes:
    - /var/run/docker.sock:/tmp/docker.sock:ro
    environment:
      DEFAULT_HOST: fallback.lvh.me

  api:
    image: dannyben/whoami
    environment:
      MESSAGE: I am the API
      VIRTUAL_HOST: "*.lvh.me"

  web:
    image: dannyben/whoami
    environment:
      MESSAGE: I am the WEB
      VIRTUAL_HOST: "www.lvh.me"

为了让它工作,你必须先启动 nginx 代理:

$ docker-compose up -d nginx

只有这样,后端服务

$ docker-compose up -d api web

然后你可以访问www.lvh.me查看Web后端,访问anything-else.lvh.me查看API后端。

此外,您可以为VIRTUAL_HOST 环境变量提供多个通配符主机,以便它同时支持您的本地开发环境和生产环境,如下所示:

VIRTUAL_HOST: "*.lvh.me,*.your-real-domain.com"

请务必注意,为了使其在生产环境中正常工作,您的 DNS 还应设置为使用通配符子域。

在这个演示中,lvh.me 只是将所有流量转发到 127.0.0.1,然后再到达您的 nginx,然后将流量向内转发到您的实际应用程序。

【讨论】:

  • 哦,实际上是lvh.me 有助于解析地址。我正在更改虚拟主机的名称。这一点很重要
  • 很高兴它有帮助。请注意,我在最后添加了一些关于生产中的通配符和使用 lvh.me 的更多信息。
  • 我们需要什么样的 DNS 记录才能进行这种设置?
猜你喜欢
  • 2021-03-02
  • 1970-01-01
  • 2015-02-13
  • 2022-01-24
  • 2016-09-27
  • 2012-09-19
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
相关资源
最近更新 更多