ConoHaWINGでCGI環境構築
レンタルサーバー(ConoHa WING )でCGI環境を作る際は幾つかポイントが有りますので確認しておきましょう。
.htaccessの追加変更
.htaccessの追加変更
Options +ExecCGI
AddHandler cgi-script .cgi .py .rb .jss .pl
(.phpを入れるとServerErrorになります。)
勿論、「.js」を指定してもOKです。
プログラムファイルの設定
基本中の基本なのですが、結構やりがちなミスです。
特に改行コードがWindowsでは「CRLF」でLinuxでは「LF」Macでは「CR」になります。
「suexec policy violation~~End of script output before headers」エラーが出たらファイル設定を確認
ファイル文字コード:「utf-8(BOMなし)」
ファイルの改行コード:「LF」Linuxサーバーの場合
ファイルの属性:「755」実行権を付与
ファイルを右クリック
属性変更をクリック
属性を「755」に設定して適用
perlCGIプログラミング
#!/usr/bin/perl print "Content-Type: text/html; charset=utf-8\n\n"; print "<html>"; print "<body>"; print "<h1>パール ワールド!</h1>"; print "</body>"; print "</html>";
rubyCGIプログラミング
#!/opt/alt/ruby25/bin/ruby
print <<END
Content-Type: text/html; charset=utf-8
<html>
<head>
<title>CGI Test</title>
</head>
<body>
<h1>ルビー ワールド!</h1>
</body>
</html>
END
pythonCGIプログラミング
pythonは、一手間かけないとエラーが出ます。「UnicodeEncodeError: ‘ascii’ codec can’t encode 」エラーがでたら、下記を追加しましょう。
import io
sys.stdin = io.TextIOWrapper(sys.stdin.buffer, encoding=’utf-8′)
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding=’utf-8′)
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding=’utf-8′)
#!/opt/alt/python37/bin/python3 import sys import io sys.stdin = io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8') sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8') print("Content-type: text/html; charset=utf-8\n") print("<html>") print("<body>") print("<h1>パイソン ワールド!</h1>") print("</body>") print("</html>")
レンタルサーバーにnode.jsを入れてみる
レンタルサーバー(ConoHa WING )にnode.jsをインストールして「ナンセンス」と言われるCGIで使って見ましょう。
ConoHaWINGでSSHキーの作成
ネームタグは、分かりやすい物に変更して結構です。
SSHキーがダウンロードされます。お好きなフォルダに移動して下さい。
ConoHaWINGにPowerShellでアクセス
PowerShellを「Winロゴマーク+Xキー」⇨「Iキー(アイキー)」で起動して
SSHコマンドでアクセスします。
「ホスト名」:host111.conoha.ne.jp
「ポート番号」:8022
「ユーザー名」:a11223344
「Keyファイル」:C:\ssh\key.pem
の場合
ssh a11223344@host111.conoha.ne.jp -p 8022 -i C:\ssh\key.pem
でアクセスします。
SSHでnodeバージョン管理nvmとnodeをインストール
curl -o- https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash
Close and reopen your terminal to startと出ます。
「NVM_DIR」を「export」でセットして
「bash」で再起動
「nvm」を起動
export NVM_DIR="$HOME/.nvm" bash nvm
nvmが起動しマニュアルが表示します。
インストール出来るnodeのバージョン確認
nvm ls-remote
node最新バージョンインストール
nvm install node nvm use node
node安定版インストール
nvm install --lts --latest-npm
nvm use node --lts
node,npmバージョン確認
node -v npm -v
npmバージョンアップ
nvm install-latest-npm
インストール済のバージョンを表示
nvm ls
エイリアス設定を確認
nvm alias
CGIでnodeを使うための設定
nodeのインストール先を「which node」で確認
which node ~/.nvm/versions/node/v16.1.0/bin/node
ユーザーフォルダ(上の~部分)の確認
pwd /home/a11223344
a11223344は各ユーザー名になります。
よってnodeのフルパスは
/home/a11223344/.nvm/versions/node/v16.1.0/bin/node
CGIの1行目(シバンshebang)は次のようになります。
シバンは、ファイルの1行目に無ければいけません。
#が1文字目と言う事です。
#!/home/a11223344/.nvm/versions/node/v16.1.0/bin/node
しかし、このままだと
「suexec policy violation~~End of script output before headers」エラーがでます。
「.nvm」の部分がドットから始ま(隠しファイル)っているためです。
そこで、nodeのシンボリックリンクを「/home/ユーザー名/bin/」にリンクします。
ConoHaでは、「/home/ユーザー名/bin/」にはPATHが通っている見たいです。
echo $PATH
しかし「~/bin」は無いと思うので「lsコマンド」で「bin」が無ければ作ってからリンクします。
mkdir ~/bin ln -s ~/.nvm/versions/node ~/bin/node
これで、「/home/a11223344/bin/node/v16.1.0/bin/node」でnodeを起動出来ます。(v16.1.0は、nodeのバージョン各自変更して下さい。)
よって、CGIの1行目(シバンshebang)は次のようになります。
#!/home/a11223344/bin/node/v16.1.0/bin/node
nodeでCGIプログラミング
準備が整いました。「Node.js ワールド!」を表示させましょう。
標準出力は「console.log」を使います。
「Content-type」の最後の改行「\n」は、一つなのでPythonと同じですね。「console.log」に改行が含まれていると言う事です。
*node用CGIのファイル拡張子は「.jss」にしています。
#!/home/a11223344/bin/node/v16.1.0/bin/node console.log('Content-type: text/html; charset=utf-8\n'); console.log('<h1>Node.js ワールド!</h1>');
アップロードしてください。
そして実行するのですが・・・
ここで、焦らずファイルの設定をもう一度確認しましょう。
ファイルの改行コード:「LF」LinuxServerの場合
ファイルの属性:「755」実行権限を与える
まとめ
今回はレンタルサーバーのConoHa WING でCGI環境を作りperl,ruby,python,nodeで動かしてみました。
プログラムは、簡単な物ですがpythonやnodeは一手間必要でかつ情報が少ないので、参考になれば幸いです。
「nodeでCGIはナンセンス」らしいのですが、自分用のツールを作る程度なら全然良いと思います。自分の使い慣れた言語で作って下さい。プロセスが別になるので処理が遅くなってしまうと思いますが・・・
今度、同じデータベースをPHP,Python,NodeのCGIでアクセス出来る様にして、体感的にスピードがどれだけ変わるか試してみたいです。
レンタルサーバーでNodeを使うにはportable-nodeを使う方法が有るみたいです。
Nodeはバージョン管理が出来た方が良い方はnvmを使って見てください。
また恐らくConoHaWING以外のレンタルサーバー(エックスサーバー 等)でも使えると思いますので試してみてください。