Nginx/Rails/PHPにFastCGIでPerl/Pythonを共存させる [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(#!)のパスは次のコマンドで確認できます。
which perl
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」になっているのでご注意ください。
関連記事
前の記事: | Nginx + Unicornで複数のRailsプロジェクトを実行する [CentOS] |
次の記事: | Windows10でRuby on Railsの開発環境を構築 [WSL/Ubuntu環境] |