Linux和Solaris建立Apache的虚拟根环境
时间:2007-02-17 来源:PHP爱好者
By 书生
介绍
??我曾经利用CERN httpd安装和使用了已经虚拟根环境下的Web服务器。对Web服务器建立虚拟根环境有各种各样的优点和缺点。在Web发展的早期阶段,这种技术还提供了额外的有价值的安全机制。但是在这个apache的领域中,这种技术似乎没有太大的用处,可它仍旧很有趣。
??我提供对apache在linux和soloris环境下实现虚拟根环境的安装的例子,它既可以做标准的编辑(在必要的时候被标记为non-DSO)或者做动态共享对象编辑(在必要时它将被标记为DSO)。选项为DSO的Solaris的例子还没有进行文档化,所以我没有测试它(我打算在测试时使用Solaris 8)。
??在Linux上安装一个虚拟根环境化的Apache目录树是相当的简单的。这个例子使用的是Red Hat 6.*和Apache 1.3.12。同时,它也包含PHP4(作为一个Apache模块),以及在虚拟根环境化的目录树上的perl5的安装。另外还安装了mod-ssl和mod-perl。
??该例也假定Red Hat 安装比较完整 (即:有足够的文件、库和开发工具)。注意,如果你安装Red Hat时用了custom(prefered)的配置,并且选择了development选项;或者你就是使用了服务器(server)配置,你都会有一个完全的开发环境。
??Mysql3.22.27并没有安装在实现了虚拟根环境目录树中,但是为了完整性我们在此将它包含进去。
声明
??我并不是个专家:),尤其在加密方面(openssl、mod-ssl和company)我的水平更是有限。我也是个普通的人,也会犯错误,所以,如果你发现了什么或是有什么建设性的意见,请告诉我。
??我写这篇文章只是希望,你能从中学到一些东西,获得一些帮助。我也可以经常提供一些RPM,但如果你知道你可以从草图开始,独立的建一个自己的现代Web网站,那恐怕会更有趣些。但是,在当前的Internet上,学习、理解关于运行一个Web网站各种问题以及所冒的风险,都要靠你自己了。
Solaris 例子
??对Web目录树进行虚拟根环境化的solaris的例子与Linux的例子十分相似。当然,如果你没有安装GNU开发环境,solaris的例子就不可能像Linux例子那样容易。
??Solaris的例子文档在另一个web页中。
附加的注释
使用工具ldd来发掘必要的共享库。
在这个例子中,用户有这样的提示:
root user:
ROOT#
ordinary user:
$
我基本上都是作为普通用户而不是root用户来编译和安装各种软件的。这有助于避免对文件系统(尤其是在使用不熟悉的软件时)造成的不必要的破坏。这也有助于在进行危险操作前给以警示,例如在已经安装的二进制文件上的“setuid"操作,以及在不寻常的地方安装文件的操作等危险操作前的警示。
在这个例子中,我作为用户soft:soft来进行编译和安装等操作。
其实,只要保证软件的所有者的身份ID与Apache目录树用户的ID(在本例中我们用的是888)不同就可以了。
Red Hat的缺省root环境中,有一个交互式的开关-I被加在命令cp、mv和rm上。如果你的root环境中没有这些设置,建议你最好将它加上。你可以检查下面的文件:
ROOT# alias |grep '-i'
alias cp='cp -i'
alias mv='mv -i'
alias rm='rm -i'
你应当使你的配置尽量的简单——不要安装那些用不到或根本不必要的模块。一般说来,一个标准的non-DSO(非动态共享对象)Apache,在安装一个perl,对大多数人都是足够的。
关于DSO和mod-ssl需要注意的地方:
如果你打算把任何东西都按照DSO模版进行编译,那你首先要建立mod-ssl,然后你确实要按照下面的顺序建立自己的Apache目录树。Mod-ssl会明显的修改Apache 建立的目录树,据我的经验,在使用我们刚才提到的软件版本的前提下,下面的顺序是做起来最简单的顺序:
建立Apache
在Apache中建立和增加mod-ssl
在Apache中建立和增加php 和mod-perl。
你应该在适当的地方记录下来你是如何编译你的目录树的,以便再做时参考。(你可以将其打印出来,并加上注释)
安装了各种软件之后,最终的虚拟根环境化的目录树有23MB,其中包含了8MB的共享库和perl。下面是基于DSO安装的文件的总结(以KB表示):
ROOT# pwd
/www
ROOT# du -s .
22737 .
ROOT# du -s *
6832??apache
0?? bin
1?? dev
7?? etc
6679??lib
1?? tmp
9215??usr
1?? webhome
ROOT# du -s apache /*
600?? apache /bin
3?? apache /cgi-bin
125?? apache /conf
1560??apache /htdocs
133?? apache /icons
392?? apache /include
3925??apache /libexec
64?? apache /man
29?? apache /var
ROOT# du -s usr/*
8410??usr/Local
336?? usr/bin
340?? usr/lib
128?? usr/share
1.获得源代码
??如果你想将一个包加入到你的虚拟根环境化的目录树中,那你必须获得这个包中任何一个文件的源代码。多数源文件都可以从相应的Linux版本的被称为SRPMs(RPM源代码包)的原码光盘中获取;当然也可从tarball文件(.tar.gz)中获取(这种方法很适合于你的带宽有限的情况)。
??在Red Hat 系统中你作为root用户安装Source:
??ROOT# rpm -i /path/to/SRPMfile.src.rpm
??然后,在/usr/src/redhat/SOURCES/目录中提取出源代码。
??在我们的例子中我将指出,在Internet上你可从何处获取这些源代码:
??软件包????版本号????????源代码??????????文档信息
??Apache??? 1.3.12????www.apache.org/dist/?????www.apache.org/docs/
??MySQL????3.22.27??? www.mysql.com/downloads???www.mysql.com/documentation/
??PHP?????4.0.2?????www.php.net/downloads.php??www.php.net/docs.php
??Perl???? 5.00503??? www.cpan.org/src/?????? www.cpan.org/doc/manual/html/index.html
??mod_perl??1.24????? perl.apache.org/dist/???? perl.apache.org/#docs
??Hello.pm?????????????????????????? perl.apache.org/dist/contrib/
??mod_ssl?? 2.6.6-1.3.12 ftp://ftp.modssl.org/source/?www.modssl.org/docs/2.6/
??OpenSSL?? 0.9.5a????ftp://ftp.openssl.org/source/?www.openssl.org/support/faq.html
??RSAref???2.0??????google search????????? google search
2.步骤细节
??准备好一个虚拟根环境化后的文件系统
2.1 在任何一个地方安装目录树
??注意:最好是在另一个磁盘上,或是在非系统分区上安装,这样可以避免别人从Web目录树以外建立到文件的连接,但是你可以使用symlink(例如:/www)连接来找到这棵目录树。
??ROOT# mkdir /export/misc/www
??ROOT# ln -s /export/misc/www /www
2.2 生成基本的目录,bin将是usr/bin的连接
??注意: 在这些例子中(除了我直接从一般文件系统中拷贝的代码)我都省略了前导的“/”,所以,注意不要将你的虚拟根环境化的目录树与真正的“/”混淆。
??在下面我将用紫红色标记出虚拟根环境化的文件
??ROOT# cd /www
??ROOT# mkdir -p usr/bin usr/lib lib etc tmp dev webhome
??ROOT# ln -s usr/bin bin
2.3 /tmp是假定的专用perms
??ROOT# chmod 777 tmp
??ROOT# chmod +t tmp
2.4 构造特殊的装置 dev/null
??ROOT# mknod -m 666 dev/null c 1 3
2.5 为你自己的时区设定时区信息(这里使用的是MET)
??ROOT# mkdir -p usr/share/zoneinfo
??ROOT# cp -pi /usr/share/zoneinfo/MET usr/share/zoneinfo/
??ROOT# cd etc
??ROOT# ln -s ../usr/share/zoneinfo/MET localtime
??ROOT# cd ..
2.6 你会发现由于缺乏本地设置,perl和mod-perl多有不便,但你可以通过在实现了虚拟根环境目录树中安装本地文件来克服它:
??ROOT# set |grep LANG
??LANG=en_US
??ROOT# mkdir /www/usr/share/locale
??ROOT# cp -a /usr/share/locale/en_US /www/usr/share/locale/
2.7 现在,在可以提供非常基础的虚拟根环境化的文件系统的共享库
??ROOT# cp -pi /lib/libtermcap.so.2 /lib/ld-linux.so.2 /lib/libc.so.6 lib/
2.8 测试你的目录树(Apachect1后面将要用到“cat”,但也不是必需的)
??ROOT# cp -pi /bin/ls /bin/sh /bin/cat bin/
??ROOT# chroot /www /bin/ls -l /
??lrwxrwxrwx 1 0????0?????? 7 Jan 29 09:24 bin -> usr/bin
??drwxr-xr-x 2 0????0??????1024 Jan 29 09:28 dev
??drwxr-xr-x 2 0????0??????3072 Jan 29 13:17 etc
??drwxr-xr-x 2 0????0??????1024 Jan 29 13:12 lib
??drwxrwxrwt 2 0????0??????1024 Jan 29 09:23 tmp
??drwxr-xr-x 5 0????0??????1024 Jan 29 09:23 usr
??drwxr-xr-x 2 0????0??????1024 Jan 29 10:41 webhome
2.9 你可以移动一下ls,它只是用于测试的。
??ROOT# rm bin/ls
3.准备一个用户和名字服务器
??下面我们生成一个运行Apache的用户,下面是这种配置的必要的命名服务:
3.1 生成一个不存在于系统上的新的用户,给他起一个特殊的名字和用户ID(例如888)。
注意:对于存在真正的鉴定文件(/etc/passwd /etc/group)的user.group,这并不是必需的,完全有你决定:
??ROOT# cd /www
??ROOT# touch etc/passwd etc/group etc/shadow
??ROOT# chmod 400 etc/shadow
3.2 编辑三个文件,在这个例子中,我只是将数据再传回文件中:
??ROOT# echo 'www:x:888:888:Web Account:/webhome:/usr/bin/False' > etc/passwd
??ROOT# echo 'www:x:888:' > etc/group
??ROOT# echo 'www:*:10882:-1:99999:-1:-1:-1:134537804' > etc/shadow
3.3 我没有给这个用户login或shell,只是为了完整,编译了一下称为false的no-go shell。
??ROOT# echo 'int main(int argc, char *argv[]) { return(1); }' > /tmp/False.c
??ROOT# cc -o /www/usr/bin/False /tmp/False.c
3.4 下面让我们标记一下二进制流:
??ROOT# chmod 111 usr/bin/*
3.5 一些命名服务是必须的。但是由于glibc和命名服务转换库的存在,那些库是必不可少不是那么一目了然的。至于其中的细节,你可以使用命令“man nsswitch”来察看。尽管在我的机器上运行着网络信息服务(NIS),但我还是选择依赖于文件和域名服务(DNS)。注意:libresolve库也是必需的,在安装了PHP之后,这种需求就相当明显了。
??ROOT# cp -pi /lib/libnss_files.so.2 lib/
??ROOT# cp -pi /lib/libnss_dns.so.2 lib/
3.6 我们将需要三个文件来完成对命名服务的配置。
??这些文件的内容决定于你IP和DNS设置。在这里我们假定web服务器的名字是ns.mynet.home,它的IP地址是:192.168.196.2(实际上它也是我的名字服务器)
??# ---- Contents of??etc/nsswitch.conf ----#
??passwd: files
??shadow: files
??group: files
??hosts: files dns
??# ---- Contents of??etc/resolv.conf ----#
??domain mynet.home
??## use the IP address of your naming server
??## if bind is not installed on your web server
??#nameserver 192.168.196.xxx
??## use this if your web server is a (caching) name server
??nameserver 127.0.0.1
??# ---- Contents of??etc/hosts ----#
??127.0.0.1 localhost loopback
??192.168.196.2 ns.mynet.home ns www
4.编译和安装Apache
4.1 为Apache的安装建立顶层目录,并且在真正的目录树中生成到它的系统连接。
??ROOT# mkdir /www/apache
??ROOT# ln -s /www/apache /apache
4.2 我都是作为一般的用户来进行安装和编译的工作的(就像这个例子中的softs),
??注意:Apache的安装是需要root身份的。在这个例子中我是在usr/local/src/chr (该文件是属于softs:softs的)中进行源代码编译的
??$ cd /usr/local/src/chr
??$ tar zxf /path/to/apache_1.3.12.tar.gz
??$ cd apache_1.3.12
4.3 编辑config.layout,这样它将包含一个称为chroot的特殊的设计(layout)。
??# chroot layout.
??
??prefix:????/apache
??exec_prefix: $prefix
??bindir:????$exec_prefix/bin
??sbindir:?? $exec_prefix/bin
??libexecdir:??$exec_prefix/libexec
??mandir:????$prefix/man
??sysconfdir:??$prefix/conf
??datadir:?? $prefix
??iconsdir:?? $datadir/icons
??htdocsdir:?? $datadir/htdocs
??cgidir:????$datadir/cgi-bin
??includedir:??$prefix/include
??localstatedir: $prefix/var
??runtimedir:??$localstatedir/logs
??logfiledir:??$localstatedir/logs
??proxycachedir: $localstatedir/proxy
??
4.4 现在进行配置和构造
??non-DSO:
??$ ./configure --with-layout=chroot --enable-module=most --enable-module=so
使得模块“so”有效,这样以后你可以运用DSO+APXS机制,通过第三类模块(3rd party module)来扩充你的Apache安装。
??DSO:
??$./configure --with-layout=chroot --enable-module=most --enable-shared=max
??$ make
??ROOT# make install ## I am root!
4.5 现在来拷贝在例子Apache要用到的共享库
??注意对于其他的配置,可能会用到其他的库(你可以通过ldd来查询)
??ROOT# cd /www
??ROOT# cp -pi /lib/libm.so.6 /lib/libcrypt.so.1 /lib/libdb.so.3 lib/
??ROOT# cp -pi /lib/libdl.so.2 lib/
4.6 可以进行快速测试来看看结果
??快速测试时,配置文件/www/apache/conf/httpd.conf中需要编辑的主要部分是:
??User www
??Group www
??ServerName yourserver.yourdomain.here
??Port 8088 ## pick your favourite test port
4.7 启动后台程序(daemon)
??ROOT# chroot /www/apache/bin/apachectl start
4.8 测试URL
??$ lynx -dump http://yourserver/
测试在另一个端口(如:8088)上的URL
??$ lynx -dump http://yourserver:8088/
4.9 这儿有一个小的perl脚本程序,它将大多数的注释从已生成的配置文件中删除,形成一个简化的文件。
4.10 将htdocs目录树的所有权交给Web目录树的所有者
??ROOT# chown -R 888:888 /www/apache/htdocs
5.编译和安装MySQL
??MySQL并不是安装在虚拟根环境化的目录树上的,事实上,它有可能是安装在其它系统上的。但在我的例子中,它是和Apache安装在一个web服务器上的。
??这个例子包括生成用户和数据库所在地,以及生成初始的数据库
5.1 生成用户,他将是MySQL数据库的所有者。
例如:在home/mysql/中生成一个用户777:777
??ROOT# groupadd -g 777 mysqldba
??ROOT# useradd -c "mysql DBA" -d /home/mysql -u 777 -g 777 -m -n mysql
5.2 解开原码,并将原码目录树给mysql的用户
??ROOT# groupadd -g 777 mysqldba
??ROOT# useradd -c "mysql DBA" -d /home/mysql -u 777 -g 777 -m -n mysql
5.3 现在作为mysql用户,为mysql数据库建立目录,并开始安装和编译mysql
??$ mkdir ~/db ## where the DB will reside
??$ cd /usr/local/src/mysql-3.22.27
??$ ./configure --localstatedir=/home/mysql/db --prefix=/usr/local/mysql
??$ make
??$ make install
5.4 生成*MySQL*授权表(只有在安装*MySQL之前,这才是必须的)
??$ ./scripts/mysql_install_db
5.5 安装和修改数据库的启动脚本,将数据库的所有者从root变为mysql
??ROOT# cd /usr/local/src/mysql-3.22.27/
??ROOT# cp support-files/mysql.server /etc/rc.d/init.d/
??ROOT# chmod 755 /etc/rc.d/init.d/mysql.server
??ROOT# [ edit /etc/rc.d/init.d/mysql.server: ]
??mysql_daemon_user=mysql ## so we can run mysqld as this user.
??ROOT# chkconfig --add mysql.server ## permanently add server to rc scripts
5.6 在安装了mysql之后,必须清空共享库的cache。
??ROOT# /sbin/ldconfig -nv /usr/local/lib
5.7 为mysql的所有者编辑PATH变量,并且设定数据库的root密码。
??$ [ Edit shell login script .bash_profile: ]
??PATH=$PATH:$HOME/bin:/usr/local/mysql/bin
??$ . ~/.bash_profile ## source it!
??$ mysqladmin -u root password '2mUch!data' ## pick your own password!
6.编译和安装PHP
6.1 先停止Apache后台程序(daemon)的运行
??ROOT#chroot /www /apache/bin/apachectl stop
6.2 你首先要编译PHP
??如果你使用的是non-DSO安装,你必须重新编译Apache。(每次要升级non-DSO包中的任何一个软件时,你都要再这样做一遍。)
??$ cd /usr/local/src/chr ## I am NOT root!
??$ tar zxf /path/to/php-4.02.tar.gz
??$ cd php-4.02
??non-DSO:
??$ ./configure --with-mysql=/usr/local/mysql
??--with-apache=../apache_1.3.12 --enable-track-vars
??--with-config-file-path=/apache/conf --sharedstatedir=/tmp
??DSO:
??$ ./configure --with-mysql=/usr/local/mysql
??--with-apxs=/apache/bin/apxs --enable-track-vars
??--with-config-file-path=/apache/conf --sharedstatedir=/tmp
??DSO:
??(or add CFLAGS switch when mod_ssl was also configured as a DSO module)
??$ CFLAGS=-DEAPI ./configure --with-mysql=/usr/local/mysql
??--with-apxs=/apache/bin/apxs --enable-track-vars
??--with-config-file-path=/apache/conf --sharedstatedir=/tmp
??$ make
??non-DSO:
??$ make install
??DSO:
??ROOT# make install
??进行DSO的PHP安装“make install”时,你必须是root。因为模块是直接进入模块目录树/apache/libexec的,另外,Apache的配置文件也改变了。
6.3 现在只讨论non-DSO安装,先重新编译Apache,再激活PHP模块
??$ cd ../apache_1.3.12/
??$ ./configure --with-layout=chroot
??--enable-module=most --enable-module=so
??--activate-module=src/modules/php4/libphp4.a
??$ make
??ROOT# make install ## I am root!
6.4 在实现了虚拟根环境目录树中,对PHP需要更多的共享库,可以用ldd来查看
??For non-DSO: ldd /apache/bin/httpd
??For DSO: ldd /apache/apache/libexec/libphp4.so
??可以使用小的for循环,从/lib和/usr/lib中拷贝所需的文件
??ROOT# cd /www
??ROOT# for i in libresolv.so.2 libnsl.so.1 libpam.so.0 ; do
??> cp -pi /lib/$i /www/lib/ ; done
??ROOT# for i in libgd.so.1 libgdbm.so.2 libz.so.1; do
??> cp -pi /usr/lib/$i /www/usr/lib/ ; done
6.5 如果你需要mysql,你必须从它编译的地方安装相应的库
??ROOT# cp -pi /usr/local/mysql/lib/mysql/libmysqlclient.so.6 /www/usr/lib/
6.6 你必须编辑httpd.conf文件,这样它才可以识别出.php文件
??ROOT# cd /apache/conf
??ROOT# [ edit /apache/conf/httpd.conf ]
??AddType application/x-httpd-php .php
??AddType application/x-httpd-php-source .phps
6.7 重新启动后台程序(daemon)
??ROOT# chroot /www /apache/bin/apachectl start
6.8 在non-DSO中,你可以检查已经编译过的PHP
??ROOT# chroot /www /apache/bin/httpd -l | grep php
??mod_php4.c
6.9 这儿有一个小的helloworld的脚本程序来测试php,它必须作为hello.php来安装。如果你想要浏览源代码的话可以拷贝一份或建立到hello.phps的系统连接。测试完,要关闭这个连接。
7.编译和安装perl
??你可以简单的将/usr/lib/perl5拷贝到www/usr/lib,并将usr/bin/perl5.00503(假定是Red Hat6。0版本)拷贝到www/usr/bin中,这样了事。同时,你需要检测并安装任何缺少的共享库,你也需要建立从usr/bin/perl5.00503到/www中的/usr/bin/perl的硬连接。
??简单的方法是:
??ROOT# cp -a /usr/lib/perl5 /www/usr/lib/perl
??ROOT# cp -p /usr/bin/perl5.00503 /www/usr/bin/
??ROOT# cd /www/usr/bin
??ROOT# ln perl5.00503 perl
??但是,我还是讲一下怎样安装和编译perl,如果你想要安装mod-perl,你就必须在此编译perl:
7.1 建立向虚拟根环境化的目录树中安装的必要的连接。
??本例中使用目录树中的usr/Local。之所以用他,是有道理的,注意不要将他与usr/local混淆。安全起见,我还是使用softs用户来安装
??ROOT# mkdir /www/usr/Local
??ROOT# ln -s /www/usr/Local /usr/local
??ROOT# chown softs:softs /www/usr/Local
7.2 从RedHat中获取RPM的源代码
??ROOT# rpm -i /path/to/perl-5.00503-2.src.rpm
7.3 作为源代码目录树的所有者,解开Perl
??$ cd /usr/Local/src/chr
??$ tar zxf /usr/src/redhat/SOURCES/perl5.005_03.tar.gz
7.4 RedHat在SRPM中包含了一些补丁。你可以使用相应版本的补丁。在这个例子中,我用了RedHat6。0的补丁。
??$ cp /usr/src/redhat/SOURCES/perl*.patch .
??$ cd perl5.005_03
??$ patch -p1 <../perl5-installman.patch
??$ patch -p1 <../perl5.005_02-buildsys.patch
??$ patch -p1 <../perl5.005_03-db1.patch
7.5 你需要运行Configure,并接受大多数的却生设置。你可能也想对man页的none加以特殊说明。下面是我对确生设置的一些修改:
??$ ./Configure
??architecture name? i386-linux
??Installation prefix to use? /usr/Local
??Directories to use for library searches? /lib /usr/lib /usr/Local/lib
??install perl as /usr/bin/perl? n
7.6 编译和运行它
??$ make
??$ make test
??$ make install
7.7 建立在usr/bin目录树中到perl的连接。
??如果你没有安装mod-perl,你需要将perl目录树的所有权转交给root。(不过这也不是必须的,只要Web目录树的所有者对perl目录树的权限是只可读的就行了)
??ROOT# cd /www/usr/bin
??ROOT# ln -s ../Local/bin/perl perl
7.8 检查共享库,安装任何缺的库(这主要决定于你的配置)
??在这个例子中,我们不缺任何库:
??ROOT# ldd /www/usr/bin/perl
??libnsl.so.1 => /lib/libnsl.so.1 (0x4001b000)
??libdl.so.2 => /lib/libdl.so.2 (0x40031000)
??libm.so.6 => /lib/libm.so.6 (0x40035000)
??libc.so.6 => /lib/libc.so.6 (0x40052000)
??libcrypt.so.1 => /lib/libcrypt.so.1 (0x40147000)
??/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
7.9 测试你的安装:
??ROOT# chroot /www /usr/bin/perl -v
??This is perl, version 5.005_03 built for i386-linux
??...
7.10 设置安装在Apache服务器上的perl例子的cgi bin 脚本
??ROOT# cd /www/apache/cgi-bin
??ROOT# chmod ugo+x *
7.11 启动Apache服务器,测试perl cgi bin脚本的例子
?? ROOT# chroot /www /apache/bin/apachectl start
??$ lynx -dump http://yourserver/cgi-bin/printenv
??同时检查test-cgi
??$ lynx -dump http://yourserver/cgi-bin/test-cgi
7.12 最后将执行的二进制位从cgi脚本中去除,或完全去除。不要留对外的连接。
??ROOT# chmod ugo-x /www/apache/cgi-bin/*
8.编译和安装mod-ssl
??如果你打算使用DSO方式安装mod-ssl,我希望你已经读过前面的附加注释段。
??你必须编译openssl和mod-ssl,我还选择编译了rsaref version 2.0.你应当阅读一些关于mod-ssl的文档信息,以便理解mod-ssl的一些发行版本和选项。
??注意,openssl和rsaref提供了包含文件、库和开发工具,它使得你可以编译mod-ssl,所以决不能说它是虚拟根环境化的目录树的一部分,或者说是安装在该目录树中的。
8.1 抽取openssl、mod-ssl和rsaref20的源代码
??$ cd /usr/local/src/chr
??$ tar zxf /path/to/mod_ssl-2.6.6-1.3.12.tar.gz
??$ tar zxf /path/to/openssl-0.9.5a.tar.gz
??$ mkdir rsaref-2.0
??$ cd rsaref-2.0
??$ tar zxf /path/to/rsaref20.1996.tar.Z
8.2 配置和建立RSA参考库。
??注意,在64位结构中你用rsaref必须在mod-ssl包中的INSTALL文件中读取文档信息。
??$ cd /usr/local/src/chr/rsaref-2.0
??$ cp -rpi install/unix local
??$ cd local
??$ make
??$ mv rsaref.a librsaref.a
8.3 配置和建立openssl库
??$ cd /usr/local/src/chr/openssl-0.9.5a
??$ ./config -L/usr/local/src/chr/rsaref-2.0/local -fPIC
??$ make
??$ make test??# inspect output for anomalies
8.4 你可能想要安装包,当然不是安装在目录树上了。
??在这儿,我假设softs拥有usr/local/tree,因为安装openssl的缺省的前缀/usr/local/ssl 。但是,也不是必须要安装这个包,因为你可以在src目录树外进行操作,来建立mod-ssl。
??$ make install
8.5 配置open-ssl
??$ cd /usr/local/src/chr/mod_ssl-2.6.6-1.3.12
??$ ./configure -with-apache=../apache_1.3.12
8.6 进入Apache目录树中,完成建立、配置、运行和构造
??$ cd /usr/local/src/chr/apache_1.3.12
??non-DSO:
??$ SSL_BASE=../openssl-0.9.5a RSA_BASE=../rsaref-2.0/local
??./configure --prefix=/apache --with-layout=chroot
??--enable-module=most --enable-module=so --enable-module=ssl
??--disable-rule=SSL_COMPAT --enable-rule=SSL_SDBM
??--activate-module=src/modules/php4/libphp4.a
??--activate-module=src/modules/perl/libperl.a
??DSO:
??$ cd src/modules
??$ make clean ## seems to be necessary if you previously compiled in the apache tree
??$ cd ../../
??$ SSL_BASE=../openssl-0.9.5a RSA_BASE=../rsaref-2.0/local
??./configure --prefix=/apache --with-layout=chroot
??--enable-module=most --enable-shared=max --enable-shared=ssl
??--disable-rule=SSL_COMPAT --enable-rule=SSL_SDBM
??$ make
8.7 重新安装Apache。如果他在运行,要停止运行再安装。
??ROOT# chroot /www /apache/bin/apachectl stop
??ROOT# make install ## I am root!
8.8 对于non-DSO安装你可以检测内部编译模块。
??ROOT# chroot /www /apache/bin/httpd -l | grep -E '(php|perl|ssl)'
??mod_ssl.c
??mod_php4.c
??mod_perl.c
8.9 在实现了虚拟根环境目录树中生成随机的设备
??ROOT# cd /www/dev
??ROOT# mknod random c 1 8
??ROOT# mknod urandom c 1 9
8.10 将缺省配置文件融合到你当前的httpd.conf文件中。
??我在不同于标准端口(80端口)的其他端口上进行了测试,但是对于安全端口(443端口),没有web服务起跑再它上面,所以我马上就会用一下这个端口。
??在这个例子中,我对缺省的配置文件httpd.conf的一些修改如下:
User www
Group www
ServerName yourserver.yourdomain.here
Port 8088 ## pick a test port
Listen 8088 ## in 'IfDefine SSL' section
Listen 443 ## this is the standard secure port!
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
# your Hello.pm script for mod_perl testing:
SetHandler perl-script
PerlHandler Apache::Hello
SSLCertificateFile /apache/conf/server.crt
SSLCertificateKeyFile /apache/conf/server.key
# in this example I generate the key and crt files into /apache/conf
8.11 如果你现在还没有一个服务器的关键字(keys)和认证(certficate),那么现在就生成它。
??在这个例子中我假设openssl在你的路径中,因为你已经安装了它。如果没有,你就把它加到路径中。注意,我已经认定了我的关键字,如果你要做非常重要的事,你最好利用授权机制来分发这些关键字。
??ROOT# cd /www/apache/conf
??set up a path of random files(为random文件生成路径)
??ROOT# randfiles='/var/log/messages:/proc/net/unix:/proc/stat:/proc/ksyms'
??generate the server key(产生服务端的密钥)
??ROOT# openssl genrsa -rand
??$randfiles -out server.key 1024
??产生带签名的请求(在认证自己的时候不要加密码)
??注意你的Common Name必须匹配你完全有权访问的web server name
??ROOT# openssl req -new -nodes -out request.pem -key server.key
??签上你自己的密钥(有效期一年)
??ROOT# openssl x509 -in request.pem -out server.crt -req -signkey server.key -days 365
??保护你的密钥和证书
??ROOT# chmod 400 server.*
??删除请求文件
??ROOT# rm request.pem
??可选择性地加密你的密钥
??ROOT# mv server.key server.key.unencrypted
??ROOT# openssl rsa -des3 -in server.key.unencrypted -out server.key
??ROOT# chmod 000 server.key.unencrypted ## better yet delete it!
??当你改变注意,你决定从你的密钥中删除加密的密码。
??ROOT# openssl rsa -in server.key -out server.key.un
??ROOT# mv server.key.un server.key
??ROOT# chmod 400 server.key
8.12 不用ssl来启动Apache,以确保它在工作。
??ROOT# chroot /www /apache/bin/apachectl start
??$ lynx -dump http://yourserver:8088/
8.13 用ssl来重启Apache,并用netscape来测试它。
??ROOT# chroot /www /apache/bin/apachectl stop
??ROOT# chroot /www /apache/bin/apachectl startssl
??$ netscape https://yourserver/
8.14 现在你可能想要编辑你的server配置文件,并在标准端口(80端口)上设置服务器。
??如果你测试配置,你不需要在443端口上进行配置。
9.一些安全考虑
??可以从一些在线Apache文档中获取帮助。一个需要特别注意的地方是在httpd脚本上进行的授权改变。
??ROOT# chmod ugo-rw /www/apache/bin/*
10.摆脱你自己的虚拟根环境化环境
??当你有意要摆脱自己的虚拟根环境化环境时,一定要十分小心。在Unix世界中完成一项任务总是有不同的方法,你可以尝试其他的方法。
??我提供了下面一个例子,它可以通过cgi脚本或php来激发。
?? ?? ...
?? /** construct the file name as $f **/
?? $cmd = "/bin/mail "-s Some-subject-line -t webmaster@localhost -f $f"";
?? $op = exec( $cmd, $arr, $retval );
?? ...
?? ?>
文件被称为wwwmail.c。
11.安装以后进行清除工作
11.1 去除安装时一些必要的临时连接
??ROOT# rm /apache /usr/Local
11.2 通过在etc/rc.d/init.d中安装称为httpd的启动脚本文件来自动启动Apache。如:
??Standard appache on port 80
??Apache on ports 80 and 443 (startssl)
接着在其上运行chkconfig来建立象征性的连接
??ROOT# chkconfig --add httpd
??ROOT# chkconfig --list httpd
??httpd?? 0:off 1:off 2:on??3:on??4:on??5:on??6:off
11.3 自动的记录triming文件。
??在RedHat系统中你可以自己定义要记录那个文件,及参数,只用在etc/logrotate/conf中说明就行了。
12.基于RPM的收获文件
??在这儿我没有时间完全文本化它,你可以从RPMS中获取它,然后不需要编译原码就生成一个虚拟根环境化的Web目录树。现在我有两个脚本,以后我会对他们文档化的:
Script file based on Red Hat 7.0 that will harvest the RPMs
Script file for creating temporary SSL key and certificate (testing purposes only!!!)
非常全面的一个php技术网站,php 爱好者站 http://www.phpfans.net 有相当丰富的文章和源代码.