OpenShift Advanced Python Cartridge
Inspired by the Advanced Ruby Cartridge this cartridge attempts to add support for the various WSGI-compliant python servers to the OpenShift platform. It does this by combining a modified python cartridge with the downloadable Nginx cartridge as a reverse proxy.
The official python cartridge uses Apache and mod_wsgi to serve your app which isn't asynchronous and presents a problem for websockets. An alternative is to provide an app.py file which allows you to avoid mod_wsgi and use something like gevent, but that elimintates the ability to serve static files through a fast webserver like Apache or Nginx.
To install this cartridge use the cartridge reflector when creating an app
rhc create-app myapp http://cartreflect-claytondev.rhcloud.com/reflect?github=gsterjov/openshift-advanced-python-cartridge
Using the cartridge isn't very different to the official python cartridge. Instead of providing a WSGI
application() function at
wsgi/application you instead provide the
application() function at
app.py. This file will be used directly by all the available servers.
By default wsgiref is used so a working environment can be provided immediately. This is easily changed by setting the
OPENSHIFT_PYTHON_SERVER environment variable and then restarting or redeploying the app.
rhc env set OPENSHIFT_PYTHON_SERVER=gunicorn rhc app restart
Be aware, however, that restarting/redeploying after changing servers for the first time might take a fair amount of time. This is because the server packages get compiled and installed on an as needed basis. Gevent and Gunicorn (which is configured to use gevent as its workers), for example, needs to be compiled within the app as OpenShift doesn't provide it as a system level package.
There is little to no configuration required as most of the details lay in the interaction between Nginx and the WSGI server package. All that is required is to define the
application() function in
Any configuration for the server package will be exposed via environment variables.
OPENSHIFT_PYTHON_WORKERS - The number of workers to spawn for packages like gunicorn.
number of CPUs * 2 + 1
Static files will be served from the
public/ directory. These files will be served directly by Nginx.
Web socket support is enabled in Nginx, however it does little more than passing the requests through with the appropriate upgrade headers. More complex websocket environments will need to go for the customised
In the future there might be a nicer way to support websockets as a completely separate server. For example, the application might be served out by gunicorn, but websocket services served out with twisted or tornado. These are purely thoughts at the moment however.
Like the standalone Nginx cartridge, its possible to provide your own server configuration to be included in the main
nginx.conf file. A sample is provided in the cloned repo as
nginx.conf.erb.sample. Simply remove the .sample suffix and commit the changes.
nginx.conf.erb will be processed and included in the main configuration every time the server starts.