Deploying Flask with
nginx & uWSGI
Kim Jeong Ju (haje01@gmail.com)
13년 7월 23일 화요일
Agenda
• Flask Document
• Prepare
• VirtualEnv(Wrapper)
• uWSGI
• nginx
• Tips & Pitfalls
13년 7월 23일 화요일
Flask Documents
• Deploying to a Web Server
• http://flask.pocoo.org/docs/quickstart/#deploying-
to-a-web-server
• Deploying with Distribute
• http://flask.pocoo.org/docs/patterns/distribute/
• Deployment Options
• http://flask.pocoo.org/docs/deploying/
13년 7월 23일 화요일
Prepare
• gcc & python-dev
• sudo apt-get update
• sudo apt-get install build-essential python-dev
python-pip
• Make User (Don’t use ‘root’ user)
• sudo useradd -r -g www-data -s /bin/false uwsgi
• Make dir
• sudo mkdir -p /var/www/myapp
13년 7월 23일 화요일
Prepare -VirtualEnv
• Install
• sudo pip install virtualenvwrapper
• Config
• export WORKON_HOME=~/VirtualEnvs
• mkdir -p $WORKON_HOME
• source /usr/local/bin/virtualenvwrapper.sh
13년 7월 23일 화요일
• Shell Script (~/.profile)
• export WORKON_HOME=~/VirtualEnvs
• source /usr/local/bin/virtualenvwrapper.sh
• Make Env. & Enter
• mkvirtualenv myapp
• workon myapp
Prepare -VirtualEnv
13년 7월 23일 화요일
Prepare - Cont.
• Install Flask
• Do(or Clone) your app
• Permission
• sudo chown uwsgi:www-data /var/www/myapp -R
• sudo chmod 775 application.py
• Add group
• sudo usermod -a -G www-data myuser
13년 7월 23일 화요일
uWSGI
• Install
• pip install uwsgi
• Make log file
• sudo mkdir -p /var/log/uwsgi
• sudo touch /var/log/uwsgi/myapp.log
• Config & Run
• sudo /home/ubuntu/VirtualEnvs/myapp/bin/uwsgi -x
uwsgi.xml
13년 7월 23일 화요일
uwsgi.xml
<?xml version="1.0"?>
<uwsgi id="myapp">
<module>application:app</module>
<virtualenv>/home/myuser/VirtualEnvs/myapp</virtualenv>
<socket>/tmp/myapp.sock</socket>
<processes>4</processes>
<chdir>/var/www/myapp</chdir>
<pidfile>/tmp/myapp.pid</pidfile>
<daemonize>/var/log/uwsgi/myapp.log</daemonize>
<stats>/tmp/myapp.stats</stats>
<log-format>``%(addr) - %(user) [%(ltime)] "%(method) %(uri)
%(proto)" %(status) %(size)`` "%(referer)" "%(uagent)"</log-
format>
<uid>uwsgi</uid>
<gid>www-data</gid>
<chmod-socket>775</chmod-socket>
</uwsgi>
13년 7월 23일 화요일
nginx
• Install
• sudo apt-get install nginx
• Start
• sudo service nginx start
13년 7월 23일 화요일
nginx config
server {
listen 8080;
server_name myapp;
root /var/www/myapp;
try_files $uri @uwsgi;
location @uwsgi {
include uwsgi_params;
uwsgi_pass unix:/tmp/myapp.sock;
}
}
13년 7월 23일 화요일
nginx
• Write config file
• sudo vi /etc/nginx/sites-available/www
• Symbolic link
• sudo ln -s /etc/nginx/sites-available/www /etc/
nginx/sites-enabled/
• remove default from sites-enabled/
• Restart
• sudo service nginx restart
13년 7월 23일 화요일
Done!
13년 7월 23일 화요일
Tips - Scripts
• start
• sudo /home/myuser/VirtualEnvs/myapp/bin/uwsgi -
x ./uwsgi.xml
• stop
• sudo /home/myuser/VirtualEnvs/myapp/bin/uwsgi --
stop /tmp/myapp.pid
• reload
• sudo /home/myuser/VirtualEnvs/myapp/bin/uwsgi --
reload /tmp/myapp.pid
13년 7월 23일 화요일
Tips - Logging Errors
• In production, you won’t see log messages
• Send Error Mails!
• Install Mail Server
• sudo apt-get install postfix
ADMINS = ['yourname@example.com']
if not app.debug:
import logging
from logging.handlers import SMTPHandler
mail_handler = SMTPHandler('127.0.0.1',
'server-error@example.com',
ADMINS, 'YourApplication
Failed')
mail_handler.setLevel(logging.ERROR)
app.logger.addHandler(mail_handler)
13년 7월 23일 화요일
Tips - Configuration
• Best Practice - http://flask.pocoo.org/docs/
config/#configuration-best-practices
• make_config.py
13년 7월 23일 화요일
Pitfall - ‘print’
• Unicode Encode Error
• No Daemon - OK, Daemon - Error!
• msg = u”한글”; print msg
• -> msg = u”한글”; print msg.encode(‘utf-8’)
13년 7월 23일 화요일
Pitfall - Pass EnvVars
• nginx UWSGI_SETENV not work (Bug!)
• uwsgi_param UWSGI_SETENV
DJANGO_SETTINGS_MODULE=myapp.settings;
• Use uwsgi ‘env’
• <env>MYAPP_DEBUG=False</env>
13년 7월 23일 화요일
References
• http://blog.naver.com/PostView.nhn?
blogId=ez_&logNo=140138625021&parentCategoryNo=1&view
Date=&currentPage=1&listtype=0
• http://blog.kramerapps.com/post/22551999777/flask-uwsgi-nginx-
ubuntu
• http://blog.naver.com/PostView.nhn?
blogId=ez_&logNo=140138625021&parentCategoryNo=1&view
Date=&currentPage=1&listtype=0
• http://flask.pocoo.org/docs/errorhandling/
13년 7월 23일 화요일

Deploying flask with nginx & uWSGI