红联Linux门户
Linux帮助

Linux和Solaris建Apache虚拟根环境二

发布时间:2006-09-01 08:15:09来源:红联作者:严寒
  4.9 这儿有一个小的perl脚本程序,它将大多数的注释从已生成的配置文件中删除,形成一个简化的文件。

  4.10 将htdocs目录树的所有权交给Web目录树的所有者

[code]ROOT# chown -R 888:888 /www/apache/htdocs[/code]

5.编译和安装MySQL

  MySQL并不是安装在虚拟根环境化的目录树上的,事实上,它有可能是安装在其它系统上的。但在我的例子中,它是和Apache安装在一个web服务器上的。

  这个例子包括生成用户和数据库所在地,以及生成初始的数据库

  5.1 生成用户,他将是MySQL数据库的所有者。

  例如:在home/mysql/中生成一个用户777:777

[code]ROOT# groupadd -g 777 mysqldba

ROOT# useradd -c "mysql DBA" -d /home/mysql -u 777 -g 777 -m -n mysql[/code]

  5.2 解开原码,并将原码目录树给mysql的用户

[code]ROOT# groupadd -g 777 mysqldba

ROOT# useradd -c "mysql DBA" -d /home/mysql -u 777 -g 777 -m -n mysql[/code]

  5.3 现在作为mysql用户,为mysql数据库建立目录,并开始安装和编译mysql

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

  5.4 生成*MySQL*授权表(只有在安装*MySQL之前,这才是必须的)
[code]$ ./scripts/mysql_install_db[/code]
  5.5 安装和修改数据库的启动脚本,将数据库的所有者从root变为mysql
[code]

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


  

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

  5.6 在安装了mysql之后,必须清空共享库的cache。

[code]ROOT# /sbin/ldconfig -nv /usr/local/lib[/code]

  5.7 为mysql的所有者编辑PATH变量,并且设定数据库的root密码。

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

6.编译和安装PHP

  6.1 先停止Apache后台程序(daemon)的运行

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

  6.2 你首先要编译PHP

  如果你使用的是non-DSO安装,你必须重新编译Apache。(每次要升级non-DSO包中的任何一个软件时,你都要再这样做一遍。)

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

  进行DSO的PHP安装“make install”时,你必须是root。因为模块是直接进入模块目录树/apache/libexec的,另外,Apache的配置文件也改变了。

  6.3 现在只讨论non-DSO安装,先重新编译Apache,再激活PHP模块

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

  6.4 在实现了虚拟根环境目录树中,对PHP需要更多的共享库,可以用ldd来查看

[code]For non-DSO: ldd /apache/bin/httpd

For DSO: ldd /apache/apache/libexec/libphp4.so[/code]

  可以使用小的for循环,从/lib和/usr/lib中拷贝所需的文件

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

  6.5 如果你需要mysql,你必须从它编译的地方安装相应的库

[code]ROOT# cp -pi /usr/local/mysql/lib/mysql/libmysqlclient.so.6 /www/usr/lib/[/code]

  6.6 你必须编辑httpd.conf文件,这样它才可以识别出.php文件

[code]ROOT# cd /apache/conf
ROOT# [ edit /apache/conf/httpd.conf ]
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps[/code]
文章评论

