henry_flower: A melancholy wolf (Default)
henry_flower ([personal profile] henry_flower) wrote2024-01-14 09:46 am

Apache як one-liner

Коли хтось раптом потребує статичного HTTP сервера для тестів, йому зазвичай рекомендують python -m http.server 8000; колись навіть список таких команд був для багатьох мов.

Закінчується це зазвичай так: людина або цим користується, або починає їхати дахом--писати для себе статичний сервер на awk, на netcat, на whitespace чи brainfuck. Кількість божевільних серед уйоб погромістів загалом вражає і чим простіша задача, тим більше часу вони їй приділяють.

Примітивність an ad hoc http static server in your current directory також є очевидна: цю іграшку викидають як тільки з'являється потреба тестувати сценарії реального життя, наприклад CORS чи клаентську аутентифікацію з сертифікатом. Приклад з пáйфоном не дозволяє навіть перевірити TLS хендшейка.

Чому ув якості http server one-liner не використовувати справжні сервера? Тому що жоден з них (окрім Caddy) такого використання не передбачає, а вагон файлів ув /etc, які очікує хеві-д'юті сервер, його сістемді юніти та мотлох ув /run на спроби не надихають.

Пригадуєте як працює опач з

$ lol() { curl -sL "$1" | nokogiri -e "p \$_.css('$2').size"; }
$ lol https://httpd.apache.org/docs/2.4/mod/directives.html li
733

дайрективами ув

$ lol https://httpd.apache.org/docs/2.4/mod 'dt a'
133

модулях?

Щоб стартувати йому потрібно окрема директорія, в якій він буде шукати конфігурацію, плюватися логами та записувати підфайла.

Сценарій: користувач інсталює опач звичним методом dnf install httpd, &c, а чи використовує він його за призначення на порту 80, нас не цікавить. Той самий системно-інстальйований опач можна змусити читати інший файл конфігурації, слухати на іншому порту і конфліктувати зі системною конфігурацією ніяк.

На жаль, це потребує скриптування, але такий скрипт може служити все життя, тому що нові http сервера з'являються та щезають кожен рік, а опач є вічний.

Я спочатку написав наївний шелівський враппер ув федорі, який робив темпоральну директорію, куди копіював крихітний httpd.conf. Все запрацювало, але коли я спробував той враппер на деб'яні, то на деякий час закрив обличчя руками.

Кожного разу 1 і те саме: мейнтейнер вважає що він знає краще, ніж апстрім. Сабсета модулів які .so, деб'ян компайлить ін (щоб однакові конфіґі на різних ОС працювали ніколи), ім'я дефолтного конфіґу є свое (звичайно), éкзек'ютабл називається опач2 замість httpd (чому ні).

Всі завжди з цим погоджуються, тому шо інакше не дай бог запишуть ув ко-мейнтейнери а це я вибачаюсь! Не для того штани ув фаанґ просиджувати щоб майнтейнерить якийсь пекедж як лох, най 15-річний румун за опачем слідкує, ув перерві між алгеброю та фізикою.

(Вибачте.)

З цікавості подивився на fbsd. Не настільки погано, але всі шляхи до модулей, наприклад, з лайнаксом не співпадають.

Поліпшена версія враперу читає конфігурацію з json.

$ find * -type f | xargs wc -l
  30 conf/httpd.conf
  52 httpd-test
  26 os.json
 108 total

це є забагато щоб постити тут, але ось вам svg (чув що ув журналах, які давно збанкрутували, колись друкували вихідний код програм, який читач мав вдома самотужки ввести):

$ httpd-test ~/Downloads
ID            fedora
log           tail -f /tmp/tmp.7PTHVzUhE5/logs/access_log
conf          /tmp/tmp.7PTHVzUhE5/conf/httpd.conf
TypesConfig   /etc/mime.types
DocumentRoot  /home/alex/Downloads
Listen        127.0.0.1:8000

До речі, всі 133 модуля опачу можна йому скомпайлити статично (або вибірково, лише ті що потрібні: configure --enable-modules=none --enable-mods-static='auth_basic …'). Чому це не використовують усіляки ембедні дівайси замість пародій tiny/micro/nano-something, у яких тече пам'ять і які половину слів http/1.1 не знають, залишається незрозумілим.

kondybas: (Default)

[personal profile] kondybas 2024-01-14 10:23 am (UTC)(link)
"..система тримається на якості мейнтейнерів кожного пекеджу.."

Ну, всі ми, так чи інакше, залежимо від майнтейнерів, але у фбсд додано всеохоплюючу опцію обісратися самотужки. Можна залізти своїми мацаками в сирци ядра, те ядро зібрати і потім на ньому завантажитися. Принаймні - спробувати завантажитися. Колись давно довелося в драйвері мережевої карти руками додати один від/під, бо не було часу чекати, поки мейнтейнер роздуплиться.
kondybas: (Default)

[personal profile] kondybas 2024-01-14 11:18 am (UTC)(link)
Осьо згадав ту історію про драйвер - то було аж в 1997 чи 1998, капєц, а ніби вчора. Навіть пам'ятаю ту довбану інтелівську двухпортову мережеву карту igx.
kondybas: (Default)

[personal profile] kondybas 2024-01-14 11:50 am (UTC)(link)
Час не минув марно, гггг