概要
タイトルの組み合わせで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番ポートでできるのか)
- ログのローテーション