九保すこひ@フリーランスエンジニア|累計300万PVのブログ運営中
現在、個人的な開発でpythonのFlaskを使ったウェブサービスを構築しています。
もともとdlibを使うためにpythonにしたんですけど、実はこれ。ウェブに設置するのにめちゃくちゃ手間取ってしまったんです。
そこで、今回は、
mod_wsgi、httpdのインストールで気をつけるべきこと
を実体験の流れでまとめておきたいと思います。
まず、前提として
mode_wsgiとhttpdのインストール自体はとても簡単
です。僕の環境(CentOS 7)だと、yumコマンドを叩けば、mod_wsgiとhttpd(apache2)が楽〜にインストールされます。
でも、後から考えると問題点はここにありました。
はじめ、dlibをpipでインストールしようとするとすごく時間がかかってしまう(←dlibをゼロからビルドする)ので、すぐインストールできるanacondaを使うことにしたんです。
しかし、このanaconda。もちろんコマンドラインから直接「python test.py」と実行したらうまく動くんですけど、mod_wsgiを通してブラウザからアクセスしようとすると、
no module named dlib(dlibモジュールなんかね〜よ!)
とエラーを出すんです。
しかも、flaskの開発モードで「http://*****:5000」でアクセスしたらうまくいくという・・・mod_wsgiだけが問題なのか・・・。
しかたがないので、ウェブ上を探ってみると、誰かが
Python3使いなよ。2はバグあるよ!(キラ〜ン、髪の毛サラ〜)
と言ってるのをみたので、pyenvを使ってpython 3をインストールすることに。
そして、再度ウェブからアクセスしてみたものの、
no module named dlib(だからdlibなんかねぇんだよっ!!)
と何も変わらず。
そこで、テキストファイルにsys.pathを保存してみると、まったく別のPythonを参照してることが判明。
そっか、condaとかpyenvを使っていても、mod_wsgiはインストールするときにシステム上pythonを参照しやがるのか・・・・・(汗)
そこで、ソースからビルドしようとしたり(←pythonのパスを指定できるらしい)、WSGIPythonHomeディレクティブなどを使ったりしましたけど、今度は「no module named site」と根本のモジュールまでなくなってしまったんで、もう一番最初のアイデア、
pipでインストールする
という方法に切り替えました。(めんどうなので、VPSでOSを再インストールした後)pipでdlibをインストール実行し、「おいおい、これもう止まってんじゃね!?」という恐怖に耐えながら気長に待つこと十数分。
やれ権限がない、とかコンパイルできない、とかのエラーを対処しつつやっとdlibをインストール、httpdに以下のようなconfファイルを作ってあげて実行してみると・・・・・?
<VirtualHost example.com> ServerNameexample.com WSGIScriptAlias / /var/www/html/*****/your.wsgi </VirtualHost>
やっと、うまく起動できました!
ホント、途中どれだけstack overflowのページを見に行ったことか・・・(汗)
ということで、あまりmod_wsgiに詳しくない場合はpip一択でデプロイしましょう、というお話でした(笑)
にしても、mod_wsgi、マジやっかいですね・・・・・・
【追記:2018/03/19】
ウェブからのアクセスができるようになった後、pythonのpipにインストールしたopencvとdlibを使おうとしたんですけど、どういうわけかうまくいきませんでした。(python ****.pyならうまくいくのに・・・)
いろいろと調査した結果、httpdのconfファイルに以下のディレクティブを追加しないといけませんでした。どうやら権限が足りてなかったようです。
WSGIApplicationGroup %{GLOBAL}
ちなみに
途中、「apxsがねーぞ!」と言われたら、httpd-develをインストールしてみてください。
あと、はじめてflaskを触ってみた感想としては、「pythonを使ってここまで簡単にウェブサイトを開発できるってマジいいね!」でした。
ただし、やっぱりウェブサイトの構築はLaravelの方が上かなーと。
というのも、例えばflaskの場合、バリデーションは自分で実装しなきゃいけないですし、その他の機能もLaravelの方が至れり尽くせりといった印象です。
なので、今回のようにdlibやopencvを使ったサイトを構築する場合以外は、Laravelでの開発になりそうです。(もしくは、メインはLaravelで、必要なページだけflaskで作ってサブドメインで公開するみたいな「ハイブリッド形式」がいいですね)
ということで、今回は以上です。
ではでは〜。