Пишем простой сервер на Python
Ну, начнем как и везде с определений, берите тетрадь и ручку сейчас начнется нудятина. Чтобы мы cмогли написать свой сервер, нужно для начала понимать как он вообще работает, ловите определение:
Сервер – это программное обеспечение, которое ожидает запросов клиентов и обслуживает или обрабатывает их соответственно.
Если объяснять это своими словами, представьте фургон с хот-догами(сервер), проголодавшись, вы(клиент) подходите и говорите повару, что вы хотите заказать(запрос), после чего повар обрабатывает, что вы ему сказали и начинает готовить, в конечном итоге вы получаете свой хот-дог(результат) и сытый радуетесь жизни. Для наглядности посмотри схему.

Околопрактика
Для написания сервера мы будем использовать Python и модуль Socket.
Socket позволяет нам общаться с сервером с помощью сокетов. Весь код я постараюсь пояснять, дабы ты мой дорогой читатель все понял. В конце статьи будет готовый код.
Создайте два файла в одной директории:
socket_server.py
socket_client.py
Практика
Пишем код для серверной части, так что открывайте файл socket_server.py.
Начнем с импорта модуля и создания TCP-сокета:
Далее весь код будет с комментариями:
Добавим вечный цикл, который будет считывать данные с клиентской части, и отправлять их обратно.
Переходим к клиентской части, весь код теперь пишем в файле socket_client.py.
Начало у клиентской части такое-же как и у серверной.
Далее подключимся к нашему серверу и отправим сообщение «Hello. Habr!».

