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

2019年1月23日プログラミング

Django のデプロイで試行錯誤中

少し前に作ったDjango のアプリを公開したくて、週末から数日間試行錯誤しています。

Djangoとは、Python でWeb アプリケーションを作るためのフレームワークです。

このPython のプログラムを公開するためには、レンタルサーバーに設定を施し、サーバーへのリクエストに対して、Web アプリケーションが動作して結果を返すようにしなければなりません。

その、公開の為の作業を「デプロイ」と呼びますが、ハマっているのが、このデプロイ。

 

追記(2019/02/11):

以下の記事の内容、解決しました!

 

レンタルサーバーはエックスサーバー

私がデプロイしようとしている先のレンタルサーバーは、エックスサーバーというサービスです。

このブログもエックスサーバーで動作しています。ブログのシステムは、WordPressというアプリケーションです。WordPressはブログのシステムとしてはあまりにも有名。プログラム言語PHP で書かれたものです。

ブログを書く目的で、エックスサーバーを借りてWordPressを使う人が多いのでしょう。

エックスサーバーには、このWordPressをかんたんに「デプロイ」してくれるメニューが用意されています。

なので、いちいち設定に迷う必要はありません。

そんな、PHP 専用、WordPress専用、とも言えるエックスサーバーに、私はPythonの自作プログラムをデプロイしようとしている、という訳です。

 

情報不足と知識不足と時代変化に悩む

エックスサーバーにPython アプリのデプロイ。なかなか思うようにできません。

エックスサーバーのPythonは正しく動作する

そもそも、エックスサーバーでDjangoを動かそうという人が少ないのかも。

こちらの情報をもとにちょっとやってみました。

 

エックスサーバーでDjangoのWebアプリを公開する方法について

 

一応、簡単なPythonのプログラムならCGIで動作することは確認できました。

でも、Djangoを動かそうとすると、どこかでプログラムが止まってしまうとようです

ブラウザにはサーバーの内部エラーのメッセージが出ます。

そして、サーバーのエラーログには、以下の文章が残っています。

End of script output before headers: index.cgi

 

Django のスクリプトが全く動かないのかと言うと、そんな事はないのです。

 

と言うとのも、Django のsettings.py のALLOWED_HOSTSに実行するマシンのホスト名を入れていないと、エラーメッセージがブラウザの画面に表示されるのです。これは間違いなくDjango のコールスタックです。

 

試しに、WebサーバがCGIのプログラムを呼び出す前に設定する環境変数を、全て調べてターミナルに設定してみました。そしてdjangoの設定を施したindex.cgiをコマンドラインで実行してみます。するとトップページのHTMLが正しく標準出力、つまりターミナル画面に出力されます。必要なライブラリやプログラムは正しくセットアップされていることが、これで確認できました。

 

ということは、結論としては、Djangoのプログラムのどこかで止まってしまっているようだ、ということ。

 

ちなみに、.htaccessファイルの中身はこんな感じ。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.cgi/$1 [QSA,L]

そして、index.cgiは、こんな感じ。(XXXXは自分のhome directory, YYYYはsub-directoryの名前、projectは私の開発中のアプリの名前)

#!/home/XXXX/public_html/YYYY/venv/bin/python
# -*- coding: utf-8 -*-

import sys, os

# Python のモジュール検索パスをカスタマイズする
sys.path.insert(0, "/home/XXXX/public_html/YYYY/venv/bin")

# カレントディレクトリをプロジェクトのディレクトリに移す (必要なら)
os.chdir("/home/XXXX/public_html/YYYY")

# 環境変数 DJANGO_SETTINGS_MODULE を設定する
os.environ['DJANGO_SETTINGS_MODULE'] = "project.settings"

from wsgiref.handlers import CGIHandler
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
CGIHandler().run(application)

上記は正しく動作しない設定なので、ご注意を!間違いのご指摘、歓迎いたします。

CGIとFCGIの区別がつかない

私は自身、Apacheの設定の知識が足りないのでエックスサーバーのApacheの設定がどうなっているの想像ができません。そこはエックスサーバのホスト側の設定になりますので、お客さんである私は知り得ないのです。

 

これも、何を試すべきかわからない理由かと思います。

CGIはプロセスを毎回立ち上げる。でも、FCGIは、プロセスを使いまわす。そういう違いは分かっているつもりなのです。

でも、じぁ、プログラムってどう書いておけばいいのでしょう??というのも分かってないのです。

 

エックスサーバーにmod_wsgiのインストールがきない

しかも、Djangoフレームワークがバージョンアップにより、CGIとかFCGIなどWebサーバとの接続のやり方が変わってきているというのも曲者。

 

その為、ネットで情報を探すものの、どのバージョンでうまく行ったのかが分からず、私の環境に適用可能なのかどうかの判断が難しいのです。

 

そして、最近のバージョンのDjangoでは、wsgiという仕組みが標準のようなのです。

ところが、wsgiをApacheで使うためのmod_wsgi というモジュールがエックスサーバーにインストール出来ない。このモジュールはpipでインストールするようなたぐいのライブラリ。

しかしエックスサーバでpip installしようとすると失敗します(以下がその時のログ)。エックスサーバーのApacheのコンフィギュレーションのの問題なのではないかと推測しています。

 

Collecting mod_wsgi
  Using cached https://files.pythonhosted.org/packages/47/69/5139588686eb40053f8355eba1fe18a8bee94dc3efc4e36720c73e07471a/mod_wsgi-4.6.5.tar.gz
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-install-o19z6e6i/mod-wsgi/setup.py", line 168, in <module>
        'missing Apache httpd server packages.' % APXS)
    RuntimeError: The 'apxs' command appears not to be installed or is not executable. Please check the list of prerequisites in the documentation for this package and install any missing Apache httpd server packages.

 

ちなみに、virtual envにインストールされているのは以下のようなものです。

Django==1.11.2
flup==1.0.3
numpy==1.13.1
pandas==0.20.3
python-dateutil==2.6.1
python-http-client==3.0.0
pytz==2017.2
sendgrid==5.2.0
six==1.10.0
xlrd==1.0.0

と言う訳で、週末を潰して作業したものの未だに解決出来ていないのです。

どなたかわかりませんか〜??