共有 4 条评论

  1. shyboy8688 于 2006-09-05 15:32:12发表:

    顶顶!!!

  2. skyy8484 于 2006-09-01 16:36:53发表:

  3. 严寒 于 2006-09-01 08:21:17发表:

      8.4 你可能想要安装包,当然不是安装在目录树上了。

      在这儿,我假设softs拥有usr/local/tree,因为安装openssl的缺省的前缀/usr/local/ssl 。但是,也不是必须要安装这个包,因为你可以在src目录树外进行操作,来建立mod-ssl。

    [code]$ make install[/code]

      8.5 配置open-ssl

    [code]$ cd /usr/local/src/chr/mod_ssl-2.6.6-1.3.12

    $ ./configure -with-apache=../apache_1.3.12[/code]

      8.6 进入Apache目录树中,完成建立、配置、运行和构造

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

      8.7 重新安装Apache。如果他在运行,要停止运行再安装。

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

    ROOT# make install ## I am root![/code]

      8.8 对于non-DSO安装你可以检测内部编译模块。

    [code]ROOT# chroot /www /apache/bin/httpd -l | grep -E '(php|perl|ssl)'
    mod_ssl.c
    mod_php4.c
    mod_perl.c[/code]

      8.9 在实现了虚拟根环境目录树中生成随机的设备

    [code]ROOT# cd /www/dev
    ROOT# mknod random c 1 8
    ROOT# mknod urandom c 1 9[/code]

      8.10 将缺省配置文件融合到你当前的httpd.conf文件中。

      我在不同于标准端口(80端口)的其他端口上进行了测试,但是对于安全端口(443端口),没有web服务起跑再它上面,所以我马上就会用一下这个端口。

      在这个例子中,我对缺省的配置文件httpd.conf的一些修改如下:

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

      8.11 如果你现在还没有一个服务器的关键字(keys)和认证(certficate),那么现在就生成它。

      在这个例子中我假设openssl在你的路径中,因为你已经安装了它。如果没有,你就把它加到路径中。注意,我已经认定了我的关键字,如果你要做非常重要的事,你最好利用授权机制来分发这些关键字。

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

      产生带签名的请求(在认证自己的时候不要加密码)

      注意你的Common Name必须匹配你完全有权访问的web server name

    [code]ROOT# openssl req -new -nodes -out request.pem -key server.key[/code]

      签上你自己的密钥(有效期一年)

    [code]ROOT# openssl x509 -in request.pem -out server.crt -req -signkey server.key -days 365[/code]

      保护你的密钥和证书

    [code]ROOT# chmod 400 server.*[/code]

      删除请求文件

    [code]ROOT# rm request.pem[/code]

      可选择性地加密你的密钥

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

      当你改变注意,你决定从你的密钥中删除加密的密码。

    [code]ROOT# openssl rsa -in server.key -out server.key.un
    ROOT# mv server.key.un server.key
    ROOT# chmod 400 server.key[/code]

      8.12 不用ssl来启动Apache,以确保它在工作。

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

    $ lynx -dump http://yourserver:8088/[/code]

      8.13 用ssl来重启Apache,并用netscape来测试它。

    [code]ROOT# chroot /www /apache/bin/apachectl stop
    ROOT# chroot /www /apache/bin/apachectl startssl
    $ netscape https://yourserver/[/code]

      8.14 现在你可能想要编辑你的server配置文件,并在标准端口(80端口)上设置服务器。

      如果你测试配置,你不需要在443端口上进行配置

    9.一些安全考虑

      可以从一些在线Apache文档中获取帮助。一个需要特别注意的地方是在httpd脚本上进行的授权改变。

    [code]ROOT# chmod ugo-rw /www/apache/bin/*[/code]

    10.摆脱你自己的虚拟根环境化环境

      当你有意要摆脱自己的虚拟根环境化环境时,一定要十分小心。在Unix世界中完成一项任务总是有不同的方法,你可以尝试其他的方法。

      我提供了下面一个例子,它可以通过cgi脚本或php来激发。
    [code]...
    /** construct the file name as $f **/
    $cmd = "/bin/mail "-s Some-subject-line -t webmaster@localhost -f $f"";
    $op = exec( $cmd, $arr, $retval );
    ...
    ?>[/code]

      文件被称为wwwmail.c。

    11.安装以后进行清除工作

      11.1 去除安装时一些必要的临时连接

    [code]ROOT# rm /apache /usr/Local[/code]

      11.2 通过在etc/rc.d/init.d中安装称为httpd的启动脚本文件来自动启动Apache。如:

    [code]Standard appache on port 80

    Apache on ports 80 and 443 (startssl)[/code]

      接着在其上运行chkconfig来建立象征性的连接

    [code]ROOT# chkconfig --add httpd
    ROOT# chkconfig --list httpd
    httpd 0:off 1:off 2:on3:on4:on5:on6:off[/code]

      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!!!)

  4. 严寒 于 2006-09-01 08:17:51发表:

      6.7 重新启动后台程序(daemon)

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

      6.8 在non-DSO中,你可以检查已经编译过的PHP

    [code]ROOT# chroot /www /apache/bin/httpd -l | grep php

    mod_php4.c[/code]

      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的硬连接。

      简单的方法是:

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

      但是,我还是讲一下怎样安装和编译perl,如果你想要安装mod-perl,你就必须在此编译perl:

      7.1 建立向虚拟根环境化的目录树中安装的必要的连接。

      本例中使用目录树中的usr/Local。之所以用他,是有道理的,注意不要将他与usr/local混淆。安全起见,我还是使用softs用户来安装

    [code]ROOT# mkdir /www/usr/Local
    ROOT# ln -s /www/usr/Local /usr/local
    ROOT# chown softs:softs /www/usr/Local[/code]

      7.2 从RedHat中获取RPM的源代码

    [code]ROOT# rpm -i /path/to/perl-5.00503-2.src.rpm[/code]

      7.3 作为源代码目录树的所有者,解开Perl

    [code]$ cd /usr/Local/src/chr

    $ tar zxf /usr/src/redhat/SOURCES/perl5.005_03.tar.gz[/code]

      7.4 RedHat在SRPM中包含了一些补丁。你可以使用相应版本的补丁。在这个例子中,我用了RedHat6。0的补丁。

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

      7.5 你需要运行Configure,并接受大多数的却生设置。你可能也想对man页的none加以特殊说明。下面是我对确生设置的一些修改:

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

      7.6 编译和运行它

    [code]$ make
    $ make test
    $ make install[/code]

      7.7 建立在usr/bin目录树中到perl的连接。

      如果你没有安装mod-perl,你需要将perl目录树的所有权转交给root。(不过这也不是必须的,只要Web目录树的所有者对perl目录树的权限是只可读的就行了)

    [code]ROOT# cd /www/usr/bin

    ROOT# ln -s ../Local/bin/perl perl[/code]

      7.8 检查共享库,安装任何缺的库(这主要决定于你的配置)

      在这个例子中,我们不缺任何库:

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

      7.9 测试你的安装:

    [code]ROOT# chroot /www /usr/bin/perl -v

    This is perl, version 5.005_03 built for i386-linux

    ... [/code]

      7.10 设置安装在Apache服务器上的perl例子的cgi bin 脚本

    [code]ROOT# cd /www/apache/cgi-bin

    ROOT# chmod ugo+x *[/code]

      7.11 启动Apache服务器,测试perl cgi bin脚本的例子

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

    $ lynx -dump http://yourserver/cgi-bin/printenv[/code]

      同时检查test-cgi

    [code]$ lynx -dump http://yourserver/cgi-bin/test-cgi[/code]

      7.12 最后将执行的二进制位从cgi脚本中去除,或完全去除。不要留对外的连接。

    [code]ROOT# chmod ugo-x /www/apache/cgi-bin/*[/code]

    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的源代码

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

      8.2 配置和建立RSA参考库。

      注意,在64位结构中你用rsaref必须在mod-ssl包中的INSTALL文件中读取文档信息。

    [code]$ cd /usr/local/src/chr/rsaref-2.0
    $ cp -rpi install/unix local
    $ cd local
    $ make
    $ marsaref.a librsaref.a[/code]

      8.3 配置和建立openssl库

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