LoginSignup
6

More than 5 years have passed since last update.

Djangoのデプロイ(Ubuntu 14.04 LTS + Nginx + uWSGI + Supervisor)

Posted at

概要

タイトルの組み合わせでDjangoのデプロイするのに相当苦労したので、次回の糧に備忘録。
ハマったところも残しておく。

組み合わせは以下

  • Ubuntu 14.04 LTS --- OS
  • Django 1.8 --- Python Webアプリ
  • Nginx 1.10.3 --- リバースプロキシ
  • uWSGI 2.0.14 --- Webサーバー
  • Supervisor --- uWSGIのデーモン化
  • pyenv --- Python実行バージョン切り替えツール ※今回の設定で特に記述箇所はなかった。

Django

ある程度作って下記コマンドを実行してブラウザからアプリケーションが動作することを確認。
これができてないと以下をやってもムダ。

$ python manage.py runserver 0.0.0.0:8000

uWSGIの設定

uWSGIはaptで入れたがうまくうごかなかった。これだけで2日ハマった。

sudoをつけてuwsgiを実行すると下記のエラーが出てうまく動作しない。

$ sudo uwsgi ***

ブラウザで確認するとログにno python application found~とログが出る。

--- no python application found, check your startup logs for errors ---
[pid: 10523|app: -1|req: -1/1] 121.101.66.160 () {40 vars in 785 bytes} [Sun Feb 19 14:12:06 2017] GET / => generated 21 bytes in 0 msecs (HTTP/1.1 500) 2 headers in 83 bytes (0 switches on core 0)

ググるとこんな情報が・・・
http://www.yodiaditya.com/no-python-application-found-check-your-startup-logs-for-errors/

uWSGIのアンインストール(本来はこの手順いらない)

sudo apt-get remove uwsgi*
sudo apt-get purge uwsgi*

uWSGIのインストール

pip経由でuWSGIをインストール。(sudo付けたか忘れた)

pip install uwsgi

iniファイルにする前に確認(http) ブラウザでhttp://****:8889/adminにアクセス。

$ uwsgi --http :8888 --file /home/<user>/<pass>/<to>/<projectname>/<projectname>/wsgi.py

サイトが見れた。

Nginxの設定

以下のように設定した。とりあえず8887番ポートで。

# sudo vi /etc/nginx/conf.d/uwsgi.conf

upstream django {
    server unix:///tmp/<projectname>.sock;
}

server {
    listen 8887;
    access_log /var/log/nginx/<projectname>_access.log;
    error_log /var/log/nginx/<projectname>_error.log;

    location /static {
        alias /home/<user>/<pass>/<to>/<projectname>/static/;
    }

    location / {
         include uwsgi_params;
         uwsgi_pass django;
    }
}

uWSGIを起動した後ブラウザから動作確認

$ uwsgi --socket /tmp/<projectname>.sock --chmod-socket=666 --file /home/<user>/<pass>/<to>/<projectname>/<projectname>/wsgi.py

ブラウザで確認(http://****:8887/admin)

error removing unix socket, unlink(): Operation not permitted [core/socket.c line 198]

apt経由でuWSGIを入れた際のsocketファイルが残っていて?パーミッションエラーが出た。
rmでsocketファイルを削除する。

sudo rm /tmp/<projectname>.sock

もう一度uwsgiを起動して再度ブラウザで確認したら見れた。

uWSGIの自動起動設定(Supervisor)

これはaptから入れる。

sudo apt-get install supervisor

設定ファイル(合ってるかどうかはわからないがとりあえず動いてはいる・・)

#  sudo vi /etc/supervisor/conf.d/uwsgi.conf
[program:uwsgi]
directory = /home/<user>/<pass>/<to>/<projectname>
command = /home/<user>/.pyenv/shims/uwsgi --ini /etc/uwsgi/apps-enabled/<projectname>.ini
stopasgroup = true
numprocs = 1
autostart = true
autorestart = true
user=root
redirect_stderr = true
stdout_logfile = /var/log/supervisor/uwsgi.log

ステータス確認

sudo supervisorctl status

ブラウザから確認

http://*****:8889/adminとかで開けばOK!
サーバーを再起動して再度アクセスできるか確認してOK!

今後の課題

  • サブディレクトリ(http://ドメイン/サブディレクトリ/:80)で複数のDjangoアプリケーションが運用できるようにしたい。
  • Ruby用にunicornも動かしているのでhttp://ドメイン/サブディレクトリ/によってNginxからuwsgiとunicornを振り分けられるようにしたい。(両方とも80番ポートでできるのか)
  • ログのローテーション

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6