こんにちは。ryoです。
今回は、ApacheからPythonのWebフレームワークであるDjangoを動かす方法を解説します。
DjangoからWebアプリケーションを作って、実際に運用するためには欠かせない技術になります。
この記事では、
・Apache
・WSGI
について解説します。さらに、
・Apacheが動くDjango環境
についての解説を通して、実際に運用することの出来るDjangoアプリケーションを作ってみましょう。
また、次の記事ではPythonを使ったWebアプリの開発手順を、開発例やPythonを活用するメリットも交えて紹介しているので良ければ参考にしてください。
→ PythonでWebアプリ開発!手順からサービス例、メリットも紹介
Apacheとは
そもそもApacheとは何なのでしょうか。
ApacheとはWebサーバー向けのソフトウェアのことです。
htmlファイルを書いたりDjangoでWebアプリケーションを作っただけではインターネット上に公開することは出来ません。
ApacheがインターネットとWebサイトやアプリケーションを繋いでくれます。
サーバーと聞くとパソコンの本体のように、大きなマシンが動いているイメージがあるかもしれません。
しかしノートPCも、このApacheを入れて設定をすることでサーバーとして使うことが出来ます。
この記事ではDjangoを外部に公開できるようにするために、Apacheを使っています。
Webサーバーの基礎的な部分を担うソフトウェアとして、覚えておきましょう。
WSGIとは
WSGI(ウィズギー)という言葉について解説します。
WSGI(Web Server Gateway Interface)は、PythonのWebサーバーとWebアプリケーションフレームワークをつなぐために規格化されたインターフェイスの定義です。
PythonにはたくさんのWebアプリケーションフレームワーク(Django、Flask、Bottleなど)があります。
それぞれのフレームワークについてはこちらの記事をご覧ください。
そしてこのWebアプリケーションフレームワークとWebサーバーの接続方法は多種多様で、既に用意されたものからユーザーが作ったものまで、色々なシステムが動いていました。
しかしこれではWebアプリケーションフレームワークを変える際には、一からコードを書き直しせざるを得ません。
そこで、共通化出来る部分はPythonという言語レベルで共通化しようという動きが出来ます。
これらのことから、WSGIに対応したWebアプリケーションフレームワークは、コードの修正を加えることなく色々なシステムに移植できることになりました。
そして今回使うPythonのモジュールに、mod_wsgiというものがあります。
mod_wsgiは、PythonとApacheをつなぐために必要なので、後の章でインストール方法を解説します。
runserverコマンドを使わない理由
Djangoには強力なrunserverコマンドがあります。
このコマンドを使うことによって実際にブラウザで確認しながらWebアプリケーションを作っていくことが出来ます。
このコマンドでサーバーが動いているのだから、わざわざApacheを使って公開する必要は無いんじゃないかと思うかもしれません。
しかし、このrunserverコマンドは開発中の使用だけを想定されています。
当然ApacheなどのWebサーバーアプリケーションほどセキュリティは厳しくなく、開発用に最適化されているので痒いところに手がとどく機能が無かったりします。
Apacheなどは世界中で使われていて様々な実績があります。
実績がたくさんあるということは、トラブルシューティングなど簡単で、インターネットで調べると見つかる可能性が高くなります。
これらの理由から、運用する際にはApacheなどのWebサーバーアプリケーションを使っていきましょう。
Apacheが動くDjango環境を作る
これからは、実際にApacheが動くDjango環境を作ってみましょう。
前提条件として、これから載せるコードやコマンドはすべてMacで実行したものになります。
WindowsやLinuxの場合はそれぞれのコマンドに置き換えて見てください。
また、Pythonの環境は、
・Python 3.6.0
・Django 1.11.2
となっています。
Djangoを準備する。
まずは、Djangoの環境を整えましょう。
Djangoはプロジェクトを作成して、その中にWebアプリケーションを作成するのが基本の流れになっています。
まずは、プロジェクトを作りたいディレクトリに移動して、このコマンドを実行しましょう。
django-admin startproject mySite
これで、mySiteというディレクトリが出来上がり、プロジェクトが作成されます。
次にmySiteディレクトリに移動して、このコマンドを実行しましょう。
python manage.py startapp myapp
これで、mySiteプロジェクトの中に、myappというWebアプリケーションが作成されました。
これで、Djangoの下準備は完了です。
次は、Apacheの導入になります。
Apacheの導入
Macには、標準でApacheがインストールされています。
httpd -v
このコマンドを入力すると、Apacheのバージョンが確認できるかと思います。
筆者の環境
Server version: Apache/2.4.25 (Unix) Server built: Feb 6 2017 20:02:10
このように確認できればしっかりとApacheはインストールされています。
もしも確認できなければ、HomebrewでApacheをインストールして、パスを通すと動かすことが出来ます。
次にApacheを起動してみましょう。
sudo apachectl start
このコマンドを入力して、管理者パスワードを入力すると、起動します。
ブラウザのアドレスバーにlocalhostと入力して移動してみると、以下のような画面が出ます。
これで、Apacheの準備は完了です。
次は、mod_wsgiの導入になります。
mod_wsgiの導入
Pythonにpipというパッケージマネージャがあります。
パッケージマネージャとは、Pythonに後から追加するモジュール(機能)を管理するためのシステムです。
pipから、このコマンドを実行します。
pip install mod_wsgi pip install mod-wsgi-httpd
mod-wsgi-httpdのインストールには時間がかかるので気長に待ちましょう。
これで、ApacheとDjangoをつなぐためのソフトウェアがインストールされました。
次に、どこにインストールされたのかを確認します。
pyenvを使っているのか、そのままのシステムで使っているPythonなのかによって変わってきます。
python -c "import sys; print(sys.path)"
このコマンドでsite-packagesという文字が入っているパスを見つけ、実際に移動します。
そしてさらに、mod_wsgi/serverへ移動します。
現在のディレクトリは環境によって変わりますが、mod_wsgi/serverはこのような構成になっています。
treeコマンドによる出力
. ├── __init__.py ├── __pycache__ │ ├── __init__.cpython-36.pyc │ ├── apxs_config.cpython-36.pyc │ └── environ.cpython-36.pyc ├── apxs_config.py ├── environ.py ├── management │ ├── __init__.py │ ├── __pycache__ │ │ └── __init__.cpython-36.pyc │ └── commands │ ├── __init__.py │ ├── __pycache__ │ │ ├── __init__.cpython-36.pyc │ │ └── runmodwsgi.cpython-36.pyc │ └── runmodwsgi.py └── mod_wsgi-py36.cpython-36m-darwin.so 5 directories, 13 files
今回の目的は、mod_wsgi-py36.cpython-36m-darwin.soのパスを見つけることです。
このパスを、Apacheの設定ファイルに加えます。
confファイルの作成と動作確認
ここからはmod_wsgiとApacheをつなげていきます。
Apacheには複数の設定ファイルがあり、今回触るのはhttpd.confと呼ばれるファイルになります。
Macであれば、/private/etc/apache2/httpd.confにあります。
このファイルの末尾に、このような追記をします。
LoadModule /Users/username/.pyenv/versions/anaconda3-4.3.0/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-darwin.so WSGIScriptAlias / /Users/username/anaconda3/mySite/mySite/wsgi.py WSGIPythonPath /Users/username/anaconda3/mySite WSGIPythonPath /Users/username/.pyenv/versions/anaconda3-4.3.0/lib/python3.6/site-packages <Directory /Users/username/anaconda3/mySite/mySite> <Files wsgi.py> Order deny,allow Allow from all </Files> </Directory>
1行目でmod_wsgiのロードをします。
2行目以降はプロジェクトファイルの場所を指定して、Djangoとmod_wsgiとApacheをつなげています。
これで、Apacheを再起動して接続できれば、完了です。
curl localhost
このコマンドを実行してIt worksという文章が入ったhtmlファイルが表示されれば、Djangoとの連携は出来ました。
実行結果
It works!
ちなみにcurlコマンドを使った確認は、Apacheの動作確認でよく行われる方法です。
Apacheを使うことで、Djangoで作ったWebアプリケーションを公開することが出来ました。
Webサーバーソフトウェアのスタンダードとも言えるApacheに慣れておくことは、サーバーに強くなることと同じです。
Apacheの設定ファイルはとても奥が深く、初心者にはわからない部分がたくさんあるかと思います。
しかしエラーメッセージをそのまま検索することによって、同じ事例でつまづいている方の解決策を見つけることが出来ます。
学習のしやすさも、ユーザーが多いApacheだからこそのポイントですね。
まとめ
DjangoでApacheを使う方法を解説してきました。
エラーメッセージが出たりlocalhostにつながらない場合は、環境によってパスを変える部分を注意して見てみましょう。
Apacheはとても奥が深いソフトウェアですが、ユーザー数の多さを強みにたくさん調べてみましょう。
Djangoで作ったWebアプリケーションを動かしたい時は、ぜひこちらの記事を参考に挑戦してみてください。