Tuesday 15 May 2012

How-To: Setting up Ec2 and Django

This took me a weekend to figure out so I thought I'd share.

This post will be a step by step guide on installing Django 2.7 on Ec2 (Ubuntu 12.04 LTS, Apache 2.7 with mod_wsgi).

Firstly, some links that were really handy for me.
- http://simonsstuffandthings.blogspot.ca/2011/02/how-to-install-django-on-ubuntu-using.html
- http://ericwconner.com/?p=347
- http://code.google.com/p/modwsgi/wiki/QuickInstallationGuide
- https://docs.djangoproject.com/en/1.4/intro/

And now, on to the tutorial. Hope someone find it useful!

---

1. Launch instance on Ec2 - Ubuntu Server 12.04 LTS (ami-a29943cb) - and do the usual security group (ports 22 and 80) and elastic IP settings. Now SSH into your machine.

2. Update apt-get
$ sudo apt-get update

3. Install Apache
$ sudo apt-get install apache2

4. Install mod_wsgi for apache2.
$ sudo apt-get install libapache2-mod-wsgi

5. Download and install setuptools for Python
$ wget http://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz
$ tar xzf setuptools-0.6c11.tar.gz
$ cd setuptools-0.6c11
$ sudo python setup.py install

6. Download and install pip
$ curl -O https://raw.github.com/pypa/pip/master/contrib/get-pip.py
$ sudo python get-pip.py

7. Install Django
$ sudo pip install django

8. Time to set up a test project, a test site, and the admin site.

9. Create your Django project. In this example, it will be called "myproject", and located in "/usr/local/src/".
$ sudo django-admin.py startproject myproject

10. Make sure httpd.conf looks like below.
$ sudo vi /etc/apache2/httpd.conf
--- /etc/apache2/httpd.conf ---
Alias /static/admin /usr/local/lib/python2.7/dist-packages/django/contrib/admin/static/admin/

WSGIScriptAlias / /var/www/apache/django.wsgi

<Directory /var/www/apache>
Order deny,allow
Allow from all
</Directory>
--- end ---
Note, "/usr/local/lib/python2.7/dist-packages/django/contrib/admin/static/admin/" might be different depending on your installation of Python and Django.

11. Create the django.wsgi referenced in httpd.conf
$ sudo mkdir /var/www/apache
$ sudo vi /var/www/apache/django.wsgi
--- /var/www/apache/django.wsgi ---
import os, sys

root = os.path.join(os.path.dirname(__file__), '/usr/local/src')
sys.path.insert(0, root)
sys.path.append('/var/www')
sys.path.append('/usr/local/src/myproject')
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'

import django.core.handlers.wsgi

application = django.core.handlers.wsgi.WSGIHandler()
--- end ---

12. Change permissions for necessary directories
$ sudo chmod o+r /var/www/apache/django.wsgi
$ sudo chmod o+rx /var/www/apache
$ sudo chmod o+rx /usr/local/src
Note, "/usr/local/src" is the directory that hosts all your Django projects and apps

13. Put this line at the end of "/etc/profile" and "/etc/bash.bashrc"
export PYTHONPATH=/usr/local/src/myproject:$PYTHONPATH
export PYTHONPATH=/usr/local/src:$PYTHONPATH
Note, these lines will change depending on which directory you choose to host your Django project and apps.

14. Restart Apache (you need to do this every time you make Django changes too)
$ sudo /etc/init.d/apache2 restart

15. Go to your website, and you should see the Django "It worked!" page.

16. Now let's set up our mySQL database and its Python adapter.
$ sudo apt-get install mysql-server
$ sudo apt-get install python-mysqldb

17. Log in to mysql and create a database for "myproject"
$ mysql -u root -p
CREATE DATABASE myproject;
GRANT ALL ON myproject.* TO root@localhost;

18. Connect your Django project to your database by editing myproject/settings.py and its database settings

19. Sync your project with your database. Now the database is hooked up.
$ sudo python manage.py syncdb

20. Enable the Django admin site.

21. Go to "myproject/myproject/settings.py" and add "django.contrib.admin" to the INSTALLED_APPS settings. Also add "django.contrib.auth" and "django.contrib.contenttypes"

22. Go to "myproject/myproject.urls.py" and uncomment the following 3 lines to enable admin
(1) from django.contrib import admin
(2) admin.autodiscover()
(3) url(r'^admin/', include(admin.site.urls)),

23. Set up permissions
$ sudo chmod o+r /var/www/apache/django.wsgi
$ sudo chmod o+rx /var/www/apache

24. Now go to "http://<YOUR_IP>/admin" to see your admin site. And that's it!

Thanks for reading!

2 comments:

  1. This is awesome. But when I go to mysite.com/admin I get the 'It worked!' page

    I also needed to run

    pip install MySQL-python

    ReplyDelete
  2. the admin mistake was mine, but the second command was needed. Thanks so much for this post

    ReplyDelete