Как настроить динамические поддомены в docker с помощью NGINX

#php #docker #nginx

#php #docker #nginx

Вопрос:

В принципе, мне нужны динамические поддомены, поэтому сайт должен быть доступен на любом поддомене в Docker, например:

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

У меня нет фиксированного количества поддоменов, поэтому я не могу просто поместить их все в файл hosts.

Имя_сервера также не помогло: server_name www.$hostname;

Все они должны указывать на один и тот же веб-сайт. Я пробовал обратный прокси-сервер jwilder, но не смог правильно его настроить.

У меня есть docker-compose.yml и Dockerfile .

Может ли кто-нибудь дать мне рабочий код, который я мог бы использовать, а затем изменить его для своих нужд. И если мне также нужно изменить файл hosts.

Я провел некоторое исследование, но моих знаний 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                                                                                                  amp;amp; 
    # 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       amp;amp; 
    # Xdebug
    pecl install xdebug                                                                                             amp;amp; 
    # Cleaning up after installation
    apt-get clean amp;amp; 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:
  

Комментарии:

1. Не могли бы вы предоставить код, который вы написали до сих пор?

2. @kuba, готово 🙂

3. В качестве конструктивного предложения для будущих вопросов: это поможет другим помочь вам, если вы сведете свой код к минимуму, необходимому для понимания и воспроизведения проблемы. В качестве дополнительного бонуса это также поможет вам лучше понять его.

Ответ №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 к веб-бэкэнду и anything-else.lvh.me к бэкэнду API.

Кроме того, вы можете предоставить несколько подстановочных узлов VIRTUAL_HOST переменной среды, чтобы она поддерживала как вашу локальную среду разработки, так и вашу производственную среду, например:

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

Важно отметить, что для того, чтобы это работало в производственной среде, ваш DNS также должен быть настроен на использование поддомена с подстановочными знаками.

В этой демонстрации lvh.me просто перенаправляется весь трафик на 127.0.0.1, который, в свою очередь, попадает на ваш nginx, который затем перенаправляет трафик внутрь вашего реального приложения.

Комментарии:

1. О, так это на самом деле lvh.me помогает разрешить адрес. Я менял имя виртуального хоста. Это важно упомянуть

2. Рад, что это помогло. Обратите внимание, что в конце я добавил еще немного информации о подстановочных знаках в производстве и использовании lvh.me .

3. Какие записи DNS нам понадобятся, чтобы разрешить такую настройку?