さくらVPSでCGIを動かすのにハマったところ
はじめに
サーバー上で少し重めのプログラムを動かす場合、レンタルサーバーではメモリが十分ではない場合が多いです。そのため、VPSを使うというのが第一選択肢になると思います。しかしながら、VPSは自由に設定できる反面、非常に多くの設定を自分でしなければなりません。ここでは完全に個人的なメモですが、ハマったところをメモしておきます。
CGIその前に
さくらVPSではSite Guardという高性能なファイアウォール的なアプリを無料で提供しています(個人で契約しようと思うと数十万)。これを使わない手はないので、スタートアップスクリプトでこれをインストールすることを選択しました(対応のOSが限られるので注意)。
最初の管理画面にたどり着くのに少し苦労しました。まず、自分が契約したサーバーのURL(IPではなく、sakura.ne.jpのほう)に:9943/を追加してアクセスします。
........sakura.ne.jp:9443/
で、ここでログイン画面が出てきますが、マニュアル記載のIDとパスワードを入れます。これがライセンス認証に必要なサポートIDとは異なりますので(こちらはヘルプに記載あり)、注意が必要。
間違いすぎてロックがかかった場合、これもマニュアル記載の方法でリセットできます。
全部マニュアルに書いてあるのですが笑、急ぐとハマります。
apacheの設定ファイルをいじる
スタートアップスクリプトでapacheがインストールされます。CGIを有効化するには:
sudo vi /etc/apache2/conf-available/cgi-enabled.confとして以下を追記。
<Directory "/var/www/html">
Options +ExecCGI
AddHandler cgi-script .cgi .py
</Directory>
もう一つ:
sudo vi /etc/apache2/apache2.conf
var/wwwのところに:
Options Indexes FollowSymLinks
↓
Options Indexes ExecCGI FollowSymLinks
として、sudo systemctl restart apache2で再起動します。
CGIの有効化
sudo a2enmod cgidでサービスを立ち上げます。
ここまではウェブ検索で出てくる情報です。諸先輩方に感謝。
Pythonの設定
ここでハマりました。まずCGIファイルに書くPythonのパスをwhich python3で調べます。
#!/usr/bin/python3
こうなるのですが、この!が抜けてて、何時間かハマりました…。
あと、.profileにPATH="$PATH:$HOME/.local/bin"を追記してパスを通します。これは何かを実行したときにエラーが出たためこうしましたが、なんのときかは忘れました…。
pip3でちょっと重めの機械学習系のライブラリを入れたのですが:
- sudo pip3とすること(pipではない、sudoにしないといいところに入らない)
- 重たいパッケージをインストール場合はsudo pip3 --no-cache-dir install torchのようにすること
- それでもだめ場合はスワップを設定すること
このあたりだ大事でした。特にsudo pip3にしないと、コマンドラインからは実行できるものの、CGIからはインポートエラーになりました。これはCGIの実行ユーザーがapacheのwww-dataになっていて、sudoなしでインストールしてしまうと、そのログインしていたユーザーのディレクトリにライブラリが入ってしまい、www-dataユーザーからはアクセスできない、ということのようです(しらんけど)。
ちなみに、tail -f /var/log/apache2/error.logとするとCGI実行時のエラーが読めるので、参考になります。
パーミッションの設定
いろいろやってもCGIで実行するとエラーが出て、ログを見るとpermission deniedみたいなことが書かれています。どうやら使用しているライブラリが勝手にlogファイルやキャッシュファイルを生成しているようで、これがwwwフォルダのパーミッション(www-dataでは書けない)と衝突しているようでした。
で、エラーがでるファイルやフォルダについて強引に作ったり、パーミッションを変更したりすれば大丈夫になりました。例えば以下のような感じです。
var/www内にて:sudo mkdir .cache #.cacheで書き込めないと言われたので先に作ってしまう
sudo chown www-data .cache #オーナーをwww-dataにする
sudo chmod 755 .cache #パーミッションを変更する
まとめ
sudoの重要さ、パーミッションの重要さ、メモリの重要さなどが身にしみました。丸一日かかりましたが、なんとか目的のファイルをブラウザから呼び出せるようになりました。このあと、ドメインの移転とHTTPS化が待っていますが、ひとまず。
書き殴りですが、いつもすぐに忘れてまた検索する羽目になるので、自分(ともしかしたらだれか)のためのメモでした。