Виртуальный хостинг · 12 min read · Nov 24, 2025

Виртуальный хостинг с PureFTPd и MySQL (включая управление квотами и пропускной способностью) на OpenSUSE 13.2

Виртуальный хостинг с PureFTPd и MySQL (включая управление квотами и пропускной способностью) на OpenSUSE 13.2

Версия 1.0
Автор: Srijan Kishore
Следите за howtoforge в Twitter
Последнее редактирование 19/ноя/2014

Этот документ описывает, как установить сервер PureFTPd, который использует виртуальных пользователей из базы данных MySQL вместо реальных системных пользователей. Это гораздо более производительно и позволяет иметь тысячи ftp пользователей на одной машине. В дополнение к этому я покажу использование квот и ограничений на загрузку/скачивание с этой настройкой. Пароли будут храниться в зашифрованном виде в виде строк MD5 в базе данных.

Для администрирования базы данных MySQL вы можете использовать веб-инструменты, такие как phpMyAdmin, которые также будут установлены в этом руководстве. phpMyAdmin - это удобный графический интерфейс, что означает, что вам не нужно возиться с командной строкой.

Этот документ предоставляется без каких-либо гарантий! Я хочу сказать, что это не единственный способ настройки такой системы. Существует множество способов достижения этой цели, но это тот путь, который я выбрал.

1 Предварительная заметка

В этом учебнике я использую имя хоста server1.example.com с IP-адресом 192.168.0.100. Эти настройки могут отличаться у вас, поэтому вам нужно заменить их, где это необходимо. У вас должна быть базовая установка Open Suse перед тем, как продолжить, как описано в этом учебнике.

2 Установка MariaDB, Apache2 и phpMyAdmin

MariaDB, Apache и модули PHP, необходимые для phpMyAdmin, можно установить следующим образом:

zypper install mariadb mariadb-client apache2 apache2-mod_php5 php5-mysql php5-mcrypt php5-mbstring php5-gd
server1:~ # zypper install mariadb mariadb-client apache2 apache2-mod_php5 php5-mysql php5-mcrypt php5-mbstring php5-gd  
Загрузка данных репозитория...  
Чтение установленных пакетов...  
Разрешение зависимостей пакетов...
  
Проблема: php5-mysql-5.6.1-4.1.x86_64 требует php5 = 5.6.1, но это требование не может быть выполнено  
  неустановимые провайдеры: php5-5.6.1-1.1.x86_64[openSUSE-13.2-0]  
                   php5-5.6.1-1.1.i586[repo-oss]  
                   php5-5.6.1-1.1.x86_64[repo-oss]  
                   php5-5.6.1-4.1.i586[repo-update]  
                   php5-5.6.1-4.1.x86_64[repo-update]  
  Решение 1: Следующие действия будут выполнены:  
  не устанавливать php5-mysql-5.6.1-4.1.x86_64  
  не устанавливать php5-mcrypt-5.6.1-4.1.x86_64  
  не устанавливать php5-gd-5.6.1-4.1.x86_64  
  Решение 2: Следующие действия будут выполнены:  
  не устанавливать php5-mcrypt-5.6.1-4.1.x86_64  
  не устанавливать apache2-mod_php5-5.6.1-4.1.x86_64  
  не устанавливать php5-gd-5.6.1-4.1.x86_64  
  не устанавливать php5-mbstring-5.6.1-4.1.x86_64  
  не устанавливать php5-mysql-5.6.1-4.1.x86_64  
  Решение 3: Следующие действия будут выполнены:  
  не устанавливать php5-mcrypt-5.6.1-4.1.x86_64  
  не устанавливать apache2-mod_php5-5.6.1-4.1.x86_64  
  не устанавливать php5-gd-5.6.1-4.1.x86_64  
  не устанавливать php5-mbstring-5.6.1-4.1.x86_64  
  Решение 4: Следующие действия будут выполнены:  
  не устанавливать php5-mcrypt-5.6.1-4.1.x86_64  
  не устанавливать apache2-mod_php5-5.6.1-4.1.x86_64  
  не устанавливать php5-gd-5.6.1-4.1.x86_64  
  не устанавливать php5-mbstring-5.6.1-4.1.x86_64  
  Решение 5: Следующие действия будут выполнены:  
  не устанавливать php5-mcrypt-5.6.1-4.1.x86_64  
  не устанавливать apache2-mod_php5-5.6.1-4.1.x86_64  
  не устанавливать php5-gd-5.6.1-4.1.x86_64  
  не устанавливать php5-mbstring-5.6.1-4.1.x86_64  
  Решение 6: Следующие действия будут выполнены:  
  не устанавливать php5-mcrypt-5.6.1-4.1.x86_64  
  не устанавливать apache2-mod_php5-5.6.1-4.1.x86_64  
  не устанавливать php5-gd-5.6.1-4.1.x86_64  
  не устанавливать php5-mbstring-5.6.1-4.1.x86_64  
  Решение 7: деинсталляция patterns-openSUSE-minimal_base-conflicts-20141007-2.1.x86_64  
  Решение 8: сломать php5-mysql-5.6.1-4.1.x86_64, игнорируя некоторые его зависимости  

