虚拟主机与Proftpd和MySQL(包括配额)对于Arch Linux
版本1.0
原作者:Falko Timme
适用于Arch Linux的文本以及Dretech的其他更改。
本文档介绍如何安装使用MySQL数据库而不是真实系统用户的虚拟用户的Proftpd服务器。 这是更好的性能,并允许在单个机器上有成千上万的ftp用户。 除此之外,我将使用此设置显示使用配额 。
对于MySQL数据库的管理,您可以使用基于Web的工具,如phpMyAdmin ,它也将安装在此howto中。 phpMyAdmin是一个舒适的图形界面,这意味着您不必乱用命令行。
本教程基于Arch Linux ,并且是Debian Sarge的原始方法 。 您应该已经建立了一个基本的Arch Linux系统。 在其他发行版 ,如SuSE , Fedora , Mandriva等,只有Proftpd安装是不同的; Proftpd的配置也应该适用于这些分发。
这是一个实践指南; 它不包括理论背景。 他们在网络上的许多其他文档中被处理。
本文档不附带任何形式的保证! 我想说,这不是设立这样一个制度的唯一办法。 实现这一目标有很多方法,但这是我所采取的方式。 我不会保证这将为您工作!
1安装Apache,MySQL和phpMyAdmin
有关Apache和/或MySQL的安装说明,请参阅https://wiki.archlinux.org/index.php/Apache 。
有关phpMyAdmin的安装说明,请参阅https://wiki.archlinux.org/index.php/Phpmyadmin 。
2安装Proftpd与MySQL支持
在Arch Linux中,MySQL支持在Proftpd中编译。 用de命令安装Proftpd:
pacman -S proftpd
然后我们创建一个ftp组(“ ftpgroup
”)和用户(“ ftpuser
”),我们所有的虚拟用户将被映射到。 将group-and userid 2001
替换为系统上免费的数字:
groupadd -g 2001 ftpgroup
useradd -u 2001 -s /bin/false -d /bin/null -c "proftpd user" -g ftpgroup ftpuser
3为Proftpd创建MySQL数据库
转到phpMyAdmin( http:// localhost / phpmyadmin
或http://192.168.2.5/phpmyadmin
(如果192.168.2.5
是FTP服务器的IP号)),用户名root和您在第1步中给出的密码。
单击屏幕上方的“SQL”,并在SQL窗口中粘贴以下查询:
create 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;
将字符串密码替换为要用于MySQL用户proftpd的任何密码
。 仍然在phpMyAdmin中,在屏幕的左侧选择数据库ftp
。 然后我们创建数据库表:我们需要复制下面的SQL命令并将其粘贴到phpMyAdmin的查询窗口中:
CREATE TABLE `ftpgroup` ( `groupname` varchar(16) NOT NULL DEFAULT '',
`gid` smallint(6) NOT NULL DEFAULT '9001',
`members` varchar(16) NOT NULL DEFAULT '',
KEY `groupname` (`groupname`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='ProFTP group table';
CREATE TABLE `ftpquotalimits` ( `name` varchar(30) NOT NULL DEFAULT '',
`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(10) unsigned NOT NULL DEFAULT '0',
`bytes_out_avail` bigint(10) unsigned NOT NULL DEFAULT '0',
`bytes_xfer_avail` bigint(10) 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', PRIMARY KEY (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `ftpquotatallies` ( `name` varchar(30) NOT NULL DEFAULT '',
`quota_type` enum('user','group','class','all') NOT NULL DEFAULT
'user', `bytes_in_used` bigint(10) unsigned NOT NULL DEFAULT '0',
`bytes_out_used` bigint(10) unsigned NOT NULL DEFAULT '0',
`bytes_xfer_used` bigint(10) 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 DEFAULT CHARSET=utf8;
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 '9001',
`gid`smallint(6) NOT NULL DEFAULT '9001',
`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',
`email` varchar(64) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `userid` (`userid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='ProFTP user table';
4配置Proftpd
打开/etc/proftpd.conf
并添加以下行:
DefaultRoot ~
# The passwords in MySQL are encrypted using CRYPT
SQLAuthTypes Crypt
SQLAuthenticate users* groups*
# used to connect to the database
# databasename@host database_user user_password
SQLConnectInfo ftp@localhost proftpd password PERCONNECTION
# Here we tell ProFTPd the names of the database columns in the "usertable"
# we want it to interact with. Match the names with those in the db
SQLUserInfo ftpuser userid passwd uid gid homedir shell
# Here we tell ProFTPd the names of the database columns in the "grouptable"
# we want it to interact with. Again the names match with those in the db
SQLGroupInfo ftpgroup groupname gid members
# set min UID and GID - otherwise these are 999 each
SQLMinID 500
# create a user's home directory on demand if it doesn't exist
CreateHome on 770 dirmode 770
# Update count every time user logs in
SQLLog PASS updatecount
SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser
# Update modified everytime user uploads or deletes a file
SQLLog STOR,DELE modified
SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser
# User quotas
# ===========
QuotaEngine on
QuotaDirectoryTally on
QuotaDisplayUnits Gb
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
如果你想看到一个横幅,看看LIST
之后的使用/可用空间,然后将下面的行(Martin Mrajca)添加到/etc/profptd.conf中
:
SQLNamedQuery gettally SELECT "ROUND((bytes_in_used/1073741824),2) FROM ftpquotatallies WHERE name='%u'"
SQLNamedQuery getlimit SELECT "ROUND((bytes_in_avail/1073741824),2) FROM ftpquotalimits WHERE name='%u'"
SQLNamedQuery getfree SELECT "ROUND(((ftpquotalimits.bytes_in_avail-ftpquotatallies.bytes_in_used)/1073741824),2) FROM ftpquotalimits,ftpquotatallies WHERE ftpquotalimits.name = '%u' AND ftpquotatallies.name = '%u'"
SQLShowInfo LIST "226" "Used %{gettally}GB from %{getlimit}GB. You have %{getfree}GB available space."
重启Proftpd:
/etc/rc.d/proftpd restart
5填充数据库和测试
要填充数据库,您可以使用phpMyAdmin。 首先,我们在表ftpgroup中
创建一个条目。 它包含groupname,groupid和我们在第二步结尾创建的ftp组/用户的用户名(如果使用另一个超过9001,则适当地替换groupid):
INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES ('ftpgroup', 9001, 'ftpuser');
现在我们完成了表ftpgroup
。 我们不必在此创建更多的条目。 无论何时创建新的虚拟ftp用户,都可以在ftpquotalimits
和ftpuser
表中进行
。 所以让我们创建我们的第一个用户(我们仍然在phpMyAdmin的查询窗口):
INSERT INTO `ftpquotalimits` (`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`) VALUES ('exampleuser', 'user', 'false', 'hard', 1073741824, 0, 0, 0, 0, 0);
INSERT INTO `ftpuser` (`userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`, `email`) VALUES ('exampleuser', encrypt('secret'), 2001, 2001, '/srv/ftp/exampleuser', '/sbin/nologin', 0, '0000-00-00 00:00:00', '0000-00-00 00:00:00', 'exampleuser@youcl.com');
(如果您正在使用本教程中的其他值,请不要忘记在最后一个INSERT语句
中替换group-和userid 2001
!)
现在在您的工作站上打开您的FTP客户端程序(如果您在Windows系统上,像WS_FTP或SmartFTP),并尝试连接。 作为主机名,您使用系统的IP地址,用户名为exampleuser
,密码为密码
(如果您尚未选择其他密码)。
如果你能连接 - 恭喜你! 如果没有,出现问题。
现在,如果你跑
ls -l /srv/ftp
您应该看到目录/ srv / ftp / exampleuser
(exampleuser的ftp目录)已被自动创建,它属于ftpuser
和ftpgroup
(我们在第二步结束时创建的用户/组)。
5.1 FTP用户管理
为了管理虚拟FTP用户,我做了一个简单的PHP脚本。 你可以在这里下载脚本。 您只需要解压缩zipfile
并将ftpusermanagement.php
复制到Arch Linux系统的/ srv / http
目录。 在您的网络浏览器中打开ftpusermanagement.php
,例如http://192.168.2.5/ftpusermanagement.php
(如果IP号码为192.168.2.5
是您的Arch Linux系统的IP号码)。 你现在可以简单的添加ftp-user,编辑ftp-users和删除ftp-users。 如果删除ftp-user,您必须手动删除该用户的目录。 在php脚本的web界面中,我还提到了一些未来可能性的idaes,但是目前我将花费我的时间在其他项目中。 脚本的版权是GPL许可证,所以您可以自由地改进和扩展脚本。
5.2数据库管理
如果要在没有Web界面的情况下管理虚拟FTP用户,则只需在表ftpquotalimits
和ftpuser
中创建条目。 下面你可以在这里找到这些表的列的解释:
ftpuser表:
重要的列是这些(其他的是由MySQL或Proftpd自动处理,所以不要手动填写!):
-
userid
:虚拟Proftpd用户的名称(例如exampleuser
)。 -
passwd
:用户的未加密(即,明文)密码
。 -
uid
:您在第二步结束时创建的ftp用户的用户标识(例如9001
)。 -
gid
:在第二步结束时创建的ftp组的groupid(例如2001
)。 -
homedir
:虚拟Proftpd用户的主目录
(例如/ srv / ftp / exampleuser
)。 如果不存在,则当新用户通过FTP第一次登录时将创建它。 虚拟用户将被关入此主目录,即他无法访问其主目录以外的其他目录。 -
shell
:如果你默认填写/ sbin / nologin,可以。
ftpquotalimits表:重要的列是这些(其他的是由MySQL或Proftpd自动处理,所以不要手动填写!):
-
name
:虚拟Proftpd用户的名称(例如exampleuser)。 -
quota_type
:用户或组。 通常我们在这里使用用户。 -
per_session
:true或false。 true表示配额限制仅适用于会话。 例如,如果用户的配额为15 MB,并且他在当前会话期间上传了15 MB,那么他无法再上传任何内容。 但是如果他再次注销,他再次有15 MB的可用性。 虚假的意思是,用户有15 MB,无论他是否退出并重新启动。 -
limit_type
:硬或软。 硬配额限制是一个从不超过限制,而一个软配额可以暂时超过。 通常你在这里很努力。 -
bytes_in_avail
:以字节为单位上传限制(例如15728640,为15 MB)。 0表示无限制。 -
bytes_out_avail
:以字节为单位的下载限制。 0表示无限制。 -
bytes_xfer_avail
:以字节为单位的传输限制。 允许用户上传和下载的总和。 0表示无限制。 -
files_in_avail
:上传文件限制。 0表示无限制。 -
files_out_avail
:文件下载限制。 0表示无限制。 -
files_xfer_avail
:扩展
文件的限制。 0表示无限制。
Proftpd在内部使用ftpquotatallies
表来管理配额,因此您不必在那里输入条目!
参考文献
- Arch Linux虚拟托管Proftpd和MySQL(包括配额): http : //www.youcl.com/proftpd_mysql_virtual_hosting
- 安装Apache和/或MySQL: https : //wiki.archlinux.org/index.php/Apache
- 安装phpMyAdmin: https : //wiki.archlinux.org/index.php/Phpmyadmin
- Mandrake 10.1 - Proftpd + MySQL认证+配额Howto: http : //www.khoosys.net/single.htm?ipg=848
链接
- Proftpd: http : //www.proftpd.org/
- MySQL: http : //www.mysql.com/
- phpMyAdmin: http : //www.phpmyadmin.net/