Рубрики
Uncategorized

Nginx: Настройка просмотра прокси-сервера с помощью Docker и Python / Django …

Вы когда-нибудь задавались вопросом, о чем сейчас Nginx и как это работает? Этот учебник дает вам больше внимания, почему вам нужно будет использовать NGINX в вашей производственной среде, и что он делает концептуально.

Автор оригинала: 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 Gunicorn-Health.png
Drawing.png.png

Рабочий процесс : Веб-браузер делает запрос, который идет первым в 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/ Для разработки в вашем браузере для просмотра этой страницы.

bookme_nginx.png.png.

Другие команды легко просмотреть в этот момент, но небольшая заметка в команде производства для 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»