강좌

  • 웹서버
  • 아파치
  • 톰켓
HOME > 강좌 >
강좌| 리눅스 및 오픈소스에 관련된 강좌를 보실 수 있습니다.
 
CGI 설정과 문제해결
조회 : 8,393  


CGI설정과 사용하기
제가 CGI을 설정하면서 나름대로 정리한 것입니다. 
원래 제 자신을 위해 노트해 놓은 것이어서 존칭을 사용하지 않았습니다.
CGI설정
CGI를 쓰기 위해서 설정화일에 해줘야 할것.
[access.conf]
<Directory /home/httpd/cgi-bin>
Options ExecCGI <-체크
뭐, html디렉토리에도 CGI를 쓰고 싶으면 위에 처럼 ExecCGI를 추가시켜준다.
[httpd.conf]
디폴트로 쓰면 크게 문제될 것 없음.
[srm.conf]
AddHandler cgi-script .cgi
주석체크해제한다.
참고
아파치 설정파일은 Apache디렉토리의 하위디렉토리 conf에 존재합니다.
1.3.x버전부터는 설정파일을 httpd.conf만 사용하기를 권장하고 있습니다.
따라서 위의 설정사항들은 httpd.conf에서만 설정하셔도 좋습니다. 
간단히 CGI를 만들었습니다.
사용자로부터 이름, 나이, 학번을 입력받아서 보내기를 클릭하면
다음페이지에서 입력된 이름, 나이, 학번을 출력합니다.
만일 설정이 제대로 되어있다면 돌아갈겁니다.
화일은 간단히 2개로 되어있습니다.
아래와 같이 하세요
cp test.html /home/httpd/htdocs
cd /home/httpd/htdocs
chmod 755 test.html
cp test.cgi /home/httpd/cgi-bin
cd /home/httpd/cgi-bin
chmod 755 test.cgi
test.html의 내용
<html>
<body>
CGI 테스트입니다.<BR>
<form action=cgi-bin/test.cgi>
이름: <input type=text name=name><br>
나이: <input type=text name=age><br>
학번: <input type=text name=number><br>
<input type=submit value=보내기>
</form>
</body>
</html>
test.cgi의 내용
perl버전이 높아져서 아래와 같이 복잡하게 할 필요는 없어졌습니다.
cgi기능이 내장되어 있다는 말인데 이는 직접 알아보세요. 간단합니다.
#!/usr/bin/perl
if ($ENV{'REQUEST_METHOD'} eq "GET") {
$FORM_DATA = $ENV{'QUERY_STRING'};
} else {
$LENGTH = $ENV{'CONTENT_LENGTH'};
if ($LENGTH >"32768") {
die "major network spam,stopped";
}
while ($LENGTH--) {
$C=getc(STDIN);
if ($C eq "=" || $C eq "&") {
$START="0";
}else{
$START++;
}
if ($START <= "8192") {
$FORM_DATA .= $C;
}
}
}
# 다시 변수로 쓸수 있게 변환해주고요.. ^^
foreach (split(/&/, $FORM_DATA)) {
($NAME,$VALUE) = split(/=/,$_);
$NAME =~ s/+/ /g;
$NAME =~ s/%([0-9|A-F]{2})/pack(C,hex($1))/eg;
$VALUE =~ s/+/ /g;
$VALUE =~ s/%([0-9|A-F]{2})/pack(C,hex($1))/eg;
$MYDATA{$NAME} = $VALUE;
}
# 길게 쓰기 귀찮아서 $now 에 저장하였습니다.
$name = $MYDATA{'name'};
$age = $MYDATA{'age'};
$number = $MYDATA{'number'};
# 문서 헤드를 출력하고요...
# 아래 문장의 중요성은 아시겠죵..??
print"Content-Type: text/html

";
print"<HTML>
";
print"<meta http-equiv=content-Type content=text/html;charset=euc-kr>";
print "<body>";
print "CGI test successful..<br>";
print "<br>이름: ";
print $name;
print "<br>나이: ";
print $age;
print "<BR>학번: ";
print $number;
print"</body></html>";
브라우저(넷스케이프)를 실행시키고 주소란에 http://localhost/test.html
을 입력하시면 됩니다.
참고로 위의 소스는 perl만 있다면 무조건 되야 됩니다. 
않된다면 그 컴푸타의 설정에 문제가 있는겁니다.
혹시 그렇다면 그쪽 관리자에게 소스를 보여주고 물어보세요..
그게 빠를것 같네요..
그럼..
 
CGI 설정과 문제해결
리눅스를 다시 깔때마다 걱정스러운 것은 환경을 잡는것이 무척 불편하다는 것이다.
마지못해 리눅스를 다시 설치하려하면 걱정부터 앞선다.
이번에도 postgresSQL땜에 다시 설치했는데 아파치의 설정에서 무척 시달렸다. 
분명 전에 설정한 화일을(access.conf, srm.conf, httpd.conf) 그대로 갖다가 썼는데
않되다니 얼마나 얼받던지 캐시땜에 그럴까 싶어 몇번 부팅까지 했지만 않되니까
컴퓨터 부수고 싶더군..
어쩔수 없이 간단한 cgi프로그램을 맹글어서 테스트를 했는데 않되네..
처음에는 cgi만드는 것도 까먹고 (사실 까먹진 않았지.) 알쏭달쏭해서..
처음부분에 Content-type: text/html하고 줄내림 2번하는 것도 체크하고 다 해봤는데
않되는건..
그래 로그화일(/var/log/httpd/error_log)을 봐서 해결될까 싶어 봤지.
않되는 이유가  reason: Premature end of script headers
'스크립트헤더의 섣부른 종료?'
무슨 소리야!!?
다시로그화일을 보니 
Can't open perl script "/home/httpd/html/test.cgi": Permission denied
라는 것이 있네
화일 퍼미션을 잘못준것같아 보니 실행권한만 있네 ..
뭐, 틀린것 없는데.. 그냥 찜찜해서 읽기권한까지 줘봤다.
다시 하니 되는구만.. 젠장.
읽기권한 하나땜에 2시간이 넘게 고생했군...
CGI오류시 체크상황
1. 설정화일의 설정이 올바른가본다.
2. CGI스크립트나 CGI실행파일이 올바른지 쉘프롬프트상에서 검사해본다.
(이경우 500에러가 난다.)
참고로 쉘프롬프트상에서 성공하더라도 웹브라우저에서 실패할 수 있는데
이는 로그화일을 보면 알겠지만 html문법이 틀린경우가 있을 수 있다.
예: text/html헤더를 빼먹는것. 
이럴 경우엔 쉘상의 결과를 갈무리해서 .html파일로 저장한후 브라우저에서
불러본다. 그럼 이유를 알 수 있겠지!
3. 로그화일을 봐서 어디에서 에러가 나는지 본다.
나의 다짐.
이제 왠만하면 아파치를 쓰지 않겠다.
CGI프로그램은 절대 하지 않겠다.

 


[원글링크] : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=770


이 글을 트위터로 보내기 이 글을 페이스북으로 보내기 이 글을 미투데이로 보내기

 
강명규
홈페이지 : http://dbakorea.pe.kr/

e-mail : myunggyu골뺑이orgio.net