Выберите одно из вышеуказанных решений по номеру или отмените [1/2/3/4/5/6/7/8/c] (c): <--7

Затем мы создаем системные ссылки для автозагрузки MySQL (чтобы MySQL запускался автоматически при каждом запуске системы) и запускаем сервер MySQL:

systemctl enable mysql.service  
systemctl start mysql.service

Чтобы обеспечить безопасность установки MySQL, выполните:

mysql_secure_installation
server1:~ # mysql_secure_installation  
/usr/bin/mysql_secure_installation: line 379: find_mysql_client: command not found  
  
ПРИМЕЧАНИЕ: РЕКОМЕНДУЕТСЯ ЗАПУСКАТЬ ВСЕ ЧАСТИ ЭТОГО СКРИПТА ДЛЯ ВСЕХ СЕРВЕРОВ MariaDB  
      В ПРОИЗВОДСТВЕННОМ ИСПОЛЬЗОВАНИИ!  Пожалуйста, внимательно прочитайте каждый шаг!  
  
Чтобы войти в MariaDB для обеспечения безопасности, нам понадобится текущий  
пароль для пользователя root.  Если вы только что установили MariaDB и  
вы еще не установили пароль root, пароль будет пустым,  
поэтому вам просто нужно нажать Enter здесь.  
  
Введите текущий пароль для root (нажмите Enter для отсутствия):   
ОК, успешно использован пароль, продолжаем...  
  
Установка пароля root гарантирует, что никто не сможет войти в пользователя root MariaDB  
без надлежащей авторизации.  
  
Установить пароль root? [Y/n] <--ENTER  
Новый пароль: <--mariadbpassword  
Повторите новый пароль: <--mariadbpassword  
Пароль успешно обновлен!  
Перезагрузка таблиц привилегий..  
  ... Успех!  
  
По умолчанию установка MariaDB имеет анонимного пользователя, позволяя любому  
войти в MariaDB без необходимости создания учетной записи пользователя.  
Это предназначено только для тестирования и для того, чтобы установка  
прошла немного легче.  
Вы должны удалить их перед переходом в  
производственную среду.  
  
Удалить анонимных пользователей? [Y/n] <--ENTER  
  ... Успех!  
  
Обычно root должен иметь возможность подключаться только с 'localhost'.  
Это гарантирует, что кто-то не сможет угадать пароль root из сети.  
  
Запретить удаленный вход root? [Y/n] <--ENTER  
  ... Успех!  
  
По умолчанию MariaDB поставляется с базой данных с именем 'test', к которой любой может  
получить доступ.  Это также предназначено только для тестирования и должно быть удалено  
перед переходом в производственную среду.  
  
