Deployment ---------- Isso ships with a built-in web server, which is useful for the initial setup and may be used in production for low-traffic sites (up to 20 requests per second). Running a "real" WSGI server supports nice things such as UNIX domain sockets, daemonization and solid HTTP handler while being more stable, secure and web-scale than the built-in web server. * gevent_, coroutine-based network library * uWSGI_, full-featured uWSGI server * gunicorn_, Python WSGI HTTP Server for UNIX * mod_wsgi_, Apache interface to WSGI * mod_fastcgi_, Apache interface to FastCGI * uberspace.de, `try this guide (in german) `_ `gevent `__ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Probably the easiest deployment method. Install with PIP (requires libevent): .. code-block:: sh $ pip install gevent Then, just use the ``isso`` executable as usual. Gevent monkey-patches Python's standard library to work with greenlets. To execute Isso, just use the commandline interface: .. code-block:: sh $ isso -c my.cfg run Unfortunately, gevent 0.13.2 does not support UNIX domain sockets (see `#295 `_ and `#299 `_ for details). `uWSGI `__ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Isso has special support for uWSGI, namely fast IPC caching, job spooling and delayed jobs. It is the author's choice, but not the only one. You need uWSGI 1.9 or higher, fortunately you can install it from PyPi: .. code-block:: sh ~> apt-get install build-essential python-dev ~> pip install uwsgi For convenience, I recommend a INI-style configuration (you can also supply everything as command-line arguments): .. code-block:: ini [uwsgi] http = :8080 master = true ; set to `nproc` processes = 4 cache2 = name=hash,items=1024,blocksize=32 ; you may change this spooler = /tmp/isso/mail module = isso.run ; uncomment if you use a virtual environment ; virtualenv = /path/to/isso env = ISSO_SETTINGS=/path/to/isso.cfg Then, create the spooling directory and start Isso via uWSGI: .. code-block:: sh ~> mkdir /tmp/isso/mail ~> uwsgi /path/to/uwsgi.ini `gunicorn `__ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Gunicorn 'Green Unicorn' is a Python WSGI HTTP Server for UNIX with a pre-fork worker ported from Ruby's Unicorn project. Install gunicorn_ via PIP: .. code-block:: sh $ pip install gunicorn To execute Isso, use a command similar to: .. code-block:: sh $ export ISSO_SETTINGS="/path/to/isso.cfg" $ gunicorn -b localhost:8080 -w 4 --preload isso.run `mod_wsgi `__ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. note:: This information may be incorrect, if you have more knowledge on how to deploy Python via `mod_wsgi`, consider extending/correcting this section. For more information, see `Flask: Configuring Apache `_. .. code-block:: apache ServerName example.org WSGIDaemonProcess isso user=www-data group=www-data threads=5 WSGIScriptAlias / /var/www/isso.wsgi Next, copy'n'paste to `/var/www/isso.wsgi`: .. code-block:: python from isso import make_app from isso.core import Config application = make_app(Config.load("/path/to/isso.cfg")) Also make sure, you set a static key because `mod_wsgi` generates a session key per thread/process. This may result in random 403 errors when you edit or delete comments. .. code-block:: ini [general] ; cat /dev/urandom | strings | grep -o '[[:alnum:]]' | head -n 30 | tr -d '\n' session-key = superrandomkey1 `mod_fastcgi `__ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. note:: This information may be incorrect, if you have more knowledge on how to deploy Python via `mod_fastcgi`, consider extending/correcting this section. For more information, see `Flask: Configuring Apache `_. .. code-block:: apache LoadModule fastcgi_module /usr/lib64/httpd/modules/mod_fastcgi.so FastCgiServer /var/www/html/yourapplication/app.fcgi -idle-timeout 300 -processes 5 ServerName example.org AddHandler fastcgi-script fcgi ScriptAlias / /var/www/isso.fcgi SetHandler fastcgi-script Next, copy'n'paste to `/var/www/isso.fcgi` (or whatever location you prefer): .. code-block:: python #!/usr/bin/env python from isso import make_app from isso.core import Config from flup.server.fcgi import WSGIServer application = make_app(Config.load("/path/to/isso.cfg")) WSGIServer(application).run() Similar to mod_wsgi_, set a static session key if you are using more than one process to avoid random errors. .. code-block:: ini [general] ; cat /dev/urandom | strings | grep -o '[[:alnum:]]' | head -n 30 | tr -d '\n' session-key = superrandomkey1