1. 程式人生 > 實用技巧 >arm 移植 lighttpd + CGI 配置

arm 移植 lighttpd + CGI 配置

--- title: arm 移植 lighttpd + CGI 配置 EntryName: porting-lighttpd-on-arm-and-make-cgi-config date: 2020-07-31 03:14:23 categories: tags: - arm - web - lighttpd - cgi - config ---

章節描述:

介紹 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://www.lighttpd.net/

維基百科:

背景

需要一個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

開啟網頁,測試