红联Linux门户
Linux帮助

Linux和Solaris建Apache虚拟根环境一

发布时间:2006-08-31 12:45:43来源:红联作者:soylo
  【导读】 在Linux上安装一个虚拟根环境化的Apache目录树是相当的简单的。这个例子使用的是Red Hat 6.*和Apache 1.3.12。同时,它也包含PHP4(作为一个Apache模块),以及在虚拟根环境化的目录树上的perl5的安装。另外还安装了mod-ssl和mod-perl。

介绍

  我曾经利用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来发掘必要的共享库。

  在这个例子中,用户有这样的提示:

[code]root user:
ROOT#
ordinary user:
$[/code]

  我基本上都是作为普通用户而不是root用户来编译和安装各种软件的。这有助于避免对文件系统(尤其是在使用不熟悉的软件时)造成的不必要的破坏。这也有助于在进行危险操作前给以警示,例如在已经安装的二进制文件上的“setuid"操作,以及在不寻常的地方安装文件的操作等危险操作前的警示。

  在这个例子中,我作为用户soft:soft来进行编译和安装等操作。

  其实,只要保证软件的所有者的身份ID与Apache目录树用户的ID(在本例中我们用的是888)不同就可以了。

  Red Hat的缺省root环境中,有一个交互式的开关-I被加在命令cp、mv和rm上。如果你的root环境中没有这些设置,建议你最好将它加上。你可以检查下面的文件:

[code]ROOT# alias |grep '-i'
alias cp='cp -i'
alias mv='mv -i'
alias rm='rm -i'[/code]

  你应当使你的配置尽量的简单----不要安装那些用不到或根本不必要的模块。一般说来,一个标准的non-DSO(非动态共享对象)Apache,在安装一个perl,对大多数人都是足够的。

  关于DSO和mod-ssl需要注意的地方:

  如果你打算把任何东西都按照DSO模版进行编译,那你首先要建立mod-ssl,然后你确实要按照下面的顺序建立自己的Apache目录树。Mod-ssl会明显的修改Apache 建立的目录树,据我的经验,在使用我们刚才提到的软件版本的前提下,下面的顺序是做起来最简单的顺序:
文章评论