Слева сервер, справа клиент
Заключение
Вот мы с вами и написали свой первый сервер, рад был стараться для вас, ниже будет готовый код.
Настройка web–сервера для приложений на Python
В статье содержится руководство по первичной настройке инфраструктуры сервера для хостинга web–сайтов на основе Debian 9.7, разработанных с применением python–фреймворка Flask.
Получаемое окружение предназначено для использования в процессе разработки, но, с некоторыми оговорками, может использоваться и в production–режиме.
- сайт, размещаемый на сервере имеет название mysite.com ;
- команды начинающиеся с символа # выполняются с root –правами;
- читатель обладает базовыми знаниями о Linux и предназначении используемого ПО, а также может самостоятельно восполнить пробелы из документации; в связи с этим в тексте опущены пояснения «очевидных» моментов.
Обновление дистрибутива, локаль и пользователь
При первом подключении к серверу необходимо.
- Обновить пакеты дистрибутива:
- Добавить русскоязычную локаль:
В появившемся окне выбора локалей и их кодировок нужно выбрать en-us.UTF-8 и ru_RU.UTF-8 . По умолчанию ставим en-us.UTF-8 .
- Перезагрузить сервер:
- Добавить пользователя admin , от имени которого будут запускаться приложения:
Для доступа по ssh будет использоваться сертификат, поэтому если его нет, нужно предварительно его создать.
После получения сертификата в /home/admin :
В открывшемся редакторе вставляем публичную часть ключа пользователя, которая выглядит примерно так:
Далее редактируем конфигурационный файл демона ssh:
Минимальное содержимое конфига:
Если все сделано правильно и ssh–клиент настроен корректно, можно отключиться от сервера и переподключиться с использованием сертификата.
Смена имени хоста
Ясно определенное имя хоста (например, mysite.com ) отображается в приглашении консоли и, когда консолей много, снижает риск выполнения каких-либо команд не на той машине.
Для изменения имени необходимо отредактировать файл hostname :
В открывшемся редакторе пишем новое имя хоста.
После перезагрузки сервера в приглашении консоли появится новое имя.
nginx
Документация по установке находится на официальном сайте.
После установки нужно удалить конфигурационный файл по умолчанию и создать конфигурационный файл сайта /etc/nginx/conf.d/mysite.com.conf :
Обратите внимание, что описанная конфигурация: 1. предполагает использование сайта только по SSL; 2. содержит закомментированные строки конфигурации SSL; подобное необходимо для корректного запуска nginx пока отсутствует SSL–сертификат; 3. Для проксирования запросов от сайта используется порт 5000, который будет указан позже в конфигурации gunicorn.
Let’s encrypt
Для получения валидного SSL–сертификата используется сервис Let’s Encrypt.
Документация по установке находится на официальном сайте.
Для корректной работы сайта необходимо получить сертификат на домен mysite.com :
На вопрос How would you like to authenticate with the ACME CA? необходимо выбрать первый вариант ответа — Nginx Web Server plugin (nginx) .
После получения сертификата в файле конфигурации сайта /etc/nginx/conf.d/mysite.com.conf необходимо раскомментировать строки:
И перезапустить nginx командой:
Python
Для использования последней актуальной (на момент написания статьи) версии Python 3.7.3, нужно скачать и собрать дистрибутив:
Сторонние пакеты для Python
Исполнение Python производится из виртуального окружения, создать которое необходимо в домашнем каталоге пользователя admin :
Активировать виртуальное окружение можно командой:
После активации виртуального окружения можно устанавливать пакеты, необходимые для работы приложения сайта.
Служба systemd для gunicorn
Gunicorn — WSGI HTTP–сервер для запуска приложений, созданных на Python. Используется в качестве прослойка между nginx и приложением cайта.
Прежде всего необходимо установить gunicorn. Сделать это можно в ранее созданном виртуальном окружении:
Далее создаем директории и файл службы для systemd:
/.config/systemd/user/gunicorn.service (предполагается, что приложение сайта находится в папке /home/admin/mysite.com ):
Важно!
Systemd останавливает все службы пользователя после закрытия последней сессии.
Таким образом после закрытия всех соединений с сервером gunicorn перестанет работать.
Чтобы подобного не происходило, нужно выполнить следующую команду от имени root :
Модуль http.server в Python.
Модуль http.server определяет классы для реализации HTTP-серверов (веб-серверов).
Предупреждение модуль http.server не рекомендуется для использования в продакшне, так как он выполняет только базовые проверки безопасности.
Класс http.server.HTTPServer , является подклассом socketserver.TCPServer() . Он создает и прослушивает HTTP-сокет, отправляя запросы обработчику.
Код для создания и запуска сервера выглядит так:
Классы HTTP веб-серверов.
http.server.HTTPServer(server_address, RequestHandlerClass) :
Класс HTTPServer основан на классе TCPServer, сохраняя адрес сервера в виде переменных экземпляра с именами server_name и server_port .
Сервер доступен обработчику, обычно через переменную экземпляра сервера обработчика RequestHandlerClass .
http.server.ThreadingHTTPServer(server_address, RequestHandlerClass) :
Класс ThreadingHTTPServer идентичен HTTPServer , но использует потоки для обработки запросов с помощью миксина ThreadingMixIn .
Такое поведение полезно для обработки запросов веб-браузеров, предварительно открывающих сокеты, на которых HTTPServer будет ждать бесконечно.
Классы HTTPServer и ThreadingHTTPServer должны получить в качестве аргумента RequestHandlerClass при создании экземпляра, из которых этот модуль предоставляет три различных варианта.
Обработчики HTTP-запросов:
-
— класс используется для обработки HTTP-запросов, поступающих на сервер; — обслуживает файлы из текущего каталога, напрямую сопоставляя структуру каталогов с HTTP-запросами; — обслуживает файлы или вывод сценариев CGI из текущего каталога.
Примеры создания простых HTTP web-серверов
Пример HTTP web-сервера, обрабатывающего статические файлы.
Если запустить HTTP сервер таким способом, то можно создать, например, фиктивный API путем загрузки на этот сервер статических файлов json или/и xml . Структура ресурсов файлов, организованных в подпапки, будет обеспечивать RESTful-подобные URL-адреса. Например, /users/all.json может содержать фиктивные записи пользователей. Этот подход еще быстрее, чем создание, например, приложения Flask . База данных не требуется, работает везде. Можно применять там, где например есть некоторые трудности с командой терминала scp для загрузки данных. Решение — можно запустить простой сервер на удаленной машине и загрузить необходимое содержимое через HTTP.
Пример HTTP web-сервера, с поддержкой SSL.
Для запуска защищенного HTTPs сервера создайте следующий модуль:
Для создания файлов ключей и сертификатов с помощью OpenSSL используйте следующую команду