Как настроить Nginx для веб-приложения Flask

Nginx Программа перевода самородков Flask

Как настроить Nginx для веб-приложения Flask

Введение

В этой статье я расскажу, что такоеNginxи как настроить Nginx для веб-приложений Flask. Эта статья«Развертывание приложений Flask»Часть цикла статей. Я нашел несколько статей о Nginx и его настройке, но я хотел бы более подробно остановиться на том, как использовать Nginx для обслуживания веб-приложения Flask и как его настроить. Файлы конфигурации Nginx немного сбивают с толку, потому что большая часть документации просто перечисляет файл конфигурации, не объясняя, что делает каждый шаг конфигурации. Надеюсь, эта статья дала вам четкое представление о том, как настроить Nginx для вашего приложения.

Что такое Nginx?

На официальном сайте Nginx (произносится как «engine-X») есть краткое описание инструмента:

Nginx — это бесплатный высокопроизводительный HTTP-сервер с открытым исходным кодом и обратный прокси-сервер, а также прокси-сервер IMAP/POP3. Nginx известен своей высокой производительностью, стабильностью, широкими возможностями, простой конфигурацией и низким потреблением ресурсов.

Мы можем расширить, чтобы понять это описание... Nginx — этоHTTPзапрашиваемый сервер. Для типичного веб-приложения Nginx можно настроить так, чтобы он выполнял следующие действия для HTTP-запросов:

  • запроситобратный проксина восходящие серверы (например, Gunicorn, uWsgi, Apache и т. д.).
  • Подавайте статические ресурсы (файлы Javascript, файлы CSS, изображения, документы, статические файлы HTML).

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

На следующем рисунке представлена ​​упрощенная схема, описывающая, как Nginx обслуживает веб-приложение Flask:

生产环境中的 Nginx

Nginx будет обрабатывать HTTP-запросы из Интернета (например, от пользователей вашего приложения). В зависимости от того, как вы настроите Nginx, он может обслуживать и возвращать статический контент (файлы Javascript, файлы CSS, изображения, документацию, статические файлы HTML) непосредственно запрашивающему источнику. Кроме того, он может реверсировать прокси-запросы к WSGI (Web Server Gateway Interface), чтобы вы могли создавать динамический контент (HTML) в своем веб-приложении Flask и возвращать его пользователю.

На приведенной выше диаграмме предполагается, что пользователь использует Docker, но конфигурация Nginx без Docker очень похожа (только без концепции контейнеров на диаграмме).

Зачем вам Nginx и Gunicorn?

В качестве HTTP-сервера Nginx используется во многих приложениях:список. Он предоставляет множество функций, но не может напрямую обслуживать приложения Flask. иGunicornЭто можно сделать. Nginx получает HTTP-запрос и передает его Gunicorn для обработки вашим приложением Flask (например, маршрут, который вы определили в view.py). Gunicorn — это сервер WSGI, который обрабатывает HTTP-запросы и направляет их в любое приложение Python с поддержкой WSGI (например, Flask, Django, Pyramid и т. д.).

Структура конфигурационного файла Nginx

Примечание: в этой статье используется Nginx версии 1.11.3.Расположение файла конфигурации зависит от вашей версии Nginx, например /opt/nginx/conf/.

В зависимости от того, как вы устанавливаете и используете Nginx, структура файла конфигурации будет немного отличаться. Большинство структур конфигурации выглядит следующим образом:

Структура 1

