Существует достаточно много маленьких веб-серверов, которые даже не требуют установки, но их функциональность и надежность может вызывать вопросы. Кроме того, большинство из них далеко не кроссплатформенные.
Универсальным и быстрым решением является запуск сервера на Python. Это выполняется одной командой. Это может быть полезно, когда вы хотите быстро раздать какой-то контент в сеть или проверить доступность порта в сети.
Установка сервера
В зависимости от операционной системы последовательность слегка отличается, но в целом следует одной логике.
Windows
В Windows очень удобно пользоваться пакетным менеджером Chocolatey (choco), который содержит opensource пакеты. Все нижеследующие команды необходимо выполнять в Powershell, запущенном от администратора.
- Установим choco через Powershell
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')))
- После установки проверим его запуск командой
choco -v
- Установим Python через репозиторий:
choco install python --pre -y
или конкретную версию
choco install python --version 3.11.6 -y
Linux
В Linux в зависимости от версии необходимо установить pip менеджер и из него поставить Python. Можно поставить и из репозитория, но там как правильно, доступны устаревшие версии (в universe на данный момент доступна версия 3.10).
В Ubuntu / Debian
add-apt-repository -y ppa:deadsnakes/ppa
apt-get update
apt install python3.10
CentOS / RHEL
В CentOS 7 установлен Python 2.7.5 по умолчанию. Python 3.6.8 последний доступный в основном репозитории. Другие версии я не рассматриваю я данной статье.
Python 3.6.8 можно установить командой
yum update
yum install python3
Запуск сервера
Python по умолчанию запускает HTTP-сервер на порту 8000 и связывает его со всеми доступными сетевыми интерфейсами на вашем компьютере — к адресу IPv4 0.0.0.0 или адресу IPv6 ::.
python3 -m http.server
или
python -m http.server
Какую команду использовать зависит от операционной системы и версии Python. В Windows надо указывать «python». В Linux — «python3».
Во второй версии питона сервер запускался командой
python -m SimpleHTTPServer 8000
По умолчанию Python обслуживает файлы, расположенные в вашем текущем рабочем каталоге, где вы выполнили команду для запуска сервера. Итак, когда вы откроете корневой адрес (/) вашего сервера в веб-браузере, вы увидите все файлы и папки в соответствующем каталоге. Самый простой вариант на локальной машине это http://localhost:8000
Можно поменять как порт, например, на порт 80. Обратите внимание, что для запуска сервера на портах меньше 1024 необходимы привилегии администратора.
python3 -m http.server 80
Вы можете указать серверу связать его домашний адрес (/) с совершенно другим каталогом, указав необязательный параметр -d:
python3 -m http.server -d ~/Pictures/
Обратите внимание, что вы можете использовать как относительные, так и абсолютные пути для указания каталога, который будет обслуживаться через HTTP.
Если у вас на компьютере несколько сетевых интерфейсов, например, если в Windows установлен WSL2 или другая виртуальная машина, то сервер можно прибить к одному из таких интерфейсов.
Например, у меня WSL2 висит на IP 172.17.240.1.
В таком случае я могу запустить:
python3 -m http.server -b 172.17.240.1 8080
Открытие сервера в интернет
Как обычно, для доступа для таких операций требуется открытие и проброс порта. Во-первых, 80 порт должен быть открыт на вашем роутере (и у провайдера). Во-вторых, на самом роутере должна выполняться маршрутизация трафика с публичного IP и 80 порта на ваш внутренний и порт сервера.
Для первого условия у провайдера необходимо купить «белый» (публично маршрутизируемый) IP адрес, вместе с этим снимаются и ограничения по стандартным портам снаружи. А вот маршрутизацию внутри вашей сети сделать чуть сложнее. Для этого используется технология DST-NAT.
В большинстве домашних роутер проброс делается через меню публикации виртуального сервера (или аналогичное). В более сложных, типа Mikrotik, это можно сделать через меню IP -> Firewall -> NAT или командную строку (замените на свои IP):
/ip firewall nat add chain=dstnat action=dst-nat dst-address=10.20.30.40 dst-port=80 protocol=tcp to-addresses=192.168.1.100 to-ports=8080
Важное замечание: публикация сервера на 80 порту мало того, что делает его уязвимым, так еще и многие браузеры негативно относятся к таким «небезопасным» сайтам и ругаются при их открытии.
Поддержку HTTPS можно добавить уже через код самого приложения на Python, указав в нем путь к имеющимся SSL сертификатам:
from http.server import HTTPServer, BaseHTTPRequestHandler
import ssl
httpd = HTTPServer(('localhost', 8443), BaseHTTPRequestHandler)
httpd.socket = ssl.wrap_socket (httpd.socket,
keyfile="path/to/key.pem",
certfile='path/to/cert.pem', server_side=True)
httpd.serve_forever()