歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> Linux文化

Linux和Solaris建Apache虛擬根環境一


【導讀】 在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來發掘必要的共享庫。

在這個例子中,用戶有這樣的提示:

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 * 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

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.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

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不便

你會發現由於缺乏本地設置,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 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

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

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:$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

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/

Copyright © Linux教程網 All Rights Reserved