Installing Cyborg API via WSGI

The Cyborg API is provided as a WSGI application and must be hosted by a standard WSGI server. This document describes how to deploy it using uWSGI. DevStack also uses uWSGI for development.

WSGI Application

The function cyborg.api.wsgi_app.init_application will setup a WSGI application to run behind uwsgi.

Cyborg API behind uwsgi

Create a cyborg-api-uwsgi file with content below:

[uwsgi]
chmod-socket = 666
socket = /var/run/uwsgi/cyborg-wsgi-api.socket
lazy-apps = true
add-header = Connection: close
buffer-size = 65535
hook-master-start = unix_signal:15 gracefully_kill_them_all
thunder-lock = true
plugins = python
enable-threads = true
worker-reload-mercy = 90
exit-on-reload = false
die-on-term = true
master = true
processes = 2
module = cyborg.wsgi.api:application

Start cyborg-api:

# uwsgi --ini /etc/cyborg/cyborg-api-uwsgi.ini

This configuration listens on a Unix socket. Configure an HTTP frontend, such as Apache or nginx, to proxy requests to that socket. The mod_wsgi configuration below is an alternative that hosts the application directly.

Cyborg API behind Apache mod_wsgi

Unlike uWSGI, mod_wsgi does not support the module = cyborg.wsgi.api:application syntax. Instead, configure WSGIScriptAlias with the path to the installed cyborg/wsgi/api.py file. That module exports the WSGI application object.

For example, the following configuration mounts the API at /accelerator:

<VirtualHost *:80>
    ServerName cyborg.example.com

    ErrorLog /var/log/apache2/cyborg-api-error.log
    CustomLog /var/log/apache2/cyborg-api-access.log combined

    WSGIApplicationGroup %{GLOBAL}
    WSGIDaemonProcess cyborg-api user=cyborg group=cyborg \
        processes=2 threads=1
    WSGIProcessGroup cyborg-api
    WSGIScriptAlias /accelerator \
        /usr/lib/python3/dist-packages/cyborg/wsgi/api.py

    <Directory /usr/lib/python3/dist-packages/cyborg/wsgi>
        Require all granted
    </Directory>
</VirtualHost>

The Python module path varies by installation. For example, RPM-based systems and virtual environments commonly install it below a site-packages directory rather than the dist-packages path shown above. Replace the path in both directives with the path used by the Cyborg installation. The mod_wsgi module must also be built for the same Python runtime used to install Cyborg.