安装环境介绍:
python2.7.10
django1.7.9
linux CentOS release 6.5 (Final) 64
1、uwsgi安装与配置
tar xvzf uwsgi-2.0.14.tar.gz
cd uwsgi-2.0.14
python setup.py install
uwsgi配置
参考 django官方网站地址(How to use Django with uWSGI):
https://docs.djangoproject.com/en/1.10/howto/deployment/wsgi/uwsgi/
a、mysite/uwsgi.py (django网站start_project生成,稍微做了下修改)
import sys
import os
p = os.path.abspath(os.path.dirname(__file__))
sys.path.insert(0, os.path.split(p)[0])
os.environ["DJANGO_SETTINGS_MODULE"] = "mysite.settings"
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
b、uwsgi.ini配置
[uwsgi]
chdir=/var/www/myweb
module=mysite.wsgi:application
master=True
pidfile=/tmp/myweb.pid
vacuum=True
max-requests=5000
processes= 3
listen = 65535
workers = 24
socket=127.0.0.1:8000
daemonize=/var/log/uwsgi/myweb.log
c、通过普通用户启动
/usr/local/python/bin/uwsgi --ini uwsgi.ini
2、nginx的安装与配置
安装:
./configure
make
make install
配置:
server {
listen 6666;
location / {
uwsgi_send_timeout 600;
uwsgi_connect_timeout 600;
uwsgi_read_timeout 1800;
uwsgi_pass 127.0.0.1:8000; #uwsgi启动的地址和端口
include uwsgi_params; #uwsgi参数
client_max_body_size 1000m; #上传包的大小
}
location /media/ { #静态文件
alias /var/www/myweb/static/;
}
location /static/ { #静态文件
alias /var/www/myweb/static/;
}
}
3、其他
nginx重新加载 -- root权限
/usr/local/nginx/sbin/nginx -s reload
nginx 杀死 -- root权限
/usr/local/nginx/sbin/nginx -s stop
nginx启动 -- root权限
/usr/local/nginx/sbin/nginx -s start
uwsgi 重新加载 ---- 普通用户权限就可以了
uwsgi --reload /tmp/myweb.pid
或者
kill -HUP `cat /tmp/myweb.pid`
4、supervisor
使用了 supervisor ,uwsgi.ini 中就不要使用 --daemonize 这个参数了
[program:myweb_uwsgi]
command=/usr/local/python/bin/uwsgi --ini /var/www/myweb/uwsgi.ini #写绝对路径
autostart = true
startsecs = 5
user=test
redirect_stderr = true
stdout_logfile_maxbytes = 20MB
stdout_logfile_backups = 20
stdout_logfile =/var/log/uwsgi/myweb.log
5、部署后台命令配置
/usr/local/python/bin/uwsgi --reload /tmp/myweb.pid;sudo /usr/local/nginx/sbin/nginx -s reload
6、由于使用uwsgi协议老是假死,改用http协议,配置如下
6.1、uwsgi.ini配置
[uwsgi]
chdir=/var/www/myweb
module=mysite.wsgi:application
master=True
pidfile=/tmp/myweb.pid
vacuum=True
max-requests=5000
workers =24 #4*cpu
listen = 65535
threads = 5
http-socket=127.0.0.1:8000 #主要改动是这个
env = LANG=en_US.UTF-8
env = LANGUAGE=en_US.UTF-8
daemonize=/var/log/uwsgi/myweb.log
6.2 nginx 配置
uwsgi_send_timeout 600; # 指定向uWSGI传送请求的超时时间,完成握手后向uWSGI传送请求的超时时间。 uwsgi_connect_timeout 600; # 指定连接到后端uWSGI的超时时间。
uwsgi_read_timeout 600; # 指定接收uWSGI应答的超时时间,完成握手后接收uWSGI应答的超时时间。
根据自己的情况配置
server {
listen 6666;
location / {
uwsgi_send_timeout 600;
uwsgi_connect_timeout 600;
uwsgi_read_timeout 1800;
uwsgi_pass 127.0.0.1:8001;
include uwsgi_params;
client_max_body_size 1000m;
}
location /media/ {
alias /var/www/myweb/static/;
}
location /static/ {
alias /var/www/myweb/static/;
}
}
8、调优
a、linux
修改linux系统监听队列的大小
vim /etc/sysctl.conf
net.core.somaxconn = 2048 (默认 128 建议 1024 或者更大 2048 )
生效
sysctl -p
b、 uwsgi
workers = 24 # 并发处理进程数
listen = 65535 # 并发的socket 连接数。默认为100。优化需要根据系统配置
在做优化之前,发现并发数过不了100.原因就是这里,uwsgi 的socket 默认链接为100.
c、nginx
worker_processes xx; #可以设置成cpu个数,体验较佳的性能
worker_cpu_affinity 0001 0010 0100 1000; #应用多核优势