Удалить тестовую базу данных и доступ к ней? [Y/n] <--ENTER  
  - Удаление тестовой базы данных...  
  ... Успех!  
  - Удаление привилегий на тестовую базу данных...  
  ... Успех!  
  
Перезагрузка таблиц привилегий гарантирует, что все изменения, сделанные до сих пор,  
вступят в силу немедленно.  
  
Перезагрузить таблицы привилегий сейчас? [Y/n] <--ENTER  
  ... Успех!  
  
Очистка...  
  
Все готово!  Если вы выполнили все вышеперечисленные шаги, ваша установка MariaDB  
теперь должна быть безопасной.  
  
Спасибо за использование MariaDB!  
server1:~ #

Теперь ваша установка MySQL должна быть защищена.

Затем мы создаем системные ссылки для автозагрузки Apache (чтобы он запускался автоматически при каждом запуске системы) и запускаем его:

systemctl enable apache2.service  
systemctl start apache2.service

phpMyAdmin можно установить следующим образом:

zypper install phpmyadmin

Чтобы убедиться, что мы можем получить доступ к phpMyAdmin, отредактируйте файл следующим образом:

vi /etc/apache2/conf.d/phpMyAdmin.conf

Добавьте псевдоним следующим образом:

Alias /phpMyAdmin /srv/www/htdocs/phpMyAdmin
Alias /phpmyadmin /srv/www/htdocs/phpMyAdmin
[...]

Перед запуском apache нам нужно следовать по ссылке и внести изменения в httpd.conf

vi /etc/apache2/httpd.conf

Примечание: если значения файла отличаются, измените значение следующим образом:

Закомментируйте эти строки и добавьте эти строки

#  
#    Options None  
#    AllowOverride None  
#    Order deny,allow  
#   Deny from all  
#  
  
  
Options None  
AllowOverride None  
Require all denied  

Затем нам нужно создать конфигурационный файл для phpmyadmin следующим образом:

cd /srv/www/htdocs/phpMyAdmin  
cp config.sample.inc.php config.inc.php

В конфигурационном файле вы можете увидеть, что phpmyadmin ожидает базу данных с именем “phpmyadmin”, которая содержит таблицы pma:

[...]  
$cfg['Servers'][$i]['pmadb']               = 'phpmyadmin';  
[...]  

Итак, мы создаем одну:

echo "create database phpmyadmin;" | mysql -u root -p 'mariadbpassword'

и загружаем таблицы из документации phpmyadmin.

mysql -u root -p 'mariadbpassword' < /usr/share/doc/packages/phpMyAdmin/examples/create_tables.sql

Теперь запустите службу Apache

systemctl enable apache2.service  
systemctl restart apache2.service

Теперь мы можем получить доступ к phpmyadmin по адресу http://192.168.0.100/phpmyadmin или по адресу http://server1.example.com

3 Установка PureFTPd с поддержкой MySQL

Пакет PureFTPd для OpenSUSE поддерживает различные бэкенды, такие как MySQL, PostgreSQL, LDAP и т. д. Поэтому все, что нам нужно сделать, это установить обычный пакет PureFTPd:

 zypper install pure-ftpd

Затем мы создаем группу ftp (ftpgroup) и пользователя (ftpuser), к которым будут сопоставлены все наши виртуальные пользователи. Замените идентификаторы группы и пользователя 2001 на номер, который свободен в вашей системе:

groupadd -g 2001 ftpgroup  
useradd -u 2001 -s /bin/false -d /bin/null -c "pureftpd user" -g ftpgroup ftpuser

4 Создание базы данных MySQL для PureFTPd

Теперь мы создаем базу данных с именем pureftpd и пользователя MySQL с именем pureftpd, который позже будет использоваться демоном PureFTPd для подключения к базе данных pureftpd:

