Configure uWSGI in emperor mode

uWSGI is the most popular application gateway interface, like CGI, fastcgi. It is high-performance and pluggable. It implements application server interfaces for various languages and platforms: WSGI, PSGI, Rack, Lua WSAPI, CGI, PHP, Go, etc.

We can use the uWSGI emperor to manage application instances, and it's easy to configure massive applications. Let's start from building uWSGI.

1.Install libraries

apt-get install libbz2-dev libxml2-dev libyaml-dev zlib1g-dev libcurl4-openssl-dev libsqlite3-dev libncurses5-dev libedit-dev

Download the lastest source
wget http://projects.unbit.it/downloads/uwsgi-latest.tar.gz

tar zxf uwsgi-latest.tar.gz

2.Configure and build plugins

cd uwsgi-2.0.18

vi buildconf/base.ini

Change plugin directory

plugin_dir = /usr/local/lib/uwsgi

mkdir /usr/local/lib/uwsgi

Build uwsgi core

python uwsgiconfig.py --build core
cp uwsgi /usr/local/bin/

Build gevent plugin
python uwsgiconfig.py --plugin plugins/gevent

Build php plugin
apt-get install libxml2-dev libjpeg-dev libpng12-dev libfreetype6-dev libmcrypt-dev zlib1g-dev curl libcurl3 libcurl4-gnutls-dev libmhash2 libmhash-dev libonig-dev libqdbm-dev libdb-dev libkrb5-dev

Add dotdeb source(debian7)
vi /etc/apt/sources.list.d/dotdeb.list

deb http://packages.dotdeb.org wheezy all
deb-src http://packages.dotdeb.org wheezy all

wget --quiet -O - http://www.dotdeb.org/dotdeb.gpg | apt-key add - apt-get update

Install php7

apt-get install php7.0-dev php7.0-cgi php7.0-curl php7.0-gd php7.0-mcrypt php.0-sqlite3 php7.0-pgsql libphp7.0-embed
python uwsgiconfig.py --plugin plugins/php

Build cgi and psgi plugins

apt-get install perl libperl-dev
python uwsgiconfig.py --plugin plugins/cgi
python uwsgiconfig.py --plugin plugins/psgi

Build python2 plugin

apt-get install python-dev python-pip
python uwsgiconfig.py --plugin plugins/python

Build python3 plugin

apt-get install python3-dev python3-pip
python3 uwsgiconfig.py --plugin plugins/python core python3

Build rack plugin

apt-get install zlib1g-dev libcurl4-openssl-dev libsqlite3-dev imagemagick libmagick-dev libmagickwand-dev
apt-get install ruby ruby-dev
python uwsgiconfig.py --plugin plugins/rack

3.Add startup service

wget --quiet -O /etc/init.d/uwsgi https://mirror.scorpwill.com/init.d/uwsgi chmod +x /etc/init.d/uwsgi

Enable service(debian8)
systemctl enable uwsgi

uwsgi runs as user nginx, install nginx if not.

4.Configure applications

Put configuration files into /etc/uwsgi
mkdir /etc/uwsgi

Configuration for PHP, save as php.ini

[uwsgi]  
plugins = php
socket = /var/tmp/uwsgi_%n.sock
master = true
vaccum = true
lazy-apps = true
disable-logging = true
processes = 4
cheaper = 2
php-allowed-ext = .php
php-allowed-ext = .inc
php-index = index.php
php-set = date.timezone=Asia/Tokyo

Configuration for Django, save as django.ini

[uwsgi]  
plugins = python,gevent
socket = /var/tmp/uwsgi_%n.sock
master = true
vaccum = true
enable-threds = true
disable-logging = true
processes = 4
threads = 2
chdir = /var/www/myproject
module = myproject.wsgi:application

Configuration for Redmine, save as redmine.ini

[uwsgi]  
plugins = rack
socket = /var/tmp/uwsgi_%n.sock
master = true
vaccum = true
lazy-apps = true
disable-logging = true
processes = 2
chdir = /var/www/redmine
rack = config.ru
post-buffering = 4096
buffer-size = 25000
rbrequire = rubygems
rbrequire = bundler/setup
env = PATH=/usr/bin:/usr/local/bin
env = LD_LIBRARY_PATH=/usr/lib:/usr/local/lib
env = BUNDLE_GEMFILE=/var/www/redmine/Gemfile
env = RAILS_ENV=production

Configuration for Trac, save as trac.ini

[uwsgi]  
plugins = python,gevent
socket = /var/tmp/uwsgi_%n.sock
master = true
vaccum = true
enable-threds = true
lazy-apps = true
disable-logging = true
processes = 4
threads = 2
wsgi-file = /var/www/trac/cgi-bin/trac.wsgi

Finally, start uwsgi and reload nginx
service uwsgi start