顯示具有 lighttpd 標籤的文章。 顯示所有文章
顯示具有 lighttpd 標籤的文章。 顯示所有文章

2009年6月5日 星期五

lighttpd web server - configure 篇 (issues)

其實在一個embedded system裡,要用lighttpd來達到所有web ui的工作,真的還滿複雜的,這裡說一下我所遇到的難題。

1. FireWare upgrade:
在案子開發初期,要能有FW upgrade功能是一定要的!! 但很其怪的是,我cgi那裡,明明就有很明確的把要lighttpd從client那裡要檔案,但為什麼總是傳一傳就斷了呢?! 我想了半天,也許是lighttpd本身default的最大上傳檔案size有限制,所以我在 lighttpd.conf裡,加了以下:

server.max-request-size = 900000000
server.network-backend="write"
server.upload-dirs=( "/tmp" )

這裡的意思是,讓lighttpd能接受的檔案變大。 再來就是告知lighttpd在有檔案進來時,要存在哪裡。

加了這一段後,再大的檔案都丟的進來,當然啦,不能大過你自已設的 max-request-size

這個問題我是靠"lighttpd upload limitation" 來找到答案的!

2. 在我們這裡遇到一個非常奇妙的事,就是只要用IE來access 板子上的htm檔,他就會被cache住,而且都不會去reload。使得我們有很多很奇怪的issue發生;像是: reset to default。因為檔案被cache住,所以就算底層的data已經被改成default, 但你從網頁看,所有欄位資料還是原本的,造成reset to default FAIL!

後來,發現,從lighttpd出去的封包裡,server-header裡,並沒有"cache-control=no-cache";於是,我抱著試驗的心態,把以下的 mod_setenv和一些configure加上去

server.modules 裡,要加 "mod_setenv", 然後還要加上這些configure

$HTTP["url"] =~ "^/(.*)" {
setenv.add-response-header = ( "Cache-Control" => "no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=-1" )
}

我稱之他為 "lighttpd cache-control" !

lighttpd web server - porting 篇

因為工作的關係,最近在研究一個很輕巧,很好用,而且功能算強大的web server - lighttpd (lighty)

在embedded system porting lighttpd 說實話算是很簡單,在這裡大約介紹一下

1. 到網路上下載 lighttpd,我的版本是 1.4.20. 下載連結請找google大神。
2. 如果只想在x86上面跑,沒有需要cross compile,或是不需要針對function做一些增減的話,可以直接make; make install.
3. 如果是要在embedded system上跑的話,必須要先編寫makefile, 我這裡提供一下範例

TARGETDIR=$(shell pwd)/target
SSL_CFLAGS += -I$(ROOTDIR)/lib/libssl/include/

CONFIGURE_CFG = \
--host=$(CROSS_COMPILE:-=) \
--target="" \
--build="" \
--htmldir="/www" \
--disable-ipv6 \
PCRECONFIG="$(ROOTDIR)/lib/pcre-7.8/pcre-config" \
PCRE_LIB="-L$(ROOTDIR)/lib/pcre-7.8/.libs -lpcre"

# --with-pcre="$(ROOTDIR)/lib/pcre-7.6" \

CONFIGURE_CFG += \
--with-pcre \
--without-bzip2 \
--without-zlib \
--with-openssl \
--with-openssl-libs=$(ROOTDIR)/lib/libssl/ \
--with-openssl-includes=$(ROOTDIR)/lib/libssl/include/

all: wwwlink Makefile
AM_MAKEFLAGS="-f Makefile" \
$(MAKE) -f Makefile

# CFLAGS="$(SSL_CFLAGS) -I$(ROOTDIR)/lib/pcre-7.6/" LDFLAGS="$(SSL_LDFLAGS) -L$(ROOTDIR)/lib/pcre-7.6/.libs -lpcre" LIBS="$(SSL_LIBS)" \
CFLAGS="$(SSL_CFLAGS) -I$(ROOTDIR)/lib/pcre-7.6 -DHAVE_PCRE_H=1 -DHAVE_LIBPCRE=1" \
LDFLAGS="$(SSL_LDFLAGS) -L$(ROOTDIR)/lib/pcre7.6/.lib -lpcre" LIBS="$(SSL_LIBS)" \
CFLAGS="$(SSL_CFLAGS) -I$(ROOTDIR)/lib/pcre-7.6 -DHAVE_PCRE_H=1 -DHAVE_LIBPCRE=1" LDFLAGS="$(SSL_LDFLAGS)" LIBS="$(SSL_LIBS)" \