mysql -u root -p
CREATE DATABASE pureftpd;  
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON pureftpd.* TO 'pureftpd'@'localhost' IDENTIFIED BY 'ftpdpass';  
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON pureftpd.* TO 'pureftpd'@'localhost.localdomain' IDENTIFIED BY 'ftpdpass';  
FLUSH PRIVILEGES;

Замените строку ftpdpass на любой пароль, который вы хотите использовать для пользователя MySQL pureftpd. Все еще в оболочке MySQL мы создаем таблицу базы данных, которая нам нужна (да, всего одна таблица!):

USE pureftpd;
CREATE TABLE `ftpd` (  
User varchar(16) NOT NULL default '',  
status enum('0','1') NOT NULL default '0',  
Password varchar(64) NOT NULL default '',  
Uid varchar(11) NOT NULL default '-1',  
Gid varchar(11) NOT NULL default '-1',  
Dir varchar(128) NOT NULL default '',  
ULBandwidth smallint(5) NOT NULL default '0',  
DLBandwidth smallint(5) NOT NULL default '0',  
comment tinytext NOT NULL,  
ipaccess varchar(15) NOT NULL default '*',  
QuotaSize smallint(5) NOT NULL default '0',  
QuotaFiles int(11) NOT NULL default 0,  
PRIMARY KEY (User),  
UNIQUE KEY User (User)  
)  ENGINE=MyISAM;
quit;

Теперь вы можете получить доступ к phpMyAdmin по адресу http://server1.example.com/phpMyAdmin/ (вы также можете использовать IP-адрес вместо server1.example.com) в браузере и войти как пользователь pureftpd. Затем вы можете взглянуть на базу данных. Позже вы можете использовать phpMyAdmin для администрирования вашего сервера PureFTPd.

5 Настройка PureFTPd

Отредактируйте /etc/pure-ftpd/pure-ftpd.conf и убедитесь, что строки ChrootEveryone, AnonymousOnly, MySQLConfigFile и CreateHomeDir включены и выглядят следующим образом:

vi /etc/pure-ftpd/pure-ftpd.conf
[...]  
ChrootEveryone              yes  
[...]  
AnonymousOnly               no  
[...]  
MySQLConfigFile              /etc/pure-ftpd/pureftpd-mysql.conf  
[...]  
CreateHomeDir               yes  
[...]  

Настройка ChrootEveryone заставит PureFTPd chroot каждого виртуального пользователя в его домашний каталог, чтобы он не мог просматривать каталоги и файлы вне своего домашнего каталога. Строка CreateHomeDir заставит PureFTPd создать домашний каталог пользователя, когда пользователь входит в систему, и домашний каталог еще не существует. AnonymousOnly должен быть установлен в no, потому что в противном случае будут разрешены только анонимные FTP-сессии.

Затем мы создаем/редактируем /etc/pure-ftpd/pureftpd-mysql.conf. Он должен выглядеть следующим образом:

vi /etc/pure-ftpd/pureftpd-mysql.conf
MYSQLSocket      /var/run/mysql/mysql.sock  
#MYSQLServer     localhost  
#MYSQLPort       3306  
MYSQLUser       pureftpd  
MYSQLPassword   ftpdpass  
MYSQLDatabase   pureftpd  
#MYSQLCrypt md5, cleartext, crypt() or password() - md5 is VERY RECOMMENDABLE uppon cleartext  
MYSQLCrypt      md5  
MYSQLGetPW      SELECT Password FROM ftpd WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")  
MYSQLGetUID     SELECT Uid FROM ftpd WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")  
MYSQLGetGID     SELECT Gid FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")  
MYSQLGetDir     SELECT Dir FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")  
MySQLGetBandwidthUL SELECT ULBandwidth FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")  
MySQLGetBandwidthDL SELECT DLBandwidth FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")  
MySQLGetQTASZ   SELECT QuotaSize FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")  
MySQLGetQTAFS   SELECT QuotaFiles FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")

