proftpd + mysql + lighttpd = свой мини хостинг

Итак. Статья предназначается для тех кто хочет сделать на своем компьютере подобие виртуального хостинга. Как вариант просто настроить фтп сервер(пропустите ненужные для вас настройки lighttpd).
Итак что нам понадобится?

  1. Lighttpd - легковесный http сервер
  2. Mysql - реляционная база данных.
  3. 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
И что же мы в конце концов получаем? Получаем свой мини хостинг. Пользователь имеет доступ к файлам и получает персональную дерикторию в вебе. Можно просто хранить файлы можно сделать простой хостинг домашних страниц.
Использованые материалы:

(C)Smit, easylinux.ru при перепечатке ссылка на данный блог обязательна :)
Если у кого либюо есть дополнения или замечены ошибке буду рад выслушать :)

Комментарии

сравнения

сравнения lighthttpd и apache2+mod_php по производительности нету?

По ощущениям

По ощущениям лайт с fastCGI щустрее чем апач.
Особенно это касается тяжеловестной работы обработки значений или вычислений. По времени вывода данных на экран апач и лайт примерно одинаковы.

Хотя лайт у меня стоит на никсах, а вот апач под вином пашет.

тесты

тесты интересно :)

вообще лайти +

вообще лайти + fcgi используют ту же схему что и апач + мод пхп тоесть интерпретатор не вызывается при каждом выполнении скрипта а постоянно висит в памяти. По ошушениям работает пошустрее. если вы заинтересованы в максимальном быстродействии при минимальных затратах ресурсов (допустим у вас система на подобии роутеров от аусус где и память и процессор сильно ограничены. То я бы посоветовал посмотреть в сторону thttpd но я с ним дела не имел практически. ) да кстати скоро будет готова статья про mod_secdownload & mod_flv_streaming иили как создать свой ютьюб. Надеюсь кому то будет интересно :))

агаа. ждем

агаа. ждем потирая руки :)

Лично у меня

Лично у меня нет. но на сайте авторов можно почитать тесты проводимые ими. Вообще как поговаривают lighty + fastcgi работает побыстрее чем apache2 + mod_php

Не все понятно. Новичек

insert into users values (NULL,'Test','12345','1012','1013','/home/ftp/test','/sbin/nologin');

Да вы объяснили----Test, 12345,/home/ftp/test - это соотвественно логин пользователя пароль и директория для пользователя.
А что такое ','1012','1013','

Да, вроде все понятно

Да, вроде все понятно

я думаю это UID и GID

я думаю это UID и GID виртуального пользователя ?

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".
Тягачи и прицепы: тягач .