NGINX и статические файлы TRAEFIK не работают с HTTPS в продакшене - PullRequest
0 голосов
/ 06 августа 2020

Я разрабатываю веб-сайт для своей ассоциации Вот . Он использует Django 3.0.7 и PostgreSQL. Я следую этому учебнику , чтобы он работал в хорошем состоянии как в разработке, так и в производстве.

В режиме разработки все хорошо, сайт работает отлично, файлы stati c и медиа файлы обслуживается встроенным веб-сервером Django.

Я тестирую "ванильную" (взятую из учебника) продукцию на моем локальном компьютере, она тоже работает. Но руководство для меня не является полным, поэтому после его завершения я решил адаптировать код в соответствии со своими потребностями. Следуя руководству, я создал новый docker -compose и новый файл dockerfile для производства. Но между учебником и сайтом, который я хочу запустить в производство, есть 2 различия:

  1. Я хочу использовать TREAFIK для маршрутизации трафика c по другому URL-адресу (appli.amis-simserhof.fr ), потому что в будущем у меня будут другие проекты на том же сервере с другими поддоменами ..
  2. Я хочу защитить сайт с помощью HTTPS. Поэтому я использую CERTBOT (давайте зашифровать) для создания сертификатов. Я добавляю эти сертификаты в TREAFFIK, чтобы использовать HTTPS, и он работает.

Итак, я адаптировал файл docker -compose с моими новыми материалами:

version: '3.7'

services:
  **traefik:
    image: traefik:v1.7.12
    command: [ 
      "--loglevel=INFO",
      "--api",
      "--docker",
      "--docker.domain=amis-simserhof.fr",
      "--entrypoints=name:https address::443 tls:/etc/certs/fullchain.pem,/etc/certs/privkey.pem",
      "--entrypoints=name:http address::80 redirect.entrypoint:https",
      ]
    ports:
      - 80:80               # http
      - 443:443             # https
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/letsencrypt/live/amis-simserhof.fr/fullchain.pem:/etc/certs/fullchain.pem
      - /etc/letsencrypt/live/amis-simserhof.fr/privkey.pem:/etc/certs/privkey.pem**
  web:
    image: registry.gitlab.com/guillaumekoenigtncy/aas-web:latest
    command: gunicorn aas.wsgi:application --bind 0.0.0.0:8000
    expose:
      - 8000
    volumes:
      - static_volume:/home/app/web/staticfiles
      - media_volume:/home/app/web/mediafiles
    environment:
      - DEBUG=0
      - SECRET_KEY=change_me
      - DJANGO_ALLOWED_HOSTS=localhost appli.amis-simserhof.fr
      - SQL_ENGINE=django.db.backends.postgresql
      - SQL_DATABASE=postgres
      - SQL_USER=postgres
      - SQL_PASSWORD=postgres
      - SQL_HOST=db
      - SQL_PORT=5432
      - DATABASE=postgres
    labels:
      - traefik.frontend.rule=HostRegexp:appli.amis-simserhof.fr
      - traefik.frontend.entryPoints=https
    depends_on:
      - db
  db:
    image: postgres:12.0-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
  **nginx:
    image: registry.gitlab.com/guillaumekoenigtncy/aas-nginx:latest
    volumes:
      - static_volume:/home/app/web/staticfiles
      - media_volume:/home/app/web/mediafiles
    expose:
      - 80
      - 443
    depends_on:
      - web**
      
volumes:
  postgres_data:
  static_volume:
  media_volume:

Я также создал файл докеров и файл конфигурации для nginx:

FROM nginx:1.19.0

RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d
upstream website {
    server web:8000;
}

server {

    listen 80; 
    listen [::]:80;

    access_log off;
    server_name appli.amis-simserhof.fr;

    location / {
        proxy_pass http://website;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }

    location /staticfiles/ {
        alias /home/app/web/staticfiles/;
    }

    location /mediafiles/ {
        alias /home/app/web/mediafiles/;
    }

}

Проблема в том, что теперь файлы stati c не обслуживаются в производстве (я получил 404) . Когда я устанавливаю DEBUG в значение True в settings.py файлов проекта обслуживаются так, что это означает, что файлы stati c присутствуют в правильной папке, которую я установил в настройках.

STATIC_URL = "/staticfiles/"
STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles")

MEDIA_URL = "/mediafiles/"
MEDIA_ROOT = os.path.join(BASE_DIR, "mediafiles")

In production, я правильно выполнил команду python manage.py collectstatic. Я заглядываю внутрь обоих контейнеров, ngnix и web, и оба файла находятся в правильном каталоге.

Итак, я прихожу к выводу, что моя конфигурация не работает, но когда я внес в нее изменения, я увидел эти изменения в nginx логов контейнеров. Ошибок нет ...

Последние 2 дня пробую все: установить ssl в конфиге nginx и удалить его из траэфик (сайт недоступен), выставить или нет порты 80 и 443 в nginx или traefik (конфликты на открытых портах или слишком много ошибок перенаправления) добавьте или удалите / в конце или в начале блоков или псевдоним в конфигурации nginx (ничего не меняйте), et c.

Если у вас есть подсказки или подсказки, я был бы очень признателен ...

Хорошего дня :)

1 Ответ

0 голосов
/ 22 августа 2020

Я смог определить stati c путь со следующей конфигурацией службы nginx:

version: '3.7'

services:
    server:
        container_name: dj
        build:
            context: ./server/project/
        restart: unless-stopped
        expose:
            - 8000
        volumes:
            - static_volume:/app/staticfiles
            - media_volume:/app/media
        command: gunicorn project.wsgi:application --bind 0.0.0.0:8000
        networks:
           - web
    nginx:
        image: nginx:1.19.2-alpine
        container_name: nginx
        restart: unless-stopped
        volumes:
            - static_volume:/app/staticfiles
            - media_volume:/app/media
        labels:
           - "traefik.enable=true"
           - "traefik.http.routers.${SERVICE}.rule=(Host(`${DOMAIN_NAME}`) && PathPrefix(`/static`)) || (Host(`${DOMAIN_NAME}`) && PathPrefix(`/media`))"
           - "traefik.http.routers.${SERVICE}.tls.certresolver=letsEncrypt"
           - "traefik.http.routers.${SERVICE}.entrypoints=web-secure"
           - "traefik.http.services.${SERVICE}.loadbalancer.server.port=80"
        depends_on:
            - server
        networks:
           - web

volumes:
    static_volume:
    media_volume:

networks:
   web:
      external: true

Обратите внимание на эту строку:

- "traefik.http.routers.static-http.rule=Host(`ex.example.com`) && PathPrefix(`/static`)"

изменить ex.example.com к вам домен

Вот часть моей конфигурации, «серверная» часть еще не завершена

...