Настройка mathopd в NetBSD
Установка и настройка mathopd
Для установки mathopd понадобится pkgsrc-wip. Его развёртывание описано на странице Система pkgsrc.
Устанавилваем mathopd из pkgsrc:
# cd /usr/pkgsrc/wip/mathopd
# make install
Копируем скрипт инициализации:
# cp /usr/pkg/share/examples/rc.d/mathopd /etc/rc.d/
Прописываем настройки в файл конфигурации /usr/pkg/etc/mathopd.conf:
ErrorLog /var/log/mathopd/mathopd/error_log
Log /var/log/mathopd/mathopd/access_log.%Y%m%d
LogGMT Off
StayRoot On
User mathopd
Umask 022
#RootDirectory
#CoreDirectory
PIDFile /var/run/mathopd.pid
Tuning {
AcceptMulti On
Clobber On
NumConnections 64
BufSize 12288
InputBufSize 2048
ScriptBufSize 4096
NumHeaders 100
ScriptTimeout 10
Timeout 10
Wait 10
}
LogFormat {
#Ctime
Method
Uri
QueryString
Version
Status
BytesRead
Referer
UserAgent
#RemoteUser
#RemoteAddress
#RemotePort
#ServerName
#ContentLength
#BytesWritten
#LocalAddress
#LocalPort
#TimeTaken
#MicroTime
}
Control {
Admin vladimir@stupin.su
#Error401File
#Error403File
#Error404File
AllowDotfiles Off
SanitizePath On
UserDirectory Off
Types {
image/gif { .gif }
image/png {
.png
.ico
}
image/jpeg { .jpg }
text/css { .css }
text/html { .html }
"text/plain; charset=UTF-8" {
.sh
.txt
.diff
.patch
.c
.py
.pl
.conf
}
application/octet-stream { * }
}
ExtraHeaders {
"Cache-Control: max-age=3600"
}
IndexNames {
index.html
}
}
Server {
Address 0.0.0.0
Port 80
Backlog 128
Virtual {
NoHost
Host stupin.su
Control {
Alias /
Location /srv/stupin.su/
}
}
Virtual {
Host manpages.stupin.su
Control {
Alias /
Location /srv/manpages.stupin.su/
}
}
Virtual {
Host netbsd.stupin.su
Control {
Alias /
Location /srv/netbsd.stupin.su/
}
}
Virtual {
Host thedjbway.stupin.su
Control {
Alias /
Location /srv/thedjbway.stupin.su/
}
}
}
В приведённом файле конфигурации настроены 4 виртуальных узла. Если поступил запрос без заголовка Host:
, то по умолчанию будет использоваться узел stupin.su.
Запускаем mathopd:
# /etc/rc.d/mathopd start
Включаем запуск mathopd в файле /etc/rc.conf:
mathopd=YES
Автоматическая генерация индексных страниц
mathopd не умеет самостоятельно генерировать индексные страницы для каталогов, в которых их нет.
Ниже приведён скрипт на языке AWK для генерации содержимого каталога, в котором нет страницы index.html. Я поместил его в файл /usr/pkg/etc/index.cgi:
#!/usr/bin/awk -f
# Function derived from https://gist.github.com/moyashi/4063894
function escape(s) {
r = "";
for (i = 1; i <= length(s); i++) {
r = r esc[substr(s, i, 1)];
}
return r;
}
BEGIN {
for(i = 0; i <= 255; i++) {
c = sprintf("%c", i);
if (c ~ /[0-9A-Za-z_.\-]/) {
esc[c] = c;
} else {
esc[c] = sprintf("%%%02X", i)
}
}
spaces = " ";
printf "Content-Type: text/html\n"
printf "\n";
printf "<html>\n";
printf "<head><title>%s</title></head>\n", ENVIRON["REQUEST_URI"];
printf "<body>\n";
printf "<h1>Index of %s</h1><hr><pre><a href=\"..\">../</a>\n", ENVIRON["REQUEST_URI"];
lscmd="/bin/ls -lT";
first = 1;
while (lscmd | getline) {
if (first == 1) {
first = 0;
continue;
}
filename = $0;
for(i = 1; i < 10; i++) {
filename = substr(filename, index(filename, $i) + length($i));
}
filename = substr(filename, 2);
printf "<a href=\"%s\">%s</a>", escape(filename), filename;
if (length(filename) < 50) {
printf substr(spaces, 1, 50 - length(filename));
}
split($8, hms, /:/);
printf " %02d-%s-%04d %02d:%02d%20s\n", $7, $6, $9, hms[1], hms[2], (substr($1, 1, 1) == "d") ? "-" : $5;
}
printf "</pre><hr></body>\n";
printf "</html>";
}
Скрипт генерирует индексные страницы по тому же шаблону, по которому их генерирует nginx.
Этот скрипт будет запускаться как CGI-скрипт либо под одним из пользователей:
- если включена опция RunScriptsAsOwner, то скрипт будет запускаться от имени пользователя, который владеет файлом скрипта,
- если опция RunScriptsAsOwner выключена, то будет запускаться от имени пользователя, который указан в опции ScriptUser.
Есть одна маленькая тонкость: если используется второй вариант, то пользователь, указанный в опции ScriptUser должен отличаться от пользователя, указанного в опции User. В противном случае mathopd будет сообщать об ошибке:
cannot run scripts without changing identity
У меня файлами веб-сервера владеет пользователь root, а в качестве группы владельца используется группа mathopd. Для запуска скрипта генерации индексных страниц я создал отдельного пользователя mathopd-cgi, включив его в группу mathopd, следующим образом:
# useradd -c 'mathopd cgi user' -s /sbin/nologin -g mathopd -d /noexistent mathopd-cgi
Осталось добавить в общую секцию Control файла конфигурации следующие настройки, чтобы mathopd вызывал скрипт для генерации индексной страницы:
RunScriptsAsOwner Off
ScriptUser mathopd-cgi
AutoIndexCommand /usr/pkg/etc/index.cgi
Specials {
CGI { .cgi }
}
И перезапустить mathopd:
# /etc/rc.d/mathopd restart