서버 설정 · 4 min read · Jan 23, 2026
Fedora 18에서 Nginx로 CGI 스크립트 제공하기
Fedora 18에서 Nginx로 CGI 스크립트 제공하기
버전 1.0
저자: Falko Timme
Twitter에서 나를 팔로우하세요
이 튜토리얼은 Fedora 18에서 nginx로 CGI 스크립트(Perl 스크립트)를 제공하는 방법을 보여줍니다. nginx 자체는 CGI를 제공하지 않지만 이를 우회할 수 있는 여러 가지 방법이 있습니다. 첫 번째 솔루션은 CGI 지원이 있는 작은 웹 서버인 Thttpd로 CGI 스크립트 요청을 프록시하는 것이고, 두 번째 솔루션은 CGI 스크립트를 제공하기 위해 CGI 래퍼를 사용하는 것입니다.
이것이 당신에게 작동할 것이라는 보장은 하지 않습니다!
1 사전 참고
여기서는 www.example.com 웹사이트를 사용하며 문서 루트는 /var/www/www.example.com/web/입니다. vhost 구성은 /etc/nginx/conf.d/www.example.com.vhost에 있습니다.
2 Thttpd 사용하기
이 장에서는 nginx를 구성하여 CGI 스크립스(확장자 .cgi 또는 .pl)에 대한 요청을 Thttpd로 프록시하는 방법을 설명합니다. Thttpd를 포트 8000에서 실행하도록 구성할 것입니다.
먼저 Thttpd를 설치합니다. Fedora 18용 Thttpd 패키지가 있지만, nginx ThttpdCGI 페이지에서는 Thttpd가 패치되어야 한다고 하므로 Fedora 18용 src.rpm 패키지를 다운로드하고 패치한 후 새로운 rpm 패키지를 빌드합니다.
새로운 rpm 패키지를 빌드하는 데 필요한 도구를 설치해야 합니다:
yum groupinstall 'Development Tools'yum-utils를 설치합니다(이 패키지에는 src.rpm을 다운로드할 수 있는 yumdownloader 도구가 포함되어 있습니다):
yum install yum-utils다음으로 Fedora 18용 Thttpd src.rpm 패키지를 다운로드합니다:
cd /usr/src
yumdownloader --source thttpdls -l[root@server1 src]# ls -l
total 164
drwxr-xr-x. 2 root root 4096 Feb 3 2012 debug
drwxr-xr-x. 3 root root 4096 Jun 4 18:21 kernels
-rw-r--r-- 1 root root 155690 Mar 28 03:21 thttpd-2.25b-28.fc18.src.rpm
[root@server1 src]#rpm -ivh thttpd-2.25b-28.fc18.src.rpm다음 경고는 무시할 수 있습니다:
[root@server1 src]# rpm -ivh thttpd-2.25b-28.fc18.src.rpm
1:thttpd warning: user mockbuild does not exist - using root
warning: group mockbuild does not exist - using root
warning: user mockbuild does not exist - using root
warning: group mockbuild does not exist - using root
warning: user mockbuild does not exist - using root
warning: group mockbuild does not exist - using root
warning: user mockbuild does not exist - using root
warning: group mockbuild does not exist - using root
warning: user mockbuild does not exist - using root
warning: group mockbuild does not exist - using root
warning: user mockbuild does not exist - using root
warning: group mockbuild does not exist - using root
warning: user mockbuild does not exist - using root
warning: group mockbuild does not exist - using root
warning: user mockbuild does not exist - using root
warning: group mockbuild does not exist - using root
########################################### [100%]
[root@server1 src]#이제 패치를 /root/rpmbuild/SOURCES/ 디렉토리에 다운로드하고 /root/rpmbuild/SPECS/thttpd.spec 파일을 수정합니다:
cd /root/rpmbuild/SOURCES/
wget -O thttpd-2.25b-ipreal.patch http://www.danielclemente.com/amarok/ip_real.txt
cd /root/rpmbuild/SPECS/
vi thttpd.spec다음 줄을 추가합니다: Patch3: thttpd-2.25b-ipreal.patch 및 %patch3 -p1 -b .ipreal:
| [...] Patch0: thttpd-2.25b-CVE-2005-3124.patch Patch1: thttpd-2.25b-fixes.patch Patch2: thttpd-2.25b-getline.patch Patch3: thttpd-2.25b-ipreal.patch [...] %prep %setup -q %patch0 -p1 -b .CVE-2005-3124 %patch1 -p1 -b .fixes %patch2 -p1 -b .getline %patch3 -p1 -b .ipreal [...] |
이제 다음과 같이 Thttpd rpm 패키지를 빌드합니다:
rpmbuild -ba thttpd.specThttpd rpm 패키지는 /root/rpmbuild/RPMS/x86_64 (/root/rpmbuild/RPMS/i386는 i386 시스템인 경우)에 생성되므로 해당 디렉토리로 이동합니다:
cd /root/rpmbuild/RPMS/x86_64
ls -l[root@server1 x86_64]# ls -l
total 224
-rw-r--r-- 1 root root 69881 Sep 3 23:17 thttpd-2.25b-28.fc18.x86_64.rpm
-rw-r--r-- 1 root root 151685 Sep 3 23:17 thttpd-debuginfo-2.25b-28.fc18.x86_64.rpm
[root@server1 x86_64]#다음과 같이 Thttpd 패키지를 설치합니다:
rpm -ivh thttpd-2.25b-28.fc18.x86_64.rpm그런 다음 원래의 /etc/thttpd.conf 파일을 백업하고 다음과 같이 새 파일을 생성합니다:
mv /etc/thttpd.conf /etc/thttpd.conf_orig
vi /etc/thttpd.conf| # 주의: 빈 줄은 허용되지 않습니다! # 이 섹션은 기본값을 덮어씁니다 # 이 섹션은 적용된 기본값을 문서화합니다 # port=80 # nosymlink # 기본값 = !chroot # novhost # nocgipat # nothrottles # host=0.0.0.0 # charset=iso-8859-1 host=127.0.0.1 port=8000 user=thttpd logfile=/var/log/thttpd.log pidfile=/var/run/thttpd.pid dir=/var/www cgipat=.cgi|.pl |
이렇게 하면 Thttpd가 127.0.0.1의 포트 8000에서 수신 대기하게 되며, 문서 루트는 /var/www입니다.
Thttpd의 시스템 시작 링크를 생성합니다…
systemctl enable thttpd.service… 그리고 시작합니다:
systemctl start thttpd.service다음으로 /etc/nginx/proxy.conf를 생성합니다:
vi /etc/nginx/proxy.conf| proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; |
이제 vhost 구성 파일을 엽니다…
vi /etc/nginx/conf.d/www.example.com.vhost… 그리고 server {} 컨테이너에 location /cgi-bin {} 섹션을 추가합니다:
| server { [...] location /cgi-bin { include proxy.conf; proxy_pass http://127.0.0.1:8000; } [...] } |
nginx를 다시 로드합니다:
systemctl reload nginx.serviceThttpd의 문서 루트가 /var/www이므로 location /cgi-bin은 /var/www/cgi-bin 디렉토리로 변환됩니다(이는 모든 vhost에 해당하며, 각 vhost는 CGI 스크립트를 /var/www/cgi-bin에 배치해야 합니다. 이는 공유 호스팅 환경에서 단점입니다. 해결책은 Thttpd 대신 3장에서 설명한 CGI 래퍼를 사용하는 것입니다).
디렉토리를 생성합니다…
mkdir /var/www/cgi-bin… 그리고 CGI 스크립트를 그 안에 배치하고 실행 가능하게 만듭니다. 테스트 목적으로 작은 Hello World Perl 스크립트를 생성합니다(hello_world.cgi 대신 확장자 .pl을 사용하여 hello_world.pl로도 사용할 수 있습니다):
vi /var/www/cgi-bin/hello_world.cgi| #!/usr/bin/perl -w # Perl에게 HTML 헤더를 전송하도록 지시합니다. # 그래서 브라우저가 출력을 받습니다 # |Hello world
\n";
chmod 755 /var/www/cgi-bin/hello_world.cgi브라우저를 열고 스크립트를 테스트합니다:
http://www.example.com/cgi-bin/hello_world.cgi모든 것이 잘 작동하면 다음 출력을 얻을 수 있습니다:

새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.