はじめに
いままでレンタルサーバなどでよくわからずにさわっていたCGIスクリプトですが、自前で動作させてみました。
CentOS8のクリーンインストール状態からの作業です。
コードは使いまわしのため、コピペできるようにしています。
作業履歴の目的なので、解説は少なめです。すみません。
設定ファイルはパッケージインストールされたものがあれば、できるだけそれを利用しています。
すでに動作している環境では、デフォルトの設定ファイルから変更されている場合もあり、必ずしも今回の手順で動作するとは限りません。
対象機器および環境
検証環境 ( 2020/8/15 )
- CentOS8 ( 8.2.2004 )
- PHP / PHP-FPM ( 7.2.24 )
- Python ( 3.8.0 )
- Perl ( 5.26.3 )
- Ruby ( 2.5.5 )
作業内容
事前作業
timedatectl set-timezone Asia/Tokyo
dnf install -y epel-release
dnf update -y
sed -i -e 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
shutdown -r now
パッケージインストール
各スクリプトと、CGIとして動作させるためのパッケージをインストールします。
dnf install -y nginx php php-fpm python38 ruby fcgi spawn-fcgi fcgiwrap
python perl ruby のスクリプトが呼び出された場合にはfcgiを呼び出すようにします。
cat <<'EOF' > /etc/nginx/default.d/cgi.conf
location ~ \.(py|pl|rb)$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/var/run/spawn-fcgi.socket;
}
EOF
fcgiのラッパーをサービスとして動作させるためのspawn-fcgiの設定ファイルを準備します。
cat <<'EOF' > /etc/sysconfig/spawn-fcgi
SOCKET=/var/run/spawn-fcgi.socket
OPTIONS="-u nginx -g nginx -s $SOCKET -S -M 0600 -C 32 -F 1 -P /var/run/spawn-fcgi.pid -- /sbin/fcgiwrap"
EOF
spawn-fcgi と php-fpm のサービス登録と起動をします。
systemctl enable nginx php-fpm spawn-fcgi
systemctl start nginx php-fpm spawn-fcgi
ファイアウォールの穴あけをしておきます。
firewall-cmd --add-service=http --zone=public --permanent
firewall-cmd --reload
なお、php-fpmはパッケージインストールされた時のデフォルト設定ファイルそのままでOKです。
コンテンツファイル
各スクリプトへのインデックスを作成しておきます。
cat <<'EOF' > /usr/share/nginx/html/index.html
<html><body>
<h1>Running CGI scripts on NGINX</h1>
<a href=/php.php>php script</a><br>
<br>
<a href=/python.py>python script</a><br>
<br>
<a href=/perl.pl>perl script</a><br>
<br>
<a href=/ruby.rb>ruby script</a><br>
</body></html>
EOF
PHPの場合
スクリプトファイル
cat <<'EOF' > /usr/share/nginx/html/php.php
<?php
print "<html><body>\n";
print "Hello PHP Script!<br>\n";
print "</body></html>\n";
?>
EOF
動作確認
# curl http://localhost/php.php
<html><body>
Hello PHP Script!<br>
</body></html>
Perlの場合
スクリプトファイル
cat <<'EOF' > /usr/share/nginx/html/perl.pl
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "<html><body>\n";
print "Hello Perl Script!<br>\n";
print "</body></html>\n";
exit;
EOF
chmod 755 /usr/share/nginx/html/perl.pl
動作確認
# curl http://localhost/perl.pl
<html><body>
Hello Perl Script!<br>
</body></html>
Pythonの場合
スクリプトファイル
cat <<'EOF' > /usr/share/nginx/html/python.py
#!/usr/bin/python3
print("HTTP/1.0 200 OK")
print("Content-type: text/html\n")
print("<html><body>")
print("Hello Python Script!<br>")
print("</body></html>")
EOF
chmod 755 /usr/share/nginx/html/python.py
動作確認
# curl http://localhost/python.py
<html><body>
Hello Python Script!<br>
</body></html>
Rubyの場合
スクリプトファイル
cat <<'EOF' > /usr/share/nginx/html/ruby.rb
#!/usr/bin/ruby
puts "Content-type: text/html\n\n"
puts "<html><body>"
puts "Hello Ruby Script!<br>"
puts "</body></html>"
EOF
chmod 755 /usr/share/nginx/html/ruby.rb
動作確認
# curl http://localhost/ruby.rb
<html><body>
Hello Ruby Script!<br>
</body></html>
ほかの設定ファイル
php-fpm は パッケージインストールそのままの設定で動作させています。
upstream php-fpm {
server unix:/run/php-fpm/www.sock;
}
index index.php index.html index.htm;
location ~ \.(php|phar)(/.*)?$ {
fastcgi_split_path_info ^(.+\.(?:php|phar))(/.*)$;
fastcgi_intercept_errors on;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php-fpm;
}