共有 2 条评论

  1. soylo 于 2006-08-31 12:50:13发表:

      3.3 我没有给这个用户login或shell,只是为了完整,编译了一下称为false的no-go shell。

    [code]ROOT# echo 'int main(int argc, char *argv[]) { return(1); }' > /tmp/False.c

    ROOT# cc -o /www/usr/bin/False /tmp/False.c[/code]

      3.4 下面让我们标记一下二进制流:

    [code]ROOT# chmod 111 usr/bin/*[/code]

      3.5 一些命名服务是必须的。但是由于glibc和命名服务转换库的存在,那些库是必不可少不是那么一目了然的。至于其中的细节,你可以使用命令“man nsswitch”来察看。尽管在我的机器上运行着网络信息服务(NIS),但我还是选择依赖于文件和域名服务(DNS)。注意:libresolve库也是必需的,在安装了PHP之后,这种需求就相当明显了。

    [code]ROOT# cp -pi /lib/libnss_files.so.2 lib/

    ROOT# cp -pi /lib/libnss_dns.so.2 lib/[/code]

      3.6 我们将需要三个文件来完成对命名服务的配置。

      这些文件的内容决定于你IP和DNS设置。在这里我们假定web服务器的名字是ns.mynet.home,它的IP地址是:192.168.196.2(实际上它也是我的名字服务器)

    [code]# ---- Contents ofetc/nsswitch.conf ----#
    passwd: files
    shadow: files
    group: files
    hosts: files dns
    # ---- Contents ofetc/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 ofetc/hosts ----#
    127.0.0.1 localhost loopback
    192.168.196.2 ns.mynet.home ns www[/code]

      4.编译和安装Apache

      4.1 为Apache的安装建立顶层目录,并且在真正的目录树中生成到它的系统连接。

    [code]ROOT# mkdir /www/apache

    ROOT# ln -s /www/apache /apache[/code]

      4.2 我都是作为一般的用户来进行安装和编译的工作的(就像这个例子中的softs),

      注意:Apache的安装是需要root身份的。在这个例子中我是在usr/local/src/chr (该文件是属于softs:softs的)中进行源代码编译的

    [code]$ cd /usr/local/src/chr
    $ tar zxf /path/to/apache_1.3.12.tar.gz
    $ cd apache_1.3.12[/code]

      4.3 编辑config.layout,这样它将包含一个称为chroot的特殊的设计(layout)。
    [code]


    bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center">


      
    
    # chroot layout.
    prefix:/apache
    exec_prefix: $prefix
    bindir:$execprefix/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[/code]

      4.4 现在进行配置和构造

    [code]non-DSO:

    $ ./configure --with-layout=chroot --enable-module=most --enable-module=so[/code]

      使得模块“so”有效,这样以后你可以运用DSO+APXS机制,通过第三类模块(3rd party module)来扩充你的Apache安装。

    [code]DSO:
    $./configure --with-layout=chroot --enable-module=most --enable-shared=max
    $ make
    ROOT# make install ## I am root![/code]

      4.5 现在来拷贝在例子Apache要用到的共享库

      注意对于其他的配置,可能会用到其他的库(你可以通过ldd来查询)

    [code]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/[/code]

      4.6 可以进行快速测试来看看结果

      快速测试时,配置文件/www/apache/conf/httpd.conf中需要编辑的主要部分是:

    [code]User www
    Group www
    ServerName yourserver.yourdomain.here
    Port 8088 ## pick your favourite test port[/code]

      4.7 启动后台程序(daemon)

    [code]ROOT# chroot /www/apache/bin/apachectl start[/code]

      4.8 测试URL

      $ lynx -dump http://yourserver/

      测试在另一个端口(如:8088)上的URL

      $ lynx -dump http://yourserver:8088/

  2. soylo 于 2006-08-31 12:48:03发表:

    建立Apache

      在Apache中建立和增加mod-ssl

      在Apache中建立和增加php 和mod-perl。

      你应该在适当的地方记录下来你是如何编译你的目录树的,以便再做时参考。(你可以将其打印出来,并加上注释)

      安装了各种软件之后,最终的虚拟根环境化的目录树有23MB,其中包含了8MB的共享库和perl。下面是基于DSO安装的文件的总结(以KB表示):

    [code]ROOT# pwd
    /www
    ROOT# du -s .
    22737 .
    ROOT# du -s *
    6832apache
    0 bin
    1 dev
    7 etc
    6679lib
    1 tmp
    9215usr
    1 webhome
    ROOT# du -s apache /*
    600 apache /bin
    3 apache /cgi-bin
    125 apache /conf
    1560apache /htdocs
    133 apache /icons
    392 apache /include
    3925apache /libexec
    64 apache /man
    29 apache /var
    ROOT# du -s usr/*
    8410usr/Local
    336 usr/bin
    340 usr/lib
    128 usr/share[/code]

      1.获得源代码

      如果你想将一个包加入到你的虚拟根环境化的目录树中,那你必须获得这个包中任何一个文件的源代码。多数源文件都可以从相应的Linux版本的被称为SRPMs(RPM源代码包)的原码光盘中获取;当然也可从tarball文件(.tar.gz)中获取(这种方法很适合于你的带宽有限的情况)。

      在Red Hat 系统中你作为root用户安装Source:

    [code]ROOT# rpm -i /path/to/SRPMfile.src.rpm[/code]

      然后,在/usr/src/redhat/SOURCES/目录中提取出源代码。

      在我们的例子中我将指出,在Internet上你可从何处获取这些源代码:

    软件包版本号源代码文档信息

    [code]Apache? 1.3.12www.apache.org/dist/?www.apache.org/docs/
    MySQL3.22.27? www.mysql.com/downloads?www.mysql.com/documentation/
    PHP?4.0.2?www.php.net/downloads.phpwww.php.net/docs.php
    Perl 5.00503? www.cpan.org/src/ www.cpan.org/doc/manual/html/index.html
    mod_perl1.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.5aftp://ftp.openssl.org/source/?www.openssl.org/support/faq.html
    RSAref?2.0google search? google search[/code]

      2.步骤细节

      准备好一个虚拟根环境化后的文件系统

      2.1 在任何一个地方安装目录树

      注意:最好是在另一个磁盘上,或是在非系统分区上安装,这样可以避免别人从Web目录树以外建立到文的连接,但是你可以使用symlink(例如:/www)连接来找到这棵目录树。

    [code]ROOT# mkdir /export/misc/www

    ROOT# ln -s /export/misc/www /www[/code]

      2.2 生成基本的目录

      bin将是usr/bin的连接

      注意: 在这些例子中(除了我直接从一般文件系统中拷贝的代码)我都省略了前导的“/”,所以,注意不要将你的虚拟根环境化的目录树与真正的“/”混淆。

      在下面我将用紫红色标记出虚拟根环境化的文件

    [code]ROOT# cd /www
    ROOT# mkdir -p usr/bin usr/lib lib etc tmp dev webhome
    ROOT# ln -s usr/bin bin[/code]

      2.3 /tmp是假定的专用perms

    [code]ROOT# chmod 777 tmp

    ROOT# chmod +t tmp[/code]

      2.4 构造特殊的装置 dev/null

    [code]ROOT# mknod -m 666 dev/null c 1 3[/code]

      2.5 为你自己的时区设定时区信息(这里使用的是MET)

    [code]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 ..[/code]

      2.6 克服perl和mod-perl不便

      你会发现由于缺乏本地设置,perl和mod-perl多有不便,但你可以通过在实现了虚拟根环境目录树中安装本地文件来它:

    [code]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”,但也不是必需的)


    bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center">


      
    
    ROOT# cp -pi /bin/ls /bin/sh /bin/cat bin/
    ROOT# chroot /www /bin/ls -l /
    lrwxrwxrwx 1 00 7 Jan 29 09:24 bin -> usr/bin
    drwxr-xr-x 2 001024 Jan 29 09:28 dev
    drwxr-xr-x 2 003072 Jan 29 13:17 etc
    drwxr-xr-x 2 001024 Jan 29 13:12 lib
    drwxrwxrwt 2 001024 Jan 29 09:23 tmp
    drwxr-xr-x 5 001024 Jan 29 09:23 usr
    drwxr-xr-x 2 001024 Jan 29 10:41 webhome[/code]

      2.9 你可以移动一下ls,它只是用于测试的。

    [code]ROOT# rm bin/ls[/code]

      3.准备一个用户和名字服务器

      下面我们生成一个运行Apache的用户,下面是这种配置的必要的命名服务:

      3.1 生成一个不存在于系统上的新的用户,给他起一个特殊的名字和用户ID(例如888)。

      注意:对于存在真正的鉴定文件(/etc/passwd /etc/group)的user.group,这并不是必需的,完全有你决定:

    [code]ROOT# cd /www
    ROOT# touch etc/passwd etc/group etc/shadow
    ROOT# chmod 400 etc/shadow[/code]

      3.2 编辑三个文件,在这个例子中,我只是将数据再传回文件中:

    [code]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[/code]