mod_wsgiとhttpdのインストールで気をつけるべき事

こんにちは。フリーランス・コンサルタント&エンジニアの 九保すこひ です。

現在、個人的な開発で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で作ってサブドメインで公開するみたいな「ハイブリッド形式」がいいですね)

ということで、今回は以上です。
ではでは〜。

このエントリーをはてなブックマークに追加       follow us in feedly  
開発のご依頼お待ちしております
開発のご依頼はこちらから: お問い合わせ
どうぞよろしくお願いいたします! by 九保すこひ