概念:
-
WSGI,全称 Web Server Gateway Interface,或者 Python Web Server Gateway Interface, 是为 Python 语言定义的 Web 服务器和 Web 应用程序或框架之间的一种简单而通用的接口。自从 WSGI 被开发出来以后,许多其它语言中也出现了类似接口。可以理解为一个标准和规范。
-
很多框架都自带了 WSGI server ,比如 Flask,webpy,Django、CherryPy等等。当然性能都不好,自带的 web server 更多的是测试用途,发布时则使用生产环境的 WSGI server或者是联合 nginx 做 uwsgi 。
-
WSGI:WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx)与应用服务器(如uWSGI服务器)通信的一种规范。uWSGI:是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。要注意 WSGI / uwsgi / uWSGI 这三个概念的区分。WSGI我们已经清楚了是一种通信协议。uwsgi同WSGI一样是一种通信协议。而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。
-
为什么有了uWSGI还需要nginx?因为nginx具备优秀的静态内容处理能力,然后将动态内容转发给uWSGI服务器,这样可以达到很好的客户端响应。
环境:
- python3.5.2
- django1.11.2 (pip3 install django)
- uwsgi2.0.15 (pip3 install uwsgi)
- nginx1.8.1 (yum -y install nginx)
部署:
- 首先确保django程序用自带的WSGI server可以启动;
注意settings.py中的一些配置:
DEBUG = False #关闭调试,默认是开启状态
ALLOWED_HOSTS = ['域名'] #如无域名,可绑定IP地址,如果均为修改服务启动后,将会报错。
LANGUAGE_CODE = 'zh-Hans' #英文语言修改为中文
TIME_ZONE = 'Asia/Shanghai #国际时区设置为上海时区
STATIC_ROOT = os.path.join(BASE_DIR, 'static/') #因为admin所需的js ,css等静态文件都在django的安装目录内,但是我们并没有配置指向Django的配置文件,通过配置此参数来指定静态文件的默认家目录是那里
- 收集静态文件:
python manage.py collectstatic (如果参数STATIC_ROOT 没有配置,此处会报错)
- 找到wsgi.py文件,启动uwsgi:
启动uwsgi :
uwsgi --http :8000 --module hys_cmdb.wsgi
这里只是测试uwsgi是否能够正常启动,后面会使用ini配置文件进行启动。
vi uwsgi.ini --- (启动命令:uwsgi --ini uwsgi.ini)
[uwsgi]
socket = :8800 # 设置端口
chmod-socket = 666
master = true
processes = 2
chdir = /webserver/hys_cmdb/ # 程序主目录
module = hys_cmdb.wsgi # wsgi.py模块相对位置
reload-mercy = 10
vacuum = true
max-requests = 1000
limit-as = 512
buffer-size = 30000
pidfile = /tmp/uwsgi8800.pid
daemonize = /backup/logs/log4j/hys_cmdb/uwsgi9090.log
- 配置nginx配置文件
cat /usr/local/nginx/conf/nginx.conf
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost; # 域名或ip,localhost表示本机ip
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8800;
uwsgi_param UWSGI_SCRIPT hys_cmdb.wsgi;
uwsgi_param UWSGI_CHDIR /webserver/hys_cmdb/;
}
location /static/ {
alias /webserver/hys_cmdb/static/; # 静态文件
}
access_log /backup/logs/nginx/local-access.log main; # 日志
}
}
nginx 启动:/usr/local/nginx/sbin/nginx
nginx 重载: /usr/local/nginx/sbin/nginx -s reload
这样,uwsgi和nginx都启动后,就可以不加端口直接访问了。
uwsgi重载: uwsgi --reload /tmp/uwsgi8800.pid
注:pid文件是在ini文件里设置的。
把nignx设置为服务:
vi /etc/init.d/nginx
#!/bin/bash
#
# chkconfig: 2345 86 14
# Descirption: Nginx Script File
prog="/usr/local/nginx/sbin/nginx"
pfile="/usr/local/nginx/logs/nginx.pid"
if [ $# -ne 1 ];then
echo "Usage:`basename $0` { start | stop | restart | reload | configtest }"
exit 9
fi
case $1 in
start)
$prog
if [ $? -eq 0 ];then
echo "Starting nginx service ..... [ok]"
# create lock file
touch /var/lock/subsys/nginx
fi
;;
stop)
kill `cat $pfile`
if [ $? -eq 0 ];then
echo "Stopping nginx.... [ok]"
fi
;;
restart)
kill `cat $pfile`
echo "Stopping nginx...."
$prog
if [ $? -eq 0 ];then
echo "Starting nginx service ..... [ok]"
# create lock file
touch /var/lock/subsys/nginx
fi
;;
reload)
kill -s HUP `cat $pfile`
;;
configtest)
$prog -t &> /dev/null
if [ $? -eq 0 ];then
echo "Syntax is ok!!!"
else
$prog -t
fi
;;
*)
echo "Usage:`basename $0` { start | stop | restart | reload | configtest }"
;;
esac
chmod 755 /etc/init.d/nginx
chkconfig --add nginx
chkconfig nginx on
service nginx (start|stop|restart|reload)
可以参考:http://code.ziqiangxuetang.com/django/django-nginx-deploy.html