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 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.specPatch3: 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(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.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すべてがうまくいけば、次の出力が得られるはずです:

新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。