新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 在ARM Linux上使用Apache+PHP

在ARM Linux上使用Apache+PHP

作者: 時間:2016-11-09 來源:網(wǎng)絡(luò) 收藏
相信這篇文章同樣是國內(nèi)很難搜到的一個HOWTO(,截至到我寫出來之前),我的最初目的是在ARM上使用PHP,嘗試了Busybox的httpd,以及boa都沒有辦法很方便的和PHP接口,因此我狠下心來,編譯了Apache。在ARM上使用PHP,好處僅僅是腳本比cgi好寫一些,付出的代價是速度和蝸牛一樣慢,不要指望很多人同時訪問可以響應(yīng)得過來。
另外說件事,BLOG上的文章多了,經(jīng)常發(fā)現(xiàn)有人轉(zhuǎn)載,但是有的人卻不注出處……難道要我吧我的名字和郵件地址寫到文章的每一個部分嗎?也許國人就是這樣缺乏某種精神,在我看到的轉(zhuǎn)載我文章的BLOG中,基本都是網(wǎng)上各種ARM Linux文章的集合,不可否認他們搜集的很好,但是看了這么多文章,連一點心得體會都沒有么,寫點原創(chuàng)的東西就這么難么?不管怎樣,我還是堅持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總體上需要兩個步驟:
1.編譯本機代碼
2.利用本機代碼進行交叉編譯

這是因為編譯apache時,需要使用編譯生成的工具制作后續(xù)編譯使用的頭文件,交叉編譯的工具當(dāng)然沒有辦法在PC上運行,因此,需要借用本機編譯生成的工具。假設(shè)為本機編譯的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

因為僅僅是借用下本機代碼,所以不用設(shè)置配置參數(shù),然后編譯

# make

等編譯完成后,就可以配置交叉編譯的apache了。apache的安裝位置為/usr/local/apache

# cd /home/lxz/apache-1.3.39
# CC=arm-linux-gcc ./configure --prefix=/usr/local/apache

會出來這樣的提示,因為交叉編譯的生成的testfunc這個工具不能在PC上執(zhí)行,但可以不理會它
./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這個文件,找到這兩段代碼
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
這里借用了剛才編譯生成的本機代碼里的工具,然后

# make

這就編譯好了,下面是安裝。由于配置apache的時候“prefix”參數(shù)指定的安裝位置是/usr/local/apache,在PC上,訪問/usr/local是需要有root權(quán)限的,需要切換到root用戶來進行安裝。不建議將apache安裝到一個隨意的目錄然后拷貝,因為這樣會造成apache中的腳本調(diào)用位置的錯誤。當(dāng)然,如果想要將apache安裝到一個PC和ARM Linux都能訪問的固定位置,如/home/lxz/apache也可以。
如果你不明白上面這段話在說什么,那么請按照下面的步驟進行操作。請確認你的PC Linux上的/usr/local/apache這個目錄不存在PC上使用的apache,否則下面的步驟會使你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這個目錄

# cp -r /usr/local/apache /home/lxz/root/usr/local

如果是一路看著我的BLOG建立起根文件系統(tǒng)的,接下來還必須建立nobody用戶和nogroup組,因為apache拒絕使用root用戶運行。具體來說就是在ARM Linux根文件系統(tǒng)上建立/etc/passwd和/etc/group兩個文件,怎么寫這兩個文件,可以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)中有這兩個文件,那么你需要檢查一下是不是有nobody用戶和nogroup組。接下來,可以制作文件系統(tǒng)映像并測試apache是否可以正常工作了,還是用命令來說明。

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

我一直用cramfs,SUSE 10.2自己就帶了mkfs.cramfs這個工具。燒寫或者加載文件系統(tǒng)映像的步驟我就不說了,需要注意的是如果你使用了不可寫的文件系統(tǒng),如cramfs,需要把apache的日志路徑掛載為臨時文件目錄,下面這幾條命令在ARM Linux上執(zhí)行。

# mount -t tmpfs tmpfs /usr/local/apache/log

然后就可以啟動apache了

# cd /usr/local/apache/bin
# ./apachectl start

假設(shè)ARM板的ip地址是192.168.5.118,在瀏覽器里輸入http://192.168.5.118:8080訪問ARM板(不修改默認配置,服務(wù)端口是8080)。apache的配置一會兒編譯了php再說。

編譯php
首先下載php-4.4.8,下載地址:http://cn2.php.net/get/php-4.4.8.tar.bz2/from/this/mirror

交叉編譯php同樣需要兩個步驟:
1.編譯本機代碼
2.利用本機代碼進行交叉編譯

原因我就不重復(fù)了,假設(shè)為本機編譯的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

在編譯的同時,可以打開/home/lxz/php-4.4.8/configure這個文件,搜索“can not run test program while cross compiling”,會搜索到很多個這樣的結(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; }
這樣做的目的是直接無視交叉編譯測試程序錯誤。另外,我使用的是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
在本機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
用上我們剛才編譯的本機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能夠鏈接起來工作。這個配置過程和Windows下使用apache+php的過程類似,因為我不是把apache和php一起編譯的,只是讓apache認識“.php”這個擴展名,然后調(diào)用php。為了方便,直接給出apache的配置文件,配置文件的位置在ARM Linux文件系統(tǒng)的/usr/local/apache/conf/httpd.conf,其中紅色字是在默認配置文件基礎(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/" 中最后一個"/"不可少

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也有配置文件,但是修改起來比較簡單,只需要把/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)的/。這個壓縮包包含apache 1.3.39和php 4.4.8,默認的網(wǎng)頁服務(wù)器根目錄為/home/webroot,默認監(jiān)聽端口為80。


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

評論


相關(guān)推薦

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

關(guān)閉