Nginx Uwsgi Supervisor and Celery


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# 先殺掉不用的東西
killall php-fpm
killall mysqld

# 檢查 Nginx 版本是否在 nginx-0.8.40 以上
# 以上就不用安裝 uwsgi 模組了
/usr/local/nginx/sbin/nginx -v

# 安裝必要的 Python 2.7.4
# - 不取代原有系統的 python
# - 另取名為 python2.7
cd ~/server
wget wget http://python.org/ftp/python/2.7.3/Python-2.7.3.tar.bz2
tar xvf Python-2.7.4.tar.bz2
cd Python-2.7.4
./configure --prefix=/usr/local
make && make altinstall

cd ..
wget https://pypi.python.org/packages/source/d/distribute/distribute-0.6.36.tar.gz
tar zxvf distribute-0.6.36.tar.gz
cd distribute-0.6.36
python2.7 setup.py install

# 安裝 redis
cd ..
wget http://redis.googlecode.com/files/redis-2.6.12.tar.gz
tar zxvf redis-2.6.12.tar.gz
cd redis-2.6.12
make PREFIX=/usr/local/redis install
cp redis.conf /usr/local/redis/
mkdir -p /usr/local/redis/{var/run,log,snapshot}
vim /usr/local/redis/redis.conf

daemonize yes
pidfile /usr/local/redis/var/run/redis.pid
logfile /usr/local/redis/log/redis.log
dir /usr/local/redis/snapshot/

# 安裝 Application
mkdir -p /home/user/python
unzip appname.zip
cd appname
virtualenv-2.7 --no-site-package venv
source ./venv/bin/activate
pip install -r requirements.txt
cd /home/user
chown -Rf user:user python

# 安裝 supervisor
easy_install-2.7 supervisor
mkdir -p /usr/local/supervisor/{etc,site,log}
echo_supervisord_conf > /usr/local/supervisor/etc/supervisord.conf
vim /usr/local/supervisor/etc/supervisord.conf

[include]
files = /usr/local/supervisor/site/*.ini

vim /usr/local/supervisor/site/python-appname.ini

[program:appname-celeryd]
command=/home/user/python/appname/venv/bin/celery worker --app=tube.tasks.base -l debug
directory=/home/user/python/appname
environment=PYTHONPATH="/home/user/python/appname:/home/user/python/appname/venv/lib/python2.7:/home/user/python/appname/venv/lib/python2.7/site-packages:$PYTHONPATH"
user=user
numprocs=1
stdout_logfile=/usr/local/supervisor/log/appname-celeryd.out.log
stderr_logfile=/usr/local/supervisor/log/appname-celeryd.err.log
autostart=true
autorestart=true
startsecs=10
stopwaitsecs=600

# 安裝 uwsgi
cd ..
wget http://projects.unbit.it/downloads/uwsgi-1.9.8.tar.gz
tar zxvf uwsgi-1.9.8.tar.gz
cd uwsgi-1.9.8
python2.7 uwsgiconfig.py --build

mkdir /usr/local/uwsgi
cp ./uwsgi /usr/local/uwsgi/

# 建立設定檔
vim /usr/local/uwsgi/python-appname.ini

[uwsgi]
chmod = 666
pidfile = /usr/local/uwsgi/python-appname.pid
daemonize = /usr/local/uwsgi/python-appname.log
socket = /tmp/uwsgi-python-appname.sock
chdir = /home/user/python/appname
virtualenv = /home/user/python/appname/venv
touch-reload = /home/user/python/appname/reload.ini
uid = 500
gid = 500
module = manager
callable = app
processes = 4
threads = 2
stats = 127.0.0.1:9191

# 啟動 USWGI 中的 Web Server 設定
/usr/local/uwsgi/uwsgi /usr/local/uwsgi/python-appname.ini

# 停上 USWGI 中的 Web Server 設定
# 如無效可用 "killall -9 uwsgi"
/usr/local/uwsgi/uwsgi --stop /usr/local/uwsgi/python-appname.pid

# 重新讀取 USWGI 中的 Web Server 設定
/usr/local/uwsgi/uwsgi --reload /usr/local/uwsgi/python-appname.pid

# 啟動 Redis
/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf

# 啟動 Supervisor 和裡面的 Celery
/usr/local/bin/supervisord -c /usr/local/supervisor/etc/supervisord.conf

# 管理 Supervisor
/usr/local/bin/supervisorctl -c /usr/local/supervisor/etc/supervisord.conf

# 編輯 Nginx
mkdir /usr/local/nginx/conf/vhost
vim /usr/local/nginx/conf/vhost/sub.domain.com.conf

server {
listen 80;
server_name pet.zeuik.com;

location / {
include uwsgi_params;
uwsgi_pass unix:/tmp/uwsgi-python-appname.sock;
}
}
參考: