FcgiWrapをインストールし、Gentoo LEMPでPerl、Ruby、Bashの動的言語を有効にする


このチュートリアルは、GentooでのLEMPインストールに関する以前のチュートリアルと厳密に関連しており、Fcgiwrap Gatewayを介してPerl、Bash、Rubyなどの動的スクリプト言語を有効にするなどの他のサーバー拡張問題を扱い、を使用して動的コンテンツを提供するようにNginx仮想ホスト構成ファイルを編集します.pl .rb 、および .cgi スクリプト。

  1. LEMP stack installed on Gentoo – https://www.tecmint.com/install-lemp-in-gentoo-linux/

ステップ1:GentooLEMPでFCGIWRAPを有効にする

Fcgiwrap Nginx FastCGI Common Gateway Interface の一部であり、Perl、Bash、Rubyスクリプトなどの他の動的スクリプト言語を処理し、TCPまたはUnixソケットは、独立した方法で、生成された結果をNginxに返します。これにより、応答がエンドクライアントに転送されます。

1.まず、次のコマンドを使用してGentooLinuxに FCcgiwrap プロセスをインストールすることから始めましょう。

# emerge --ask www-misc/fcgiwrap

2.デフォルトでは、Fcgiwrapパッケージは、プロセスを管理するための init スクリプトをGentooに提供しません。パッケージがコンパイルおよびインストールされたら、次の init スクリプトを作成します。これは、 Unixドメインソケットを使用してプロセスを起動するか、ローカルを使用してプロセスを起動するという3つのアプローチを使用してFcgiwrapプロセスを管理するのに役立ちます。 b> TCPソケットまたは両方を同時に使用します。

/etc/init.d/パスに次のファイル内容のinitファイルを作成します。

# nano /etc/init.d/fcgiwrap

次のファイルコンテンツを追加します。

#!/sbin/runscript

ip="0.0.0.0"
port="12345"

start() {
ebegin "Starting fcgiwrap process..."
       /usr/sbin/fcgiwrap -s tcp:$ip:$port &
        tcp_sock=`netstat -tulpn | grep fcgiwrap`
        echo "Socket details: $tcp_sock"
eend $? "Errors were encountered while starting fcgiwrap process"
}

stop() {
ebegin "Stopping fcgiwrap process..."
                pid=`ps a | grep fcgiwrap | grep tcp | cut -d" " -f1`
kill -s 1 $pid
                tcp_sock=`netstat -tulpn | grep fcgiwrap`
                 if test $tcp_sock =  2> /dev/null ; then
                 echo "Fcgiwrap process successfully stoped"
                tcp_sock=`netstat -atulpn | grep $port`
                if test $tcp_sock =  2> /dev/null ; then
                echo "No open fcgiwrap connection found..."
                else
                echo "Wait to close fcgiwrap open connections...please verify with 'status'"
                echo -e "Socket details: \n$tcp_sock"
                 fi
                else
                echo "Fcgiwarp process is still running!"
        echo "Socket details: $tcp_sock"
        fi
eend $? "Errors were encountered while stopping fcgiwrap process..."
}

status() {
ebegin "Status fcgiwrap process..."
      tcp_sock=`netstat -atulpn | grep $port`
    if test $tcp_sock =  2> /dev/null ; then
                       echo "Fcgiwrap process not running"
                     else
                echo "Fcgiwarp process is running!"
                 echo -e "Socket details: \n$tcp_sock"
                fi
eend $? "Errors were encountered while stopping fcgiwrap process..."
}

ご覧のとおり、スクリプトファイルの先頭にはそれぞれ ip port の2つの変数があります。この変数を必要に応じて変更し、システム上の他のサービス、特にポート変数(ここではデフォルトは 12345 )と重複しないようにしてください。それに応じて変更してください。

IP変数で 0.0.0.0 を使用すると、プロセスは任意のIPでバインドしてリッスンできます(ファイアウォールがない場合は外部からアクセスできます)が、セキュリティ上の理由から、ローカルでのみリッスンするように変更する必要があります。 127.0.0.1 で、パフォーマンスや負荷分散のために別のノードにFcgiwrapゲートウェイをリモートでセットアップするなどの他の理由がない限り。

3.ファイルが作成されたら、実行権限を追加し、開始、停止、またはステータススイッチを使用してデーモンプロセスを管理します。ステータススイッチは、リッスンする IP-PORT ペアや、初期化されたアクティブな接続があるかどうかなど、関連するソケット情報を表示します。また、プロセスに TIME_WAIT 状態のアクティブな接続がある場合、すべてのTCP接続が閉じるまでプロセスを再開できません。

# chmod +x /etc/init.d/fcgiwrap
# service start fcgiwrap
# /etc/init.d/fcgiwrap status

前に示したように、Fcgiwrapは両方のソケットを使用して同時に実行できるため、2番目のスクリプトの名前を fcgiwrap-unix-socket に少し変更して、両方を同時に開始して実行できるようにします。

# nano /etc/init.d/fcgiwrap-unix-socket

UNIXソケットには次のファイルコンテンツを使用してください。

#!/sbin/runscript
sock_detail=`ps a | grep fcgiwrap-unix | head -1`

start() {
ebegin "Starting fcgiwrap-unix-socket process..."
        /usr/sbin/fcgiwrap -s unix:/run/fcgiwrap-unix.sock &
        sleep 2
        /bin/chown nginx:nginx /run/fcgiwrap-unix.sock
        sleep 1
        sock=`ls -al /run/fcgiwrap-unix.sock`
        echo "Socket details: $sock"
eend $? "Errors were encountered while starting fcgiwrap process"
}

stop() {
ebegin "Stopping fcgiwrap-unix-socket process..."
                pid=`ps a | grep fcgiwrap | grep unix | cut -d" " -f1`
                rm -f /run/fcgiwrap-unix.sock                 
                kill -s 1 $pid
                echo "Fcgiwrap process successfully stoped"
                #killall /usr/sbin/fcgiwrap
        sleep 1
        echo "Socket details: $sock"
eend $? "Errors were encountered while stopping fcgiwrap process..."
}

status() {
ebegin "Status fcgiwrap-unix-socket process..."
  if test -S /run/fcgiwrap-unix.sock; then
       echo "Process is started with socket: $sock_detail"
        else
        echo "Fcgiwrap process not running!"
        fi
eend $? "Errors were encountered while stopping fcgiwrap process..."
}

4.このファイルが実行可能であり、同じサービススイッチ( start stop 、または status )を使用していることを再度確認します。このソケットのデフォルトパスを /run/fcgiwrap-unix.sock システムパスに設定しました。プロセスを開始し、 status スイッチを使用して確認するか、/run ディレクトリの内容を一覧表示してソケットを見つけるか、 ps -a | grep fcgiwrap コマンド。

# chmod +x /etc/init.d/fcgiwrap-unix-socket
# service start fcgiwrap-unix-socket
# /etc/init.d/fcgiwrap-unix-socket status
# ps -a | grep fcgiwrap

前述のように、FcgiwrapはTCPソケットとUNIXソケットの両方で同時に実行できますが、外部ゲートウェイ接続が必要ない場合は、プロセス間通信を使用するため、 Unixドメインソケットのみに固執します。 TCPループバック接続であり、TCPオーバーヘッドの使用量が少なくなります。

ステップ2:NginxでCGIスクリプトを有効にする

5.NginxがFastCommon Gateway Interfaceを介してPerlまたはBashスクリプトを解析および実行するには、仮想ホストをルートパスまたはロケーションステートメントでFcgiwrap定義を使用して構成する必要があります。

例を以下に示します(localhost)。これは、ルートパス(/var/www/localhost/htdocs/)に .pl および .cgi 拡張子は、デフォルトのルートドキュメントパスにFcgiwrap TCPソケットを使用し、2番目の場所は Unixドメインソケットを使用し、 index.pl ファイルを使用します3番目の場所は、 index.cgi ファイルで TCPソケットを使用しています。

fastcgi_pass 引数ステートメントを変更して、次のコンテンツまたはその一部のみを、UNIXまたはTCPソケットを使用して動的PerlまたはBashスクリプトをアクティブ化する目的の仮想ホスト構成ファイルに配置します。

# nano /etc/nginx/sites-available/localhost.conf

localhost.conf を編集して、以下のテンプレートのようにします。

