Автор оригинала: Samuel James.
Обновление: Файл Docker-Compose был обновлен, чтобы позволить Django Server отправлять журналы для правильной logstash. Пожалуйста, ссылайтесь на хранилище, а также settings.py Для настроек журнала.
Этот пост является продолжением использования Docker с Elasticsearch, Logstash и Kibana (ELK), в котором мы связываем все приложение.
В конце этого поста я предложил, чтобы люди добавили Nginx к конфигурации докеров в виде практики. В этом посте я сделаю еще одну смелую попытку показать, что Nginx Есть и почему его следует учитывать для использования и как добавить его в существующую конфигурацию.
Чувствую себя взволнованным? давай сделаем это!
Немного фона
Обычно приложения, работающие на любой платформе (производстве или разработку), используют сервер, чтобы ответить на любой запрос от вызова клиента (пользователи приложения), структура беспокойства здесь Python/django который использует Runserver
(Python Management.py Runserver) в качестве сервера разработки для доставки контента всякий раз, когда производится запрос.
Хотя это хорошо, не рекомендуется использовать этот сервер разработки (Runserver) для производственной среды, и именно здесь появляется зеленый единорог, Зеленый единорог (Gunicorn) — это сервер Python HTTP, который взаимодействует с веб-приложением через Интерфейс шлюза веб-сервера (WSGI) средний человек между Веб-приложение и Веб-сервер Отказ
Тем не менее, использование Gunicorn само по себе как по производству сервера не полностью рекомендуется даже зеленым единорогом из их Страница документации
Несмотря на то, что доступно много HTTP Proxies, мы настоятельно рекомендуем вам использовать Nginx. Если вы выберете другой прокси-сервер, вам необходимо убедиться, что он буферирует медленные клиенты, когда вы используете Deformn Deal Punicorn. Без этого буферизации боевика будет легко подвержена отказанию от атак службы.
Что сказал, для нашей текущей настройки мы собираемся создать производственную среду, где мы включим Боевика и Nginx. Как наше Сервер и прокси-сервер соответственно для приложения.
Рабочий процесс : Веб-браузер делает запрос, который идет первым в Nginx (прокси-сервер), Nginx действует как прокси и отправляет этот запрос на Gunicorn (HTTP Python). Gunicorn принимает, что и передает веб-приложение через интерфейс, называемый интерфейсом Web-сервера (WSGI).
Время реализации
Вот Исходный код для справки.
Во-первых, мы расстались на наш конфигурацию Docker
У нас было простое Docker-Compose.yml
файл, где была размещена вся наша конфигурация. В зависимости от того, что вы хотите, вы можете разделить свою структуру файлов в Производство и Развитие Папка для вашей конфигурации DockerFile.
Для этого раздела я создал два дополнительных файла под названием docker-compose.override.yml
и docker-compose.prod.yml
и модифицировал уже существующую Docker-Compose.yml
файл.
# docker-compose.override.yml version: '3.2' services: django_web: labels: com.example.service: "web" com.example.description: "Use for the main web process" build: context: ./bookme/docker_compose/django/ dockerfile: Dockerfile image: bookme_django_web:1.0 depends_on: - db - es - kibana command: ["./docker_compose/django/wait_for_postgres.sh"] ports: - "8000:8000" environment: PRODUCTION: 'false' logging: driver: "json-file" volumes: - ./bookme:/app
# docker-compose.yml version: '3.2' services: db: restart: always image: postgres container_name: bookme_db volumes: - type: volume source: dbdata target: /pg_data ports: - "8001:5432" django_web: container_name: django_web environment: - LOGSTASH_HOST=logstash expose: - "5959" es: labels: com.example.service: "es" com.example.description: "For searching and indexing data" image: elasticsearch:5.4 container_name: bookme_es volumes: - type: volume source: esdata target: /usr/share/elasticsearch/data/ ports: - "9200:9200" kibana: labels: com.example.service: "kibana" com.example.description: "Data visualisation and for log aggregation" image: kibana:5.4.3 container_name: bookme_kibana ports: - "5601:5601" environment: - ELASTICSEARCH_URL=http://es:9200 depends_on: - es logstash: labels: com.example.service: "logstash" com.example.description: "For logging data" image: logstash:5.4.3 volumes: - ./:/logstash_dir command: logstash -f /logstash_dir/logstash.conf ports: - "5959:5959" depends_on: - es volumes: dbdata: esdata:
Здесь я использую Общая возможность конфигурации докера составляют, где файл docker-compose.override.yml
вместе с Docker-Compose.yml
Файл действует как наша конфигурация развития.
Подумайте об этом как замена, где Docker-Compose.yml
Конфигурация используется в качестве общей конфигурации для обоих Переопределить
(Развитие) и Продукты
(производственная) конфигурация.
# docker-compose.prod.yml version: '3.2' services: django_web: labels: com.example.service: "web" com.example.description: "Use for the main web process" build: context: ./bookme/docker_compose/django/ dockerfile: Dockerfile image: bookme_django_web:1.0 depends_on: - db - es - kibana command: ["./docker_compose/django/wait_for_postgres.sh"] environment: PRODUCTION: 'true' LOGSTASH_HOST: logstash expose: - "5959" logging: driver: "json-file" volumes: - ./bookme:/app nginx: restart: always container_name: nginx_server build: context: ./bookme/docker_compose/nginx/ dockerfile: Dockerfile depends_on: - django_web ports: - "0.0.0.0:80:80"
Переопределить
Файл имеет только django-web Сервис только в то время как Продукты
Config-файл имеет django_web Сервис и nginx услуга. Общий конфиг к ним обоим является Docker-Compose.yml
файл.
Что-то отметить здесь, это nginx
Сервис, которую мы ввели в docker-compose.prod.yml
Файл, где мы отображаем порт 80 на хост-машина для порта 80 в процессе Docker Daemon, как для django_web
Сервис здесь мы добавили окружающая среда Инструкция показать, что эта настройка специально для Производство
Отказ
Во-вторых, мы вводим файл Dockerfile и Nginx.conf для Nginx
# nginx dockerfile FROM nginx:latest ADD nginx.conf /etc/nginx/nginx.conf
Nginx Файл и конфигурация можно ссылаться здесь
# nginx.conf user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; ## Default: 1024, increase if you have lots of clients } http { include /etc/nginx/mime.types; # fallback in case we can't determine a type default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; upstream app { server django_web:8000; } server { # use 'listen 80 deferred;' for Linux # use 'listen 80 accept_filter=httpready;' for FreeBSD listen 80; charset utf-8; # Handle noisy favicon.ico messages in nginx location = /favicon.ico { return 204; access_log off; log_not_found off; } location / { # checks for static file, if not found proxy to app try_files $uri @proxy_to_app; } # django app location @proxy_to_app { proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; proxy_pass http://app; } } }
Чтобы понять nginx.conf
Файл давайте кратко посмотрим на документацию
Nginx состоит из модулей, которые контролируются директивами, указанными в файле конфигурации. Директивы делятся на простые директивы и директивы за блок. Простая директива состоит из имени и параметров, разделенных пробелами, и заканчивается с запятой. Классная директива имеет такую же структуру, как простая директива, но вместо точки с запятой заканчивается набором дополнительных инструкций, окруженных брекетами ({и}). Если указатель блок может иметь другие директивы внутри брекетов, он называется контекстом (примеры: события, HTTP, Server и местоположение).
Директивы, помещенные в файл конфигурации вне любого контекста, считаются в основном контексте. События и HTTP-директивы находятся в основном контексте, сервере в HTTP и местоположении на сервере.
Остальная часть линии после того, как знак # считается комментарием.
Чтобы узнать больше о блоках и директивах, как это еще одна тема самостоятельно, я предлагаю пройти через руководство их начинающего Документация и Официальная страница Nignx документации Gunicorn Отказ
В-третьих, мы редактируем наши start.sh скрипт
# start.sh #!/bin/bash function manage_app () { python manage.py makemigrations python manage.py migrate } function start_development() { # use django runserver as development server here. manage_app python manage.py runserver 0.0.0.0:8000 } function start_production() { # use gunicorn for production server here manage_app gunicorn bookme.wsgi -w 4 -b 0.0.0.0:8000 --chdir=/app --log-file - } if [ ${PRODUCTION} == "false" ]; then # use development server start_development else # use production server start_production fi
Две функции, чтобы принять к сведению здесь, start_development
функция, которая работает с использованием сервера разработки (Runserver) и start_prodction
Функция, которая работает с использованием производственного сервера (Gunicorn)
В-четвертых, мы определяем наш файл автоматизации, чтобы управлять тем, как приложение работает.
На данный момент мы определяем Makefile Чтобы автоматизировать повторную задачу, такую как начала среды разработки, производственная среда, SSH-ING в контейнеры, останавливая процесс и все … Вы также можете добавлять другие команды в файл.
# makefile start-dev: docker-compose up start-prod: docker-compose -f docker-compose.yml -f docker-compose.prod.yml up stop-compose: @eval docker stop $$(docker ps -a -q) docker-compose down ssh-nginx: docker exec -it nginx_server bash ssh-django-web: docker exec -it django_web bash ssh-db: docker exec -it db bash ssh-es: docker exec -it es bash ssh-kibana: docker exec -it kibana bash check-network-config-details: docker network inspect bookme_default build-prod: docker-compose -f docker-compose.yml -f docker-compose.prod.yml build build-dev: docker-compose build
Чтобы начать процесс докеров в производстве Run сделать старт-продукт
Чтобы начать процесс докеров в разработке Run делать старт
После того, как приложение увеличится и работает тип localhost
для производства и http://localhost: 8000/
Для разработки в вашем браузере для просмотра этой страницы.
Другие команды легко просмотреть в этот момент, но небольшая заметка в команде производства для Docker, команда docker-compose -f docker-compose.yml -f docker-compose.prod.yml up
Запускает процесс докера, используя только Docker-Compose.yml и docker-compose.prod.yml файлы.
Бег Docker-Compose Up
Здесь использует docker-compose.yml и docker-compose.override.yml файлы для запуска среды разработки.
ПРИМЕЧАНИЕ
Nginx Используется в качестве прокси-сервера в этом посте среди прочего, также можно использовать в качестве балансировщика нагрузки программного обеспечения, как прокси кеша, буферизация … так далее
Если вы чувствуете себя вдохновленным всем этим цистом на Nginx. Вы можете прочитать больше по этому поводу из их сайт и использовать этот пост на Цифровой океан Для более глубокого взгляда на Nginx.
Заключение
До сих пор мы добрались до этого до этого момента, мы смогли повторно структурировать наш файл составляющих докеров, добавил пару больше к тому, что мы имеем существующие, создали новый DockerFile для Nginx, а также добавление Nginx .CONF файл в проект.
Мы также создали Makefile для автоматизации процесса, который включает в себя начало среды производства и развития, а также другие команды управления. Это где мы завершаем это для этого блога.
Поздравляю, если вы сделали это здесь. Спасибо за чтение и не стесняйтесь любить этот пост.
Оригинал: «https://www.codementor.io/@samueljames/nginx-setting-up-a-simple-proxy-server-using-docker-and-python-django-f7hy4e6jv»