06 марта 2010

Делаем из Apache простенькое хранилище файлов.

Идея возникла после того, как решил выложить в общий доступ всё добро, которое накачал с разных околоанимешный галерей. Была мысль об ftp-сервере, но при выкачивании целой папки он тормозил систему, потому что всё это дело стоит на обычном домашнем компе, да еще и на Windows.
Для начала расскажу, почему я не выбрал nginx и LightTPD.
Nginx (http://nginx.org/) мне понравился простотой настройки, но не понравился тем, что практически не переваривает кириллицу и иероглифы в именах файлов.
LightTPD (http://www.lighttpd.net/) тоже понравился несложной настройкой, и проблем с кодировками у него не было, но он совершенно не хотел сжимать листинги файлов в gzip, а листинги генерировались довольно монструозные.
Была идея повесить LightTPD на 127.0.0.1:80, а Nginx настроить так, чтобы он перенаправлял ему все запросы, а ответы сжимал в gzip и возвращал назад, только уж слишком крутая комбинация для домашней машинки.
Решил я вернуться к Apache (http://httpd.apache.org/), который я отбросил по причине кажущейся монструозности.
Скачал с сайта дистрибутив версии 2.2.14 без SSL, поставил и приступил к настройке.
Для начала нужно было максимально облегчить сервер путем отключения ненужных модулей. После плясок с бубном и чтения документации у меня получился такой список:
#LoadModule actions_module modules/mod_actions.so
LoadModule alias_module modules/mod_alias.so
#LoadModule asis_module modules/mod_asis.so
LoadModule auth_basic_module modules/mod_auth_basic.so
#LoadModule auth_digest_module modules/mod_auth_digest.so
#LoadModule authn_alias_module modules/mod_authn_alias.so
#LoadModule authn_anon_module modules/mod_authn_anon.so
#LoadModule authn_dbd_module modules/mod_authn_dbd.so
#LoadModule authn_dbm_module modules/mod_authn_dbm.so
LoadModule authn_default_module modules/mod_authn_default.so
LoadModule authn_file_module modules/mod_authn_file.so
#LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
#LoadModule authz_dbm_module modules/mod_authz_dbm.so
LoadModule authz_default_module modules/mod_authz_default.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_host_module modules/mod_authz_host.so
#LoadModule authz_owner_module modules/mod_authz_owner.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule autoindex_module modules/mod_autoindex.so
#LoadModule cache_module modules/mod_cache.so
#LoadModule cern_meta_module modules/mod_cern_meta.so
#LoadModule cgi_module modules/mod_cgi.so
#LoadModule charset_lite_module modules/mod_charset_lite.so
#LoadModule dav_module modules/mod_dav.so
#LoadModule dav_fs_module modules/mod_dav_fs.so
#LoadModule dav_lock_module modules/mod_dav_lock.so
#LoadModule dbd_module modules/mod_dbd.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule dir_module modules/mod_dir.so
#LoadModule disk_cache_module modules/mod_disk_cache.so
#LoadModule dumpio_module modules/mod_dumpio.so
#LoadModule env_module modules/mod_env.so
#LoadModule expires_module modules/mod_expires.so
#LoadModule ext_filter_module modules/mod_ext_filter.so
#LoadModule file_cache_module modules/mod_file_cache.so
#LoadModule filter_module modules/mod_filter.so
#LoadModule headers_module modules/mod_headers.so
#LoadModule ident_module modules/mod_ident.so
#LoadModule imagemap_module modules/mod_imagemap.so
#LoadModule include_module modules/mod_include.so
#LoadModule info_module modules/mod_info.so
LoadModule isapi_module modules/mod_isapi.so
#LoadModule ldap_module modules/mod_ldap.so
#LoadModule logio_module modules/mod_logio.so
LoadModule log_config_module modules/mod_log_config.so
#LoadModule log_forensic_module modules/mod_log_forensic.so
#LoadModule mem_cache_module modules/mod_mem_cache.so
LoadModule mime_module modules/mod_mime.so
#LoadModule mime_magic_module modules/mod_mime_magic.so
LoadModule negotiation_module modules/mod_negotiation.so
#LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
#LoadModule proxy_connect_module modules/mod_proxy_connect.so
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
#LoadModule proxy_http_module modules/mod_proxy_http.so
#LoadModule rewrite_module modules/mod_rewrite.so
#LoadModule setenvif_module modules/mod_setenvif.so
#LoadModule speling_module modules/mod_speling.so
#LoadModule ssl_module modules/mod_ssl.so
#LoadModule status_module modules/mod_status.so
#LoadModule substitute_module modules/mod_substitute.so
#LoadModule unique_id_module modules/mod_unique_id.so
#LoadModule userdir_module modules/mod_userdir.so
#LoadModule usertrack_module modules/mod_usertrack.so
#LoadModule version_module modules/mod_version.so
#LoadModule vhost_alias_module modules/mod_vhost_alias.so
Теперь осталось настроить алиасы для папок  и сделать листинг приятный для глаз.
Чтобы не засорять основной конфиг, я вынес все алиасы в отдельный файл:
Include conf/dirs.conf
В этот файл я внес алиасы и настройки для каждой папки. Было очень лень заниматься перераспределением информации на жестких дисках.
Alias /pics1 T:/Pictures/

<Directory /pics1>
    Options FollowSymLinks Indexes Includes
    AddOutputFilterByType DEFLATE text/html text/plain text/xml
    AllowOverride All
    Order deny,allow
    Allow from all
</Directory>
Таким макаром серверу разрешалось генерировать листинги для папок и запрещалось сжимать картинки, что мне и требовалось.
Для генерирования приятного глазу листинга в основном конфиге надо раскомментировать строчку:
Include conf/extra/httpd-autoindex.conf
В самом файле я произвел следующие настройки:
IndexOptions FancyIndexing HTMLTable VersionSort NameWidth=80 FoldersFirst IgnoreCase
Ограничивается ширина колонки с  именами папок и файлов до 80 символов и включается привычная сортировка файлов и папок (папки в начале списка, регистр не учитывается).
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t *.txt favicon.ico *.bat *.sh* google*
Добавил к стандартному набору несколько масок, чтобы скрыть от посетителя то, что ему видеть не надо.
Для добавления хранилищу красивости можно в корне создать файл "HEADER.html", содержимое которого будет выводиться над листингом, и файл "README.html", содержимое которого будет выводиться под листингом.
Можно было бы и дальше убирать из конфига ненужные куски, но остановился на этом.
В итоге всё работало и занимало в памяти чуть больше 10 мегабайт.

Если в результате каких-то изменений сервер перестал запускаться, то в папке "conf\original\" можно найти "заводские" конфиги.

На результат моих мучений можно посмотреть по адресу http://radjah.ath.cx.