server {
                                listen 80;
                                server_name localhost;

access_log /var/log/nginx/localhost_access_log main;
error_log /var/log/nginx/localhost_error_log info;

               root /var/www/localhost/htdocs/;
                location / {
                autoindex on;
                index index.html index.htm index.php;
                                }

## PHP –FPM Gateway ###
                            location ~ \.php$ {
                            try_files $uri =404;
                            include /etc/nginx/fastcgi.conf;
                            fastcgi_pass 127.0.0.1:9001;
				}

## Fcgiwrap Gateway on all files under root with TCP Sockets###
location ~ \.(pl|cgi|rb)$ {
                fastcgi_index index.cgi index.pl;
                include /etc/nginx/fastcgi.conf;
fastcgi_pass 127.0.0.1:12345;    
                                }                                                                                                                             

## Fcgiwrap Gateway on all files under root second folder with index.pl using UNIX Sockets###
location /second {
                                index index.pl; 
root /var/www/localhost/htdocs/;
                                location ~ \.(pl|cgi|rb)$ {
                                include /etc/nginx/fastcgi.conf;
                                fastcgi_pass unix:/run/fcgiwrap-unix.sock;      
                                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                                             }                                                                                                            
                                                }

## Fcgiwrap Gateway on all files under root third folder with index.cgi using TCP Sockets###
location /third {
                                index index.cgi;               
                                location ~ \.(pl|cgi|rb)$ {
                                include /etc/nginx/fastcgi.conf;
                                 fastcgi_pass 127.0.0.1:12345;       
                                }                                                                                             
  }

6. Nginx localhost.conf または特定の仮想ホスト構成ファイルの編集が終了したら、Webサイトのデフォルトのドキュメントルートパスに移動し、ロケーションステートメントを反映するようにこれら2つのフォルダーを作成し、次のインデックスファイルを作成します。特定の拡張子を持つすべての場所。

# cd /var/www/localhost/htdocs
# mkdir second third

次の内容の index.pl ファイルを2番目の場所に作成します。

# nano /var/www/localhost/htdocs/second/index.pl

このコンテンツを追加して、環境変数を取得します。

#!/usr/bin/perl
print "Content-type: text/html\n\n";
print <<HTML;
                <html>
                <head><title>Perl Index</title></head>
                <body>
                                <div align=center><h1>A Perl CGI index on second location with env variables</h1></div>
                </body>
HTML
print "Content-type: text/html\n\n"; foreach my $keys (sort keys %ENV) { print "$keys =
$ENV{$keys}<br/>\n";
}
exit;

次に、次の内容の index.cgi ファイルを3番目の場所に作成します。

# nano /var/www/localhost/htdocs/third/index.cgi

このコンテンツを追加して、環境変数を取得します。

#!/bin/bash
echo Content-type: text/html
echo ""
cat << EOF
<HTML>
<HEAD><TITLE>Bash script</TITLE></HEAD>
<BODY><PRE>
<div align=center><h1>A BASH CGI index on third location with env variables</h1></div>
EOF
env
cat << EOF
</BODY>
</HTML>
EOF

7.編集が終了したら、両方のファイルを実行可能にし、Nginxサーバーを再起動して、両方のFcgiwrapソケットが実行されていることを確認します。

# chmod +x /var/www/localhost/htdocs/second/index.pl
# chmod +x /var/www/localhost/htdocs/third/index.cgi
# service nginx restart
# service fcgiwrap start
# service fcgiwrap-unix-socket start

次に、次のURLでローカルブラウザをリダイレクトします。

http://localhost 

http://localhost/second/ 

http://localhost/third/

結果は以下のスクリーンショットのように表示されます。

8.すべてが適切に配置され、正しく構成されている場合は、再起動後に次のコマンドを発行して、両方のFcgiwrapデーモンが自動的に起動するようにします(両方のCGIソケットを使用するようにNginxを構成した場合)。

# rc-update add fcgiwrap default
# rc-update add fcgiwrap-unix-socket default

ステップ3:FcgiwrapでRubyサポートをアクティブ化する

9. Nginx FCGIで動的Rubyスクリプトを実行する必要がある場合は、次のコマンドを使用してGentooに Ruby インタープリターをインストールする必要があります。

# emerge --ask ruby

10.パッケージがコンパイルおよびインストールされたら、Nginx sites-available に移動し、最後の中括弧“の前に次のステートメントを追加して localhost.conf ファイルを編集します。 }” 。これは、Nginxlocalhostによって提供されるデフォルトのドキュメントルートパスの下の4番目の場所でRubyスクリプトを実行するためのサポートをアクティブにします。

# nano /etc/nginx/sites-available/localhost.conf

次のNginxディレクティブを使用します。

## Fcgiwrap Gateway on all files under root fourth folder with index.rb under TCP Sockets###
                location /fourth {
                                index index.rb;
                                location ~ \.rb$ {
                                include /etc/nginx/fastcgi.conf;
                                fastcgi_pass 127.0.0.1:12345;       
                                                }                                                                                                             
                               }             
## Last curly bracket which closes Nginx server definitions ##
}

11.構成をテストするには、/var/www/localhost/htdocs パスの下に4番目のディレクトリを作成し、拡張子が .rb の実行可能Rubyインデックススクリプトを作成して、次を追加します。コンテンツ。

# mkdir /var/www/localhost/htdocs/fourth
# nano /var/www/localhost/htdocs/fourth/index.rb

Rubyindex.rbの例。

#!/usr/bin/ruby
puts "HTTP/1.0 200 OK"
puts "Content-type: text/html\n\n"
puts "<html><HEAD><TITLE>Ruby script</TITLE></HEAD>"
puts "<BODY><PRE>"
puts "<div align=center><h1>A Ruby CGI index on fourth location with env variables</h1></div>"
system('env')

12.ファイルに実行権限を追加したら、Nginxデーモンを再起動して構成を適用します。

# chmod +x /var/www/localhost/htdocs/fourth/index.rb
# service nginx restart

ブラウザを開き、URL http:// localhost/fourth/に移動します。これにより、次のコンテンツが表示されます。

これで、FastCGI Gatewayで動的Perl、Ruby、およびBashスクリプトを提供するようにNginxを構成しましたが、Nginx CGI Gatewayでこの種の解釈されたスクリプトを実行すると危険であり、サーバーに深刻なセキュリティリスクを課す可能性があることに注意してください。システムの下でアクティブシェルを使用して実行しますが、静的HTMLによって課せられる静的バリアを拡張して、Webサイトに動的機能を追加できます。

全著作権所有。 © Linux-Console.net • 2019-2022