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 09:26 am (UTC)(link)
"..З цікавості подивився на fbsd. Не настільки погано, але всі шляхи до модулей, наприклад, з лайнаксом не співпадають.."

Зате співпадають з фбсд усіх релізів.
Що мене дратує в лінухах найбільше, це саме відмінна від фбсд розкладка шляхів. І, ніби того мало, в кожному лінуходістрі розкладка по шляхах своя. Най трошечки, але своя.

Наприклад, мені дуже подобається, що у фбсд системний /єтц не засирається конфігами стороннього софта, а є /usr/local/etc. І за всі роки я так і не спромігся второпати, якого біса робочий каталог мускля в дебіана знаходиться в /var/lib, а не /var/db, що є логічним.

Дочитав до SVG і мене порвало у шмаття!
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)
Час не минув марно, гггг
kondybas: (Default)

[personal profile] kondybas 2024-01-14 09:56 am (UTC)(link)
І, до речі, чому статикою не компілять. Бо не компілять. У фбсд софт з пакетів зі штатної репи - це поки ще маленький. Як трошки починаєш розбиратися - починаєш ставити софта з портів, компілюючи з своїми опціями. В зовсім критичних випадках робиться ахалай-конфігур-махалай-мейк-інсталл. Норма життя. А лінупсоїду скажи зкомпілювати апача - то обплює з ніг до голови і назве арчистом.
kondybas: (Default)

[personal profile] kondybas 2024-01-14 11:21 am (UTC)(link)
Нині перфекціонізм не шанують. Хуяк-хуяк - і в продакшн. Як наступлять на О(nm), то намагаються всьо засипати процесорами. До повного фєншую-хєнтаю вже ніхто нічого не вилизує.
juan_gandhi: (Default)

[personal profile] juan_gandhi 2024-01-14 10:47 am (UTC)(link)

What's the use case for launching a fully-functional web server to just test a functionality? I would expect a server to be hiding behind some kind of layer that takes care of TLS... not sure about CORS, but maybe. I strongly believe that an application layer should not care about that. So if we are talking about testing interactions between microservices, it makes no sense (to me).

OTOH, if we test the frontend tier, then, I believe, a slapped together server may be not a good idea at all, since it's not fully functional, it may give an impression that everything's ok, but actually it's not. I'd rather count on a properly deployed test/staging/dev server.

Or?