系統:Ubuntu 14.04 LTS
搭建python的運行環境:Nginx+Supervisor+Pypy+Virtualenv
軟件說明:
Nginx:通過upstream進行負載均衡
Supervisor:管理python進程
Pypy:用Python實現的Python解釋器PyPy is a fast, compliant alternative implementation of the Python language (2.7.6 and 3.2.3).
Virtualenv:搭建python虛擬環境
環境搭建:
安裝pypy:
Shell
sudo apt-get install pypy
1sudoapt-getinstallpypy
安裝virtualenv:
Shell
sudo apt-get install virtualenv
1sudoapt-getinstallvirtualenv
創建pypy+virtualenv虛擬環境:
Shell
#在當前目錄下創建PYPYENV
virtualenv -p /usr/bin/pypy PYPYENV
cd PYPYENV
1
2
3#在當前目錄下創建PYPYENV
virtualenv-p/usr/bin/pypyPYPYENV
cdPYPYENV
導出原有 python 安裝的包列表:
Shell
pip freeze > list.txt
1pipfreeze>list.txt
進入virtualenv(PYPYENV)虛擬環境,同時導入list.txt列表:
Shell
source bin/activate
pip install -r list.txt
1
2sourcebin/activate
pipinstall-rlist.txt
退出virtualenv虛擬環境:
Shell
deactivate
1deactivate
安裝 supervisor:
Shell
sudo apt-get install supervisor
1sudoapt-getinstallsupervisor
配置supervisor:
Shell
vim /etc/supervisor/supervisord.conf
1vim/etc/supervisor/supervisord.conf
添加
Shell
[inclue]
files=conf.d/*.conf
1
2[inclue]
files=conf.d/*.conf
Shell
vim /etc/supervisor/conf.d/xxxx.conf
1vim/etc/supervisor/conf.d/xxxx.conf
代碼示例:
Shell
[program:blog]
command= runinenv.sh /pathaa/PYPYENV python /pathbb/xxx.py --port=80%(process_num)02d --log_file_prefix=/tmp/xxx-80%(process_num)02d.log
directory=/path
numprocs=4
process_name=%(program_name)s-80%(process_num)02d
autostart=true
autorestart=true
startsecs=3
stdout_logfile=/tmp/xxx.log
stderr_logfile=/tmp/xxxerror.log
1
2
3
4
5
6
7
8
9
10[program:blog]
command=runinenv.sh/pathaa/PYPYENVpython/pathbb/xxx.py--port=80%(process_num)02d--log_file_prefix=/tmp/xxx-80%(process_num)02d.log
directory=/path
numprocs=4
process_name=%(program_name)s-80%(process_num)02d
autostart=true
autorestart=true
startsecs=3
stdout_logfile=/tmp/xxx.log
stderr_logfile=/tmp/xxxerror.log
runinenv.sh文件代碼示例:
Shell
#!/bin/bash
VENV=$1
if [ -z $VENV ]; then
echo "usage:runinenv [virtualenv_path] CMDS"
exit 1
fi
source ${VENV}/bin/activate
shift 1
echo "Executing $@ in ${VENV}"
exec "$@"
deactivate
1
2
3
4
5
6
7
8
9
10
11#!/bin/bash
VENV=$1
if[-z$VENV];then
echo"usage:runinenv [virtualenv_path] CMDS"
exit1
fi
source${VENV}/bin/activate
shift1
echo"Executing $@ in ${VENV}"
exec"$@"
deactivate
supervisor管理
啟動:
Shell
sudo supervisord
1sudosupervisord
管理:
Shell
sudo supervisorctl
supervisord > reload
supervisord > status
supervisord > start
supervisord > stop
1
2
3
4
5
6sudosupervisorctl
supervisord>reload
supervisord>status
supervisord>start
supervisord>stop
安裝Nginx:
Shell
sudo apt-get install nginx sudo /etc/init.d/nginx start
1sudoapt-getinstallnginxsudo/etc/init.d/nginxstart
瀏覽器訪問localhost即可看到Welcome to Nginx。
修改nginx配置:
Shell
vim /etc/nginx/sites-available/default
1vim/etc/nginx/sites-available/default
Shell
#在http中添加
upstream xxxx{
ip_hash;
server localhost:8001;
server localhost:8002;
server localhost:8003;
server localhost:8004;
……
}
#在server中修改:
location / {
proxy_pass http://xxxx
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14#在http中添加
upstreamxxxx{
ip_hash;
serverlocalhost:8001;
serverlocalhost:8002;
serverlocalhost:8003;
serverlocalhost:8004;
……
}
#在server中修改:
location/{
proxy_passhttp://xxxx
}
nginx壓力測試:
Shell
sudo apt-get install apache2-utils
# 并發數1000,總請求數10000
ab -c 1000 -n 10000 http://localhost/
1
2
3
4sudoapt-getinstallapache2-utils
# 并發數1000,總請求數10000
ab-c1000-n10000http://localhost/
參考資料:
1 、使用 ab 進行測試 nginx 時,結果發現 Failed requests 很大,查看日志( /var/log/nginx/error.log ),發現錯誤是: socket() failed (24: Too many open files),參考這里;
2、Nginx中的一些優化