AI Painter 5th — разверните свой RESTful API с 0 по 1

Flask
AI Painter 5th — разверните свой RESTful API с 0 по 1

В предыдущей статье мыСделал RESTful API с Flask, но в конце статьи, когда мы запустили код, мы обнаружили, что это был localhost:xxxx, а это означало, что мы не могли получить доступ к API, который мы предоставили через внешнюю сеть, поэтому даже если программа была развернута на сервер, не было бы никакой полезности. В этой статье мы подробно обсудим, как развернуть его на сервере, а затем добиться доступа к внешней сети.

Подготовка окружающей среды

Если рабочий хочет хорошо работать, он должен сначала заточить свои инструменты. Это все равно, так как мы хотим выбрать развертывание на сервер, мы должны сначала иметь сервер, здесь я выбираю студенческую машину XX облака (не спрашивайте, почему, это дешево). Система выбирает Ubuntu18.04, и необходимо установить следующие вещи:

  • Python 3.6
  • Nginx
  • pyenv
  • pipenv
  • Flask + Gunicorn

Здесь мы используем pyenv для управления разными версиями python.Кто-то может спросить здесь, разве Ubuntu не поставляется с python2 и python3?Зачем использовать pyenv для управления?В предыдущей статье мы также говорили, что использовать pyenv для управления python будет очень сложно. удобно, настолько удобно, что для установки Python-версии системы коммутации требуется всего одна строчка кода.Без лишних слов приступим к нашей работе.

подключиться к удаленному серверу

Я не буду много говорить о том, как купить облачный хост XX Cloud.После того, как вы его купите, мы в фоновом режиме проверим внешний сетевой IP-адрес купленного нами облачного хоста.Например, внешний сетевой IP-адрес моего сервера является94.191.9.43(надеюсь, вы, ребята, будете милосердны и не будете с ним связываться):

Следующим шагом будет подключение к серверу.Существует множество инструментов,таких как xshell,putty или terminal.Вот рекомендую инструментTermius, я рекомендую его по двум причинам:Номинальная стоимость, как фейс-контроль, Termius - самый красивый SSH-клиент, который я когда-либо видел, никто. При этом он еще и кроссплатформенный, и поддерживается win/mac/linux/android/ios.Не знаю, где он выше, чем xshell.

5c7eb7590c28be6ee5c8afdb_termius

Подключение также очень простое: мы добавляем хост, который необходимо подключить, в termius, а затем вводим имя пользователя и пароль для входа в систему.

Установите указанную версию python с помощью pyenv

В предыдущей статье рассказывалось, как установить pyenv под mac, хотя способ установки под linux аналогичен, все-таки заголовок этой статьи — развернуть с 0 на 1, так что поговорим об этом подробнее.

  • Загрузите и установите pyenv
curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash 
  • Проверьте, существует ли он~/.bash_profileдокумент
cat ~/.bash_profile
  • Если нет, создайте новый файл
touch ~/.bash_profile
  • Затем выполните следующую команду, чтобы добавить pyenv в системные переменные.
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile  
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile 
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
source ~/.bash_profile

выполнить следующийpyenvкоманда, если появится следующий рисунок, установка прошла успешно.

Затем мы используем pyenv для установки разных версий Python всего одной строкой команды:

pyenv install xxx(版本号)

Например, если мы хотим установить python 3.6.7, нам просто нужно выполнитьpyenv install 3.6.7Вот и все. Этот шаг может быть немного медленным, в основном это зависит от скорости сети и производительности сервера.

Если установка не удалась, вы можете попробовать выполнить следующий код, чтобы установить некоторые зависимые библиотеки, а затем переустановить python:

sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev libffi-dev liblzma-dev

Если появятся следующие слова, установка прошла успешно.

image-20190527155431084

Далее мы выполняемpyenv versionsПроверьте python в настоящее время в нашей системе

* system (set by /home/ubuntu/.pyenv/version)
  3.6.7

воплощать в жизньpyenv global 3.6.7Используйте 3.6.7 в качестве системной среды python по умолчанию и выполните команду python, чтобы проверить версию python системы.Как показано на рисунке ниже, мы переключили версию python системы по умолчанию на 3.6.7.

image-20190527155707337

Установите pipenv для управления виртуальной средой проекта.

  • Сначала обновите пипс
pip install --upgrade pip
  • затем установите пипенв
