WEB SERVER PORTING 1 Jo, Heeseung
웹서버포팅 HBE-SM5-S4210 를임베디드웹서버로사용할수있도록웹서버를올리는작업 임베디드서버에널리쓰이는웹서버들중 GoAhead 라는웹서버를포팅 CGI 프로그램을이용하여웹에서 HBE-SM5-S4210 의 LED, 7- Segment, TextLCD 를제어실습 2
Goahead webserver 소스를다운받거나제공된 CD 안의소스를이용 http://cslab.jbnu.ac.kr/_down/es/webs218.tar.gz 경로 : [CD]\source\webserver\webs218.tar.gz http://data.goahead.com/software/webserver/2.1.8/webs218.tar.gz 3
GoAhead 소스복사및압축해제 웹서버소스를복사한후에소스를압축해제 ws031202 라는디렉터리가생성되고, 그안에들어가면여러가지플랫폼에해당하는디렉터리가각각존재 - LINUX 디렉터리로이동 root@ubuntu:# cp /media/sm5-linux-111031/source/webserver/webs218.tar.gz /working root@ubuntu:# cd /working root@ubuntu:/working# tar xzvf webs218.tar.gz root@ubuntu:/working# cd ws031202/linux/ 4
GoAhead 컴파일을위한소스수정 HBE-SM5-S4210 타겟보드에서이프로그램을실행시키기위해서는크로스컴파일을해야함 - Makefile 을다음과같이수정 root@ubuntu:/working/ws031202/linux# vi Makefile ------------------------ 다음과같이수정한다 --------------------- # 크로스컴파일을하기위해서 " 컴파일러 " 와 " 라이브러리빌더 " 를추가 14 15 CC=arm-linux-gcc 16 AR=arm-linux-ar 17 # 마지막줄에서 cc 를 $(CC) 로변경 158 $(CC) -c -o $@ $(DEBUG) $(CFLAGS) $(IFLAGS) $< ----------------------- 저장하고종료한다 ------------------------ 5
GoAhead 컴파일을위한소스수정 misc.c 파일수정 root@ubuntu:/working/ws031202/linux# vi../misc.c ----------------- 다음과같이수정한다 ------------------------- 61 //static int strnlen(char_t *s, unsigned int n); 62 static void put_char(strbuf_t *buf, char_t c); 63 static void put_string(strbuf_t *buf, char_t *s, int len, 428 #if 0 429 static int strnlen(char_t *s, unsigned int n) 430 { 431 unsigned int len; 432 433 len = gstrlen(s); 434 return min(len, n); 435 } 436 #endif ------------------ 저장하고종료한다 -------------------------- 9
GoAhead 컴파일 다음과같이 make 를실행하여컴파일 생성된파일들을확인 root@ubuntu:/working/ws031202/linux# make root@ubuntu:/working/ws031202/linux# ls Makefile libwebs.a main.c main.o webs 위와같이 webs 라는웹서버실행파일과 libwebs.a 라는라이브러리가생성 10
인덱스파일작성 다음으로웹서버의인덱스파일로사용할 index.html 파일을생성 테스트용으로간단히작성하고, 각자다른내용을추가 root@ubuntu:/working/ws031202/linux# vi index.html -------------------- 다음과같이수정한다 ---------------------- <html> <head> <title>the First webs test!</title> </head> <body> The first embedded linux web page </body> </html> --------------------- 저장하고종료한다 ---------------------- root@ubuntu:/working/ws031202/linux# 11
웹서버실행파일인 webs 와앞에서작성한 index.html 을타겟보드로복사 타겟보드에서 GoAhead 실행을위한준비 타겟보드에서웹서버에접속했을때보여질웹페이지디렉터리 (/web) 를생성 cgi 가들어갈디렉터리 (/web/cgi-bin) 를생성 로그인한후에 /web 디렉터리가존재하는지확인 현재 HBE-SM5-S4210 의루트파일시스템에는웹서버가포팅되어있기때문에 /web 디렉터리가이미존재 실습을위해서기존에있던 /web 디렉터리를삭제하거나다른이름으로이동 - 여기에서는 /web 디렉터리를임시로다른이름으로이동 12
타겟보드에서 GoAhead 실행을위한준비작업 [root@sm5s4210 ~]# ls / ------------------다음과같은메시지가 출력된다 ----------------- bin jffs lost+found sbin tmp dev lib mnt sys usr etc linuxrc proc sysfs var home lost+found root test web [root@sm5s4210 ~]# mv /web/ /web-org [root@sm5s4210 ~]# ls / ------------------다음과같은메시지가 출력된다 ----------------- bin jffs lost+found sbin tmp dev lib mnt sys usr etc linuxrc proc sysfs var home lost+found root test web-org 13
타겟보드에서 GoAhead 실행을위한준비작업 /bin 디렉터리에 webs 실행파일이존재하는지확인 현재 HBE-SM5-S4210 의루트파일시스템에는웹서버가포팅되어있기때문에 /bin 디렉터리에 webs 실행파일이이미존재 - 실습을위해서기존에있던 webs 파일을삭제하거나다른이름으로이동 - 여기에서는 /bin/webs 파일을임시로다른이름으로이동 [root@sm5s4210 ~]# ls /bin/webs ------------------ 다음과같은메시지가출력된다 ----------------- /bin/webs [root@sm5s4210 ~]# mv /bin/webs /bin/webs-org [root@sm5s4210 ~]# ls /bin/webs-org ------------------ 다음과같은메시지가출력된다 ----------------- /bin/webs-org 14
타겟보드에 GoAhead 실행파일및 main.html 다운로드 호스트 PC 에있는 webs 와 index.html 파일을타겟보드의 /bin 과 /web 로복사 타겟보드로복사하는방법은 nfs 를이용 15
웹서버프로세스가실행되고있는지확인 루트파일시스템에서는부팅시에웹서버가자동으로실행되도록설정되어있음 webs 를실행하기전에웹서버가실행되고있는지확인한후에실행 웹서버가실행되고있으면프로세스를 kill [root@sm5s4210 ~]# ps grep webs ------------------ 다음과같은메시지가출력된다 ----------------- 1316 root 1856 S /bin/webs [root@sm5s4210 ~]# kill -9 1316 16
타겟보드에서 GoAhead 실행 다음과같이웹서버를실행 /web 하위에서실행 [root@sm5s4210 ~]# /bin/webs & [root@sm5s4210 ~]# ps grep webs 1424 root 1988 S /bin/webs 1426 root 3536 S grep -i webs 17
호스트 PC 의웹브라우저로웹서버에접속 타겟보드의웹서버가정상적으로동작하는지확인 호스트 PC 의웹브라우저를이용 - 웹브라우저로타겟보드의웹서버에접속시반드시 IP 설정을타겟보드와통신이가능하도록맞춰주어야함 18
호스트 PC 의웹브라우저로웹서버에접속 브라우저의주소입력창에 http://192.168.0.150/index.html 을입력 19
CGI PROGRAMMING 공통게이트웨이인터페이스 (CGI, Common Gateway Interface) 브라우저에서서버로정보를전달하기위한방법을정의하는인터페이스 CGI 프로그램에서는동적인문서를전달하기위해 HTTP 프로토콜을사용 CGI 를구현하기위하여웹브라우저에서 FORM 태그를통해사용자의입력값들을웹서버로전송 서버에서는그값을 CGI 프로그램으로입력값을넘겨줌 20
CGI PROGRAMMING Web 에서입력값전달방식 웹에서사용자의입력값들을넘겨주기위하여는 <FORM> 태그를사용 <FORM> 태그의구성 <form method=get action="cgi-bin/8bitled.cgi"> <p align="center"> 0x <input type="text" name="value" maxlength="2" size="2"> <input type="submit" name="button" value="input"></p> </form> 21
CGI PROGRAMMING Web 에서입력값전달방식 get method - <form> 태그에 method=get 으로하면사용자의입력값들이환경변수에저장되어전달 - 각입력값들이기본 URL 에붙은인수 (parameter) 로서첨가되어 CGI 프로그램으로값을전달 - get method 를이용하면, 그입력값들이환경변수의하나인 QUERY_STRING 에들어가전달되는데 CGI 프로그램은 QUERY_STRING 에들어있는값을읽음 - 이때그값들은입력된대로넘어가는것이아니라서버에의해여러가지로변환 (encoding) 되어넘어가며 CGI 프로그램에서는그값들을 getenv() 로읽어들여해독 (decoding) 하여야함 22
CGI PROGRAMMING Web 에서입력값전달방식 post method - <form> 태그에서 method=post 로하면, stdin(standard input: 표준입력 ) 을통해전달 - post method 는 stdin 을이용하므로전달하려는데이터양에제한이없음 - post method 에서는환경변수들또한 stdin 과함께전달됨 - 입력값들이 encoding 되어넘어오기때문에 CGI 에서그값들을 decoding 해야함 23
CGI PROGRAMMING C 언어를이용한 CGI 프로그래밍 CGI 프로그램에서는출력할데이터에앞서적절한헤더정보를보내웹서버가어떤타입을출력하려는지인식하게해야함 다음의예는웹서버에게어떤타입을출력하려고하는지알수있게해줌 printf("content-type: text/html\n\n"); 24
CGI PROGRAMMING CGI 예제작성 root@ubuntu:# mkdir /working/web root@ubuntu:# cd /working/web/ root@ubuntu:/working/web# vi first.c ----------------------- 다음과같이수정한다 ------------------------ #include <stdio.h> int main() { printf("content-type: text/html\n\n"); printf("<html>\n<head><title>the First CGI program</title></head>\n"); printf("<body>\n<center> It is a CGI program test</center>\n</body>\n </html>"); return 0; } ----------------------- 저장하고종료한다 ------------------------- 25
CGI PROGRAMMING first.c 소스를컴파일 root@ubuntu:/working/web# arm-linux-gcc -o first.cgi first.c first.html 파일을작성 root@ubuntu:/working/web# vi first.html --------------------- 다음과같이수정한다 -------------------- <html> <head> <title>test CGI PROGRAM!</title> </head> <body><center><a href="cgi-bin/first.cgi">the first CGI PROGRAM!</a> </center> </body> </html> -------------------------- 저장하고종료한다 -------------------- 26
CGI PROGRAMMING first.cgi 와 first.html 파일을타겟보드로복사 타겟보드에 first.html 과 first.cgi 을 /web 과 /web/cgi-bin 에복사 [root@sm5s4210 ~]# mv first.html /web/ [root@sm5s4210 ~]# mv first.cgi /web/cgi-bin/ 27
CGI PROGRAMMING CGI 예제실행확인 호스트 PC의웹브라우저에서웹서버에접속 주소창에 http://192.168.0.150/first.html을입력 28
CGI PROGRAMMING CGI 예제실행확인 화면에출력된 The first CGI PROGRAM! 을누르면 /web/cgi-bin 에있는 first.cgi 프로그램이동작 29