新聞中心

在ARM Linux上使用Apache+PHP

作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò) 收藏
相信這篇文章同樣是國(guó)內(nèi)很難搜到的一個(gè)HOWTO(,截至到我寫(xiě)出來(lái)之前),我的最初目的是在ARM上使用PHP,嘗試了Busybox的httpd,以及boa都沒(méi)有辦法很方便的和PHP接口,因此我狠下心來(lái),編譯了Apache。在ARM上使用PHP,好處僅僅是腳本比cgi好寫(xiě)一些,付出的代價(jià)是速度和蝸牛一樣慢,不要指望很多人同時(shí)訪問(wèn)可以響應(yīng)得過(guò)來(lái)。
另外說(shuō)件事,BLOG上的文章多了,經(jīng)常發(fā)現(xiàn)有人轉(zhuǎn)載,但是有的人卻不注出處……難道要我吧我的名字和郵件地址寫(xiě)到文章的每一個(gè)部分嗎?也許國(guó)人就是這樣缺乏某種精神,在我看到的轉(zhuǎn)載我文章的BLOG中,基本都是網(wǎng)上各種ARM Linux文章的集合,不可否認(rèn)他們搜集的很好,但是看了這么多文章,連一點(diǎn)心得體會(huì)都沒(méi)有么,寫(xiě)點(diǎn)原創(chuàng)的東西就這么難么?不管怎樣,我還是堅(jiān)持EE小站的風(fēng)格——原創(chuàng)性。下面開(kāi)始正題,本文分為三大部分,apache、php和配置。

編譯apache
下載apache 1.3.39(1.3.41有些bug,沒(méi)有辦法交叉編譯)
下載地址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)然沒(méi)有辦法在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è)缺省路徑,具體步驟還是用命令來(lái)說(shuō)明:

# 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ì)出來(lái)這樣的提示,因?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
打開(kāi)/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上,訪問(wèn)/usr/local是需要有root權(quán)限的,需要切換到root用戶來(lái)進(jìn)行安裝。不建議將apache安裝到一個(gè)隨意的目錄然后拷貝,因?yàn)檫@樣會(huì)造成apache中的腳本調(diào)用位置的錯(cuò)誤。當(dāng)然,如果想要將apache安裝到一個(gè)PC和ARM Linux都能訪問(wèn)的固定位置,如/home/lxz/apache也可以。
如果你不明白上面這段話在說(shuō)什么,那么請(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了。接下來(lái)所要做的是將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)的,接下來(lái)還必須建立nobody用戶和nogroup組,因?yàn)閍pache拒絕使用root用戶運(yùn)行。具體來(lái)說(shuō)就是在ARM Linux根文件系統(tǒng)上建立/etc/passwd和/etc/group兩個(gè)文件,怎么寫(xiě)這兩個(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組。接下來(lái),可以制作文件系統(tǒng)映像并測(cè)試apache是否可以正常工作了,還是用命令來(lái)說(shuō)明。

# mkfs.cramfs /home/lxz/root /home/lxz/root.img

我一直用cramfs,SUSE 10.2自己就帶了mkfs.cramfs這個(gè)工具。燒寫(xiě)或者加載文件系統(tǒng)映像的步驟我就不說(shuō)了,需要注意的是如果你使用了不可寫(xiě)的文件系統(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訪問(wèn)ARM板(不修改默認(rèn)配置,服務(wù)端口是8080)。apache的配置一會(huì)兒編譯了php再說(shuō)。

編譯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è)缺省路徑,具體步驟還是用命令來(lái)說(shuō)明:

# cd /home/lxz/php-4.4.8-i586
# ./configure
# make

在編譯的同時(shí),可以打開(kāi)/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; }
這樣做的目的是直接無(wú)視交叉編譯測(cè)試程序錯(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) +
defined(IBM) != 1
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) +
defined(IBM) != 1
//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

別以為可以編譯了,還有東西要修改,真汗啊……打開(kāi)/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
接下來(lái)就需要修改配置文件,讓apache和php能夠鏈接起來(lái)工作。這個(gè)配置過(guò)程和Windows下使用apache+php的過(guò)程類似,因?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"

Options FollowSymLinks
AllowOverride None


Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
Allow from all


UserDir public_html


DirectoryIndex index.html
DirectoryIndex index.php
DirectoryIndex index.php3
DirectoryIndex index.phtml

