Skip to content

Instantly share code, notes, and snippets.

@k4ml
Forked from ptone/_webfaction_setup.rst
Created September 17, 2012 02:58
Show Gist options
  • Save k4ml/3735326 to your computer and use it in GitHub Desktop.
Save k4ml/3735326 to your computer and use it in GitHub Desktop.
setting up a stack on webfaction
#user nobody;
worker_processes 2;
# pid ptone-logs/nginx.pid;
# error_log ptone-logs/nginx-error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
# for running via supervisor:
daemon off;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 35;
gzip on;
# Directories
client_body_temp_path tmp/client_body/ 2 2;
fastcgi_temp_path tmp/fastcgi/;
proxy_temp_path tmp/proxy/;
uwsgi_temp_path tmp/uwsgi/;
# Logging
access_log log/nginx-access.log combined;
# teststack server:
include /home/ptone/webapps/teststack/test_project/etc/nginx.conf;
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443;
# server_name localhost;
# ssl on;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_timeout 5m;
# ssl_protocols SSLv2 SSLv3 TLSv1;
# ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
# Note that this file is located in a deploy or etc folder in the django project root
# uWSGI serving Django.
# probably not required in a non-loadbalancing scenario
# upstream django {
# Distribute requests to servers based on client IP. This keeps load
# balancing fair but consistent per-client. In this instance we're
# only using one uWGSI worker anyway.
# ip_hash;
# server unix:/home/ptone/sock/teststack_uwsgi.sock;
# }
server {
# teststack
listen 50218;
server_name nginx.ptone.com;
charset utf-8;
access_log mylogs/teststack.access.log combined;
# Django admin media.
location /static/admin/ {
alias /home/ptone/webapps/teststack/venv/lib/python2.6/site-packages/django/contrib/admin/media/;
}
# Your project's static media.
location /static/ {
alias /home/ptone/webapps/teststack/test_project/media/;
}
# Finally, send all non-media requests to the Django server.
location / {
# uncomment below if you are using the upstream approach
# uwsgi_pass django;
uwsgi_pass unix:/home/ptone/sock/teststack_uwsgi.sock;
include uwsgi_params;
}
}
#! /bin/bash
NAME=supervisord
SUPERVISORD=/home/ptone/bin/supervisord
SUPERVISORCTL=/home/ptone/bin/supervisorctl
PIDFILE=/home/ptone/etc/supervisord.pid
OPTS="-c /home/ptone/etc/supervisord.conf"
PS=$NAME
TRUE=1
FALSE=0
test -x $SUPERVISORD || exit 0
export PATH="${PATH:+$PATH:}/usr/local/bin:/usr/sbin:/sbin:/home/ptone/bin:/home/ptone/sbin:"
isRunning(){
pidof_daemon
PID=$?
if [ $PID -gt 0 ]; then
return 1
else
return 0
fi
}
pidof_daemon() {
PIDS=`pidof -x $PS` || true
[ -e $PIDFILE ] && PIDS2=`cat $PIDFILE`
for i in $PIDS; do
if [ "$i" = "$PIDS2" ]; then
return 1
fi
done
return 0
}
start () {
echo "Starting Supervisor daemon manager..."
isRunning
isAlive=$?
if [ "${isAlive}" -eq $TRUE ]; then
echo "Supervisor is already running."
else
$SUPERVISORD $OPTS || echo "Failed...!"
echo "OK"
fi
}
stop () {
echo "Stopping Supervisor daemon manager..."
$SUPERVISORCTL shutdown || echo "Failed...!"
echo "OK"
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload|force-reload)
stop
start
;;
esac
exit 0
[inet_http_server] ; inet (TCP) server setings
port=127.0.0.1:11672 ; (ip_address:port specifier, *:port for all iface)
username=<user> ; (default is no username (open server))
password=<pass> ; (default is no password (open server))
[supervisord]
logfile=/home/ptone/webapps/supervisor/logs/user/supervisor/supervisord.log ; (main log file ; default $CWD/supervisord.log)
logfile_maxbytes=20MB ; (max main logfile bytes b4 rotation ; default 50MB)
logfile_backups=10 ; (num of main logfile rotation backups ; default 10)
loglevel=debug ; (log level ; default info ; others: debug,warn,trace)
pidfile=/home/ptone/etc/supervisord.pid ; (supervisord pidfile ; default supervisord.pid)
nodaemon=false ; (start in foreground if true ; default false)
minfds=1024 ; (min. avail startup file descriptors ; default 1024)
minprocs=200 ; (min. avail process descriptors ; default 200)
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=http://127.0.0.1:11672
username=<user>
password=<pass>
[program:nginx]
command=nginx
autostart=true
autorestart=true
redirect_stderr=true
exitcodes=0
[program:teststack_uwsgi]
command=uwsgi -p 2 -s /home/ptone/sock/teststack_uwsgi.sock -H /home/ptone/webapps/teststack/venv/ --pythonpath /home/ptone/webapps/teststack/test_project -w wsgi
autostart=true
autorestart=true
redirect_stderr=true
exitcodes=0

Getting your basic python settings sorted out

https://gist.github.com/902200:

mkdir -p ~/bin ~/lib/python2.6/site-packages
easy_install-2.6 --prefix=$HOME pip
pip install virtualenv

Setting up a nginx-uwsgi-django stack

Setting up the webfaction app

create custom port listening app:

cd webapps/teststack/
virtualenv venv
source venv/bin/activate
mkdir pkg
cd pkg

Download and make packages

http://nginx.org/en/download.html#stable_versions

curl http://nginx.org/download/nginx-0.8.54.tar.gz | tar -xvz

uwsgi module included since 0.8.40 nginx

http://projects.unbit.it/uwsgi/wiki/RunOnNginx

upload progress module:

http://github.com/masterzen/nginx-upload-progress-module

git clone https://github.com/masterzen/nginx-upload-progress-module.git

get uwsgi itself: I've found this latest version has compile errors on webfaction while this does not:

curl http://projects.unbit.it/downloads/uwsgi-0.9.6.8.tar.gz | tar -xz
cd uwsgi-x-x-x-x
make -f Makefile.Py26
cp uwsgi $VIRTUAL_ENV/bin/

nginx:

cd ../nginx-0.8.54/
./configure --add-module=../nginx-upload-progress-module/
make

expect to see errors about deprecated sys_errlist: http://nginx.org/en/docs/sys_errlist.html

cp objs/nginx $VIRTUAL_ENV/bin/

Set up Django project

cd out to webapps/<appname>
django-admin.py startproject test_project
cd test_project/
mkdir -p etcs/production
ln -s etcs/production/ ./etc
cd ..
cp pkg/nginx-0.8.54/conf/mime.types test_project/etcs/production/
cp pkg/uwsgi-0.9.6.8/nginx/uwsgi_params test_project/etcs/production/
cd venv
mkdir tmp/ sock/ pid/ log/

get the django project settings and urls set up for admin to work manage.py collectstatic

Get the runtime stuff setup

get project on python path:

cd venv/<site-packages>
ln -s $HOME/webapps/test_project .

start up nginx:

cd $VIRTUAL_ENV
bin/nginx -p `pwd`/ -c ../test_project/etc/nginx.conf

create a wsgi.py file in project root:

import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'test_project.settings'

import django.core.handlers.wsgi

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

get project on python path:

cd $HOME/webapps/teststack/venv/lib/python2.6/site-packages
ln -s $HOME/webapps/teststack/test_project .

startup uwsgi:

cd venv
bin/uwsgi -p 4 -s sock/uwsgi.sock -H `pwd`/ --pythonpath $HOME/webapps/teststack/test_project -w wsgi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment