8.04 server CGI 설정 관련 초보 질문입니다

리눅스사용에 갓 입문한 초보입니다.

간단한 lamp 서버를 만들고자 우분투 8.04 서버선택하여 사용하려 하는데 cgi 관련 스크립트가 실행이 되지않아
5일째 끙끙거리다 이곳에 도움을청합니다.

php 실행에는 문제가 없으나 cgi만 실행하면 Internal Server Error 에러를 뿜어냅니다.

cgi 스크립트에 문제가 있을수 있다고 생각해서

정말 간단하게 index.cgi / index.pl

#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello, World.";

작성하였습니다만 작동이 되지않습니다.

파일의 권한은 755 주었고 실행 디렉토리는 /var/www/cgi-bin 으로 주었습니다.

Apache/2.2.8 버전이 설치 되어있으며

수정한 파일은 /etc/apache2/sites-enabled/000-default 으로

아래와 같이 수정하였습니다.

(http.conf 는 내용이없는 빈 파일이더군요.2.X 대 버전은 http.conf를 사용하지 않나요?)

www/index.cgi 는 소스를 그대로 출력해버리고
www/test/index.cgi 역시 소스를 그대로 출력하며
www/cgi-bin/index.cgi는 Internal Server Error
www/cgi-bin/test/index.cgi 또한 Internal Server Error 를 출력합니다.

아래는 /etc/apache2/sites-enabled/000-default 의 설정 정보입니다.

더 설정할 파일이 있거나 잘못된것이 있으면 지적 부탁드리겠습니다.

NameVirtualHost *
<VirtualHost *>
ServerAdmin webmaster@localhost

    DocumentRoot /var/www/
    &lt;Directory /&gt;
            Options FollowSymLinks
            AllowOverride None
    &lt;/Directory&gt;
    &lt;Directory /var/www/&gt;
            Options Indexes FollowSymLinks MultiViews
            AllowOverride FileInfo
            Order allow,deny
            allow from all
    &lt;/Directory&gt;

    ScriptAlias /cgi-bin/ /var/www/cgi-bin/
    &lt;Directory &quot;/var/www/cgi-bin&quot;&gt;
            AllowOverride None
            Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
            AddHandler cgi-script .cgi .pl .sh
            Order allow,deny
            Allow from all
    ErrorLog /var/log/apache2/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog /var/log/apache2/access.log combined
    ServerSignature On

Alias /doc/ &quot;/usr/share/doc/&quot;
&lt;Directory &quot;/usr/share/doc/&quot;&gt;
    Options Indexes MultiViews FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
    Allow from 127.0.0.0/255.0.0.0 ::1/128
&lt;/Directory&gt;

</VirtualHost>

[quote="genesispark":uyyylfbh](http.conf 는 내용이없는 빈 파일이더군요.2.X 대 버전은 http.conf를 사용하지 않나요?)[/quote:uyyylfbh]우분투 아파치 설정은 httpd.conf 설정 파일를 분리하여 효율적인 운영 위해 내용별로 나누어 관리 합니다.
/etc/apache2 이하 디렉에 파일들 내용을 살펴 보시면 감이 올 것 입니다.

우선 CGI 아파치 모듈 활성화는 하셨는지요?
sudo a2enmod cgi
그러면 자동으로 심볼릭을 걸면서 cgi 모듈을 로딩 합니다.
물론 아파치 재시작 필요

cgi 는 2가지 입니다.
스키립선언과 옵션

AddHandler cgi-script .cgi .pl .sh 이 라인은 머 굳이 pl sh 없이
AddHandler cgi-script .cgi 는 NameVirtualHost * 위로 적으시고

그리고 옵션을 Options ExecCGI IncludesNoExec 로 해보십시요
아파치 디렉 옵션 선언은 상위에 적용이 되면 하위는 따라 되는 구조 입니다.
/ <– /var/www <– /var/www/cgi-bin/
따라서 /var/www/cgi-bin/ 만 되게 하려면 여기에 옵션에서 선언하고
전 디렉에서 CGI가 되려면 <Directory /> 에 옵션에서 선언 되어야 겠지요

전에도 비슷하게 답 한건데 참고 바랍니다.

http://www.ubuntu.or.kr/viewtopic.php?p=11755

답변 감사합니다.

a2enmod cgi 해보니 이미 enable 상태였습니다.

이후 알려주신데로 수정 하였습니다만 아직 500에러가 발생됩니다.

혹시나 해서 다시 설치하고 아래와 같이 수정하였습니다.
(다른작업은 없었습니다)
모든 권한 루트 실행

설치시 lamp 선택후 설치.

apt-get update / upgrade 실행
apt-get install apache2 확인

a2enmod cgi 확인 - 이미 enable

/var/www/이하 cgi-bin 디렉토리 생성
이전과 같은 index.cgi cgi-bin 디렉토리 내 생성

cgi-bin / index.cgi 권한 755 수정