Если вы используете Nginx, скомпилированный из исходного кода или официальный образ Docker, файлы конфигурации находятся в /etc/nginx/, а основной файл конфигурации — /etc/nginx/nginx.conf. Нижняя строка в /etc/nginx/nginx.conf загружает в конфигурацию остальное содержимое конфигурационного файла в каталоге /etc/nginx/conf.d/:

  • include /etc/nginx/conf.d/*.conf;

Структура 2

Если вы установили Nginx через диспетчер пакетов (например, apt-get в Ubuntu), то ваш /etc/nginx/ будет иметь следующие два подкаталога:

  • Sites-Available — содержит несколько файлов конфигурации для нескольких сайтов.
  • site-enabled — содержит символическую ссылку на файл конфигурации в каталоге, доступном для сайтов.

Эти два каталога унаследованы от Apache и будут применяться к конфигурации Nginx.

Поскольку мое приложение Flask развернуто с помощью Docker, в этой статье основное внимание будет уделено структуре 1 выше.

Конфигурация Nginx

Файл конфигурации верхнего уровня для Nginx — nginx.conf. Nginx принимает многоуровневые файлы конфигурации, что также позволяет пользователям гибко настраивать свои собственные приложения. Подробнее о каждом параметре в файле конфигурации см.Официальная документация Nginx.

В Nginx параметры конфигурации организованы по блокам конфигурации. Ниже приведены блоки конфигурации, на которые мы будем ссылаться в этой статье:

  • Main — определяется в nginx.conf (все параметры, не входящие в блок конфигурации, относятся к блоку Main)
  • События — определены в nginx.conf
  • Http — определено в nginx.conf
  • Сервер - определен вapplication_name.conf

Разделение этих блоков конфигурации на отдельные файлы позволяет вам определить высокоуровневую конфигурацию для Nginx в nginx.conf и других файлах *.conf, чтобы определить параметры виртуального хоста или сервера для вашего приложения.

детали nginx.conf

Файл nginx.conf по умолчанию, который поставляется вместе с установкой Nginx, можно использовать для первоначальной настройки большинства серверов. Давайте подробнее рассмотрим содержимое nginx.conf и подумаем, как расширить сюда настройки по умолчанию.

Основной раздел

Основной конфигурационный блок nginx.conf (то есть те параметры, которых нет в конфигурационном блоке) это:

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

Первый параметр (user) определит владельца сервера Nginx и работающего пользователя. Когда Nginx запускается через контейнер Docker, достаточно использовать значения по умолчанию.

Второй параметр (worker_processes) определяет количество рабочих процессов. Рекомендуемое значение по умолчанию для этого параметра — количество ядер, используемых в данный момент сервером. Для базового виртуального частного сервера (VPS) значение по умолчанию, равное 1, является хорошим выбором. Вы можете увеличить это число по мере увеличения производительности VPS.

Третий параметр (error_log) определяет место, где в файловой системе хранится журнал ошибок, и может дополнительно определить параметр, указывающий минимальный уровень ошибок, которые необходимо регистрировать. Используйте значение по умолчанию для этого параметра.

Четвертый параметр (pid) определяет расположение файла для хранения pid основного процесса Nginx. Используйте значение по умолчанию для этого параметра.

блок конфигурации событий

Блок конфигурации событий определяет некоторые параметры, влияющие на обработку соединения. Это также первый блок конфигурации в файле Nginx.conf:

events {
    worker_connections  1024;
}

В этом блоке конфигурации есть только один единственный параметр (worker_connections), который определяет максимальное количество одновременных подключений, которые может открыть рабочий процесс. Значение по умолчанию определяет в общей сложности 1024 доступных подключения, и его не нужно изменять (но вам нужно будет подсчитать количество подключений, которые пользователи запрашивают на сайте и запрашивают сервер WSGI).

блок конфигурации http

Блок конфигурации http определяет некоторые параметры того, как Nginx обрабатывает веб-трафик HTTP. Это второй блок конфигурации в файле nginx.conf:

http {
    include       /etc/nginx/mime.types;
    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;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

Первый параметр (include) указывает файл конфигурации, который необходимо импортировать. Здесь импортируется файл mime.types, расположенный в /etc/nginx/. Этот файл определяет различные типы файлов, поддерживаемые Nginx. Этот параметр должен сохранить значение по умолчанию.

Второй параметр (default_type) указывает тип файла по умолчанию, возвращаемый пользователю. Для приложений Flask возвращаются динамически сгенерированные файлы HTML, поэтому этот параметр следует изменить наdefault_type text/html;

Третий параметр (log_format) указывает формат журнала и должен оставаться форматом по умолчанию.

Четвертый параметр (access_log) указывает расположение доступа к журналу Nginx и должно сохранить значение по умолчанию.

Пятый параметр (send_file) и шестой параметр (tcp_nopush) немного сложнее. может относиться к«Оптимизация Nginx»статье, чтобы понять эти параметры (включаяtcp_nodelay) Детали. Поскольку мы собираемся использовать Nginx для доставки статического контента, мы можем установить эти параметры следующим образом:

    sendfile        on;
    tcp_nopush     on;
    tcp_nodelay    on;

Седьмой параметр (keepalive_timeout) определяет время ожидания для сохранения соединения с клиентом и должно сохранять значение по умолчанию.

Восьмой параметр (gzip) определяет использование алгоритма сжатия gzip для уменьшения объема передаваемых данных. Хотя объем данных уменьшается, это также увеличивает потребление производительности платформы в процессе сжатия, а преимущества компенсируются в два раза, поэтому оставьте значение по умолчанию (выключено).

Девятый и последний параметр (include) определяет другие файлы конфигурации с суффиксом .conf, расположенные в /etc/nginx/conf.d/. Теперь мы будем использовать эти файлы конфигурации для определения сервера статического содержимого и обратного прокси-сервера для сервера WSGI.

Окончательная конфигурация nginx.conf

Помимо настроек nginx.conf по умолчанию, нам нужно настроить некоторые параметры (и добавить комментарии) по мере необходимости, вот окончательная версия nginx.conf:

# Define the user that will own and run the Nginx server
user  nginx;
# Define the number of worker processes; recommended value is the number of
# cores that are being used by your server
worker_processes  1;

# Define the location on the file system of the error log, plus the minimum
# severity to log messages for
error_log  /var/log/nginx/error.log warn;
# Define the file that will store the process ID of the main NGINX process
pid        /var/run/nginx.pid;

# events block defines the parameters that affect connection processing.
events {
   # Define the maximum number of simultaneous connections that can be opened by a worker process
   worker_connections  1024;
}

# http block defines the parameters for how NGINX should handle HTTP web traffic
http {
   # Include the file defining the list of file types that are supported by NGINX
   include       /etc/nginx/mime.types;
   # Define the default file type that is returned to the user
   default_type  text/html;

   # Define the format of log messages.
   log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                     '$status $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for"';

   # Define the location of the log of access attempts to NGINX
   access_log  /var/log/nginx/access.log  main;

   # Define the parameters to optimize the delivery of static content
   sendfile        on;
   tcp_nopush     on;
   tcp_nodelay    on;

   # Define the timeout value for keep-alive connections with the client
   keepalive_timeout  65;

   # Define the usage of the gzip compression algorithm to reduce the amount of data to transmit
   #gzip  on;

   # Include additional parameters for virtual host(s)/server(s)
   include /etc/nginx/conf.d/*.conf;
}
Настройте Nginx для развертывания статического контента и обратного прокси-сервера.

Если вы посмотрите на файл /etc/nginx/conf.g/default.conf по умолчанию, вы увидите, что он предоставляет простой блок конфигурации сервера с множеством дополнительных настроек, которые можно использовать, раскомментировав его. Мы не будем рассматривать конфигурацию в этом файле один за другим, а сразу обсудим ключевые параметры, которые нам пригодятся для развертывания статического контента и обратного прокси-сервера WSGI. Рекомендуется следующееapplication_nameКонфигурация .conf:

# Define the parameters for a specific virtual host/server
server {
   # Define the directory where the contents being requested are stored
   # root /usr/src/app/project/;

   # Define the default page that will be served If no page was requested
   # (ie. if www.kennedyfamilyrecipes.com is requested)
   # index index.html;

   # Define the server name, IP address, and/or port of the server
   listen 80;
   # server_name xxx.yyy.zzz.aaa

   # Define the specified charset to the “Content-Type” response header field
   charset utf-8;

   # Configure NGINX to deliver static content from the specified folder
   location /static {
       alias /usr/src/app/project/static;
   }

   # Configure NGINX to reverse proxy HTTP requests to the upstream server (Gunicorn (WSGI server))
   location / {
       # Define the location of the proxy server to send the request to
       proxy_pass http://web:8000;

       # Redefine the header fields that NGINX sends to the upstream server
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

       # Define the maximum file size on file uploads
       client_max_body_size 5M;
   }
}

Блок конфигурации сервера определяет параметры для конкретного виртуального хоста или сервера. Обычно это одно веб-приложение, которое вы развертываете на своем VPS.

Первый параметр (root) определяет, где хранится запрошенный контент. Когда Nginx получает запрос пользователя, он ищет в этом каталоге. Поскольку он определен в пути "/" по умолчанию, этот ненужный параметр можно закомментировать.

Второй параметр (index) определяет страницу по умолчанию, которую нужно получить при запросе неуказанной страницы (например, при посещении www.kennedyfamilyrecipes.com). Поскольку мы используем динамический контент, созданный веб-приложением Flask, нам нужно закомментировать этот параметр.

Первые два параметра (root и index) включены в этот файл конфигурации и в некоторых случаях могут использоваться для настройки Nginx.

Третий параметр (server_name) и четвертый параметр (listen) необходимо использовать вместе. Если ваше веб-приложение было развернуто, вам необходимо установить следующие параметры:

server {
   …
   Listen 192.241.229.181;
   …
}

Если вы развертываете еще одно приложение Flask blog.kennedyfamilyrecipes.com в дополнение к www.kennedyfamilyrecipes.com, вам необходимо разделить блок конфигурации «сервер» и настроить «user_name» и «listen» отдельно:

server {
    listen 80;
    server_name *.kennedyfamilyrecipes.com;

    . . .

}

server {
    listen 80;
    server_name blog.kennedyfamilyrecipes.com;

    . . .

}

Nginx выберет «имя_сервера», которое лучше всего соответствует запросу. То есть запрос «blog.kennedyfamilyrecipes.com» будет предпочтительно соответствовать «blog.kennedyfamilyrecipes.com», а не «*.kennedyfamilyrecipes.com».

Пятый параметр (charset) определяет значение набора символов заголовка ответа «Content-Type», которое должно быть установлено в «utf-8».

Первый блок конфигурации «местоположение» определяет, что Nginx необходимо доставлять статический контент в следующие места:

  location /static {
       alias /usr/src/app/project/static;
   }

locationБлок конфигурации определяет, как обрабатывать запрошенный URI (часть после имени домена или IP, номера порта). В этом первом блоке местоположения (/static) мы определяем, что Nginx будет обрабатывать запросы с www.kennedyfamilyrecipes.com/static/, извлекая файлы, расположенные в каталоге /usr/src/app/project/static. Например, запрос www.kennedyfamilyrecipes.com/static/img/img_1203.jpg вернет файл изображения, расположенный по адресу /usr/src/app/project/static/img/img_1203.jpg. Если файл не существует, верните пользователю код ошибки 404 (НЕ НАЙДЕН).

Второй блок конфигурации местоположения ("/") определяет обратный прокси. Этот блок конфигурации местоположения определяет, как Nginx будет передавать запросы на сервер WSGI (Gunicorn), где находится наш интерфейс приложения Flask. Рассмотрим подробнее каждый из этих параметров:

   location / {
       proxy_pass http://web:8000;
       proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       client_max_body_size 5M;
   }

Первый параметр (proxy_pass) определяет местоположение прокси-сервера, который получает переадресованные запросы. Если вы хотите перенаправить запрос на локальный сервер, вы можете использовать:

proxy_pass http://localhost:8000/;

Если вы хотите перенаправлять запросы на определенный сокет Unix (например, на сервер Gunicorn, работающий на том же компьютере, что и Nginx), вы можете использовать:

proxy_pass http://unix:/tmp/backend.socket:/

Если вы используете Nginx, работающий в контейнере Docker, и хотите общаться с Gunicorn в контейнере, вы можете напрямую использовать имя контейнера, на котором работает Gunicorn:

proxy_pass http://web:8000;

Второй параметр (proxy_pass_header) позволяет вам переопределять заголовки для запросов к вышестоящим серверам, таким как Gunicorn. Этот параметр можно установить четыре раза следующим образом:

  • Имя и порт сервера Nginx (Host $host)
  • Схема исходного клиентского запроса (например, http-запрос или https-запрос) (X-Forwarded-Proto $scheme)
  • IP-адрес пользователя (X-Real-IP $remote_addr)
  • К текущему местоположению узла IP-адреса всех прокси, через которые проходит клиент (X-Forwarded-For $proxy_add_x_forwarded_for)

Третий параметр (client_max_body_size) определяет максимальный размер, разрешенный для загрузки файлов, что очень важно для веб-приложений, которым необходимо загружать файлы. Поскольку размер изображения обычно находится в пределах 2 МБ, установка 5 МБ здесь достаточна практически для любого изображения.

Суммировать

В этой статье объясняется, что такое сервер Nginx и как его настроить для приложения Flask. Nginx является ключевым компонентом большинства веб-приложений, обслуживающим статический контент для пользователей, обратным проксированием запросов к вышестоящим серверам (WSGI в нашем веб-приложении Flask) и балансировкой нагрузки (не рассматривается в этой статье). Надеюсь, после прочтения этой статьи вам будет легче понять конфигурацию Nginx!

Цитаты

How to Configure NGINX (Linode)

NGINX Wiki

NGINX Pitfalls and Common Mistakes

How to Configure the NGINX Web Server on a VPS (DigitalOcean)

Understanding NGINX Server and Location Block Selection Algorithms (DigitalOcean)

NGINX Optimization: Understanding sendfile, tcp_nodelay, and tcp_nopush


Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллекти другие поля, если вы хотите видеть больше качественных переводов, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.