아파치 소스 내려 받기
http://apache.tt.co.kr/httpd/ 사이트에서 다음의 소스를 다운로드합니다.
작업 환경
- 리눅스 배포판 : FedoraCore-3
- ARM툴체인 : arm-linux-gcc 3.4.3
- ARM툴체인 : mipsel-linux-gcc 3.4.4
아파치 웹 서버 설치하기
작업 디렉토리는 다음과 같으며, 이 디렉토리는 사용자 임의의로 설정하면 됩니다.
/staff/tsheaven/ramdisk/gcc-3.4.3/src
다운받은 아파치 웹 서버 소스의 압축을 해지합니다.
[root@hw27:src]# tar -zxvf apache_1.3.41.tar.gz
정상적으로 풀렸다면 디렉토리로 들어가서 환경을 설정합니다.
[root@hw27:src]# cd apache_1.3.41/
[root@hw27:apache_1.3.41]# ./configure
Configuring for Apache, Version 1.3.41
+ using installation path layout: Apache (config.layout)
Creating Makefile
Creating Configuration.apaci in src
Creating Makefile in src
+ configured for Linux platform
+ setting C compiler to gcc
+ setting C pre-processor to gcc -E
+ using "tr [a-z] [A-Z]" to uppercase
+ checking for system header files
+ adding selected modules
+ using system Expat
+ checking sizeof various data types
+ doing sanity check on compiler and options
Creating Makefile in src/support
Creating Makefile in src/regex
Creating Makefile in src/os/unix
Creating Makefile in src/ap
Creating Makefile in src/main
Creating Makefile in src/modules/standard
[root@hw27:apache_1.3.41]# make
[root@hw27:apache_1.3.41]# vi configure
77 ##
78 ## determine platform id
79 ##
80 PLATFORM="`$aux/GuessOS`"
81
// 를 다음과 같이 수정한다.
77 ##
78 ## determine platform id
79 ##
80 #PLATFORM="`$aux/GuessOS`"
81 PLATFORM="arm-whatever-riscix"
// 기존에 임베디드에서 웹서버로 많이 사용한 boa 대신 아파치 웹 서버를 올려 사용하는 방법을 소개하고자 합니다. // 컴파일에 필요한 헤더파일을 만들기 위하여 gcc로 컴파일된 두개의 파일을 따로 복사해 놓습니다. [root@hw27:apache_1.3.41]# mkdir temp [root@hw27:apache_1.3.41]# chmod 777 temp [root@hw27:apache_1.3.41]# cp -a src/main/gen_test_char tmep/ [root@hw27:apache_1.3.41]# cp -a src/main/gen_uri_delims tmep/ [root@hw27:apache_1.3.41]# file temp/gen_test_char temp/gen_test_char: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.0, dynamically linked (uses shared libs), not stripped [root@hw27:apache_1.3.41]# file temp/gen_uri_delims temp/gen_uri_delims: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.0, dynamically linked (uses shared libs), not stripped [root@hw27:apache_1.3.41]# gcc로 컴파일 된것을 모두 제거하고, 다시 configure 를 실행합니다. [root@hw27:apache_1.3.41]# make distclean
configure는 테스트를 위한것과 램디스크에 포함하기 위한 두가지 방법으로 설명하겠습니다. 기본적으로 먼저 테스트하기 위한 configure를 실행하여 정상적으로 아파치 웹 서버가 올라가면 이를 다시 램디스크에 포함하기 위한 configure를 실행하시면 됩니다.
- 테스트하기 위한 configure 입니다.
[ARM 일 경우]
[root@hw27:apache_1.3.41]# LD=arm-linux-ld CC=arm-linux-gcc CPP=arm-linux-cpp STRIP=arm-linux-strip OBJCOPY=arm-linux-objcopy RANLIB=arm-linux-ranlib ./configure --prefix=/app/apache
[MIPS 일 경우]
[root@hw27:apache_1.3.41]# LD=mipsel-linux-ld CC=mipsel-linux-gcc CPP=mipsel-linux-cpp STRIP=mipsel-linux-strip OBJCOPY=mipsel-linux-objcopy RANLIB=mipsel-linux-ranlib ./configure --prefix=/app/apache
- 램디스크에 포함하기 위한 configure 이다.
[ARM 일 경우]
[root@hw27:apache_1.3.41]# LD=arm-linux-ld CC=arm-linux-gcc CPP=arm-linux-cpp STRIP=arm-linux-strip OBJCOPY=arm-linux-objcopy RANLIB=arm-linux-ranlib ./configure --prefix=/usr/local/apache
[MIPS 일 경우]
[root@hw27:apache_1.3.41]# LD=mipsel-linux-ld CC=mipsel-linux-gcc CPP=mipsel-linux-cpp STRIP=mipsel-linux-strip OBJCOPY=mipsel-linux-objcopy RANLIB=mipsel-linux-ranlib ./configure --prefix=/usr/local/apache
configure를 실행하였다면 컴파일을 합니다.
[root@hw27:apache_1.3.41]# make ===> src make[1]: Entering directory `/staff/tsheaven/ramdisk/gcc-3.4.3/src/apache_1.3.41' make[2]: Entering directory `/staff/tsheaven/ramdisk/gcc-3.4.3/src/apache_1.3.41/src' ===> src/regex arm-linux-gcc -I. -I../os/unix -I../include -DLINUX=22 -DHAVE_SET_DUMPABLE -DUSE_HSREGEX -DUSE_EXPAT -I../lib/expat-lite -DNO_DL_NEEDED `../apaci` -DPOSIX_MISTAKE -c -o regcomp.o regcomp.c arm-linux-gcc -I. -I../os/unix -I../include -DLINUX=22 -DHAVE_SET_DUMPABLE -DUSE_HSREGEX -DUSE_EXPAT -I../lib/expat-lite -DNO_DL_NEEDED `../apaci` -DPOSIX_MISTAKE -c -o regexec.o regexec.c arm-linux-gcc -I. -I../os/unix -I../include -DLINUX=22 -DHAVE_SET_DUMPABLE -DUSE_HSREGEX -DUSE_EXPAT -I../lib/expat-lite -DNO_DL_NEEDED `../apaci` -DPOSIX_MISTAKE -c -o regerror.o regerror.c arm-linux-gcc -I. -I../os/unix -I../include -DLINUX=22 -DHAVE_SET_DUMPABLE -DUSE_HSREGEX -DUSE_EXPAT -I../lib/expat-lite -DNO_DL_NEEDED `../apaci` -DPOSIX_MISTAKE -c -o regfree.o regfree.c rm -f libregex.a ar cr libregex.a regcomp.o regexec.o regerror.o regfree.o arm-linux-ranlib libregex.a <=== src/regex ===> src/os/unix arm-linux-gcc -c -I../../os/unix -I../../include -DLINUX=22 -DHAVE_SET_DUMPABLE -DUSE_HSREGEX -DUSE_EXPAT -I../../lib/expat-lite -DNO_DL_NEEDED `../../apaci` os.c arm-linux-gcc -c -I../../os/unix -I../../include -DLINUX=22 -DHAVE_SET_DUMPABLE -DUSE_HSREGEX -DUSE_EXPAT -I../../lib/expat-lite -DNO_DL_NEEDED `../../apaci` os-inline.c rm -f libos.a ar cr libos.a os.o os-inline.o arm-linux-ranlib libos.a <=== src/os/unix ===> src/ap arm-linux-gcc -c -I../os/unix -I../include -DLINUX=22 -DHAVE_SET_DUMPABLE -DUSE_HSREGEX -DUSE_EXPAT -I../lib/expat-lite -DNO_DL_NEEDED `../apaci` ap_cpystrn.c arm-linux-gcc -c -I../os/unix -I../include -DLINUX=22 -DHAVE_SET_DUMPABLE -DUSE_HSREGEX -DUSE_EXPAT -I../lib/expat-lite -DNO_DL_NEEDED `../apaci` ap_execve.c arm-linux-gcc -c -I../os/unix -I../include -DLINUX=22 -DHAVE_SET_DUMPABLE -DUSE_HSREGEX -DUSE_EXPAT -I../lib/expat-lite -DNO_DL_NEEDED `../apaci` ap_fnmatch.c arm-linux-gcc -c -I../os/unix -I../include -DLINUX=22 -DHAVE_SET_DUMPABLE -DUSE_HSREGEX -DUSE_EXPAT -I../lib/expat-lite -DNO_DL_NEEDED `../apaci` ap_getpass.c arm-linux-gcc -c -I../os/unix -I../include -DLINUX=22 -DHAVE_SET_DUMPABLE -DUSE_HSREGEX -DUSE_EXPAT -I../lib/expat-lite -DNO_DL_NEEDED `../apaci` ap_md5c.c arm-linux-gcc -c -I../os/unix -I../include -DLINUX=22 -DHAVE_SET_DUMPABLE -DUSE_HSREGEX -DUSE_EXPAT -I../lib/expat-lite -DNO_DL_NEEDED `../apaci` ap_signal.c arm-linux-gcc -c -I../os/unix -I../include -DLINUX=22 -DHAVE_SET_DUMPABLE -DUSE_HSREGEX -DUSE_EXPAT -I../lib/expat-lite -DNO_DL_NEEDED `../apaci` ap_slack.c arm-linux-gcc -c -I../os/unix -I../include -DLINUX=22 -DHAVE_SET_DUMPABLE -DUSE_HSREGEX -DUSE_EXPAT -I../lib/expat-lite -DNO_DL_NEEDED `../apaci` ap_snprintf.c arm-linux-gcc -c -I../os/unix -I../include -DLINUX=22 -DHAVE_SET_DUMPABLE -DUSE_HSREGEX -DUSE_EXPAT -I../lib/expat-lite -DNO_DL_NEEDED `../apaci` ap_sha1.c arm-linux-gcc -c -I../os/unix -I../include -DLINUX=22 -DHAVE_SET_DUMPABLE -DUSE_HSREGEX -DUSE_EXPAT -I../lib/expat-lite -DNO_DL_NEEDED `../apaci` ap_checkpass.c arm-linux-gcc -c -I../os/unix -I../include -DLINUX=22 -DHAVE_SET_DUMPABLE -DUSE_HSREGEX -DUSE_EXPAT -I../lib/expat-lite -DNO_DL_NEEDED `../apaci` ap_base64.c arm-linux-gcc -c -I../os/unix -I../include -DLINUX=22 -DHAVE_SET_DUMPABLE -DUSE_HSREGEX -DUSE_EXPAT -I../lib/expat-lite -DNO_DL_NEEDED `../apaci` ap_ebcdic.c arm-linux-gcc -c -I../os/unix -I../include -DLINUX=22 -DHAVE_SET_DUMPABLE -DUSE_HSREGEX -DUSE_EXPAT -I../lib/expat-lite -DNO_DL_NEEDED `../apaci` ap_strtol.c rm -f libap.a ar cr libap.a ap_cpystrn.o ap_execve.o ap_fnmatch.o ap_getpass.o ap_md5c.o ap_signal.o ap_slack.o ap_snprintf.o ap_sha1.o ap_checkpass.o ap_base64.o ap_ebcdic.o ap_strtol.o arm-linux-ranlib libap.a <=== src/ap ===> src/main arm-linux-gcc -c -I../os/unix -I../include -DLINUX=22 -DHAVE_SET_DUMPABLE -DUSE_HSREGEX -DUSE_EXPAT -I../lib/expat-lite -DNO_DL_NEEDED `../apaci` gen_test_char.c arm-linux-gcc -DLINUX=22 -DHAVE_SET_DUMPABLE -DUSE_HSREGEX -DUSE_EXPAT -I../lib/expat-lite -DNO_DL_NEEDED `../apaci` -o gen_test_char gen_test_char.o -lm -lcrypt ./gen_test_char >test_char.h /bin/sh: ./gen_test_char: cannot execute binary file make[3]: *** [test_char.h] Error 126 make[2]: *** [subdirs] Error 1 make[2]: Leaving directory `/staff/tsheaven/ramdisk/gcc-3.4.3/src/apache_1.3.41/src' make[1]: *** [build-std] Error 2 make[1]: Leaving directory `/staff/tsheaven/ramdisk/gcc-3.4.3/src/apache_1.3.41' make: *** [build] Error 2
위와 같이 에러가 발생하면 다음과 같이 합니다.
[root@hw27:apache_1.3.41]# vi src/main/Makefil 69 distclean: clean 70 -rm -f Makefile 71 72 uri_delims.h: gen_uri_delims 73 ./gen_uri_delims >uri_delims.h 74 75 gen_uri_delims: gen_uri_delims.o 76 $(CC) $(CFLAGS) $(LDFLAGS) -o gen_uri_delims gen_uri_delims.o $(LIBS) 77 78 test_char.h: gen_test_char 79 ./gen_test_char >test_char.h 80 81 gen_test_char: gen_test_char.o 82 $(CC) $(CFLAGS) $(LDFLAGS) -o gen_test_char gen_test_char.o $(LIBS) 83
73, 79라인을 다음과 같이 주석 처리 한다.
69 distclean: clean 70 -rm -f Makefile 71 72 uri_delims.h: gen_uri_delims 73 # ./gen_uri_delims >uri_delims.h <------- 주석 처리 74 75 gen_uri_delims: gen_uri_delims.o 76 $(CC) $(CFLAGS) $(LDFLAGS) -o gen_uri_delims gen_uri_delims.o $(LIBS) 77 78 test_char.h: gen_test_char <------- 주석 처리 79 # ./gen_test_char >test_char.h 80 81 gen_test_char: gen_test_char.o 82 $(CC) $(CFLAGS) $(LDFLAGS) -o gen_test_char gen_test_char.o $(LIBS) 83
위와 같이 주석처리 하였다면 gcc로 컴파일하여 임시 폴더에 복사해둔 두개의 파일은 src/main 폴더에 복사합니다.
[root@hw27:apache_1.3.41]# cp -a temp/gen_test_char src/main/ [root@hw27:apache_1.3.41]# cp -a temp/gen_uri_delims src/main/
복사를 하였다면 다음과 같이 실행을 합니다.
[root@hw27:apache_1.3.41]# cd src/main[root@hw27:main]# ./gen_test_char > test_char.h [root@hw27:main]# ./gen_uri_delims > uri_delims.h
[root@hw27:main]# vi test_char.h <------- 정상적으로 생성되었는지 확인합니다. ( 내용이 없으면 잘못 생성된 것입니다.)
[root@hw27:main]# vi uri_delims.h <------- 정상적으로 생성되었는지 확인합니다. ( 내용이 없으면 잘못 생성된 것입니다.)
[root@hw27:main]# cd ../../ 모두 정상적으로 되었다면 컴파일을 합니다. [root@hw27:apache_1.3.41]# make 정상적으로 컴파일이 되었다면 install을 합니다. [root@hw27:apache_1.3.41]# make install 1. 테스트용일 경우 [root@hw27:apache_1.3.41]# ls /app/apache bin cgi-bin conf htdocs icons include libexec logs man proxy 이 폴더를 /nfs로 복사합니다. [root@hw27:apache_1.3.41]# cp -a /app /nfs/
************* 이 부분 부터는 타겟보드에서 작업하는 내용입니다. ******************
타겟보드에서 nfs로 마운트합니다. [root@falinux root]$ mount -t nfs -o nolock 192.168.xx.xx/nfs /mnt/nfs [root@falinux root]$ cp -a /mnt/nfs/app/apache /app 환경 설정 conf 디렉토리에 있는 httpd.conf 에서 다음 항목들을 찾아 아래와 같이 변경합니다. [root@falinux root]$ cd /app/apache/conf [root@falinux conf]$ vi httpd.conf 233 # Port: The port to which the standalone server listens. For 234 # ports < 1023, you will need httpd to be run as root initially. 235 # 236 Port 80 237 238 # 239 # If you wish httpd to run as a different user or group, you must run 240 # httpd as root initially and it will switch. 241 # 242 # User/Group: The name (or #number) of the user/group to run httpd as. 243 # . On SCO (ODT 3) use "User nouser" and "Group nogroup". 244 # . On HPUX you may not be able to use shared memory as nobody, and the 245 # suggested workaround is to create a user www and use that user. 246 # NOTE that some kernels refuse to setgid(Group) or semctl(IPC_SET) 247 # when the value of (unsigned)Group is above 60000; 248 # don't use Group "#-1" on these systems! 249 # 250 User nobody 251 Group nobody 252 253 # 254 # ServerAdmin: Your address, where problems with the server should be 255 # e-mailed. This address appears on some server-generated pages, such 256 # as error documents. 257 # 258 ServerAdmin root@falinux 259 260 # 261 # ServerName allows you to set a host name which is sent back to clients for 262 # your server if it's different than the one the program would get (i.e., use 263 # "www" instead of the host's real name). 264 # 265 # Note: You cannot just invent host names and hope they work. The name you 266 # define here must be a valid DNS name for your host. If you don't understand 267 # this, ask your network administrator. 268 # If your host doesn't have a registered DNS name, enter its IP address here. 269 # You will have to access it by its address (e.g., http://123.45.67.89/) 270 # anyway, and this will make redirections work in a sensible way. 271 # 272 # 127.0.0.1 is the TCP/IP local loop-back address, often named localhost. Your 273 # machine always knows itself by this address. If you use Apache strictly for 274 # local testing and development, you may use 127.0.0.1 as the server name. 275 # 276 ServerName 192.168.10.133 452 # ErrorLog: The location of the error log file. 453 # If you do not specify an ErrorLog directive within a454 # container, error messages relating to that virtual host will be 455 # logged here. If you *do* define an error logfile for a 456 # container, that host's errors will be logged there and not here. 457 # 458 #ErrorLog /usr/local/apache/logs/error_log 459 ErrorLog /dev/null 478 # The location and format of the access logfile (Common Logfile Format). 479 # If you do not define any access logfiles within a 480 # container, they will be logged here. Contrariwise, if you *do* 481 # define per- access logfiles, transactions will be 482 # logged therein and *not* in this file. 483 # 484 #CustomLog /usr/local/apache/logs/access_log common 485 CustomLog /dev/null common 236, 250, 251, 276, 459, 485 라인을 확인 합니다. Port 80 User nobody Group nobody ServerName 192.168.10.133 <--- 타겟보드의 Local IP Address ErrorLog /dev/null <--- 로그 기록으로 인한 타겟보드의 용량 부족이 발생하므로 반드시 이렇게 처리 해 주어야 합니다. CustomLog /dev/null common <--- 로그 기록으로 인한 타겟보드의 용량 부족이 발생하므로 반드시 이렇게 처리 해 주어야 합니다. 실행 bin 디렉토리의 ./apachectl start 라고 하면 아파치가 시작됩니다. 아파치 데몬을 구동 중지 시키려면 ./apachectl stop 하면 됩니다. [root@falinux conf]$ cd /app/apache/bin [root@falinux bin]$ ./apachectl start [root@falinux bin]$ ./apachectl start ./apachectl start: httpd started [root@falinux bin]$ ps PID Uid VmSize Stat Command 1 root 500 S init [3] 2 root SWN [ksoftirqd/0] 3 root SW< [events/0] 4 root SW< [khelper] 5 root SW< [kthread] 55 root SW< [kblockd/0] 58 root SW< [khubd] 60 root SW< [kseriod] 73 root SW [pdflush] 74 root SW [pdflush] 75 root SW< [kswapd0] 76 root SW< [aio/0] 697 root SW [mtdblockd] 722 root SW< [kpsmoused] 737 root SW< [kmmcd] 911 root 432 S syslogd -m 0 916 root 624 S inetd 918 root 1260 S -bash 919 root 476 S /sbin/getty -L tty1 115200 vt100 1048 root SW< [rpciod/0] 1095 root 908 S /app/apache/bin/httpd 1096 nobody 572 S /app/apache/bin/httpd 1097 nobody 572 S /app/apache/bin/httpd 1098 nobody 572 S /app/apache/bin/httpd 1099 nobody 572 S /app/apache/bin/httpd 1100 nobody 572 S /app/apache/bin/httpd 1101 root 640 R ps [root@falinux bin]$
윈도우 익스플로우에서 다음과 같이 접속합니다.
http://192.168.10.133
테스트
타겟보드의 /app/apache/htdocs 폴더에서 다음과 같이 만듭니다. $) cd /app/apache/htdocs $) vi index.htmlTEST APACHE
$) 익스플러에서 http://192.168.10.133로 접속하였을 경우 TEST APACHE가 뜨면 정상입니다. 2. 램디스크용일 경우 [root@hw27:apache_1.3.41]# ls /usr/local/apache bin cgi-bin conf htdocs icons include libexec logs man proxy 용량 줄이기 Strip 하기 [root@hw27:apache_1.3.41]# cd /usr/local/apache [root@hw27:bin]# ls -al total 1008 drwxr-xr-x 2 root root 4096 2008-05-14 20:26 . drwxr-xr-x 12 root root 4096 2008-05-14 20:05 .. -rwxr-xr-x 1 root root 62793 2008-05-14 20:26 ab -rwxr-xr-x 1 root root 5036 2008-05-14 20:26 apachectl -rwxr-xr-x 1 root root 24532 2008-05-14 20:26 apxs -rwxr-xr-x 1 root root 10527 2008-05-14 20:26 checkgid -rwxr-xr-x 1 root root 8875 2008-05-14 20:26 dbmmanage -rwxr-xr-x 1 root root 26219 2008-05-14 20:26 htdigest -rwxr-xr-x 1 root root 61071 2008-05-14 20:26 htpasswd -rwxr-xr-x 1 root root 763456 2008-05-14 20:26 httpd -rwxr-xr-x 1 root root 15596 2008-05-14 20:26 logresolve -rwxr-xr-x 1 root root 15046 2008-05-14 20:26 rotatelogs [root@hw27:bin]# arm-linux-strip ab [root@hw27:bin]# arm-linux-strip checkgid [root@hw27:bin]# arm-linux-strip htdigest [root@hw27:bin]# arm-linux-strip htpasswd [root@hw27:bin]# arm-linux-strip httpd [root@hw27:bin]# arm-linux-strip logresolve [root@hw27:bin]# arm-linux-strip rotatelogs [root@hw27:bin]# ls -al total 852 drwxr-xr-x 2 root root 4096 2008-05-15 10:57 . drwxr-xr-x 12 root root 4096 2008-05-14 20:05 .. -rwxr-xr-x 1 root root 47612 2008-05-15 10:56 ab -rwxr-xr-x 1 root root 5036 2008-05-14 20:26 apachectl -rwxr-xr-x 1 root root 24532 2008-05-14 20:26 apxs -rwxr-xr-x 1 root root 3708 2008-05-15 10:56 checkgid -rwxr-xr-x 1 root root 8875 2008-05-14 20:26 dbmmanage -rwxr-xr-x 1 root root 16892 2008-05-15 10:56 htdigest -rwxr-xr-x 1 root root 47084 2008-05-15 10:56 htpasswd -rwxr-xr-x 1 root root 671820 2008-05-15 10:56 httpd -rwxr-xr-x 1 root root 7856 2008-05-15 10:56 logresolve -rwxr-xr-x 1 root root 6796 2008-05-15 10:57 rotatelogs [root@hw27:bin]# 디렉토리 및 파일 삭제 [root@hw27:apache]# rm -rf man [root@hw27:apache]# rm -rf icon/* [root@hw27:apache]# rm -rf htdocs/* 환경 설정 conf 디렉토리에 있는 httpd.conf 에서 다음 항목들을 찾아 아래와 같이 변경합니다. [root@hw27:bin]# cd ../conf [root@hw27:conf]# vi httpd.conf Port 80 User nobody Group nobody ServerName 192.168.10.133 <--- 타겟보드의 Local IP Address
램디스크를 만들때 램디스크 이미지의 usr/local에 apache를 모두 복사하시면 됩니다.
끝으로 아파치 웹 서버를 포팅할 수 있게 도움을 주신 이은희님께 감사의 말씀을 드립니다.