proftpd + mysql + lighttpd = свой мини хостинг
Итак. Статья предназначается для тех кто хочет сделать на своем компьютере подобие виртуального хостинга. Как вариант просто настроить фтп сервер(пропустите ненужные для вас настройки lighttpd). Итак что нам понадобится? Lighttpd - легковесный http сервер Mysql - реляционная база данных. Proftpd - популярный и очень мощный фтп сервер Mysql & Lighttpd будем устанавливать из репозитория. А вот proftpd прийдется собирать ручками. Устанавливаем lighttpd & mysql-server: Debian: apt-get install lighttpd mysql-server libmysqlclient15-dev libmysql++-dev Fedora core: yum install mysql mysql-server mysql++-devel (поскольку я сижу на дебиане то за точность команды не ручаюсь) Установили? Переходим далее. Теперь создаем временную директорию для исходников: mkdir /home/smit/src/ не забываем изменить ;) переходим в нее и забираем последние исходники proftpd wget ftp://ftp.proftpd.org/distrib/source/proftpd-1.3.1.tar.gz распаковываем А теперь внимание. Нам понадобится знать где хранятся заголовочные файлы для mysql. Я приведу пример для Debian Debian: ./configure --prefix=/usr/local/ -with-modules=mod_sql:mod_sql_mysql:mod_quotatab:mod_quotatab_sql --with-includes=/usr/include/mysql/ Если все прошло без ошибок (Они могут возникнуть только в том случае если вы неправильно указали местоположение заголовочных файлов) То переходим к компиляции. make && make install После выполнения данных команд бинарные файлы окажутся в /usr/local/bin/ конфиг в /usr/local/etc/ Теперь нам нужно настроить сервер MySql для работы с proftpd Для начала мы должны установить пароль на пользователя root выполняем в консоли : mysql -u root use mysql После туда же вставляем: UPDATE user SET password=PASSWORD("abcd") WHERE user="root"; и это: FLUSH PRIVILEGES; перезапускаем сервис. abcd - ваш пароль не забудьте сменить на что то более серьезное ;) База готова к "Употреблению". Теперь нам нужно создать базу для сервера . mysql -u root -p програма спросит ваш пароль который мы установили ранее. Теперь нам нужно создать базу create database proftpd; После выбираем только что созданую базу use proftpd; Создаем базу CREATE TABLE users ( primary_key int not null auto_increment primary key, username varchar(20) not null, password varchar(20) not null, uid int not null, gid int not null, homedir varchar(50) not null, shell varchar(20) not null );
CREATE TABLE quotalimits ( name VARCHAR(30), quota_type ENUM("user", "group", "class", "all") NOT NULL, per_session ENUM("false", "true") NOT NULL, limit_type ENUM("soft", "hard") NOT NULL, bytes_in_avail FLOAT NOT NULL, bytes_out_avail FLOAT NOT NULL, bytes_xfer_avail FLOAT NOT NULL, files_in_avail INT UNSIGNED NOT NULL, files_out_avail INT UNSIGNED NOT NULL, files_xfer_avail INT UNSIGNED NOT NULL );
CREATE TABLE quotatallies ( name VARCHAR(30) NOT NULL, quota_type ENUM("user", "group", "class", "all") NOT NULL, bytes_in_used FLOAT NOT NULL, bytes_out_used FLOAT NOT NULL, bytes_xfer_used FLOAT NOT NULL, files_in_used INT UNSIGNED NOT NULL, files_out_used INT UNSIGNED NOT NULL, files_xfer_used INT UNSIGNED NOT NULL );
Теперь мы должны добавить пользователя и группу. От имени которых будет работать сервер. groupadd ftp useradd ftp -s /sbin/nologin -d /dev/null -g ftp заносим пользователей и квоты. Если для системного пользователя, смотрим uid gid: cat /etc/passwd | grep smit smit:x:1000:1000:smit,,,:/home/smit:/bin/bash 1000:1000 это и есть uid gid. Вносим данные в таблицу. mysql -u root -p use proftpd; insert into users values (NULL,'smit','passwd','1000','1000','/home/smit','/sbin/nologin'); insert into quotalimits values ('smit','user','false','hard','0','0','0','0','0','0'); Этими командами мы создали аккаунт для уже существующего пользователя в системе. Теперь перейдем к виртуальным пользователям. Файлы должны кому то пренадлежать. Это будет пользователь ftp. Смотрим uid gid: cat /etc/passwd | grep ftp ftp:x:1001:1001::/dev/null:/sbin/nologin Вносим данные в таблицу: mysql -u root -p use proftpd; insert into users values (NULL,'Test','12345','1012','1013','/home/ftp/test','/sbin/nologin'); Test, 12345,/home/ftp/test - это соотвественно логин пользователя пароль и директория для пользователя. Я сделал директорию /home/ftp/ куда будут помещатся все пользовательские директории. так же не забываем что новыми директориями должен владеть пользователь ftp. chown ftp:ftp /home/ftp/test Задаем квоту в 150 мегабайт. musql -u root -p use proftpd insert into quotalimits values ('test','user','false','hard','157286400','0','0','0','0','0');
Комментарии к таблице users
username: имя виртуального пользователя
passwd: незашифрованный пароль
uid: uid пользователя которому будут принадлежать файлы
gid: gid пользователя которому будут принадлежать файлы
homedir: chroot директория пользователя.
shell: по умолчанию /sbin/nologin
Комментарии к таблице quotalimits
name: имя виртуального пользователя
quota_type: тип ограничения по (user,qroup,class или all - для всех)
per_session: true - использовать квоту только на текущую сессию, в этом случае ни куда не записывается размер использованной квоты и для каждой новой сессии используется указанная квота.
false - в этом случае использование квоты заноситься в базу данных.
limit_type: soft - возможно некоторое превышение квоты
hard - жостко заданная квота, превышение невозможно
bytes_in_avail лимит загрузки в байтах ( если 150 Мб то 157286400 байт) 0 = нет лемита
bytes_out_avail лимит скачивания в байтах. 0 = нет лимита
bytes_xfer_avail: Лимит передачи в байтах.0 = нет лимита
files_in_avail: Лимит количества загружаемых файлов. 0 = нет лимита
files_out_avail: Лимит количесва скачиваемых файлов. 0 = нет лимита
files_xfer_avail: Лимит количесва передачи файлов. 0 = нет лимита
таблицу quotatallies редактировать не нужно proftpd это делает сам.
ServerName "FTP server"
ServerAdmin smit@smit.com
ServerType standalone
DefaultServer on
ServerIdent on
Port 21
Umask 022
MaxClients 10 "Sorry, the maximum number of allowed users are already connected (%m)"
MaxClientsPerHost 10 "Sorry, you may not connect more than one time. %m allowed users already connected"
MaxLoginAttempts 3
User ftp
Group ftp
SyslogLevel notice
UseReverseDNS off
IdentLookups off
SystemLog /var/log/proftpd/proftpd.log
TransferLog /var/log/proftpd/proftpd-tranfer.log
ExtendedLog /var/log/proftpd/proftpd-extended.log read,write
ExtendedLog /var/log/proftpd/proftpd-auth.log AUTH auth
LogFormat default "%h %l %u %t "%r" %s %b"
LogFormat auth "%v [%P] %h %t "%r" %s"
LogFormat write "%h %l %u %t "%r" %s %b"
TimeoutIdle 300
TimeoutLogin 300
TimeoutNoTransfer 360
TimeoutStalled 640
DefaultTransferMode binary
AllowForeignAddress off
DisplayConnect /etc/ftp_connect.msg DisplayLogin /etc/ftp_login.msg AccessDenyMsg "ATTENTION!!! ALL CONNECTIONS LOGED" AccessGrantMsg "Now upload/download files" DisplayGoAway "Go Away" PersistentPasswd off DefaultRoot ~
AllowOverwrite on
AllowAll
AllowAll
Если нужен анонимный доступ раскомментировать.
< Anonymous /path/to/anonymous/users> # Директория для анонимов.
User ftp
Group ftp
UserAlias anonymous ftp
MaxClients 10
< Limit WRITE>
DenyAll # Запрещаем писать.
< /Limit>
< /Anonymous>
sql info
SQLAuthTypes Plaintext # хранить пароли в открытом тексте
SQLAuthenticate users
SQLConnectInfo proftpd@localhost proftpd password # база@хост логин пароль
SQLUserInfo users username password uid gid homedir shell # данные которые беруться из базы
RequireValidShell off # непроверять валидность шелла
SQLLogFile /var/log/proftpd/sql.log #нужно только на время тестирования после закоментить, генерирует много инфы.
config quotas
===========
QuotaEngine on # включить квоту
QuotaDirectoryTally on
QuotaDisplayUnits Mb
QuotaShowQuotas on
SQLNamedQuery get-quota-limit SELECT "name, quota_type, per_session, limit_type,
bytes_in_avail, bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail,
files_xfer_avail FROM quotalimits WHERE name = '%{0}' AND quota_type = '%{1}'"
SQLNamedQuery get-quota-tally SELECT "name, quota_type, bytes_in_used, bytes_out_used,
bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM quotatallies
WHERE name = '%{0}' AND quota_type = '%{1}'"
SQLNamedQuery update-quota-tally UPDATE "bytes_in_used = bytes_in_used + %{0},
bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2},
files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4},
files_xfer_used = files_xfer_used + %{5} WHERE name = '%{6}' AND quota_type = '%{7}'" quotatallies
SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" quotatallies
QuotaLimitTable sql:/get-quota-limit
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally
QuotaLog /var/log/proftpd/quota.log
----------------------------- end config --------------------------------
Создаем директорию для логов mkdir /var/log/proftpd запросы SQLNamedQuery get-quota-limit SQLNamedQuery get-quota-tally SQLNamedQuery update-quota-tally должны быть одной строкой в конфиге. вот вродебы и все теперь можно запусктать proftpd
Фтп сервер настроен и готов к работе. Теперь переходим к настройке Web- сервера. В Debian для включения модуля используйте команду lighty-enable-mod В остальных системах : nano /etc/lighttpd/lighttpd.conf находим mod_userdir и раскоменчиваем его. В Debian открываем файл nano /etc/lighttpd/conf-enabled/10-userdir.conf userdir.path="" в конец дописываем userdir.basepath = "/home/ftp/" перезапускаем Web сервер /etc/init.d/lighttpd restart проверяем досутпность директории зайдя по ссылке http://localhost/~test Для остальных системы выполнить те же шаги только добавлять все данные в файл /etc/lighttpd/lighttpd.conf И что же мы в конце концов получаем? Получаем свой мини хостинг. Пользователь имеет доступ к файлам и получает персональную дерикторию в вебе. Можно просто хранить файлы можно сделать простой хостинг домашних страниц. Использованые материалы: http://www.opennet.ru http://forums.proftpd.org (C)Smit, easylinux.ru при перепечатке ссылка на данный блог обязательна :) Если у кого либюо есть дополнения или замечены ошибке буду рад выслушать :)
Комментарии:
Нет комментариев.
Пожалуйста войдите или зарегистрируйтесь чтобы оставлять комментарии.