Как запустить несколько сайтов на одном сервере с помощью docker и nginx?

Я пытаюсь запустить два сайта на django на одном сервере под разными ip, возникает ошибка, что порт занят, я исправил порты, но сайт не запускается. Подскажите, пожалуйста, где ошибка? Когда перехожу по ip получаю ошибку This site can't be reached. У меня есть два файла docker-compose, и в каждом из них я запускаю nginx, на втором он выдает ошибку, подскажите пожалуйста как правильно его настроить. Я слышал, что есть вариант с общим файлом nginx, но не понимаю как его реализовать. Помогите пожалуйста.

Это второй файл docker-compose и его настройки. Буду очень благодарен за помощь

.env

#Django
# Should be one of dev, prod
MODE=prod
PORT=8008

#postgres
DB_NAME=xxx
DB_USER=xxx
DB_HOST=xxx
DB_PASSWORD=xxxx
DB_PORT=5432
POSTGRES_PASSWORD=mysecretpassword

#WSGI
WSGI_PORT=8008
WSGI_WORKERS=4
WSGI_LOG_LEVEL=debug

# Celery
CELERY_NUM_WORKERS=2

# Email
EMAIL_HOST_USER=xxxx
EMAIL_HOST_PASSWORD=xxxx

docker-compose.yml

version: '3'

services:

  backend:
    build: ./
    container_name: site_container
    restart: always
    command: ./commands/start_server.sh
    ports:
      - "${PORT}:${WSGI_PORT}"
    volumes:
      - ./src:/srv/project/src
      - ./commands:/srv/project/commands
      - static_content:/var/www/site
    env_file:
      - .env
    depends_on:
      - postgres

  postgres:
    image: postgres:12
    volumes:
      - pg_data:/var/lib/postgresql/data
    env_file:
      - .env
#    environment:
#      - DJANGO_SETTINGS_MODULE=app.settings.${MODE}

  nginx:
    image: nginx:1.19
    volumes:
      - ./nginx:/etc/nginx/conf.d
      - static_content:/var/www/site
    ports:
      - 81:80
      - 444:443
    env_file:
      - .env
    depends_on:
      - backend

volumes:
  pg_data: {}
  static_content: {}

default.conf

server {
    listen 80 default_server;

    server_name 183.22.332.12;

    location /static/ {
        root /var/www/site;
    }

    location /media/ {
        root /var/www/site;
    }

    location / {
        proxy_set_header Host $host;
        proxy_pass http://backend:8010;
    }
}

Если вы запускаете два виртуальных сервера с разными IP на одной машине, вы захотите указать IP-адрес в директиве listen:

server {
    listen      192.168.1.1:80;
    server_name example.net www.example.net;
    ...
}

server {
    listen      192.168.1.2:80;
    server_name example.com www.example.com;
    ...
}

Подробнее о том, как nginx обрабатывает запросы, можно узнать здесь: http://nginx.org/en/docs/http/request_processing.html

Если вы хотите запустить более одного сайта на сервере, вы можете

  1. используйте разные ip
  2. используйте разные port
  3. использовать разные domain
  4. использовать другой путь и переписать его ...

Вы можете выбрать один из советов из верхнего списка.

В вашей конфигурации вы выбрали разные ip и один и тот же порт, но вы установили весь сайт по умолчанию и не слушаете разные ip

server{
      listen      ip:port;
}

Обычно IP просто опускается.

Или вы можете использовать один ip и разные порты.

server{
      listen      port1;
}
server{
      listen      port2;
}

Или вы можете использовать один ip и один порт, но разные домены.

server{
      listen      port;
      server_name 1.a.com;
}
server{
      listen      port;
      server_name 2.a.com;
}
Вернуться на верх