DjangoアプリケーションをApache上で本番環境として動かす方法
2016-07-21 15:02
  • DjangoをApacheで動かした時の記録です。
    前回はCentOS6環境にpyenv, mod_wsgi, apacheを入れ、djangoを動かしてみた記録を書きましたが
    その続きのようなものです。

    前提(のようなもの)

    以下の環境を準備出来ていることを前提とします。
    ・Apache 2.2系をインストール済み(2.4系でも問題無いですが、自分が行った環境を書いています)
    ・mod_wsgiがすでにインストール済み(前回の記事参照)
    ・Django1.8 (or later) ですでに開発環境が動いている
    ・Python 3.5系
    

    mod_wsgiにPATHを通す

    pipを使ってインストールしたものの、apache2.2系標準の
    "/etc/httpd/modules/" 以下にソケットファイルが置かれるわけではないので、エイリアスを貼ってやる必要があります。

    僕の場合は、以下の場所にソケットファイルが作られていました。

    /xx/xx/.pyenv/versions/3.5.1/lib/python3.5/site-packages/mod_wsgi/server/mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so
    

    なので、ファイル名をmod_wsgi.soにリネームしつつエイリアスを貼ってしまいます。
    $ sudo ln -s /xx/xx/.pyenv/versions/3.5.1/lib/python3.5/site-packages/mod_wsgi/server/mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so /etc/httpd/modules/mod_wsgi.so
    

    httpd.confの設定

    僕はバーチャルホストでサーバーを動かしたかったので、以下のように
    httpd.confの内容を変更します。
    # NameVirtualHostのコメントを外す
    NameVirtualHost *:80
    

    Apacheさんは "/etc/httpd/conf.d/" 以下の.confファイルをすべてロードするようになっているので、
    新たに "/etc/httpd/conf.d/wsgi.conf"というファイルを作ってしまいます。

    注:httpd.confに以下の記述があるため

    #
    # Load config files from the config directory "/etc/httpd/conf.d".
    #
    Include conf.d/*.conf
    

    wsgi.confの作成

    いよいよ本題だったりするわけですが、僕は以下のように設定しました。
    # モジュールの読み込み
    LoadModule wsgi_module modules/mod_wsgi.so
    
    # Pythonのパスを指定する
    # SocketPrefixはどこでもいいが、/var/run/wsgiでOK
    WSGIPythonHome /xxx/xxx/.pyenv/versions/3.5.1
    WSGISocketPrefix /var/run/wsgi
    
    # IfModuleとか必要ならどうぞ。ここでは省略
    
    # VirtualHostの設定
    <VirtualHost *:80>
        ServerName sample-server.com
    
        # Daemonとして動かす場合は必須。
        # Deamonに"sample-site"という名前をつけました。
        # また、DjangoプロジェクトのルートにPythonパッケージのパスを指定してあげる感じ。
        WSGIDaemonProcess sample-site python-path=/path/to/Django/app:/xxx/xxx/.pyenv/versions/3.5.1/lib/python3.5/site-packages
    
        # group指定
        WSGIProcessGroup sample-site
       
        # apacheのドキュメントルートにDjangoプロジェクト上で作成( 1.8では自動的に作成されていた)したwsgi.pyを指定。
        # これで、http://hoge-site.com/ 以下でDjangoプロジェクトが動くようになる。
        WSGIScriptAlias / /path/to/Django/app/appName/wsgi.py process-group=sample-site
    
        # ここの指定の仕方はApache2.2系と2.4系で違いがあるので注意。
        <Files wsgi.py>
            AuthType None
            Order deny,allow
            Allow from all
        </Files>
    
        # Staticファイルのパスを指定する
        Alias /static/ /path/to/Django/app/static/
        <Location /static/>
            Options -Indexes
        </Location>
    
        # MEDIAの指定(画像とか)
        Alias /images/ /path/to/Django/app/static/images/
        <Location /images/>
            Options -Indexes
        </Location>
    
        # 最後に、Djangoアプリケーションの場所を指定
        <Directory /path/to/Django/app/appName>
            Order deny,allow
            Allow from all
        </Directory>
    
        # Logの設定は任意で。
        ErrorLog /var/log/httpd/xxx-error.log
        CustomLog /var/log/httpd/xxx.access.log combined
    </VirtualHost>
    

    ※なお、Djangoのプロジェクトルートを指定するのか、プロジェクト内で作成したアプリケーションの
    ディレクトリを指定するのか非常に混乱したので、同じように混乱した人の助けになればいいなと思います。

    上記の設定でファイルを保存し、apacheを再起動すればDjangoプロジェクトが公開されているはずです。

    settings.pyにてDEBUG = Falseにするのをお忘れなく。。


    人気ブログランキングへ ブログランキング・にほんブログ村へ
    ↑応援よろしくお願いします!m(_ _)m

  • 2016-06-07 23:05
  • Python
  • DjangoPythonApache本番環境CentOS
profile picture

自己紹介的な何か

@wkmettyでついったーやってます。時々。 普段はなんちゃってプログラマやってます。海外から帰任してからは現場に戻って最前線でコード書いてます。 週末は気の向くままにプログラミングしたり、写真撮りに出かけたり、家でhuluみながらまったりしたりしています。(*´ω`*)モキュ