从代码安装完整的http+ftp+mail的linux server
菜鸟花了大约两个月装了一台linux server,包括kernel/apache2/PHP(GD)/MYSQL/qmail(smtp用户认证)/pureftp等,现在贴出来让大家分享,有问题请到http://www.garhee.com/bbs/的linux论坛提问(转贴别删)
1、安装linux和重编译linux内核
先到redhat.com下载linux 7.3, 和kernel.org下载需要的linux kernel版本
为什么选择7.3?因为简单,集成的东西少,我只需要http ftp mysql mail,而且为了发扬diy精神,我全部软件都从源代码安装。
安装linux时,注意不要把不要的东西安装
到kernel.org下载你需要的kernel代码包,我下载的是2.4.20 25在linux7.3上我没有编译通过,不知哪位大侠编译通过的,劳驾到我的论坛http://www.garhee.com/bbs/告诉我一声,谢谢!
进入到linux kernel代码的目录,
更改Makefile文件中的EXTRAVERSION = minikernel,并且把安装时装进去的linux kernel0的源代码的config文件拷贝过来用,在redhat最好使用redhat自己提供的config文件
执行下面的命令:
make menuconfig
make dep
make bzImage
make modules
make modules_install
在make menuconfig时,可以去掉这些没必要的东西:
Plug and Play configuration
Telephony Support
IEEE 1394 (FireWire) support (EXPERIMENTAL)
Amateur Radio support
IrDA (infrared) support
ISDN subsystem
Multimedia devices
Sound
USB support
Bluetooth support
其他的子选项请读者自己斟酌去掉以缩小内核大小,还有记得另存为自己知道的config文件
由于我用的是scsi(aix79xx)硬盘,所以到http://adaptec.com下载了最新版本的驱动aic79xx-2.0.2-source.tar.gz,覆盖了drivers/scsi/aic79xx目录,再编译。
这样,硬盘哗啦哗啦的转了一大段时间后,终于编译完成了,该执行如下步骤:
cp arch/i386/boot/bzImage /boot/vmlinuz-2.4.20minikernel
cp vmlinux /boot/vmlinux-2.4.20minikernel
cp System.map /boot/System.map-2.4.20minikernel
cd /lib/modules
mkinitrd /boot/initrd-2.4.20minikernel.img 2.4.20minikernel
这时候编译好的内核就拷贝到/boot目录下了,更改/boot/grub/grub.conf或/etc/lilo.conf,增加一条启动项目指向编译好的新内核。lilo启动的话还有执行/sbin/lilo -v。重启后就可以选择新内核了。
另外,一定要ntsysv禁用掉telnet,用ssh
参考文章:《浅谈Linux安全》 http://www.phpx.com/index.php?itemid=227
《linux下SSH配合SecureCRT的密匙完美使用方法》 http://www.5ilinux.com/ssh01.html
2、安装apache2
到apache.org下载最新的apache2版本,解压并执行:
./configure --prefix=/server/apache2 --enable-so --enable-mods-shared=most
make
make install
参考文章:《apache的静态/动态编译在apache+php+mysql的应用》http://www.5ilinux.com/apache01.html
3、安装mysql
到mysql.com下载,编译命令:
./configure --prefix=/server/mysql
make
make install
在/etc/ld.so.conf增加一行:
/server/mysql/lib/mysql
执行ldconfig
4、安装php+gd+zlib+freetype2+mmcache
freetype2
到http://www.freetype.org/下载最新版本的freetype2,编译命令:
./configure --prefix=/server/freetype2
make
make install
zlib
到http://www.zlib.org/或http://www.gzip.org/zlib/下载最新版本的zlib,编译命令:
./configure --prefix=/server/zlib
make
make install
gd
到http://www.boutell.com/gd/下载最新版本
./configure --prefix=/server/gdlib --with-png=/usr --with-jpeg=/usr --with-freetype=/server/freetype
make
make install
在/etc/ld.so.conf增加一行:
/server/gdlib/lib
执行ldconfig
php
到php.net下载php4,我安装时php5用不了mmcache,新版本不知出来了没有
./configure --prefix=/server/php --with-config-file-path=/server/php/etc --with-mysql=/server/mysql --with-apxs2=/server/apache2/bin/apxs --with-gd=/server/gdlib --enable-gd-native-ttf --enable-gd-imgstrttf --with-jpeg-dir=/usr/lib --with-png-dir=/usr/lib --with-zlib-dir=/server/zlib --with-freetype-dir=/server/freetype2
mmcache
到http://turck-mmcache.sourceforge.net下载
export PHP_PREFIX="/server/php"
$PHP_PREFIX/bin/phpize
./configure --enable-mmcache=shared --with-php-config=$PHP_PREFIX/bin/php-config
make
make install
在php.ini文件Dynamic Extensions中增加:
extension="/server/php/lib/php/extensions/mmcache.so"
mmcache.shm_size="16"
mmcache.cache_dir="/tmp/mmcache"
mmcache.enable="1"
mmcache.optimizer="1"
mmcache.check_mtime="1"
mmcache.debug="0"
mmcache.filter=""
mmcache.shm_max="0"
mmcache.shm_ttl="0"
mmcache.shm_prune_period="0"
mmcache.shm_only="0"
mmcache.compress="1"
建目录:
mkdir /tmp/mmcache
chmod 0777 /tmp/mmcache
参考文章:《PHP 利器一箩筐》http://www.phpx.com/index.php?itemid=237
5、安装qmail
到http://www.qmail.org/下载qmail最新版本和ucspi-tcp daemontools
到http://www.inter7.com/下载vpopmail qmailadmin sqwebmail最新版本
qmail
安装文档qmail http://www.lifewithqmail.org/lwq.html#installation-issues
ucspi http://cr.yp.to/ucspi-tcp.html
daemontools http://cr.yp.to/daemontools.html
安装ucspi-tcp:
make
make setup check
安装deamontools:
package/install
mkdir /var/qmail
groupadd nofiles
useradd qmaild -g nofiles -d /var/qmail -s /bin/false
useradd alias -g nofiles -d /var/qmail/alias -s /bin/false
useradd qmaill -g nofiles -d /var/qmail -s /bin/false
useradd qmailp -g nofiles -d /var/qmail -s /bin/false
groupadd qmail
useradd qmailq -g qmail -d /var/qmail -s /bin/false
useradd qmailr -g qmail -d /var/qmail -s /bin/false
useradd qmails -g qmail -d /var/qmail -s /bin/false
make setup check
生成文件/var/qmail/rc
#!/bin/sh
# Using stdout for logging
# Using control/defaultdelivery from qmail-local to deliver message by default
exec env - PATH="/var/qmail/bin:$PATH" qmail-start " cat /var/qmail/control/defaultdelivery "
chmod 755 /var/qmail/rc
mkdir /var/log/qmail
echo ./Mailbox >/var/qmail/control/defaultdelivery
生成文件/var/qmail/bin/qmailctl
#!/bin/sh
# description: the qmail MTA
PATH=/var/qmail/bin:/bin:/usr/bin:/usr/local/bin:/usr/local/sbin
export PATH
QMAILDUID=`id -u qmaild`
NOFILESGID=`id -g qmaild`
case "$1" in
start)
echo "Starting qmail"
if svok /service/qmail-send ; then
svc -u /service/qmail-send /service/qmail-send/log
else
echo "qmail-send supervise not running"
fi
if svok /service/qmail-smtpd ; then
svc -u /service/qmail-smtpd /service/qmail-smtpd/log
else
echo "qmail-smtpd supervise not running"
fi
if svok /service/qmail-pop3d ; then
svc -u /service/qmail-pop3d /service/qmail-pop3d/log
else
echo qmail-pop3d supervise not running
fi
if [ -d /var/lock/subsys ]; then
touch /var/lock/subsys/qmail
fi
;;
stop)
echo "Stopping qmail..."
echo " qmail-smtpd"
svc -d /service/qmail-smtpd /service/qmail-smtpd/log
echo " qmail-send"
svc -d /service/qmail-send /service/qmail-send/log
echo " qmail-pop3d"
svc -d /service/qmail-pop3d /service/qmail-pop3d/log
if [ -f /var/lock/subsys/qmail ]; then
rm /var/lock/subsys/qmail
fi
;;
stat)
svstat /service/qmail-send
svstat /service/qmail-send/log
svstat /service/qmail-smtpd
svstat /service/qmail-smtpd/log
svstat /service/qmail-pop3d
svstat /service/qmail-pop3d/log
qmail-qstat
;;
doqueue|alrm|flush)
echo "Flushing timeout table and sending ALRM signal to qmail-send."
/var/qmail/bin/qmail-tcpok
svc -a /service/qmail-send
;;
queue)
qmail-qstat
qmail-qread
;;
reload|hup)
echo "Sending HUP signal to qmail-send."
svc -h /service/qmail-send
;;
pause)
echo "Pausing qmail-send"
svc -p /service/qmail-send
echo "Pausing qmail-smtpd"
svc -p /service/qmail-smtpd
echo "Pausing qmail-pop3d"
svc -p /service/qmail-pop3d
;;
cont)
echo "Continuing qmail-send"
svc -c /service/qmail-send
echo "Continuing qmail-smtpd"
svc -c /service/qmail-smtpd
echo "Continuing qmail-pop3d"
svc -c /service/qmail-pop3d
;;
restart)
echo "Restarting qmail:"
echo "* Stopping qmail-smtpd."
svc -d /service/qmail-smtpd /service/qmail-smtpd/log
echo "* Sending qmail-send SIGTERM and restarting."
svc -t /service/qmail-send /service/qmail-send/log
echo "* Restarting qmail-smtpd."
svc -u /service/qmail-smtpd /service/qmail-smtpd/log
echo "* Restarting qmail-pop3d."
svc -t /service/qmail-pop3d /service/qmail-pop3d/log
;;
cdb)
tcprules /etc/qmail/tcp.smtp.cdb /etc/qmail/tcp.smtp.tmp < /etc/qmail/tcp.smtp
chmod 644 /etc/qmail/tcp.smtp.cdb
echo "Reloaded /etc/qmail/tcp.smtp."
tcprules /etc/qmail/tcp.pop3.cdb /etc/qmail/tcp.pop3.tmp < /etc/qmail/tcp.pop3
chmod 644 /etc/qmail/tcp.smtp.cdb
echo "Reloaded /etc/qmail/tcp.pop3."
;;
help)
cat < stop -- stops mail service (smtp connections refused, nothing goes out)
start -- starts mail service (smtp connection accepted, mail can go out)
pause -- temporarily stops mail service (connections accepted, nothing leaves)
cont -- continues paused mail service
stat -- displays status of mail service
cdb -- rebuild the tcpserver cdb file for smtp
restart -- stops and restarts smtp, sends qmail-send a TERM & restarts it
doqueue -- schedules queued messages for immediate delivery
reload -- sends qmail-send HUP, rereading locals and virtualdomains
queue -- shows status of queue
alrm -- same as doqueue
flush -- same as doqueue
hup -- same as reload
HELP
;;
*)
echo "Usage: $0 "
exit 1
;;
esac
exit 0
mkdir -p /var/qmail/supervise/qmail-send/log
mkdir -p /var/qmail/supervise/qmail-smtpd/log
生成/var/qmail/supervise/qmail-send/run
#!/bin/sh
exec /var/qmail/rc
生成/var/qmail/supervise/qmail-send/log/run
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail
生成/var/qmail/supervise/qmail-smtpd/run
#!/bin/sh
QMAILDUID=`id -u vpopmail`
NOFILESGID=`id -g vpopmail`
MAXSMTPD=`cat /var/qmail/control/concurrencyincoming`
LOCAL=`head -1 /var/qmail/control/me`
if [ -z "$QMAILDUID" -o -z "$NOFILESGID" -o -z "$MAXSMTPD" -o -z "$LOCAL" ]; then
echo QMAILDUID, NOFILESGID, MAXSMTPD, or LOCAL is unset in
echo /var/qmail/supervise/qmail-smtpd/run
exit 1
fi
if [ ! -f /var/qmail/control/rcpthosts ]; then
echo "No /var/qmail/control/rcpthosts!"
echo "Refusing to start SMTP listener because it'll create an open relay"
exit 1
fi
exec /usr/local/bin/softlimit -m 5000000 /usr/local/bin/tcpserver -v -R -l "$LOCAL" -x /etc/qmail/tcp.smtp.cdb -c "$MAXSMTPD" -u "$QMAILDUID" -g "$NOFILESGID" 0 smtp /var/qmail/bin/qmail-smtpd 2>&1
生成/var/qmail/supervise/qmail-smtpd/log/run
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail/smtpd
生成/var/qmail/supervise/qmail-pop3d/run
#!/bin/sh
QMAILDUID=`id -u vpopmail`
NOFILESGID=`id -g vpopmail`
LOCAL=`head -1 /var/qmail/control/me`
if [ -z "$QMAILDUID" -o -z "$NOFILESGID" -o -z "$LOCAL" ]; then
echo QMAILDUID, NOFILESGID, or LOCAL is unset in
echo /var/qmail/supervise/qmail-pop3d/run
exit 1
fi
exec /usr/local/bin/softlimit -m 5000000 /usr/local/bin/tcpserver -R -H -x /etc/qmail/tcp.pop3.cdb -u "$QMAILDUID" -g "$NOFILESGID" 0 110 /var/qmail/bin/qmail-popup "$LOCAL" /server/vpopmail/bin/vchkpw /var/qmail/bin/qmail-pop3d Maildir 2>&1
生成/var/qmail/supervise/qmail-pop3d/log/run
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail/pop3d
echo 20 > /var/qmail/control/concurrencyincoming
chmod 644 /var/qmail/control/concurrencyincoming
chmod 755 /var/qmail/supervise/qmail-send/run
chmod 755 /var/qmail/supervise/qmail-send/log/run
chmod 755 /var/qmail/supervise/qmail-smtpd/run
chmod 755 /var/qmail/supervise/qmail-smtpd/log/run
mkdir -p /var/log/qmail/smtpd
chown qmaill /var/log/qmail /var/log/qmail/smtpd
mkdir -p /var/log/qmail/pop3d
chown qmaill /var/log/qmail /var/log/qmail/pop3d
mkdir /etc/qmail
echo '127.:allow,RELAYCLIENT=""' >>/etc/qmail/tcp.smtp
echo ':allow' >>/etc/qmail/tcp.pop3
qmailctl cdb
vpopmail
groupadd -g 89 vchkpw
useradd -g vchkpw -u 89 vpopmail
用/server/mysql/bin/mysql登录进mysql,建vpopmail数据库
CREATE DATABASE vpopmail;
GRANT select,insert,update,delete,create,drop ON vpopmail.*
TO vpopmailuser@localhost IDENTIFIED BY 'vpoppasswd';
./configure --prefix=/server/vpopmail --enable-qmaildir=/var/qmail --enable-vpopuser=vpopmail --enable-vpopgroup=vchkpw --enable-roaming-users --enable-tcprules-prog=/usr/local/bin/tcprules --enable-tcpserver-file=/etc/qmail/tcp.smtp --enable-relay-clear-minutes=20 --enable-auth-logging --enable-mysql-logging --enable-clear-passwd --disable-sqwebmail-pass --enable-log-name=vpopmail --enable-incdir=/server/mysql/include/mysql --enable-libdir=/server/mysql/lib/mysql --enable-libs=mysqlclient --enable-auth-module=mysql --enable-ip-alias-domains --enable-mysql-limits --enable-many-domains --disable-passwd --enable-mysql-limits
make
make install-strip
echo "localhost|0|vpopmailuser|vpoppasswd|vpopmail" > /server/vpopmail/etc/vpopmail.mysql
chown vpopmail.vchkpw /server/vpopmail/etc/vpopmail.mysql
chmod 640 ~vpopmail/etc/vpopmail.mysql
echo 'mydomain.com' >/var/qmail/control/rcpthosts
/var/qmail/bin/vadddomain mydomain.com
qmailadmin
./configure --enable-cgibindir=/server/apache2/cgi-bin --enable-htmldir=/server/apache2/htdocs
make
make install
sqwebmail
./configure --prefix=/server/sqwebmail --with-cachedir=/server/sqwebmail/cachetmp --enable-imagedir=/server/apache2/htdocs/webmail --enable-cgibindir=/server/apache2/cgi-bin --enable-softtimeout=1200 --enable-hardtimeout=1800 --with-fcgi
make
make install
ln -s /var/qmail/supervise/qmail-send /var/qmail/supervise/qmail-smtpd /var/qmail/supervise/qmail-pop3d /service
启动apache,就可以从qmailadmin用 postmaster@mydomain.com 来登录管理mydomain.com。增加一个email地址test@mydomain.com后,就可以用outlook和test@mydomain.com用户进行收发email了。
其他安装文章:《基于qmail的完整WEBMAIL解决方案安装详解》http://www.phpx.com/index.php?itemid=130
6、smtpd用户认证功能
下载http://www.garhee.com/download/qmail-smtpd.c ;这个是从netqmail-1.05版本更改过来的,如果要改新版本,请对照更改
/var/qmail/bin/qmailctl stop
更改/var/qmail/supervise/qmail-smtpd/run中的
exec /usr/local/bin/softlimit -m 5000000 /usr/local/bin/tcpserver -v -R -l "$LOCAL" -x /etc/qmail/tcp.smtp.cdb -c "$MAXSMTPD" -u "$QMAILDUID" -g "$NOFILESGID" 0 smtp /var/qmail/bin/qmail-smtpd 2>&1
为
exec /usr/local/bin/softlimit -m 5000000 /usr/local/bin/tcpserver -v -H -R -l "$LOCAL" -x /etc/qmail/tcp.smtp.cdb -c "$MAXSMTPD" -u "$QMAILDUID" -g "$NOFILESGID" 0 smtp /var/qmail/bin/qmail-smtpd /server/vpopmail/bin/vchkpw /bin/true 2>&1
/var/qmail/bin/qmailctl start
7、安装pureftpd
到http://mirrors.sunsite.dk/pure-ftpd/下载(pureftp.org给封掉了)
http://home.9812.net/linux/article/pureftpd/下载安装配置文件
./configure --prefix=/server/pureftp --with-boring --with-throttling --with-ratios --with-virtualhosts --with-virtualchroot --with-peruserlimits --with-mysql=/server/mysql --with-ftpwho --with-language=simplified-chinese --without-inetd --without-shadow --with-diraliases --with-sysquotas --with-altlog --with-quotas --with-privsep
make
make install
cp pureftpd-mysql.conf /server/pureftp/etc/
cp configuration-file/pure-ftpd.conf /server/pureftp/etc/
修改两个configure文件直到满意
cp configuration-file/pure-config.pl /server/pureftp/bin/
增加一行/server/pureftp/sbin/pure-ftpd到:
-x && ($PUREFTPD=$_, last) for qw(
$/sbin/pure-ftpd
/usr/local/pure-ftpd/sbin/pure-ftpd
/usr/local/pureftpd/sbin/pure-ftpd
/usr/local/sbin/pure-ftpd
/usr/sbin/pure-ftpd
/server/pureftp/sbin/pure-ftpd
);
useradd ftp -u 1111 -g proftpgroup -s /bin/false -d /bin/null -c "pureftpd user"
登录mysql执行sql语句:
create database pureftp;
GRANT ALL ON pureftp.* TO pureftp@localhost IDENTIFIED BY 'purepasswd';
CREATE TABLE `users` (
`id` int(32) unsigned NOT NULL auto_increment,
`User` varchar(16) NOT NULL default '',
`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 '',
`QuotaSize` smallint(5) NOT NULL default '0',
`QuotaFiles` int(11) NOT NULL default '0',
`ULBandwidth` smallint(5) NOT NULL default '0',
`DLBandwidth` smallint(5) NOT NULL default '0',
`ULRatio` smallint(6) NOT NULL default '0',
`DLRatio` smallint(6) NOT NULL default '0',
`comment` tinytext NOT NULL,
`ipaccess` varchar(15) NOT NULL default '*',
`status` enum('0','1') NOT NULL default '0',
`create_date` datetime NOT NULL default '0000-00-00 00:00:00',
`modify_date` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id`,`User`),
UNIQUE KEY `User` (`User`)
) TYPE=MyISAM AUTO_INCREMENT=5 ;
INSERT INTO users VALUES (5, 'test', MD5('test'), '505', '505', '/tmp', 0, 0, 0, 0, 0, 0, '', '*', '1', '2003-06-26 18:04:33', '2003-06-26 18:04:33');
启动pureftpd
/server/pureftp/bin/pure-config.pl /server/pureftp/etc/pure-ftpd.conf
停止pureftpd
kill -INT `cat /var/run/pure-ftpd.pid | sed 1q`
参考文章:《Pure-FTPd + LDAP + MySQL + PGSQL + Virtual-Users + Quota How To》http://www.chinaunix.net/jh/15/102137.html