wwwlink:
-rm -f www
ifeq ($(CONFIG_CTM_WWW_DIR),)
@if [ ! -d $(PRODUCTDIR)/www ] ; then \
echo "ERROR: There is no www directory in $(PRODUCTDIR)/www." ; \
exit 1 ; \
fi
ln -sf $(PRODUCTDIR)/www www
else
@if [ ! -d $(PRODUCTDIR)/$(CONFIG_CTM_WWW_DIR) ] ; then \
echo "ERROR: There is no $(CONFIG_CTM_WWW_DIR) directory in $(PRODUCTDIR)/$(CONFIG_CTM_WWW_DIR)." ; \
exit 1 ; \
fi
ln -sf $(PRODUCTDIR)/$(CONFIG_CTM_WWW_DIR) www
endif


Makefile:
chmod u+x ./configure; \
CFLAGS="$(SSL_CFLAGS) -I$(ROOTDIR)/lib/pcre-7.8/ -DHAVE_PCRE_H=1 -DHAVE_LIBPCRE=1" LDFLAGS="$(SSL_LDFLAGS)" LIBS="$(SSL_LIBS)" \
./configure $(CONFIGURE_CFG)

clean:
rm -rf $(TARGETDIR)
rm -f www
AM_MAKEFLAGS="-f Makefile" \
$(MAKE) -f Makefile distclean

preinstall:
rm -rf $(TARGETDIR)
mkdir -p $(TARGETDIR)
DESTDIR=$(TARGETDIR) \
AM_MAKEFLAGS="-f Makefile" \
$(MAKE) -f Makefile install

romfs:
$(ROMFSINST) -p 755 src/.libs/lighttpd /usr/bin/lighttpd
$(ROMFSINST) -p 755 src/lighttpd-angel /usr/bin/lighttpd-angel
mkdir -p $(ROMFSDIR)/lighttpd_www
$(ROMFSINST) www /lighttpd_www
$(ROMFSINST) -s /var/config.bin /lighttpd_www/config.bin
$(ROMFSINST) -p 755 lighttpd.conf /usr/lighttpd_old.conf
$(ROMFSINST) -p 755 lighttpd.user /usr/lighttpd.user
$(ROMFSINST) -p 755 src/.libs/mod_indexfile.so /usr/local/lib/mod_indexfile.so
$(ROMFSINST) -p 755 src/.libs/mod_access.so /usr/local/lib/mod_access.so
$(ROMFSINST) -p 755 src/.libs/mod_auth.so /usr/local/lib/mod_auth.so
$(ROMFSINST) -p 755 src/.libs/mod_cgi.so /usr/local/lib/mod_cgi.so
$(ROMFSINST) -p 755 src/.libs/mod_ssi.so /usr/local/lib/mod_ssi.so
$(ROMFSINST) -p 755 src/.libs/mod_dirlisting.so /usr/local/lib/mod_dirlisting.so
$(ROMFSINST) -p 755 src/.libs/mod_staticfile.so /usr/local/lib/mod_staticfile.so
$(ROMFSINST) -p 755 src/.libs/mod_evasive.so /usr/local/lib/mod_evasive.so
$(ROMFSINST) -p 755 src/.libs/mod_setenv.so /usr/local/lib/mod_setenv.so
$(ROMFSINST) -p 755 src/.libs/mod_redirect.so /usr/local/lib/mod_redirect.so
$(ROMFSINST) -p 755 server.pem /usr/server.pem

4. 請注意,我在這裡遇到的第1個問題是,pcre的問題,看的出來,lighttpd和pcre有dependence的關係,要能成功的讓lighttpd 找到 pcre的resource,你必須要像我這樣寫,不然,lighttpd會去reference到你本機的pcre,也就是說,就算你build 好了,丟到板子上,也不會動,因為他會說 pcre is not supported.

5. 在romfs方面,則要看你想包什麼功能進去,所以這裡建議,用到什麼包什麼,不要全部包包進去,除非沒有空間限制。

6. 到這裡,打make下去,應該在 src/ 下找到 lighttpd-angel, 和 src/.lib/ 下找到 lighttpd 和一堆 mod_xxx.so。 這些都是最後要等到target board上的必要檔案。

Porting 到這裡,應該算是成功,接下來就要看你把檔案等到target board上能不能動了。