Permalink
Fetching contributors…
Cannot retrieve contributors at this time
280 lines (180 sloc) 7.29 KB

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 127.0.0.1:8080 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;
    }
}

Note

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
sys.path.append('/opt/graphite/webapp')
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/mod_wsgi.so

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-web 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>
            <IfVersion >= 2.4>
                    Require all granted
            </IfVersion>
    </Directory>

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

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 local_settings.py 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:

[uwsgi]
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 wsgi.py:

# /opt/graphite/conf/wsgi.py

import sys
sys.path.append('/opt/graphite/webapp')
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 /static/ {
        alias /opt/graphite/webapp/content/;
    }

    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.