Убедитесь, что вы заменили строку ftpdpass на реальный пароль для пользователя MySQL pureftpd в строке MYSQLPassword! Пожалуйста, обратите внимание, что мы используем md5 в качестве метода MYSQLCrypt, что означает, что мы будем хранить пароли пользователей в виде строки MD5 в базе данных, что гораздо безопаснее, чем использование паролей в открытом виде!

Теперь мы создаем системные ссылки для автозагрузки PureFTPd и запускаем его:

systemctl enable pure-ftpd  
systemctl start pure-ftpd

6 Заполнение базы данных и тестирование

Чтобы заполнить базу данных, вы можете использовать оболочку MySQL:

mysql -u root -p
USE pureftpd;

Теперь мы создаем пользователя exampleuser со статусом 1 (что означает, что его ftp-учетная запись активна), паролем secret (который будет храниться в зашифрованном виде с использованием функции MD5 MySQL), UID и GID 2001 (используйте идентификатор пользователя и идентификатор группы, которые вы создали в конце второго шага!), домашний каталог /home/www.example.com, пропускная способность загрузки и скачивания 100 КБ/с (килобайтов в секунду) и квоту 50 МБ:

INSERT INTO `ftpd` (`User`, `status`, `Password`, `Uid`, `Gid`, `Dir`, `ULBandwidth`, `DLBandwidth`, `comment`, `ipaccess`, `QuotaSize`, `QuotaFiles`) VALUES ('exampleuser', '1', MD5('secret'), '2001', '2001', '/home/www.example.com', '100', '100', '', '*', '50', '0');
quit;

Теперь откройте свою FTP-клиентскую программу на своем рабочем месте (что-то вроде WS_FTP или SmartFTP, если вы находитесь в системе Windows, или gFTP на настольном компьютере Linux) и попробуйте подключиться. В качестве имени хоста используйте server1.example.com (или IP-адрес системы), имя пользователя - exampleuser, а пароль - secret.

Если вы смогли подключиться - поздравляю! Если нет, что-то пошло не так.

Теперь, если вы выполните

ls -l /home/
server1:~ # ls -l /home/  
total 0  
drwxr-xr-x 1 administrator users    128 Nov  7 14:30 administrator  
drwxr-xr-x 1 ftpuser       ftpgroup  18 Nov 19 14:32 www.example.com  
server1:~ #

вы должны увидеть, что каталог /home/www.example.com (домашний каталог exampleuser) был создан автоматически, и он принадлежит ftpuser и ftpgroup (пользователю/группе, которую мы создали в конце второго шага):

7 Администрирование базы данных

