質問: ### 前提・実現したいこと pythonのdjangoフレームワークを利用してwebアプリを作成しようとしています。 djangoの開発サーバーではうまく動くというところまできて、 CentOS7とapacheという環境で公開しようとした時に、 どのようにデプロイすべきかについて以下3点で悩んでしまいました。 1. どのディレクトリにアプリを置くべきか 2. パーミッションの設定はどうすべきか 3. apacheをどのユーザで起動すべきか 実現したいのは、 A. databaseはデフォルトのままsqlite3を利用していますが、 apacheがその更新を行える必要があります。 B. 今後も開発し、変更を加える手間が少ない方が良いです。 C. セキュリティ的にできるだけ危険性の少ない方が良いです。 これらを実現するためのオーソドックスなプラクティスはないものでしょうか。 ### 試したこと 現在は本番サーバー(AWS EC2)上のユーザーディレクトリ内で作業を行なっています。`/home/centos/myapp` しかし、`/var/www/`以下に置くような例をよく見かけます。 そうする場合には、シンボリックリンクにすべきなのかコピーすべきなのかもわかりません。 gitは使っていませんが、利用した方が良いかとも思っています。 ### 補足情報 python3.6を`/usr/local/`にインストールしています。(ユーザはこれで使えるようになりましたが、rootとapacheは`usr/bin`しか見てくれていないようなので、`ln -s /usr/local/bin/python3.6 /usr/bin/python` のようにしています。) そのpipを利用してmod_wsgiをインストールしています。 また、apacheはyumでインストールしました。
回答: どのような方法で作った Django アプリケーションをデプロイするかによって変わってきます。 Python には WSGI という独自のWebアプリケーション用インタフェースが用意されています。Django もこの WSGI を使うことをオススメしています。 一般的には `Webサーバー --- WSGIサーバー --- WSGIアプリ(Django)` という構成を取るのですが、Apache には mod_wsgi という便利モジュールが用意されていて、これを入れるだけで WSGIサーバーなしで WSGIアプリを動かすことができます。 つまり `Apache(mod_wsgi) --- Django` という構成です。これをおすすめします。 おおまかな手順は次の通りです 1. **Python3.6用**の mod_wsgi をインストール (pipを使うのが無難?) 2. Apacheの設定ファイルを編集し、mod_wsgi を読み込ませる 3. Apacheの設定ファイルを編集し、Djangoアプリの設定を入れる ``` # Djangoアプリ設定例 WSGIDaemonProcess myapp user=centos group=wheel threads=5 WSGIScriptAlias /myapp /home/centos/myapp/wsgi.py WSGIProcessGroup myapp Require all granted ``` これだけで http://localhost/myapp であなたのDjangoアプリが動きます。詳しくは Django 公式リファレンス: をご覧下さい。 でやっと本題ですが、mod_wsgi を使うという前提で質問に回答します。 > > どのディレクトリにアプリを置くべきか > > > いまのまま(/home/centos/myapp)で全く問題ないと思います。 > > パーミッションの設定はどうすべきか > > > Apache が WSGIの設定ファイル `/home/centos/myapp/wsgi.py` にアクセスできるようにする必要があります。 CentOS7 だとホームディレクトリのパーミッションは 700 になっていると思いますので、`chmod 755 /home/centos` で他ユーザーに読み込み・実行権限を付与してください。(もし他のユーザーにホームディレクトリを見られては困るのであれば、Djangoアプリのディレクトリを他の場所に移動してください) また、すでにそうなっているはずですが、同様に `/home/centos/myapp` に others の`rx`権限が、`/home/centos/myapp/wsgi.py` に`r`権限があるかも念のため確認してください。 ちなみに上記の mod_wsgi の設定例ではDjangoアプリを一般ユーザー(centosさん)権限で動かします。(これを daemon mode といいます)そのため SQLite3 のデータファイルは、apacheではなく所有者(centos)として読み書きを行うので、他ユーザーからの書き込みを許可してあげる必要はありません。 daemon mode で一般ユーザー権限で動かすことにより、万が一 Django アプリに侵入された際に他のプロセスやOSごと乗っ取られるリスクを最小限にすることができセキュアです。 > > apacheをどのユーザで起動すべきか > > > デフォルト(`apache`)のまま変える必要はないと思います。