arm 移植 lighttpd + CGI 配置
章節描述:
介紹 lighttpd 的移植,以及 CGI 配置
lighttpd介紹
lighttpd
is a secure, fast, compliant, and very flexible web-server that has been optimized for high-performance environments. It has a very low memory footprint compared to other webservers and takes care of cpu-load. Its advanced feature-set (FastCGI, CGI, Auth, Output-Compression, URL-Rewriting and many more) make lighttpd the perfect webserver-software for every server that suffers load problems.
維基百科:
- https://redmine.lighttpd.net/projects/lighttpd/wiki/Docs
- https://redmine.lighttpd.net/projects/lighttpd
背景
需要一個arm平臺的方案。
version:
- lighttpd 1.4.55
- gcc-3.4.5-glibc-2.3.6/arm-softfloat (採用cross tool製作)
#!/bin/bash export CC=arm-softfloat-linux-gnu-gcc export AR=arm-softfloat-linux-gnu-ar export LD=arm-softfloat-linux-gnu-ld export RANLIB=arm-softfloat-linux-gnu-ranlib export STRIP=arm-softfloat-linux-gnu-strip ./configure --prefix=/usr/local/lighttpd-arm --host=arm-softfloat-linux-gnu --build=i686-pc-linux --disable-FEUTARE --disable-ipv6 --disable-lfs --without-bzip2 make sudo make install #--prefix 為安裝目錄(主機&目標板一致)
我的移植方案:
## # Copyright By Schips, All Rights Reserved # https://gitee.com/schips/ # # File Name: make.sh # Created : 2020-07-31 09:38:39 # ## #!/bin/sh BASE=`pwd` #BUILD_HOST=arm-linux # 最終的執行環境 INSTALL=${BASE}/install FIN_INSTALL=/usr/local/lighttpd make_dirs() { cd ${BASE} mkdir compressed install source -p } tget () { #try wget filename=`basename $1` echo "Downloading [${filename}]..." if [ ! -f ${filename} ];then wget $1 fi echo "[OK] Downloaded [${filename}] " } download_package () { cd ${BASE}/compressed #下載包 tget https://download.lighttpd.net/lighttpd/releases-1.4.x/lighttpd-1.4.55.tar.gz } tar_package () { cd ${BASE}/compressed ls * > /tmp/list.txt for TAR in `cat /tmp/list.txt` do tar -xf $TAR -C ../source done rm -rf /tmp/list.txt } set_compile_env () { #GCC_PATH=`whereis gcc | awk -F: '{print $2}' | awk '{print $1}' | xargs dirname` #export PATH=$PATH:$GCC_PATH export CC=${BUILD_HOST}gcc export AR=${BUILD_HOST}ar export LD=${BUILD_HOST}ld export RANLIB=${BUILD_HOST}ranlib export STRIP=${BUILD_HOST}strip } make_taget () { cd ${BASE}/source/* ./configure --disable-ipv6 --disable-lfs --without-bzip2 \ --prefix=${FIN_INSTALL} && echo "${FIN_INSTALL} with ${BUILD_HOST}gcc" > ${BASE}/ccinfo make } make_install () { mkdir ${BASE}/install/lib -p mkdir ${BASE}/install/sbin -p cd ${BASE}/source/* SRCTOP=`pwd` echo "${FIN_INSTALL} with ${BUILD_HOST}gcc" > ${BASE}/ccinfo cp ${BASE}/ccinfo ${BASE}/install cp $SRCTOP/src/.libs/*.so ${BASE}/install/lib -r cp $SRCTOP/src/lighttpd-angel ${BASE}/install/sbin cp $SRCTOP/src/lighttpd ${BASE}/install/sbin #cp `find . -type f -name "lighttpd.conf" 2> /dev/null | grep doc` -v ${BASE}/install/sbin cp $SRCTOP/doc/config -r ${BASE}/install/ rm ${BASE}/install/config/Make* } make_dirs set_compile_env #tar_package #make_taget make_install exit $?
配置 lighttpd.conf
一般配置
修改工作路徑:
server.document-root = "/home/xx/lighttpd/"
關閉http範圍請求:
#$HTTP["url"] =~ "\.pdf$" {
# server.range-requests = "disable"
#}
修改組:
lighttpd.conf檔案中:註釋掉username行,
#server.username = "lighttpd"
#server.groupname = "lighttpd
否則會出現:
can't find username lighttpd
其他:
檔案系統不能讀寫的話用#
號註釋掉這兩個選項:
#server.errorlog
#accesslog.filename
CGI支援
CGI(Common Gateway Interface),通用閘道器介面,它是一段程式,執行在伺服器上,提供同客戶端 HTML 頁面的介面。
我們這裡以自定義的cgi程式處理為例子。
確定目錄結構
假定目錄位於/home/xx/lighttpd/
,目錄結構如下:
/home/xx/lighttpd/install
├── config
├───lighttpd.conf
│ ├── conf.d
│ └── vhosts.d
├── lib
└── sbin
配置 lighttpd
說明:
由於這個版本的lighttpd是很新的一個版本,很多文章的配置都有一些變化。但是實際上是類似的。
新版lighttpd.conf中,include
了很多子配置,例如include "modules.conf"
。
如果需要配置cgi,一般在modules.conf
中使能include conf.d/cgi.conf
比較合理。
當然,也可以在
lighttpd.conf
中註釋掉include "modules.conf"
,將所有的配置寫在lighttpd.conf
裡面。
編輯conf.d/cgi.conf
:
# 確保 此行有效:
server.modules += ( "mod_cgi" )
# 修改 cgi.assign
## 注:對於帶副檔名且需要特定解析程式執行的CGI,可以指定解析程式的路徑
cgi.assign = ( ".pl" => "/usr/bin/perl",
".rb" => "/usr/bin/ruby",
".erb" => "/usr/bin/eruby",
## 對於帶副檔名卻不需要特定解析程式就能執行的CGI,可指定解析程式為空,此時可由html中指定需要執行的cgi程式。(例如下面這行)
# 新增這一行
".cgi" => "",
".py" => "/usr/bin/python" )
## 對於不帶副檔名的CGI程式,只能通過固定路徑存取了,如:
## cgi.assgin = ( "/cgi-bin/mycgi" => "/usr/local/cgi/mycgi )
編寫網頁
為了方便,以index.html
修改,內容為:
注意其中的
Action
指定的路徑要與實際上的伺服器工作路徑相對應。我們這裡將請求傳送給
cgi-bin
下的程式
- mult_sh.cgi :由sh處理
- mult_c.cgi : 由c程式處理
<html>
<head>
<meta charset="utf-8">
<title>測試</title>
</head>
<body>
<form name="form1" ACTION="/cgi-bin/mult_sh.cgi">
<P>計算兩個數的乘積,請輸入兩個乘數。
<INPUT NAME="m" SIZE="5">
<INPUT NAME="n" SIZE="5"><BR>
<INPUT TYPE="SUBMIT" values="提交">
</form>
</body>
</html>
建立cgi目錄
假設新建的目錄名為:cgi-bin
,此時的目錄如下:
/home/xx/lighttpd/install
├─▲ cgi-bin
├── config
│ ├── conf.d
│ └── vhosts.d
├── lib
└── sbin
編寫自定義cgi程式
cgi程式可以有很多種寫法,這裡以bash與c語言為例。
程式需要放在
/home/xx/lighttpd/install/cgi-bin
中,這是由html檔案指定的。
c程式
這段C程式會處理網路請求,並做正確的運算。
/*
# Copyright By Schips, All Rights Reserved
# https://gitee.com/schips/
#
# File Name: mult_c.c
# Created : 2020-07-31 14:20:53
*/
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *data;
long m,n;
printf("%s\n\n","Content-Type:text/html;charset=utf8");
printf("<TITLE>乘法結果</TITLE> ");
printf("<H3>乘法結果</H3> ");
data = getenv("QUERY_STRING"); //獲得form傳來的引數——兩個乘數m和n
if(data == NULL)
printf("<P>錯誤!資料沒有被輸入或者資料傳輸有問題");
else if(sscanf(data,"m=%ld&n=%ld",&m,&n)!=2)
printf("<P>錯誤!輸入資料非法。表單中輸入的必須是數字。");
else
printf("<P>%ld和%ld的乘積是:%ld。",m,n,m*n);
return 0;
}
編譯:
注意,執行檔案的字尾名為配置好的
.cgi
,否則會變成檔案傳輸。
gcc mult_c.c -o mult_c.cgi
指令碼
##
# Copyright By Schips, All Rights Reserved
# https://gitee.com/schips/
#
# File Name: mult_sh.cgi
# Created : 2020-07-31 14:18:24
#
##
#!/bin/sh
# 獲取網路傳過來的引數
str=$QUERY_STRING
echo "Content-type: text/html" # HTTP頭部的一部分,告訴瀏覽器檔案的內容型別。
echo # 空行,告訴伺服器結束頭部
## 自定義的處理(這裡不做處理,只做資料迴環)
echo
echo
echo ""
echo ""
echo "hello, this is the output from shell"
echo "<br>Data send by Browser : [$QUERY_STRING]</br>"
echo ""
測試
指定配置檔案啟動:
cd /home/xx/lighttpd/
sbin/lighttpd -f config/lighttpd.conf
開啟網頁,測試