3 Server Configuration
Noah Petherbridge edited this page 2015-07-09 23:29:13 -07:00

Config File

Rophako uses the YamlSettings module for its configuration. There is a default settings file named defaults.yml; use it for reference to see what options are available.

To configure your site, create a file named settings.yml and define the keys/values that you want to override from the defaults. For example, if the only thing you want to change is the site's name and secret key, the settings.yml can look as simple as this:

rophako:
  site:
    site_name: new-site.com
  security:
    secret_key: helloworld123456

The default config is loaded by the app first and then your custom settings are masked on top, so you only need to include the settings you want to change in the settings.yml. The defaults file is thoroughly commented, so check it out.

For the web server side of things, see Apache and nginx configurations.

Apache Configurations

mod_wsgi

For simple sites you can configure Rophako to run as a mod_wsgi app.

In your Apache configuration:

<VirtualHost *:80>
    ServerName www.example.com
    WSGIDaemonProcess rophako user=www-data group=www-data threads=5 home=/home/www-data/git/rophako
    WSGIScriptAlias / /home/www-data/git/rophako/app.wsgi
    WSGIScriptReloading On
    CustomLog /home/www-data/logs/access_log combined
    ErrorLog /home/www-data/logs/error_log

    <Directory /home/www-data/sites/rophako>
        WSGIProcessGroup rophako
        WSGIApplicationGroup %{GLOBAL}
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

A file named app.wsgi is included in the git repo. Here it is for reference. You may need to make changes to it if you use a different virtualenv:

#!/usr/bin/env python

"""WSGI runner script for the Rophako CMS."""

import sys
import os

# Add the CWD to the path.
sys.path.append(".")

# Use the 'rophako' virtualenv.
activate_this = os.environ['HOME']+'/.virtualenv/rophako/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))

from rophako import app as application

# vim:ft=python

mod_fcgid and mod_rewrite

For Kirsle.net I had a legacy document root full of random static files, so Rophako needed to serve the dynamic pages but let Apache serve all the legacy stuff.

Apache configuration:

# Rophako www.kirsle.net
<VirtualHost *:80>
    ServerName www.kirsle.net
    DocumentRoot /home/kirsle/www
    CustomLog /home/kirsle/logs/access_log combined
    ErrorLog /home/kirsle/logs/error_log
    SuexecUserGroup kirsle kirsle

    <Directory "/home/kirsle/www">
        Options Indexes FollowSymLinks ExecCGI
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>

    <Directory "/home/kirsle/www/fcgi">
        SetHandler fcgid-script
        Options +ExecCGI
        AllowOverride all
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

And in my .htaccess file in my document root:

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /fcgi/index.fcgi/$1 [QSA,L]
    RewriteRule ^$ /fcgi/index.fcgi/ [QSA,L]
</IfModule>

And finally, my FastCGI script. Important things to note:

  • The shebang line points to the Python binary in my virtualenv.
  • I modify sys.path and chdir to my git checkout folder for Rophako.
  • The ScriptNameStripper allows mod_rewrite to work best. Without it you'll sometimes get URL paths like /fcgi/index.fcgi/blog/entry/... etc. from Flask because that's what it thinks its path is.
#!/home/kirsle/.virtualenv/rophako/bin/python

import os
import sys
sys.path.append("/home/kirsle/git/rophako")
os.chdir("/home/kirsle/git/rophako")

from flup.server.fcgi import WSGIServer
from rophako import app

class ScriptNameStripper(object):
    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        environ["SCRIPT_NAME"] = ""
        return self.app(environ, start_response)

app = ScriptNameStripper(app)

if __name__ == "__main__":
    WSGIServer(app).run()

nginx configurations

This is how to get it set up with nginx, supervisor and gunicorn.

supervisor

Install supervisor and create a config file like /etc/supervisor/conf.d/rophako.conf with these contents:

[program:rophako]
command = /home/www-data/.virtualenv/rophako/bin/gunicorn -b 127.0.0.1:9000 wsgi_gunicorn:app
environment = ROPHAKO_SETTINGS="/home/www-data/site/settings.ini"
directory = /home/www-data/git/rophako
user = www-data

Reload supervisor and start your app:

$ supervisorctl reread
$ supervisorctl reload
$ supervisorctl start rophako

nginx config

Add your site to /etc/nginx/sites-available with a config like this:

server {
        server_name www.example.com example.com;
        listen 80;

        root /home/www-data/git/rophako;

        location /static {
                alias /home/www-data/www/static;
        }
        location /favicon.ico {
                alias /home/www-data/www/favicon.ico;
        }

        location / {
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $remote_addr;
                proxy_pass http://127.0.0.1:9000;
        }
}

Start or restart nginx, service nginx restart

Next Step: Configuration and Plugins