AccessFileName .htaccess

Order allow,deny
Deny from all
Satisfy All

UseCanonicalName On

TypesConfig /usr/local/apache/conf/mime.types

DefaultType text/plain

MIMEMagicFile /usr/local/apache/conf/magic

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

Alias /icons/ "/usr/local/apache/icons/"

Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all

Alias /manual/ "/usr/local/apache/htdocs/manual/"

Options Indexes FollowSymlinks MultiViews
AllowOverride None
Order allow,deny
Allow from all

ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"
ScriptAlias /php4/ "/usr/local/php/bin/"
# 注意 "/usr/local/php/bin/" 中最后一個(gè)"/"不可少

AllowOverride None
Options None
Order allow,deny
Allow from all



IndexOptions FancyIndexing
AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip
AddIconByType (TXT,/icons/text.gif) text/*
AddIconByType (IMG,/icons/image2.gif) image/*
AddIconByType (SND,/icons/sound2.gif) audio/*
AddIconByType (VID,/icons/movie.gif) video/*
AddIcon /icons/binary.gif .bin .exe
AddIcon /icons/binhex.gif .hqx
AddIcon /icons/tar.gif .tar
AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
AddIcon /icons/a.gif .ps .ai .eps
AddIcon /icons/layout.gif .html .shtml .htm .pdf
AddIcon /icons/text.gif .txt
AddIcon /icons/c.gif .c
AddIcon /icons/p.gif .pl .py
AddIcon /icons/f.gif .for
AddIcon /icons/dvi.gif .dvi
AddIcon /icons/uuencoded.gif .uu
AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
AddIcon /icons/tex.gif .tex
AddIcon /icons/bomb.gif core
AddIcon /icons/back.gif ..
AddIcon /icons/hand.right.gif README
AddIcon /icons/folder.gif ^^DIRECTORY^^
AddIcon /icons/blank.gif ^^BLANKICON^^
DefaultIcon /icons/unknown.gif
ReadmeName README.html
HeaderName HEADER.html
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t


AddLanguage da .dk
AddLanguage nl .nl
AddLanguage en .en
AddLanguage et .ee
AddLanguage fr .fr
AddLanguage de .de
AddLanguage el .el
AddLanguage he .he
AddCharset ISO-8859-8 .iso8859-8
AddLanguage it .it
AddLanguage ja .ja
AddCharset ISO-2022-JP .jis
AddLanguage kr .kr
AddCharset ISO-2022-KR .iso-kr
AddLanguage nn .nn
AddLanguage no .no
AddLanguage pl .po
AddCharset ISO-8859-2 .iso-pl
AddLanguage pt .pt
AddLanguage pt-br .pt-br
AddLanguage ltz .lu
AddLanguage ca .ca
AddLanguage es .es
AddLanguage sv .sv
AddLanguage cs .cz .cs
AddLanguage ru .ru
AddLanguage zh-TW .zh-tw
AddCharset Big5.Big5.big5
AddCharset WINDOWS-1251 .cp-1251
AddCharset CP866.cp866
AddCharset ISO-8859-5.iso-ru
AddCharset KOI8-R.koi8-r
AddCharset UCS-2.ucs2
AddCharset UCS-4.ucs4
AddCharset UTF-8.utf8

LanguagePriority en da nl et fr de el it ja kr no pl pt pt-br ru ltz ca es sv tw

AddType application/x-tar .tgz
AddType application/x-httpd-php .php3
AddType application/x-httpd-php .php
AddType application/x-httpd-php .phtml
AddEncoding x-compress .Z
AddEncoding x-gzip .gz .tgz

Action application/x-httpd-php "/php4/php"

BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4.0b2;" nokeepalive downgrade-1.0 force-response-1.0
BrowserMatch "RealPlayer 4.0" force-response-1.0
BrowserMatch "Java/1.0" force-response-1.0
BrowserMatch "JDK/1.0" force-response-1.0

php也有配置文件,但是修改起來(lái)比較簡(jiǎn)單,只需要把/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
保存就可以了。
如果你覺(jué)得上面的一切都很麻煩,可以在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)頁(yè)服務(wù)器根目錄為/home/webroot,默認(rèn)監(jiān)聽(tīng)端口為80。


關(guān)鍵詞: ARMLinuxApache+PH

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