pip install pipenv

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

Для его конкретного использования, пожалуйста, обратитесь к моей предыдущей статье 👉«Кто из них силен в управлении Python? 》

Загрузить проект на сервер

По сути, построение среды проекта здесь в основном завершено, но она только пригодна к использованию, и еще есть что-то близкое к той среде, которую нам нужно построить в итоге, об этом поговорим позже, давайте загрузим проект на наш Инструмент, который я выбираю здесь, это FileZilla, бесплатный FTP-клиент с открытым исходным кодом (и он выглядит хорошо), добавьте IP-адрес сервера после создания нового сайта, введите имя пользователя и пароль и нажмите «Подключиться», чтобы подключиться к удаленному серверу, как показано на рисунке ниже.

После успешного подключения мы можем увидеть список файлов сервера в правой части инструмента.Лично я предпочитаю создать новую папку dev в /home/ubuntu для хранения кода проекта для удобства управления, как показано ниже.

image-20190527162745456

Мы выбираем файл для загрузки в левой части инструмента и перетаскиваем его в указанную папку, чтобы загрузить файл. Здесь я говорю о коде, хранящемся в/home/ubuntu/dev/python/stylizeПо пути мы также можем просмотреть файл через терминал.

Этот код упоминался в предыдущей статье, и его можно получить, ответив на запрос «Style Migration API» в фоне общедоступной учетной записи WeChat «01 Binary».

Реализовать доступ к внешней сети

самый примитивный способ

Мы загрузили код проекта на сервер, заходим в папку из командной строки и выполняемpipenv installСоздайте виртуальную среду и загрузите необходимые зависимости. выполнить следующийpipenv shellВойдите в виртуальную среду, затем мы увидим, что перед путем будет скобка, которая является именем виртуальной среды, как показано ниже.

(stylize) ubuntu@VM-0-10-ubuntu:~/dev/python/stylize$ 

предоставлено в предыдущем разделеmain.pyкод, нам нужно внести некоторые изменения в основную функцию:

