jump to navigation

Apache Not Reloading Configuration File / Rewrites Not Updating July 15, 2009

Posted by scoopseven in Apache, Linux.
add a comment

This week I experienced a problem where my apache rewrite rules wouldn’t update or reload.  I would change a 301 redirect or an alias, restart Apache and the changes wouldn’t process. Humph. I got to the point where I started to believe, like DNS, that these redirects where propagated somewhere out on the Internet and they were just happening. Of course, this doesn’t happen.

Our Apache setup contains conf files for several sites, and our main httpd.conf file has a section that includes these conf files:

# Load config files from the config directory "/etc/httpd/conf.d".
Include conf.d/*.conf

What I had done was left a backup config file in the /etc/httpd/conf.d directory, so I had mysite.conf and mysite-20090710.conf being included when Apache loaded.  Weather Apache tried to load both config files or my backup was simply overwriting my real config, I’m not sure, but as soon as I removed the backup config everything started working as normal. From now on, my backup Apache config files will be named mysite.bak!

Django / PythonPath July 8, 2009

Posted by scoopseven in Apache, Django.
add a comment

The post below was taken directly from www.ventanazul.com. I republished only because this solved a problem that was a real PITA for me and wasn’t spelled out too clearly in the Django documentation. If you’re having a problem with Django / Apache / mod_python / PythonPath / sys.path / Could not import module things, give it a try.

The importance of PYTHONPATH

According to the official documentation this is what you need on your Apache’s site configuration to setup Django:

<Location “/mysite/”>
SetHandler python-program
PythonHandler django.core.handlers.modpython
SetEnv DJANGO_SETTINGS_MODULE mysite.settings
PythonOption django.root /mysite
PythonPath “['/path/to/project'] + sys.path”
PythonDebug On
</Location>

Obviously PythonDebug On should not appear, or should be set to Off, on a production environment.

The lines above assume that your Django project is called mysite and the site is on http://example.com/mysite. And even if the documentation mentions how to handle PYTHONPATH via mod_python I didn’t have a clear picture of the whole thing after running my first failed tests.

I decided to setup a site dedicated just to my Django project, you can use name based or IP based virtual hosts on Apache, and I want to access it from the root: http://example.com/. Also, I store all my Python related stuff in /home/alexis/python-work hence the project will be at /home/alexis/python-work/project and its only application below it: /home/alexis/python-work/project/app.

I know there are better ways to organize reusable applications on Django, as James Bennett suggests, but for my project a traditional project/app structure was enough. Anyway, the following ideas can be applied to any setup. Let’s see all the lines I use on Apache to setup a Django site:

<VirtualHost 192.168.0.180>
ServerName example.com
ServerAdmin alexis@example.com
<Location “/”>
SetHandler python-program
PythonHandler django.core.handlers.modpython
SetEnv DJANGO_SETTINGS_MODULE project.settings
PythonDebug On
PythonPath “['/home/alexis/python-work', '/home/alexis/python-work/project'] + sys.path”
</Location>
</VirtualHost>

The IP on VirtualHost, 192.168.0.180, is the private one I’ll be using for this site. I’ve also added 192.168.0.180 example.com in /etc/hosts to avoid changes on the DNS server, something you should do on production.

project.settings refers to the settings.py file inside the /home/alexis/python-work/project directory.

I’ve also removed PythonOption django.root /mysite because this site sits on root, Location “/”, and there’s no need to specify a subdirectory.

And the most important part:

PythonPath “['/home/alexis/python-work', '/home/alexis/python-work/project'] + sys.path”

This is how you add paths to PYTHONPATH via mod_python. Notice we have two paths, one for the parent directory and another for the project, both are needed to get all your imports right. Django’s documentation highlights this:

Remember: the parent directories of anything you import directly must be on the Python path.

After adding these changes you should restart Apache, or possibly just reload, and be able to access your Django site at http://example.com/.