ホーム > カテゴリ > Ruby・Ruby on Rails >

Nginx/Rails/PHPにFastCGIでPerl/Pythonを共存させる [CentOS]

CentOSで各種サーバー構築(目次)

NginxにRuby on Rails、PHP、Perl、Pythonを共存させます。

今回はPerl、Pythonの設定となります。Perl/Python自体はCentOSに標準インストールされているものを使用します。FastCGIの動作には「spawn-fcgi」と「fcgiwrap」を用います。

前提条件

NginxでRuby on RailsとPHPを共存させる

1. 各インストール

sudo yum --enablerepo=epel -y install spawn-fcgi fcgi-devel

sudo yum -y groupinstall "Development Tools" 

cd ~/
wget http://github.com/gnosek/fcgiwrap/tarball/master -O fcgiwrap.tar.gz 

tar zxvf fcgiwrap.tar.gz 
cd gnosek-fcgiwrap-* 
autoreconf -i 
./configure 
sudo make 
sudo make install 

2. サービスの設定

CentOS7以降 (systemctl)

systemctl/chkconfigコマンドでサービスを未登録の場合は3行目は「error reading information on service spawn-fcgi: No such file or directory」になります。 ※コマンドを実行しても問題ありません。

// CentOS6以下用のサービスを削除する
sudo rm /etc/sysconfig/spawn-fcgi
sudo chkconfig --del spawn-fcgi

// CentOS7以降用のサービスファイルを作成する
sudo vi /usr/lib/systemd/system/spawn-fcgi.service

[spawn-fcgi.service]

[Unit]
Description=Simple CGI Server
After=network.target

[Service]
User=ユーザー名
ExecStart=/usr/bin/spawn-fcgi -u ユーザー名 -g ユーザー名 -a 127.0.0.1 -n -p 9001 -P /var/run/spawn-fcgi.pid -f /usr/local/sbin/fcgiwrap
Restart=always

[Install]
WantedBy=multi-user.target

spawn-fcgiの引数は公式のソースコード(spawn-fcgi.c)で確認して下さい。

// デーモンリロード
sudo systemctl daemon-reload
 
// 自動起動の設定(On)
sudo systemctl enable spawn-fcgi

// 自動起動の設定(Off)
sudo systemctl disable spawn-fcgi 
 
// サービスの開始
sudo systemctl start spawn-fcgi

// サービスの停止
sudo systemctl stop spawn-fcgi
 
// サービスの状態
sudo systemctl status spawn-fcgi
 
// サービスのリスタート
sudo systemctl restart spawn-fcgi

// サービスの一覧情報
sudo systemctl list-unit-files

CentOS6以下 (chkconfig)

sudo vi /etc/sysconfig/spawn-fcgi

[spawn-fcgi]

# See spawn-fcgi(1) for all possible options.
#
# Example :
#SOCKET=/var/run/php-fcgi.sock
#OPTIONS="-u apache -g apache -s $SOCKET -S -M 0600 -C 32 -F 1 -P /var/run/spawn-fcgi.pid -- /usr/bin/php-cgi"

OPTIONS="-u ユーザー名 -g ユーザー名 -a 127.0.0.1 -p 9001 -P /var/run/spawn-fcgi.pid -- /usr/local/sbin/fcgiwrap"

// 自動起動の設定(On)
sudo chkconfig spawn-fcgi on

// 自動起動の設定(Off)
sudo chkconfig spawn-fcgi off
 
// サービスの開始
sudo service spawn-fcgi start

// サービスの停止
sudo service spawn-fcgi stop
 
// サービスの状態
sudo service spawn-fcgi status
 
// サービスのリスタート
sudo service spawn-fcgi restart

// サービスの一覧情報
sudo chkconfig --list

3. /etc/nginx/conf.d/*.confの編集

*.confファイルに以下を追記します。*は任意の名称。前回の記事を参照した方はmyaap.confです。

# Perl用 ※中身は一緒、拡張子が異なるだけです。
location ~ \.cgi$ {
    # 存在しない場合は404
    try_files $uri /404.html;
          
    fastcgi_pass 127.0.0.1:9001;
    fastcgi_index index.cgi;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

# Python用 ※中身は一緒、拡張子が異なるだけです。
location ~ \.py$ {
    # 存在しない場合は404
    try_files $uri /404.html;
          
    fastcgi_pass 127.0.0.1:9001;
    fastcgi_index index.py;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

// Nginxを再起動
sudo systemctl restart nginx

4. CGIファイルの作成 - Perl版

パーミッションは500 or 700でいける。動かない場合は705 or 755など。

#! /usr/bin/perl
  
print "Content-type:text/html\n\n";
print "\n";
print "CGI TEST\n";

ファイル先頭のshebang(#!)のパスは次のコマンドで確認できます。

5. pyファイルの作成 - Python版

パーミッションは500 or 700でいける。動かない場合は705 or 755など。

[Python2]

#!/usr/bin/python
 
print 'Content-type: text/html; charset=UTF-8\n'
print 'Hello World!'

[Python3]

#!/usr/bin/python3
 
print ('Content-type: text/html; charset=UTF-8\n')
print ('Hello World!')

// Pythonのバージョン確認
python --version
// ファイル先頭のshebang(#!)のパスは次のコマンドで確認できます。
which python

6. 他のプログラミング言語

この流れを見て頂くわかると思いますが、プログラムファイルのshebangを正しく指定すれば他のプログラミング言語でも実行可能です。

例えば、「#!/bin/sh」とするとシェルスクリプトをCGIで動作可能です。

7. エラー

403 Forbidden

ユーザー名(-u)/グループ名(-g)が「nginx」になっていると発生する場合があります。その場合は両方とも「ユーザー名」を設定して下さい。

502 Bad Gateway

改行コードが「LF」以外だと発生する場合があります。特にWindowsの方は標準で「CR+LF」になっているのでご注意ください。






関連記事



公開日:2019年09月17日 最終更新日:2019年12月12日
記事NO:02771