エックスサーバでDjango+Pythonのデプロイを解決!原因はnumpyだった?!

エックスサーバーのサブドメインでアプリを動かす

私のブログ「しずかなかずし」は、エックスサーバーというレンタルサービスで運営しています。エックスサーバーは、WordPressを使うには非常に便利にできています。

しかも、「サブドメイン」という機能も用意されており、 original-domain.com という独自ドメインを使っている場合は、subdomain.original-domain.com というサブドメインに別のシステムを動かすことが可能です。

 

私は、このサブドメインの仕組みを使って、そのサイトでとあるサービスを動かそうとしました。pythonのプログラムです。pythonの有名なWebアプリケーションフレームワークでdjangoというものがありますが。私がやりたかったのは、サブドメイン上に、このdjangoを使って作ったWebアプリケーションを配置することでした。

 

ところが、一旦試みたものの、うまくいかず、苦労していました。

関連記事: エックスサーバにDjango+Pythonのデプロイが上手くできない話(未解決)

そして、今回ようやく原因を特定して、解決しましたので報告します。

 

数値計算用のライブラリnumpyにハマる

私が動かしたかった自前のWebアプリケーションは、以下のようなものです。

 

関連記事: Excelに英文を打ち込んだら、読み上げた音声ファイルmp3を返すサイトの制作

 

Excelファイルに英単語や英文を列挙して、このアプリにアップロードすると、テキスト読み上げの機能を使って、mp3ファイルにしてくれる、という便利なサービスです。

English Excel to Speech: xls2speech.shizuka-na-kazushi.style

このシステムは、通知計算用のライブラリである、numpyというpythonのライブラリを使用しています。numpyは今流行りのAIで機械学習を行ったり、さまざまなビッグデータの解析を行ったりするのに、その筋の方々にはかなり有名なライブラリです。

 

だからといって、私が作った上記のEnglish Excel to Speechで実際にそんな、たいそうな演算をさせているかと言うとそんなことはありません。Text To Speech(TTS)の処理はMicrosoftのWebサービスを使っているので、数値計算のたぐいは実行していないのです。

 

では、なぜ、numpyが必要になったかと言うと、一緒に使っているpandas というライブラリなのです。pandasはexcelファイルを読み込んでpythonでデータを操作するのに便利なライブラリです。

そして、このnumpyをdjangoで使おうとする際に、OpenBLASというマルチスレッド(並列化)の最適化の仕組みがあるようなのですが、これが原因の模様です。

numpyを使うdjangoアプリのデプロイの解決方法

大前提として、エックスサーバーでpythonのアプリを動かす際に、virtualenvの仮想環境に必要なライブラリをインストールしています。

エックスサーバーでSSHでログインしても、ルート権限はありませんので、自分のローカルディレクトリに必要なものを全部入れてしまおうというわけです。

エックスサーバでvirtual envを作りpipを使う

私が借りているサーバでは、python2.7とpython3.4がインストール(2019年2月11日現在)されています。

まずは、以下のような感じでvirtual envを作ります。(バージョン3系を使います)

$ pyvenv-3.4 venv

「venv」は自分で付けたvirtual 環境の名前です。この名前でディレクトリが作成されます。

次に、virtual env(仮想環境)を有効化します。

$ . venv/bin/activate

その後、pipのインストールです。

$ python get-pip.py
これでpipが使えるようになったので、必要なものは、pip install xxxx と実行すれば、この仮想環境に必要なものがすべてインストールされます。

djangoのアプリケーションファイルのコピー

djangoのアプリをコピーします。エックスサーバの場合、サブドメインは以下のようなフォルダに、アプリケーションを入れる必要があります。

[HOME]/original-domain/public_html/subdomain/

ここのディレクトリに全てのdjangoのファイルをコピーします。

subdomainのディレクトリに.htaccessの配置

subdomainにapacheサーバの設定ファイルを作ります。

内容は、以下のようなファイル.htaccessを配置します。

 

実際にdjangoのアプリにアクセスする際は、

https://original-domain.com/subdomain/

ではなく、

https://subdomain.original-domain.com/

でアクセスしないと、上手く行きませんでした。。。(やり方がわからなかった)

index.cgiの用意

ここがポイントでした。以前の解決できなかったときのブログ記事とほぼ同様のファイルなのですが、環境変数を1つ追加しています。

 

追加したのは、OPENBLAS_NUM_THREADSの行。これは、OpenBLASの最適化のスレッドを1つに限定するための設定です。

どうも、CGIで動かす時に、OpenBLASの複数スレッドを使うのが上手く行かない原因のようでした。(最適化しなくてもexcelファイルを読み込むだけなのに。。。)

これで解決できました!

 

 

 

あなたへのおすすめ


コメントを残す

関連する投稿

検索語を上に入力し、 Enter キーを押して検索します。キャンセルするには ESC を押してください。

トップに戻る
%d人のブロガーが「いいね」をつけました。