在ARM Linux上使用Apache+PHP
另外說件事,BLOG上的文章多了,經(jīng)常發(fā)現(xiàn)有人轉(zhuǎn)載,但是有的人卻不注出處……難道要我吧我的名字和郵件地址寫到文章的每一個(gè)部分嗎?也許國人就是這樣缺乏某種精神,在我看到的轉(zhuǎn)載我文章的BLOG中,基本都是網(wǎng)上各種ARM Linux文章的集合,不可否認(rèn)他們搜集的很好,但是看了這么多文章,連一點(diǎn)心得體會(huì)都沒有么,寫點(diǎn)原創(chuàng)的東西就這么難么?不管怎樣,我還是堅(jiān)持EE小站的風(fēng)格——原創(chuàng)性。下面開始正題,本文分為三大部分,apache、php和配置。
編譯apache
下載apache 1.3.39(1.3.41有些bug,沒有辦法交叉編譯)
下載地址http://apache.mirror.phpchina.com/httpd/apache_1.3.39.tar.bz2
交叉編譯apache總體上需要兩個(gè)步驟:
1.編譯本機(jī)代碼
2.利用本機(jī)代碼進(jìn)行交叉編譯
這是因?yàn)榫幾gapache時(shí),需要使用編譯生成的工具制作后續(xù)編譯使用的頭文件,交叉編譯的工具當(dāng)然沒有辦法在PC上運(yùn)行,因此,需要借用本機(jī)編譯生成的工具。假設(shè)為本機(jī)編譯的apache代碼已經(jīng)解壓縮到/home/lxz/apache-1.3.39-i586,為ARM編譯的apache代碼已經(jīng)解壓縮到/home/lxz/apache-1.3.39,交叉編譯器arm-linux-gcc已設(shè)缺省路徑,具體步驟還是用命令來說明:
# cd /home/lxz/apache-1.3.39-i586
# ./configure
因?yàn)閮H僅是借用下本機(jī)代碼,所以不用設(shè)置配置參數(shù),然后編譯
# make
等編譯完成后,就可以配置交叉編譯的apache了。apache的安裝位置為/usr/local/apache
# cd /home/lxz/apache-1.3.39
# CC=arm-linux-gcc ./configure --prefix=/usr/local/apache
會(huì)出來這樣的提示,因?yàn)榻徊婢幾g的生成的testfunc這個(gè)工具不能在PC上執(zhí)行,但可以不理會(huì)它
./helpers/TestCompile: line 294: /home/lxz/apache-1.3.39/src/helpers/testfunc: cannot execute binary file
打開/home/lxz/apache-1.3.39/src/main/Makefile這個(gè)文件,找到這兩段代碼
uri_delims.h: gen_uri_delims
./gen_uri_delims >uri_delims.h
test_char.h: gen_test_char
./gen_test_char >test_char.h
修改為
uri_delims.h: gen_uri_delims
/home/lxz/apache-1.3.39-i586/src/main/gen_uri_delims >uri_delims.h
test_char.h: gen_test_char
/home/lxz/apache-1.3.39-i586/src/main/gen_test_char >test_char.h
這里借用了剛才編譯生成的本機(jī)代碼里的工具,然后
# make
這就編譯好了,下面是安裝。由于配置apache的時(shí)候“prefix”參數(shù)指定的安裝位置是/usr/local/apache,在PC上,訪問/usr/local是需要有root權(quán)限的,需要切換到root用戶來進(jìn)行安裝。不建議將apache安裝到一個(gè)隨意的目錄然后拷貝,因?yàn)檫@樣會(huì)造成apache中的腳本調(diào)用位置的錯(cuò)誤。當(dāng)然,如果想要將apache安裝到一個(gè)PC和ARM Linux都能訪問的固定位置,如/home/lxz/apache也可以。
如果你不明白上面這段話在說什么,那么請(qǐng)按照下面的步驟進(jìn)行操作。請(qǐng)確認(rèn)你的PC Linux上的/usr/local/apache這個(gè)目錄不存在PC上使用的apache,否則下面的步驟會(huì)使你PC Linux上的apache不可用。
# su root
輸入密碼
# cd /home/lxz/apache-1.3.39/
# make install
# exit
別忘了用exit退出root用戶模式,這樣,apache的文件就被安裝到PC上的/usr/local/apache了。接下來所要做的是將apache拷貝到ARM Linux根文件系統(tǒng),假設(shè)ARM Linux根文件系統(tǒng)在PC上的位置為/home/lxz/root,其中已經(jīng)有/usr/local這個(gè)目錄
# cp -r /usr/local/apache /home/lxz/root/usr/local
如果是一路看著我的BLOG建立起根文件系統(tǒng)的,接下來還必須建立nobody用戶和nogroup組,因?yàn)閍pache拒絕使用root用戶運(yùn)行。具體來說就是在ARM Linux根文件系統(tǒng)上建立/etc/passwd和/etc/group兩個(gè)文件,怎么寫這兩個(gè)文件,可以google下。它們的內(nèi)容可以如下:
/etc/passwd
root::0:0:root:/:/bin/ash
nobody::65534:65533:nobody:/:/bin/ash
/etc/group
nobody::65533:
nogroup::65534:nobody
root::0:
users::100:
當(dāng)然,如果你的ARM Linux根文件系統(tǒng)中有這兩個(gè)文件,那么你需要檢查一下是不是有nobody用戶和nogroup組。接下來,可以制作文件系統(tǒng)映像并測試apache是否可以正常工作了,還是用命令來說明。
# mkfs.cramfs /home/lxz/root /home/lxz/root.img
我一直用cramfs,SUSE 10.2自己就帶了mkfs.cramfs這個(gè)工具。燒寫或者加載文件系統(tǒng)映像的步驟我就不說了,需要注意的是如果你使用了不可寫的文件系統(tǒng),如cramfs,需要把a(bǔ)pache的日志路徑掛載為臨時(shí)文件目錄,下面這幾條命令在ARM Linux上執(zhí)行。
# mount -t tmpfs tmpfs /usr/local/apache/log
然后就可以啟動(dòng)apache了
# cd /usr/local/apache/bin
# ./apachectl start
假設(shè)ARM板的ip地址是192.168.5.118,在瀏覽器里輸入http://192.168.5.118:8080訪問ARM板(不修改默認(rèn)配置,服務(wù)端口是8080)。apache的配置一會(huì)兒編譯了php再說。
編譯php
首先下載php-4.4.8,下載地址:http://cn2.php.net/get/php-4.4.8.tar.bz2/from/this/mirror
交叉編譯php同樣需要兩個(gè)步驟:
1.編譯本機(jī)代碼
2.利用本機(jī)代碼進(jìn)行交叉編譯
原因我就不重復(fù)了,假設(shè)為本機(jī)編譯的php代碼已經(jīng)解壓縮到/home/lxz/php-4.4.8-i586,為ARM編譯的php代碼已經(jīng)解壓縮到/home/lxz/php-4.4.8,交叉編譯器arm-linux-gcc已設(shè)缺省路徑,具體步驟還是用命令來說明:
# cd /home/lxz/php-4.4.8-i586
# ./configure
# make
在編譯的同時(shí),可以打開/home/lxz/php-4.4.8/configure這個(gè)文件,搜索“can not run test program while cross compiling”,會(huì)搜索到很多個(gè)這樣的結(jié)果:
{ echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
把它們都改為
{ echo "configure: error: can not run test program while cross compiling" 1>&2; }
這樣做的目的是直接無視交叉編譯測試程序錯(cuò)誤。另外,我使用的是arm-linux-gcc 3.4.1版,和代碼不太兼容。找到/home/lxz/php-4.4.8/Zend/zend_strtod.c的第238行
#if defined(IEEE_LITTLE_ENDIAN) + defined(IEEE_BIG_ENDIAN) + defined(VAX) +
Exactly one of IEEE_LITTLE_ENDIAN IEEE_BIG_ENDIAN, VAX, or
IBM should be defined.
#endif
把這段改為
#if defined(IEEE_LITTLE_ENDIAN) + defined(IEEE_BIG_ENDIAN) + defined(VAX) +
//Exactly one of IEEE_LITTLE_ENDIAN IEEE_BIG_ENDIAN, VAX, or
//IBM should be defined.
#endif
在本機(jī)php編譯完后,輸入如下命令
# cd /home/lxz/php-4.4.8
# CC=arm-linux-gcc ./configure --prefix=/usr/local/php --host=i586-suse-linux --target=arm-linux
別以為可以編譯了,還有東西要修改,真汗啊……打開/home/lxz/php-4.4.8/Makefile,找到這段
install-pear-packages: $(top_builddir)/sapi/cli/php
@$(top_builddir)/sapi/cli/php $(PEAR_INSTALL_FLAGS) /home/lxz/php-4.4.8/pear/install-pear.php -d "$(peardir)" -b "$(bindir)" /home/lxz/php-4.4.8/pear/packages/*.tar
用上我們剛才編譯的本機(jī)php里的文件,把它改成
install-pear-packages: /home/lxz/php-4.4.8-i586/sapi/cli/php
@/home/lxz/php-4.4.8-i586/sapi/cli/php $(PEAR_INSTALL_FLAGS) /home/lxz/php-4.4.8/pear/install-pear.php -d "$(peardir)" -b "$(bindir)" /home/lxz/php-4.4.8/pear/packages/*.tar
終于可以編譯了
# make
隨后和apache一樣,需要切換用戶,把php的文件安裝到/usr/local/php
# su
輸入密碼
# cd /home/lxz/php-4.4.8
# make install
# exit
這樣,php就編譯完成了。
配置Apache和PHP
接下來就需要修改配置文件,讓apache和php能夠鏈接起來工作。這個(gè)配置過程和Windows下使用apache+php的過程類似,因?yàn)槲也皇前補(bǔ)pache和php一起編譯的,只是讓apache認(rèn)識(shí)“.php”這個(gè)擴(kuò)展名,然后調(diào)用php。為了方便,直接給出apache的配置文件,配置文件的位置在ARM Linux文件系統(tǒng)的/usr/local/apache/conf/httpd.conf,其中紅色字是在默認(rèn)配置文件基礎(chǔ)上修改或添加的內(nèi)容。
ServerType standalone
ServerRoot "/usr/local/apache"
PidFile /usr/local/apache/logs/httpd.pid
ScoreBoardFile /usr/local/apache/logs/httpd.scoreboard
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
MinSpareServers 5
MaxSpareServers 10
StartServers 5
MaxClients 150
MaxRequestsPerChild 0
Port 80
User nobody
Group nobody
ServerAdmincosine@126.com
DocumentRoot "/home/webroot"
AccessFileName .htaccess
UseCanonicalName On
DefaultType text/plain
HostnameLookups Off
ErrorLog /usr/local/apache/logs/error_log
LogLevel warn
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
LogFormat "%h %l %u %t "%r" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
CustomLog /usr/local/apache/logs/access_log common
ServerSignature On
Action application/x-httpd-php "/php4/php"
php也有配置文件,但是修改起來比較簡單,只需要把/home/lxz/php-4.4.8/php.ini-dist到ARM Linux文件系統(tǒng)的/usr/local/php/lib,并改名為php.ini,找到
register_globals = Off
修改為
register_globals = On
保存就可以了。
如果你覺得上面的一切都很麻煩,可以在EE小站的SkyDrive下載我制作好的壓縮包,地址http://cid-4201fdc93932ddaf.skydrive.live.com/self.aspx/EE小站瑣碎文件/armv4-apache-php.tar.bz2,解壓縮到ARM Linux根文件系統(tǒng)的/。這個(gè)壓縮包包含apache 1.3.39和php 4.4.8,默認(rèn)的網(wǎng)頁服務(wù)器根目錄為/home/webroot,默認(rèn)監(jiān)聽端口為80。
評(píng)論