Wednesday, May 25, 2016

Deploy django project with gunicorn, nginx and ubuntu

Энэ тохиргоог нэтээс хайж олж хийхэд жаахан ядаргаатай байсан тул блогтоо тэмдэглэв.



django app-ийн рүүт директор
/home/user/deploy/myproject

Gunicorn

Хамгийн эхлээд систем эхлэхэд хамт асдаг gunicorn эхлүүлэгч скрипт бичиж зохих газар нь хадгалах хэрэгтэй.

/etc/init.d/myproject файлыг үүсгээд дараах байдалтайгаар хадгална.

#!/bin/bash

APPNAME=myproject
USER=user
PATH=/bin:/usr/bin:/sbin:/usr/sbin
ACTIVATE=/home/user/deploy/myproject/venv/bin/activate
APPMODULE=myproject.wsgi:application
SOCKFILE=/home/user/deploy/myproject/myproject.sock
DAEMON=gunicorn
PIDFILE=/var/run/gunicorn.pid
LOGFILE=/var/log/$DAEMON.log
WORKERS=2


. /lib/lsb/init-functions


if [ -e "/etc/default/$APPNAME" ]
then
    . /etc/default/$APPNAME
fi

cd /home/user/deploy/myproject

RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR

case "$1" in
  start)
        log_daemon_msg "Starting deferred execution scheduler" "$APPNAME"
        source $ACTIVATE
        $DAEMON --daemon --bind=unix:$SOCKFILE --pid=$PIDFILE --workers=$WORKERS --user=$USER --log-file=$LOGFILE $APPMODULE
        log_end_msg $?
    ;;
  stop)
        log_daemon_msg "Stopping deferred execution scheduler" "$APPNAME"
        killproc -p $PIDFILE $DAEMON
        log_end_msg $?
    ;;
  force-reload|restart)
    $0 stop
    $0 start
    ;;
  status)
    status_of_proc -p $PIDFILE $DAEMON && exit 0 || exit $?
    ;;
  *)
    echo "Usage: /etc/init.d/$APPNAME {start|stop|restart|force-reload|status}"
    exit 1
    ;;
esac

exit 0


Хадгалсныхаа дараа
sudo chmod +x /etc/init.d/myproject
sudo chown root:root /etc/init.d/myproject
sudo update-rc.d myproject defaults
sudo update-rc.d myproject enable

асаахдаа
sudo /etc/init.d/myproject start

зогсоохдоо
sudo /etc/init.d/myproject stop

лог файл нь
/var/log/gunicorn.log


NGINX

прожект рүүтрүүгээ ороод myproject_nginx.conf файлыг үүсгэнэ.
/home/user/deploy/myproject/myproject_nginx.conf

server {
        listen 80;
        server_name .my-domain.com;
        charset utf-8;
        client_max_body_size 75M;
        location = /favicon.ico { access_log off; log_not_found off; }
        location /media {
                alias /home/user/deploy/myproject/design/media;
        }
        location /static {
                alias /home/user/deploy/myproject/design/static_root;
        }
        location / {
                include proxy_params;
                proxy_pass http://unix:/home/user/deploy/myproject/myproject.sock;
        }
}

media болон static alias-уудыг өөрийнхөө прожектийнхоо тохиргооноос хамаарч өөрчлөөрэй.

тохиргооны файлаа nginx-д symlink холболт үүсгэн бүртгүүлэх хэрэгтэй.
sudo ln -s /home/user/deploy/myproject/myproject_nginx.conf /etc/nginx/sites-enabled

одоо nginx-ээ restart хийгээд тохируулсан домайнлуугаа ороход бүгд хэвийн ажиллах ёстой.
sudo /etc/init.d/myproject start
sudo service nginx restart

Nginx нь 80-р порт буюу вэбийн default порт дээр чагнан ажиллана, гаднаас хүсэлт ирэнгүүт түүнийг gunicorn-ийн socket-рүү проксидон дамжуулан ажиллана, gunicorn нь хэд хэдэн django процесс үүсгэн тэдгээрийгээ supervise хийн ажиллана, өөрөөр хэлбэл аль нэг процесс нь унавал дахин асааж өгнө, бодвол тэгээд socket-оор ирсэн өгөгдлүүдээ ном журмын дагуу wsgi-ээрээ дамжуулан процесстэйгээ харилцан ажиллах байлгүй.