Configuring The Webapp

There are multiple ways to expose the Graphite webapp. The following stack configurations exist:

  • nginx + gunicorn
  • Apache + mod_wsgi
  • nginx + uWSGI

Depending on the configuration you choose, the webapp configuration is slightly different.

nginx + gunicorn

In this setup, nginx will proxy requests for Gunicorn, which will itself listen locally on port 8080 and serve the webapp (Django application).

Install Gunicorn

If you use a virtualenv, you can use pip:

pip install gunicorn

Otherwise, you can use packages for your distribution.

On Debian-based systems, run:

sudo apt install gunicorn

Install nginx

On Debian-based systems, run:

sudo apt install nginx

Configure nginx

We will use dedicated log files for nginx when serving Graphite:

sudo touch /var/log/nginx/graphite.access.log
sudo touch /var/log/nginx/graphite.error.log
sudo chmod 640 /var/log/nginx/graphite.*
sudo chown www-data:www-data /var/log/nginx/graphite.*

Write the following configuration in /etc/nginx/sites-available/graphite:

upstream graphite {
    server fail_timeout=0;

server {
    listen 80 default_server;

    server_name HOSTNAME;

    root /opt/graphite/webapp;

    access_log /var/log/nginx/graphite.access.log;
    error_log  /var/log/nginx/graphite.error.log;

    location = /favicon.ico {
        return 204;

    # serve static content from the "content" directory
    location /static {
        alias /opt/graphite/webapp/content;
        expires max;

    location / {
        try_files $uri @graphite;

    location @graphite {
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_connect_timeout 10;
        proxy_read_timeout 10;
        proxy_pass http://graphite;


Don’t forget to change the server_name to match your actual hostname. You may also adapt other settings to your use case, such as root.

Enable this configuration for nginx:

sudo ln -s /etc/nginx/sites-available/graphite /etc/nginx/sites-enabled
sudo rm -f /etc/nginx/sites-enabled/default

Reload nginx to use the new configuration:

sudo service nginx reload

Apache + mod_wsgi

First, you need to install mod_wsgi.

See the mod_wsgi InstallationInstructions for installation instructions.

Then create the graphite.wsgi. (You can find example of graphite.wsgi file on the conf directory of source ditribution):

# /opt/graphite/conf/graphite.wsgi

import sys
from graphite.wsgi import application

Finally, configure the apache vhost. (You can find example of Graphite vhost configuration in the contrib directory of source ditribution):

# /etc/httpd/conf.d/graphite-vhost.conf

LoadModule wsgi_module modules/

WSGISocketPrefix /var/run/wsgi

Listen 80
<VirtualHost *:80>

    ServerName graphite
    DocumentRoot "/opt/graphite/webapp"
    ErrorLog /opt/graphite/storage/log/webapp/error.log
    CustomLog /opt/graphite/storage/log/webapp/access.log common

    WSGIDaemonProcess graphite-web processes=5 threads=5 display-name='%{GROUP}' inactivity-timeout=120
    WSGIProcessGroup graphite-web
    WSGIApplicationGroup %{GLOBAL}
    WSGIImportScript /opt/graphite/conf/graphite.wsgi process-group=graphite-api application-group=%{GLOBAL}

    WSGIScriptAlias / /opt/graphite/conf/graphite.wsgi

    Alias /static/ /opt/graphite/static/

    <Directory /opt/graphite/static/>
            <IfVersion < 2.4>
                    Order deny,allow
                    Allow from all
            <IfVersion >= 2.4>
                    Require all granted

    <Directory /opt/graphite/conf/>
            <IfVersion < 2.4>
                    Order deny,allow
                    Allow from all
            <IfVersion >= 2.4>
                    Require all granted

Adapt the mod_wsgi configuration to your requirements.

See the mod_wsgi QuickConfigurationGuide for an overview of configurations and mod_wsgi ConfigurationDirectives to see all configuration directives

Restart apache:

$ service httpd restart

Running the webapp with mod_wsgi as URL-prefixed application (Apache)

When using the new URL_PREFIX parameter in the WSGIScriptAlias setting must look like the following (e.g. URL_PREFIX=”/graphite”):

WSGIScriptAlias /graphite /opt/graphite/conf/graphite.wsgi/graphite

The /graphite is needed for Django to create the correct URLs

Nginx + uWSGI

First, you need to install uWSGI with Python support. On Debian, install uwsgi-plugin-python.

Then create the uWSGI file for Graphite-web in /etc/uwsgi/apps-available/graphite.ini:

processes = 2
socket = localhost:8080
gid = www-data
uid = www-data
virtualenv = /opt/graphite
chdir = /opt/graphite/conf
module = wsgi:application

Then create the file

# /opt/graphite/conf/

import sys
from graphite.wsgi import application

Enable graphite.ini and restart uWSGI:

$ ln -s /etc/uwsgi/apps-available/graphite.ini /etc/uwsgi/apps-enabled
$ service uwsgi restart

Finally, configure the nginx vhost:

# /etc/nginx/sites-available/graphite.conf

server {
    listen 80;

    location / {
        include uwsgi_params;
        uwsgi_pass localhost:8080;

Enable the vhost and restart nginx:

$ ln -s /etc/nginx/sites-available/graphite.conf /etc/nginx/sites-enabled
$ service nginx restart

Acnowlegments ————_

Portions of that manual are based on Graphite-API deployment manual.