Nginx, CGI · 2 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サポートを持つ小さなWebサーバーであるThttpdにCGIスクリプトのリクエストをプロキシすることです。2つ目の解決策は、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 thttpd
ls -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.spec

Thttpd rpmパッケージは/root/rpmbuild/RPMS/x86_64(i386システムの場合は/root/rpmbuild/RPMS/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 # default = !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.service

Thttpdのドキュメントルートは/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ヘッダーを送信するように指示します。 # これにより、ブラウザは出力を受け取ります # サーバー上の(コマンドライン)ではなく。 print "Content-type: text/html\n\n"; # 基本的なHTMLタグを印刷します。 # それらの内容も。 print "Hello World!! \n"; print "

Hello world

\n"; |

chmod 755 /var/www/cgi-bin/hello_world.cgi

ブラウザを開いてスクリプトをテストします:

http://www.example.com/cgi-bin/hello_world.cgi

すべてがうまくいけば、次の出力が得られるはずです:

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。