Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Django stack setup on EC2 AMI

Django Stack

Overview

This is a set of instructions to setup a Django Nginx Gunicorn MySQL/Postgres stack on a single Amazon EC2 instance.

Server - AWS

  • Create an EC2 instance, choose the Amazon AMI type - it's a CentOS flavour.

  • Download the .pem file

  • To connect to the server over SSH:

      ssh -i PEMSFILE  ec2-user@domain
    

    e.g.

      ssh -i ~/pems_files/myfile.pem ec2-user@ec2-54-247-136-3.eu-west-1.compute.amazonaws.com
    

Open ports in ec2 security group:

22 (SSH)
80 (HTTP)
3306 (MYSQL) -- TESTING DB -- DANGER
8000 (Django/Gunicorn) -- TESTING

make sure everything is up to date:

sudo yum update

nginx

Install:

sudo yum install nginx

sudo vim /etc/nginx/conf.d/MY-PROJECT.conf

conf file:

server {
	listen   80;
	server_name staging.project_name.co.pt;
	# no security problem here, since / is alway passed to upstream
	root /srv/www/project_name/checkout/website;
	# serve directly - analogous for static/staticfiles

	location / {
        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://localhost:8000/;
	}
	# what to serve if upstream is not available or crashes
    error_page 500 502 503 504 /media/50x.html;
}

init script:

sudo  /sbin/chkconfig nginx on

start:

sudo service nginx start

MySQL

sudo yum -y install mysql mysql-server 

sudo  /sbin/chkconfig mysqld on

sudo service mysqld start

sudo mysqladmin -u root password 'new-password'

mysql -u root -p

mysql> create database MY-PROJECT;

[local access - safer]
mysql> GRANT ALL ON project_name.* TO user@'localhost' IDENTIFIED BY 'sga 	rcez';

[remote access]
mysql> GRANT ALL ON project_name.* TO user@'%' IDENTIFIED BY 'user';

mysql> FLUSH PRIVILEGES;

control:

security:

[removes the test database]
mysql> DROP DATABASE test;

[Removes anonymous access]
mysql> DELETE FROM mysql.user WHERE user = ;

mysql> FLUSH PRIVILEGES;

Project

mkdir /srv/www/project_name

sudo chown ec2-user project_name

git clone git@github.com:user/project_name.co.pt.git checkout

install virtualenv:

sudo easy_install virtualenv

make a virtualenv:

cd /srv/www/project_name

virtualenv --no-site-packages env

start it:

source env/bin/activate

install package manager:

sudo easy_install pip

probably not needed:

sudo yum install python-imaging
sudo yum install freetype-devel
sudo yum install gcc
sudo yum install python-devel
sudo yum install python26* mysql-devel

example requirements.txt in project folder:

    Django==1.3.1
    gunicorn==0.13.4
    MySQL-python==1.2.3

install:

pip install -r requirements.txt

test Django

#to test the base setup - open port 8000 in sec group
python manage.py runserver 0.0.0.0:8000

#test gunicorn
gunicorn_django -b 0.0.0.0:8000

make gunicorn script in project folder (http://senko.net/en/django-nginx-gunicorn/)

#!/bin/bash
set -e
LOGFILE=/var/log/gunicorn/project_name.log
LOGDIR=$(dirname $LOGFILE)
NUM_WORKERS=3
# user/group to run as
USER=ec2-user
GROUP=ec2-user
cd /srv/www/project_name/checkout/website
source ../../env/bin/activate
test -d $LOGDIR || mkdir -p $LOGDIR
exec gunicorn_django -w $NUM_WORKERS \
--user=$USER --group=$GROUP --log-level=debug \
--log-file=$LOGFILE 2>>$LOGFILE

# for local add to the above: --bind 0.0.0.0:8000

chmod ug+x run_gunicorn.sh

sudo chown ec2-user /var/log/gunicorn/

Supervisor

This controls Gunicorn

sudo easy_install supervisor

sudo vim /etc/supervisord.conf

    echo_supervisord_conf > /etc/supervisord.conf
    
# note: this doesn't work for some reason; echo_supervisord_conf then copy the output into a new file at /etc/supervisord.conf

#append :

[program:project_name]
directory = /srv/www/project_name/checkout/website/
user = ec2-user
command = /srv/www/project_name/checkout/website/run_gunicorn.sh

stdout_logfile = /var/log/supervisor/stout.log
stderr_logfile = /var/log/supervisor/error.log

create new file /etc/rc.d/init.d/supervisord

create empty files at /var/log/supervisor/stout.log /var/log/supervisor/error.log

tell linux to start supervisor on reboot chkconfig --add supervisord

sudo /sbin/chkconfig supervisord on

add script to /ect/init.d/supervisord: http://serverfault.com/questions/96499/how-to-automatically-start-supervisord-on-linux-ubuntu/259230#259230

sudo chmod +x /etc/init.d/supervisord

sudo chkconfig --add supervisord

sudo /etc/init.d/supervisord status

# stop nginx
sudo service nginx stop

sudo /etc/init.d/supervisord start
or
sudo service supervisord start

restart nginx:

sudo service nginx start

References:

http://senko.net/en/django-nginx-gunicorn/ http://davidpoblador.com/run-django-apps-using-gunicorn-and-nginx/

@fabre-thibaud

This comment has been minimized.

Copy link

fabre-thibaud commented Jan 14, 2015

I'm using your Gist (2+ years later :D) as I was looking for a way to install supervisor as a service on Amazon AMI. The command that works for echo_supervisord_conf is:

sudo bash -c 'echo_supervisord_conf > /etc/supervisord.conf'

Thanks for the guide anyways

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.