if __name__ == '__main__':
    app.run(host='0.0.0.0',port=8080, debug=app.config['DEBUG']

По сравнению с содержанием предыдущего раздела эта модификация добавляетhost='0.0.0.0'Этот параметр, значение этого параметра заключается в том, чтобы реализовать доступ к внешней сети сервера WSGI. Если этот хост не добавлен, по умолчанию к нему может быть получен доступ только по внутренней сети. В это время мы выполним его снова.python main.pyЗапустите весь проект, и появится следующий эффект, указывающий, что служба запущена.

image-20190527191041654

В это время мы набираем в браузереip:8080Вы можете увидеть эффект.Например, я ввел http://94.191.9.43:8080, и результаты следующие:

⭐️Обратите внимание, что вам необходимо настроить группу безопасности в консоли приобретенного вами облачного сервиса, чтобы открыть соответствующий порт на ваш сервер

На данный момент мы реализовали развертывание приложения flask на стороне сервера и реализацию доступа к внешней сети.

Это конец?

Но разве это конец? Конечно нет, если мы разорвем соединение, сервис не сможет выполниться. В это время кто-то может сказать, что он выполняетpython main.pyдобавьте один перед этой командойnohupНельзя ли запустить его в фоновом режиме? Да, таким образом можно запускать в фоновом режиме, но в реальном продакшене никто не будет развертывать таким образом, причина очень проста.Flask — это веб-фреймворк, а не веб-сервер. Веб-службы, непосредственно подтягиваемые Flask, ограничены средой разработки. Рабочая среда недостаточно стабильна и не может выдерживать параллелизм большого количества запросов. В производственной среде для обработки различных запросов необходимо использовать профессиональное серверное программное обеспечение.. Поскольку производительность сервера, который поставляется с flask, очень низкая, нам, естественно, нужно знать профессиональный сервер.Варианты здесь: Gunicorn, Nginx или Apache.Обычно мы выбираем комбинацию Gunicorn+Nginx.

Что такое Гуникорн?

Вот простые ответы на два вопроса, что такое Gunicorn и почему Gunicorn.

Первый вопрос, что такое Gunicorn?

Gunicorn Китайское название «Единорог», HTTP-сервер Python WSGI UNIX с открытым исходным кодом.

Второй вопрос, почему Gunicorn?

Высокая эффективность и простота использования.

Почему Gunicorn+Nginx?

существует«Третья пуля AI Painter - Flask of Graduation Design Killer»В этой статье мы упомянуливеб сервера такжесервер приложенийВ этих двух типах серверов сервер приложений может анализировать как статические, так и динамические ресурсы, но способность анализировать статические ресурсы не так хороша, как у веб-серверов. Nginx — это веб-сервер, а Gunicorn — сервер приложений.Используя такую ​​комбинацию, с одной стороны, проброс сервиса Gunicorn на базе Nginx может восполнить недостатки сервиса Gunicorn в некоторых случаях в производственной среде. , если вы делаете веб-сайт, помимо обслуживания, есть много статических файлов, которые необходимо разместить, что является сильной стороной Nginx и чем-то, для чего не подходит Gunicorn. Поэтому для веб-сайтов, разработанных на основе Flask, для развертывания используются Gunicorn и Nginx, что является хорошим выбором.

Итак, зачем вам нужен Nginx для пересылки сервиса Gunicorn?

Согласно приведенному выше объяснению, на самом деле вполне возможно использовать Gunicorn напрямую для доступа к внешней сети.Зачем вам нужно добавлять слой Nginx?

Причина на самом деле очень проста. Nginx мощный, и Nginx используется для перенаправления сервисов Gunicorn. Основное внимание уделяется решению проблемы снижения производительности, вызванной «медленным поведением клиента» на сервере. Кроме того, при развертывании HTTP-сервисов на Интернет, также необходимо учитывать «быстрый» ответ клиента, обработку SSL и проблемы с высоким параллелизмом, и эти проблемы могут быть решены на Nginx, поэтому добавление слоя обратного прокси-сервера Nginx поверх службы Gunicorn является многоцелевым развертыванием. решение.

Если вы хотите узнать больше о роли Nginx/Gunnicorn в проекте, рекомендуем прочитать👇

Какова роль Nginx и Gunicorn на сервере? - Знаю почти

Ууху. Call.com/question/38…

приступить к реализации

Запустить Гуникорн

Выше было сказано так много базовых знаний и принципов, поэтому давайте выполним настоящую операцию. Во-первых, установите Gunicorn. Метод установки очень прост. В виртуальной среде pipenv мы можем напрямую запустить следующий код.

pipenv install gunicorn

затем беги

gunicorn -D -w 3 -b 127.0.0.1:8080 main:app

Это запустит веб-службу, здесь мы объясним эти параметры.

  1. gunicorn: название команды, не так много объяснений
  2. -D означает запуск в фоновом режиме
  3. -w означает поток
  4. -b Указать ip и порт (рекомендуется использовать локальный порт, удобный для nginx на прокси.)
  5. main — файл запуска проекта (main.py)
  6. приложение является глобальной переменной (app = Flask(__name__))

Хотя приведенная выше команда не сложная, но ввод такой длинной команды каждый раз неизбежно приведет к ошибкам, есть ли какой-нибудь простой способ? Ответ, естественно, да, мы можем установить параметры этих команд наконфигурационный файлФорма сохраняется в файл local.

Сначала создайте новый в корневом каталоге проекта.gunicorn.conf, затем напишите следующую информацию:

# 并行工作线程数
workers = 4
# 监听内网端口8080【按需要更改】
bind = '127.0.0.1:8080'
# 设置守护进程【关闭连接时,程序仍在运行】
daemon = True
# 设置超时时间120s,默认为30s。按自己的需求进行设置
timeout = 120
# 设置访问日志和错误信息日志路径
accesslog = './logs/acess.log'
errorlog = './logs/error.log'

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

gunicorn -c gunicorn.conf main:app

Не забудьте заранее создать папку с логами 😊

Закрыть

Пройдя вышеперечисленные операции, мы можем запустить проект, так как же его закрыть?

Это просто, в два шага

шаг 1:

pstree -ap|grep gunicorn

Показать результаты:

(stylize) ubuntu@VM-0-10-ubuntu:~/dev/python/stylize$ pstree -ap|grep gunicorn
  |-gunicorn,9349/home/ubuntu/.local/share/virtualenvs/stylize-rKP1K2-f/bin/gun
  |   |-gunicorn,9352/home/ubuntu/.local/share/virtualenvs/stylize-rKP1K2-f/bin/gun
  |   |-gunicorn,9353/home/ubuntu/.local/share/virtualenvs/stylize-rKP1K2-f/bin/gun
  |   `-gunicorn,9354/home/ubuntu/.local/share/virtualenvs/stylize-rKP1K2-f/bin/gun
  |                       |-grep,9365 --color=auto gunicorn

шаг 2:

kill -9 9349

-9 означает принудительное завершение работы, 9349 означает номер запущенного процесса (в зависимости от ситуации на вашем сервере)

Установить и настроить Nginx.

Установка Nginx на Ubuntu так же проста, как одна команда:

sudo apt-get install nginx

Следующим шагом является настройка, файл конфигурации nginx по умолчанию находится в/etc/nginx/sites-enabled/defaultв, выполнитьsudo vim default, измените код в следующей части

server {
    listen 80;
    server_name localhost;
    location /{
        proxy_pass http://127.0.0.1:8080;
    }
}

Здесь мы объясняем, что эффект от изменения вышеуказанного содержимого заключается в следующем: передача внешнегопорт 80Входящий запрос проксируется на порт 127.0.0.1:8080. помнишь, мы былиgunicorn.confНачальный адрес фляги задается в127.0.0.1:8080, наконец, пригодился здесь.

Затем выполните следующую команду, чтобы перезапустить nginx

sudo nginx -s reload

В настоящее время, если мы снова посетим http://94.191.9.43, нам не нужно добавлять номер порта.

image-20190528014523423

Если у вас есть доменное имя, вы можете получить доступ к доменному имени, разобрав доменное имя на этот ip в фоновом режиме.Разве это не интересно?

Конечно добавление прослойки сервиса Nginx в Gunicorn, помимо реализации обратного прокси, еще одна причина в том, что с ним очень удобно настраивать HTTPS.Я не буду здесь говорить больше.Если читатели заинтересованы, вы можете проверить соответствующие информации, или в области комментариев / Оставьте мне сообщение в фоновом режиме.Если есть много людей, которые хотят знать, я найду возможность выбрать их и записать их по отдельности.

журнал! журнал! журнал!

В дополнение к вышеупомянутой проблеме с HTTPS, я не знаю, заметили ли вы, что чего-то не хватает. Правильно, журнал! Важные вещи сказаны трижды! В качестве фоновой программы как можно меньше логов? Теперь, когда мы взяли на себя управление проектом Flask вместе с Gunicorn, как мы можем получить информацию журнала Flask? Не волнуйтесь, Gunicorn уже разобрался за вас, это очень просто, нужно только запустить файлmain.pyПросто добавьте кусок кода.

import logging
if __name__ != '__main__':
    gunicorn_logger = logging.getLogger('gunicorn.error')
    app.logger.handlers = gunicorn_logger.handlers
    app.logger.setLevel(gunicorn_logger.level)

Этот способ письма в основном делает 4 вещи:

  1. if __name__ != '__main__'Этот способ написания встречается редко, а это означает, что внутренний код будет выполняться только тогда, когда файл импортируется как модуль, что позволяет избежать жесткого кодирования.gunicorn main:appво время бегаmain.pyБудет импортирован в gunicorn как модуль, т.к. gunicorn на самом деле написан на чистом pyhton.
  2. Получить регистратор пушкикорна
  3. Свяжите регистратор gunicorn и регистратор приложения flask вместе
  4. Установите уровень связанного логгера на уровень логгера пушки, потому что окончательный уровень выходного лога настраивается в пушке

Затем перезапустите gunicorn.Путь для хранения логов был указан в gunicorn.conf ранее, и его можно просмотреть с помощью команды cat.

В конце концов

Бессознательно я написал почти 4000 слов. С одной стороны, я написал так много на этот раз, потому что обнаружил, что есть слишком много вещей, которые можно расширить, когда я недавно использовал эту штуку. С другой стороны, я надеюсь, что это может быть отличается от содержания других блогов, не только показывает процесс реализации, вы также можете поделиться некоторыми привычками и опытом в процессе его использования и общаться с вами. Конечно, здесь еще много чего можно добыть, например, как получить IP-адрес посетителя и проанализировать его, как настроить HTTPS с помощью Nginx и т. д. Если вам интересно, вы можете найти соответствующую информацию, или обсудите со мной в области сообщений/за кулисами, вы, ребята, ваша поддержка - самая большая движущая сила для меня, чтобы двигаться вперед!