Серверы · 6 min read · Jan 31, 2026
Виртуальный хостинг с Proftpd и MySQL (включая квоты) на Ubuntu 14.04LTS
Этот документ описывает, как установить сервер Proftpd, который использует виртуальных пользователей из базы данных MySQL вместо реальных системных пользователей. Это гораздо более производительно и позволяет иметь тысячи ftp-пользователей на одной машине. В дополнение к этому я покажу использование квот с этой настройкой. Этот учебник основан на Ubuntu 14.04LTS.
Для администрирования базы данных MySQL вы можете использовать веб-инструменты, такие как phpMyAdmin, который также будет установлен в этом руководстве. phpMyAdmin - это удобный графический интерфейс, что означает, что вам не придется возиться с командной строкой.
Это руководство предназначено как практическое руководство; оно не охватывает теоретические основы. Они рассматриваются во многих других документах в сети.
Этот документ предоставляется без каких-либо гарантий! Я хочу сказать, что это не единственный способ настройки такой системы. Существует множество способов достижения этой цели, но это тот путь, который я выбираю. Я не даю никаких гарантий, что это сработает для вас!
1 Предварительная заметка
В этом учебнике я использую имя хоста server1.example.com с IP-адресом 192.168.0.100. Эти настройки могут отличаться у вас, поэтому вам нужно заменить их, где это необходимо.
Убедитесь, что вы вошли в систему как root:
sudo su1.1 Изменение оболочки по умолчанию
/bin/sh является символической ссылкой на /bin/dash, однако нам нужна /bin/bash, а не /bin/dash. Поэтому мы делаем следующее:
dpkg-reconfigure dashУстановить dash как /bin/sh? <– Нет
1.2 Отключение AppArmor
AppArmor - это расширение безопасности (аналог SELinux), которое должно обеспечивать расширенную безопасность. На мой взгляд, вам не нужно это для настройки безопасной системы, и оно обычно вызывает больше проблем, чем преимуществ (подумайте об этом после того, как вы провели неделю, устраняя неполадки, потому что какой-то сервис не работал так, как ожидалось, а затем вы обнаруживаете, что все было в порядке, только AppArmor вызывало проблему). Поэтому я отключаю его.
Мы можем отключить его следующим образом:
/etc/init.d/apparmor stop
update-rc.d -f apparmor remove
apt-get remove apparmor apparmor-utils2 Установка MySQL и phpMyAdmin
Все это можно установить одной командой:
apt-get install mysql-server mysql-client phpmyadmin apache2Вам будет предложено ввести пароль для пользователя root MySQL - этот пароль действителен для пользователя root@localhost, а также [email protected], поэтому нам не нужно указывать пароль root MySQL вручную позже:
Новый пароль для пользователя MySQL “root”: <– вашпарольsqlroot
Повторите пароль для пользователя MySQL “root”: <– вашпарольsqlroot
В дополнение к этому вы увидите следующие вопросы:
Веб-сервер для автоматической перенастройки: <– apache2
Настроить базу данных для phpmyadmin с dbconfig-common? <– Нет
3 Установка Proftpd с поддержкой MySQL
Для Ubuntu доступен предварительно настроенный пакет proftpd-mod-mysql. Установите его как отдельный демон следующим образом:
apt-get install proftpd-mod-mysqlВам будет задан следующий вопрос:
Запустить proftpd: <– standalone
Затем мы создаем группу ftp (ftpgroup) и пользователя (ftpuser), к которым будут сопоставлены все наши виртуальные пользователи. Замените идентификатор группы и пользователя 2001 на номер, который свободен в вашей системе:
groupadd -g 2001 ftpgroup
useradd -u 2001 -s /bin/false -d /bin/null -c "proftpd user" -g ftpgroup ftpuser4 Создание базы данных MySQL для Proftpd
Теперь мы создаем базу данных под названием ftp и пользователя MySQL с именем proftpd, который демон proftpd будет использовать позже для подключения к базе данных ftp:
mysql -u root -pCREATE DATABASE ftp;
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost' IDENTIFIED BY 'password';
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost.localdomain' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;Замените строку password на любой пароль, который вы хотите использовать для пользователя MySQL proftpd. Все еще в оболочке MySQL мы создаем необходимые таблицы базы данных:
USE ftp;
CREATE TABLE ftpgroup (
groupname varchar(16) NOT NULL default '',
gid smallint(6) NOT NULL default '5500',
members varchar(16) NOT NULL default '',
KEY groupname (groupname)
) ENGINE=MyISAM COMMENT='ProFTP group table';
CREATE TABLE ftpquotalimits (
name varchar(30) default NULL,
quota_type enum('user','group','class','all') NOT NULL default 'user',
per_session enum('false','true') NOT NULL default 'false',
limit_type enum('soft','hard') NOT NULL default 'soft',
bytes_in_avail bigint(20) unsigned NOT NULL default '0',
bytes_out_avail bigint(20) unsigned NOT NULL default '0',
bytes_xfer_avail bigint(20) unsigned NOT NULL default '0',
files_in_avail int(10) unsigned NOT NULL default '0',
files_out_avail int(10) unsigned NOT NULL default '0',
files_xfer_avail int(10) unsigned NOT NULL default '0'
) ENGINE=MyISAM;
CREATE TABLE ftpquotatallies (
name varchar(30) NOT NULL default '',
quota_type enum('user','group','class','all') NOT NULL default 'user',
bytes_in_used bigint(20) unsigned NOT NULL default '0',
bytes_out_used bigint(20) unsigned NOT NULL default '0',
bytes_xfer_used bigint(20) unsigned NOT NULL default '0',
files_in_used int(10) unsigned NOT NULL default '0',
files_out_used int(10) unsigned NOT NULL default '0',
files_xfer_used int(10) unsigned NOT NULL default '0'
) ENGINE=MyISAM;
CREATE TABLE ftpuser (
id int(10) unsigned NOT NULL auto_increment,
userid varchar(32) NOT NULL default '',
passwd varchar(32) NOT NULL default '',
uid smallint(6) NOT NULL default '5500',
gid smallint(6) NOT NULL default '5500',
homedir varchar(255) NOT NULL default '',
shell varchar(16) NOT NULL default '/sbin/nologin',
count int(11) NOT NULL default '0',
accessed datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (id),
UNIQUE KEY userid (userid)
) ENGINE=MyISAM COMMENT='ProFTP user table';
quit;Как вы могли заметить, с помощью команды quit; мы вышли из оболочки MySQL и вернулись в оболочку Linux.
Кстати, (я предполагаю, что имя хоста вашей системы ftp-сервера - server1.example.com) вы можете получить доступ к phpMyAdmin по адресу http://server1.example.com/phpmyadmin/ (вы можете использовать IP-адрес вместо server1.example.com) в браузере и войти как proftpd. Затем вы можете взглянуть на базу данных. Позже вы можете использовать phpMyAdmin для управления вашим сервером Proftpd.
5 Настройка Proftpd
Откройте /etc/proftpd/modules.conf…
vi /etc/proftpd/modules.conf… и включите следующие три модуля:
| [...] # Установите один из proftpd-mod-mysql, proftpd-mod-pgsql или любой другой # SQL backend engine, чтобы использовать этот модуль и необходимый бэкенд. # Этот модуль должен быть обязательно загружен перед любым из # существующих SQL бэкендов. LoadModule mod_sql.c [...] # Установите proftpd-mod-mysql и раскомментируйте предыдущий # модуль mod_sql.c, чтобы использовать это. LoadModule mod_sql_mysql.c [...] # Установите один из предыдущих SQL бэкендов и раскомментируйте # предыдущий модуль mod_sql.c, чтобы использовать это LoadModule mod_quotatab_sql.c [...] |
Затем откройте /etc/proftpd/proftpd.conf и закомментируйте следующие строки:
vi /etc/proftpd/proftpd.conf| [...] # |
Далее в файле добавьте следующие строки:
| [...] # # Альтернативные фреймворки аутентификации # #Include /etc/proftpd/ldap.conf #Include /etc/proftpd/sql.conf DefaultRoot ~ SQLBackend mysql # Пароли в MySQL шифруются с использованием CRYPT SQLAuthTypes Plaintext Crypt SQLAuthenticate users groups # используется для подключения к базе данных # databasename@host database_user user_password SQLConnectInfo ftp@localhost proftpd password # Здесь мы говорим ProFTPd имена столбцов базы данных в "usertable" # с которыми мы хотим, чтобы он взаимодействовал. Совпадение имен с теми, что в базе данных SQLUserInfo ftpuser userid passwd uid gid homedir shell # Здесь мы говорим ProFTPd имена столбцов базы данных в "grouptable" # с которыми мы хотим, чтобы он взаимодействовал. Снова имена совпадают с теми, что в базе данных SQLGroupInfo ftpgroup groupname gid members # установить минимальный UID и GID - в противном случае они равны 999 SQLMinID 500 # создать домашний каталог пользователя по запросу, если он не существует CreateHome on # Обновлять счетчик каждый раз, когда пользователь входит в систему SQLLog PASS updatecount SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser # Обновлять измененный каждый раз, когда пользователь загружает или удаляет файл SQLLog STOR,DELE modified SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser # Квоты пользователей # =========== 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 ftpquotalimits 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 ftpquotatallies 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}'" ftpquotatallies SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" ftpquotatallies QuotaLimitTable sql:/get-quota-limit QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally RootLogin off RequireValidShell off [...] |
Убедитесь, что вы заменили строку password на реальный пароль для пользователя MySQL proftpd в строке SQLConnectInfo!
Затем перезапустите Proftpd:
/etc/init.d/proftpd restartGet new posts in your inbox
No spam. Unsubscribe anytime.