Для большинства людей проще, если у них есть графический интерфейс для MySQL; поэтому вы также можете использовать phpMyAdmin (в этом примере по адресу http://server1.example.com/phpMyAdmin/ или http://192.168.0.100/phpMyAdmin/) для администрирования базы данных pureftpd.

Когда вы хотите создать нового пользователя, вам нужно создать запись в таблице ftpd, поэтому я объясню столбцы этой таблицы здесь:

Таблица ftpd:

  • User: Имя виртуального пользователя PureFTPd (например, exampleuser).

  • status: 0 или 1. 0 означает, что учетная запись отключена, пользователь не может войти в систему.

  • Password: Пароль виртуального пользователя. Убедитесь, что вы используете функцию MD5 MySQL, чтобы сохранить пароль в зашифрованном виде в виде строки MD5:


  • UID: Идентификатор пользователя ftp, который вы создали в конце второго шага (например, 2001).

  • GID: Идентификатор группы ftp, который вы создали в конце второго шага (например, 2001).

  • Dir: Домашний каталог виртуального пользователя PureFTPd (например, /home/www.example.com). Если он не существует, он будет создан, когда новый пользователь войдет в систему в первый раз через FTP. Виртуальный пользователь будет заключен в этот домашний каталог, т.е. он не сможет получить доступ к другим каталогам вне своего домашнего каталога.

  • ULBandwidth: Пропускная способность загрузки виртуального пользователя в КБ/с (килобайтах в секунду). 0 означает неограниченно.

  • DLBandwidth: Пропускная способность скачивания виртуального пользователя в КБ/с (килобайтах в секунду). 0 означает неограниченно.

  • comment: Вы можете ввести любой комментарий здесь (например, для вашего внутреннего администрирования). Обычно это поле оставляют пустым.

  • ipaccess: Введите IP-адреса, которые могут подключаться к этой FTP-учетной записи. * означает, что любой IP-адрес может подключаться.

  • QuotaSize: Объем хранилища в МБ (не КБ, как в ULBandwidth и DLBandwidth!), который виртуальный пользователь может использовать на FTP-сервере. 0 означает неограниченно.

  • QuotaFiles: количество файлов, которые виртуальный пользователь может сохранить на FTP-сервере. 0 означает неограниченно.

8 Анонимный FTP

Если вы хотите создать анонимную ftp-учетную запись (ftp-учетную запись, в которую каждый может войти без пароля), вам нужно создать пользователя и группу с именем ftp. Оба были созданы автоматически, когда вы установили пакет pure-ftpd, поэтому вам не нужно создавать их вручную. Однако домашний каталог ftp по умолчанию - /srv/ftp, но я хотел бы создать каталог анонимного ftp в /home/ftp (обычные ftp-каталоги пользователей также находятся в /home, например, /home/www.example.com). Но, конечно, вы можете использовать каталог /srv/ftp для анонимного ftp, если предпочитаете его.

Если вы хотите использовать /home/ftp, откройте /etc/passwd и измените домашний каталог пользователя ftp с /srv/ftp на /home/ftp (не делайте этого, если хотите использовать /srv/ftp):

vi /etc/passwd
[...]  
#ftp:x:40:49:FTP account:/srv/ftp:/bin/bash  
ftp:x:40:49:FTP account:/home/ftp:/bin/bash  
[...]  

Затем переместите /srv/ftp в /home (не делайте этого, если хотите использовать /srv/ftp):

mv /srv/ftp /home

Затем мы создаем каталог /home/ftp/incoming, который позволит анонимным пользователям загружать файлы. Мы дадим каталогу /home/ftp/incoming права 311, чтобы пользователи могли загружать, но не видеть и не скачивать файлы в этом каталоге. Каталог /home/ftp будет иметь права 555, что позволяет видеть и скачивать файлы:

chown ftp:nobody /home/ftp  
cd /home/ftp  
mkdir incoming  
chown ftp:nobody incoming/  
chmod 311 incoming/  
cd ../  
chmod 555 ftp/

(Если вы хотите использовать /srv/ftp вместо этого, замените /home/ftp на /srv/ftp в приведенных выше командах.)

Анонимные пользователи смогут войти в систему, и им будет разрешено скачивать файлы из /home/ftp, но загрузки будут ограничены каталогом /home/ftp/incoming (и после загрузки файла в /home/ftp/incoming его нельзя прочитать или скачать оттуда; администратору сервера нужно переместить его в /home/ftp, чтобы сделать его доступным для других).

Теперь нам нужно настроить PureFTPd для анонимного ftp. Откройте /etc/pure-ftpd/pure-ftpd.conf и убедитесь, что у вас есть следующие настройки:

vi /etc/pure-ftpd/pure-ftpd.conf
[...]  
NoAnonymous                 no

[...]  
AnonymousBandwidth            8  
[...]  
AnonymousCantUpload         no  
[...]  

(Настройка AnonymousBandwidth является необязательной - она позволяет вам ограничить пропускную способность загрузки и скачивания для анонимных пользователей. 8 означает 8 КБ/с. Используйте любое значение, которое вам нравится, или закомментируйте строку, если не хотите ограничивать пропускные способности.)

Наконец, мы перезапускаем PureFTPd:

systemctl restart pure-ftpd.service

9 Ссылки

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.