Last month I posted a blog article called Running a Flask application under the Apache WSGI module. I detailed all the steps when running on a typical Ubuntu/Debian machine. Today however, I thought I’d try and do the same setup on my mac. There were a few gotchas, which is why I’m writing this. As with most things Mac, I can’t promise this as a guide for everyone, just it worked for me and hopefully it will for you.
Ok, so before I get started, I’ve only performed this setup on OS X 10.9.4, one of the problems I had, was not a problem in versions prior to OS X 10.8. However if you’re that out of date, you might want to upgrade anyway.
For the most part, setting up a Flask application is the same as on Ubuntu/Debian. You create virtualhosts in different locations on OS X (/etc/apache2/extra/httpd-vhosts.conf), the virtualhost itself is also marginally different (more on this below). The part that is majorly different is getting the WSGI module installed. On linux it was as simple as running:
# Install WSGI module $ sudo aptitude install libapache2-mod-wsgi # Restart Apache $ /etc/init.d/apache2 restart
As you probably know, aptitude doesn’t exist on OS X, instead there are multiple package managers you can use instead like Homebrew or Macports. In this article I’m going to use Homebrew. So if you haven’t got that installed yet, you can find a simple command on their website which you can run to install Homebrew. Currently that command is:
$ ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
Next we need to install the mod_wsgi Apache module, using our new Homebrew tool. Before we can do that, we have to fix a bug in OS X by symlinking our xCode toolchain (on OSX 10.8 or higher ONLY). Don’t worry about this to much, it’s just Apple being crap again. Copy, paste, forget, continue.
# Change into the toolchain directory $ cd /Applications/Xcode.app/Contents/Developer/Toolchains/ # Create the symlink $ sudo ln -s XcodeDefault.xctoolchain OSX10.9.xctoolchain
Now we can install the mod_wsgi Apache module using Homebrew
$ brew install mod_wsgi
Next we need to load the mod_wsgi module into Apache using our httpd.conf file (usually located at /etc/apache2/httpd.conf) Add this line next to the other LoadModule calls.
$ LoadModule wsgi_module /usr/local/Cellar/mod_wsgi/3.4/libexec/mod_wsgi.so
Restart Apache
$ sudo apachectl restart
Virtualhost differences
Although the virtual host follows almost the exact same forgot. Apple does have its quirks, like having to wrap every in quotes. We also do not need to set the home argument on WSGIDaemonProcess. Here are the example of the Linux and OS X virtualhosts for comparison
# Linux <virtualhost *:80> ServerName my.webtool WSGIDaemonProcess webtool user=flask group=www-data threads=5 home=/var/www/prod-webtool/ WSGIScriptAlias / /var/www/prod-webtool/webtool.wsgi <directory /var/www/prod-flask> WSGIProcessGroup webtool WSGIApplicationGroup %{GLOBAL} WSGIScriptReloading On Order deny,allow Allow from all </directory> </virtualhost>
# OS X <virtualhost *:80> ServerName my.webtool WSGIDaemonProcess webtool user=flask group=www-data threads=5 WSGIScriptAlias "/" "/var/www/prod-webtool/webtool.wsgi" <directory "/var/www/prod-flask"> WSGIProcessGroup webtool WSGIApplicationGroup %{GLOBAL} WSGIScriptReloading On Order deny,allow Allow from all </directory> </virtualhost>
Final thoughts
Ok, so that was all pretty simple right? If this doesn’t work for you, sorry, leave a comment and I’ll try to help. As new versions of OS X are released I’ll try to update this blog post.
The rest of the setup is exactly the same as for Ubuntu/Debian, so read that article for information on configuring WSGI for Apache and your application.
7 Love This
You are using an old mod_wsgi version. More recent versions should not require you to fiddle around in the compiler toolchain directory.
Hey, I knew I had seen your name somewhere, Google confirmed where, so thanks for the reply. What is your recommended way of installing mod_wsgi? As far as I can tell Homebrew doesn’t allowed upgrading mod_wsgi, beyond version 3.4. Using a newer version would be great and I could then update this blog. Thanks.
Don’t use Homebrew. Try using mod_wsgi express instead:
https://pypi.python.org/pypi/mod_wsgi
Hi i need many help to my project i have a server in windows and run very well,i have to install in MAC Yosemite but the controller.wsgi not run.Any idea? my question is in stackoverflow http://stackoverflow.com/questions/30806955/wsgi-apache-in-mac-os-yosemite i try all,but nothing run…
I checked the SO thread you posted, it looks like you found a solution 🙂
Thanks Simon, this helped me. I’m new to CGI so a couple of things weren’t clear to me. Here are a couple of tips for other people. I am not using Flask.
1. The script must end in .wsgi (not .py or .cgi)
2. wsgi looks for a function called ‘application’. Here’s a sample file that worked for me (without the and
tags of course, if those get published)
#!/usr/bin/python
def application(environ, start_response):
status = '200 OK'
output = 'Hello World!'
response_headers = [('Content-type', 'text/plain'),
('Content-Length', str(len(output)))]
start_response(status, response_headers)
return [output]
Hi pal, thanks for sharing your knowledge. There is no doubt in my mind, the majority of problems with WSGI are caused by tinniest of mix-up.
Regarding your 2nd point. Maybe I didn’t make it super clear. I wrote an article previous to this one, on running flask on a Debianesque OS, which covers exactly what you’re talking about. Maybe I should have put the content in both articles – http://www.jakowicz.com/flask-apache-wsgi/