000-default 수정후 apache2 restart

이하 000-default 내용

AddHandler cgi-script .cgi ->위치변경

NameVirtualHost *
<VirtualHost *>
ServerAdmin webmaster@localhost

DocumentRoot /var/www/
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/>
Options FollowSymLinks MultiViews
AllowOverride FileInfo
Order allow,deny
allow from all
</Directory>

#ScriptAlias /cgi-bin/ /var/www/cgi-bin/ ->주석처리 했습니다

<Directory "/var/www/cgi-bin"> ->cgi-bin 이하 전 디렉토리에서 cgi 실행가능시?
AllowOverride None
Options ExecCGI IncludesNoExec ->옵션 수정
Order allow,deny
Allow from all
</Directory>

이하 생략

이해를 잘못한건지… 입문 초보인지라…;; 알려주신 동일질문 링크의 cgi 설정오류 와 같은 현상이 일어나내요.

예시파일이나 가이드 딱 있으면 좋으련만

구글링 하다보면 같은 조건이지만

suExec 파일의 이름을 바꾸는것도 있고 000-default가아닌 default 생성해서 바꾸기도하고

site-available 에 default를 바꾸기도하고…httpd.conf 내용이 분산되서 그런지 시행착오가 많이 필요하내요;;

무식하면 용감하다고…

xamp 라는 것도 있던데… 이거도 한번 해볼까합니다.

벌서 주말이군요. 즐거운 주말되십시요.

전 우분투 기본 설정입니다.

/etc/apache2/sites-enabled/000-default

[code:2oumhd96]
16 ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
17 <Directory "/usr/lib/cgi-bin">
18 AllowOverride None
19 Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
20 Order allow,deny
21 Allow from all
22 </Directory>
23
24 ErrorLog /var/log/apache2/error.log
[/code:2oumhd96]

아무 설정 수정 없이 그냥 /usr/lib/cgi-bin 에 cgi만들면
그냥 CGI잘 됩니다.

혹시 가능하시면

tail -f ErrorLog /var/log/apache2/error.log
이거 실행후 CGI접속해서 뿌려주는
CGI에러 메시지를 보여주시기 바랍니다.

ihavnoth 님 답변 감사합니다

우선 Cgi를 실행하고자 하는 곳은 /var/www/cgi-bin 으로 000-default 파일을 수정하였습니다.

확인 된 에러는 Premature end of script headers :first.cgi 였습니다.

아파치 튜토리얼을 보니

프로그램 오류

CGI 프로그램이 실패하는 경우 대부분 프로그램 자체 문제때문이다. 특히 위의 두가지 실수를 하지 않았고 이 글을 계속 보고 있다면 더더욱 그렇다. 먼저 웹서버에서 실행하기 전에 명령행에서 프로그램을 실행해본다. 예를 들어, 다음과 같이 실행한다.

cd /usr/local/apache2/cgi-bin
./first.pl

(perl 인터프리터를 실행하지 마라. 쉘과 아파치는 스크립트 첫번째 줄에 있는 경로 정보를 사용하여 인터프리터를 찾아야 한다.)

프로그램은 제일 먼저 Content-Type을 포함한 HTTP 헤더들을 출력하고 빈 줄을 출력해야 한다. 다른 것을 출력한다면 웹서버에서 실행할 경우 아파치는 Premature end of script headers를 반환한다. 자세한 내용은 위의 CGI 프로그램 작성하기를 참고하라.

인터프리리터 경로가 잘못됬다고 하는데 테스트용으로 만든 파일은

#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello, World.";

으로 오류날 부분이 없었습니다만…

당황스럽게도

#!/usr/bin/perl -U 으로 수정하였더니 실행이 되었습니다

-U allow unsafe operations 이라는데…

-U 옵션을 주지않고 실행할방법이없는건지…

전 -U 주지 않고도 정상 실행됩니다.

설정 변경한건 없습니다.

기본 설정으로 테스트 해서 잘되면 그뒤부터

설정을 변경하면서 잘못된 부분을 찾는게

묹 해결에 도움이 될것 같습니다.

8.10이긴 하지만 설치한 기본 설정으로 질 작동됩니다.

[quote="genesispark":z4j6grvs]
./first.pl

#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello, World.";

#!/usr/bin/perl -U 으로 수정하였더니 실행이 되었습니다

-U 옵션을 주지않고 실행할방법이없는건지…[/quote:z4j6grvs]

혹시 위에 first.pl 을
터미날 등에서
perl ./first.pl
하더라도 실행이 되지 않나요?
perl -U ./first.pl 해야지만 실행 되는?
그렇다면
perl -w ./first.pl 등으로 문제점을 확인해 볼수 있을꺼 같은데…

(번외로 제생각에는 눈에 않보이는 특수 문자가 들어가 있다는데 한표를 던져 봅니다…, 혹 이거라면
vim 또는 emacs 로 정리하는게 제경우 깔끔했습니다… )