python django+uwsgi+nginx

概念:
  1. WSGI,全称 Web Server Gateway Interface,或者 Python Web Server Gateway Interface, 是为 Python 语言定义的 Web 服务器和 Web 应用程序或框架之间的一种简单而通用的接口。
    自从 WSGI 被开发出来以后,许多其它语言中也出现了类似接口。可以理解为一个标准和规范。
  2. 很多框架都自带了 WSGI server ,比如 Flask,webpy,Django、CherryPy等等。当然性能都不好,自带的 web server 更多的是测试用途,发布时则使用生产环境的 WSGI server或者是联合 nginx 做 uwsgi 。
  3. WSGI:WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx)与应用服务器(如uWSGI服务器)通信的一种规范。
    uWSGI:是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
    要注意 WSGI / uwsgi / uWSGI 这三个概念的区分。
    WSGI我们已经清楚了是一种通信协议。
    uwsgi同WSGI一样是一种通信协议。
    而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。
  4. 为什么有了uWSGI还需要nginx?
    因为nginx具备优秀的静态内容处理能力,然后将动态内容转发给uWSGI服务器,这样可以达到很好的客户端响应。
 
环境:
  1. python3.5.2  
  2. django1.11.2 (pip3 install django)
  3. uwsgi2.0.15   (pip3 install uwsgi)
  4. nginx1.8.1   (yum -y install nginx)
 
 
部署:
  1. 首先确保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的配置文件,通过配置此参数来指定静态文件的默认家目录是那里
  1. 收集静态文件:
          python manage.py collectstatic  (如果参数STATIC_ROOT 没有配置,此处会报错)
  1. 找到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
  1. 配置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 

原文地址:https://www.cnblogs.com/wumingxiaoyao/p/7090357.html