发布CRM你将使用以下软件

  • nginx
  • uWSGI
  • CentOS7
  • CRM项目文件
  • virtualenv/virtualenvwrapper
  • supervisor

WSGI、uWSGI

python web服务器开发使用WSGI协议(Web Server Gateway Interface)

python web项目默认会生成一个wsgi.py文件,确定好应用模块。

生产环境中使用的是uWSGI,实现了WSGI所有接口,C语言编写,效率很高的web服务器。

uWSGI是一个全功能的HTTP服务器,实现了WSGI协议、uwsgi协议、http协议等。它要做的就是把HTTP协议转化成语言支持的网络协议。比如把HTTP协议转化成WSGI协议,让Python可以直接使用。

Nginx

使用nginx是为了它的反向代理功能,项目会通过Django+uWSGI+Nginx进行服务器线上部署。

CentOS

1.打包项目CRM文件夹,压缩文件

2.通过xftp、scp、lrzsz等上传文件至Centos服务器

Linux使用技巧

1.通过xshell或者iTerm等软件,多终端操作你的linxu,这样对uwsgi、nginx、项目代码调试的时候,避免来回切换目录,提供工作效率。

2.注意修改了linux软件的配置文件,都要重启服务才能生效。

Virtualenv/Virtualenvwrapper

构建一个干净,隔离的python解释器环境,防止软件依赖,冲突等问题,建议使用。

Supervisor

Supervisor(http://supervisord.org/)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制。

uWSGI+Nginx部署
nginx部署python程序
1.在进行项目部署的时候,如果报错
no application not found
就是因为你的uwsgi没找到django的wsgi.py应用文件

2.为什么要用nginx uwsgi
因为用户只想访问域名,不带有任何端口
通过nginx反向代理,用户直接访问 chiji.com,但是nginx直接转发给了django,我们其实看到的页面是django
uwsgi是支持并发的,python web服务器,让你的django并发性更高,但是uwsgi不支持静态文件的处理,静态文件会丢失

用nginx处理静态文件,uwsgi处理动态请求

3.项目部署实验步骤
####
nginx

####
uwsgi+django
1.workon切换之前的虚拟环境或者创建新的虚拟环境(mkvirtualenv nginx_crm)且解决环境依赖
[root@localhost ~]# workon
[root@localhost ~]# workon myblog
(myblog) [root@localhost ~]# pip3 list

2.在虚拟环境下安装uwsgi
(myblog) [root@localhost ~]# pip3 install uwsgi
(myblog) [root@localhost ~]# which uwsgi
/root/Envs/myblog/bin/uwsgi
(myblog) [root@localhost ~]# uwsgi --version
2.0.18



3.用uwsgi启动一个python文件:
uwsgi --http :8000 --wsgi-file test.py
http :8000: 使用http协议,端口8000
wsgi-file test.py: 加载指定的文件,test.py

#test.py
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"] # python3
    
#访问:http://192.168.0.101:8000/     


4.用uwsgi启动一个项目(在虚拟环境下操作):
    #cd到目录中,myblog/wsgi.py确保找到这个文件
    (myblog) [root@localhost ~]# uwsgi --http :8000 --module myblog.wsgi --py-autoreload=1
    module myblog.wsgi: 加载指定的wsgi模块
    --py-autoreload=1  热加载命令(修改django代码,uWSGI会自动加载django程序)


    使用uwsgi配置文件去启动项目:

    1.手动创建uwsgi.ini 配置文件
    (myblog) [root@localhost myblog]# ls
    backend  db.sqlite3  manage.py  media  myblog  repository  static  templates  utils  web
    (myblog) [root@localhost myblog]# touch uwsgi.ini
    (myblog) [root@localhost myblog]# vim uwsgi.ini

    #########################
    # mysite_uwsgi.ini file
    [uwsgi]

    # Django-related settings
    # the base directory (full path)
    #指定django的项目目录,第一层
    chdir           = /opt/myblog
    # Django's wsgi file
    #找到django的wsgi文件
    #这里需要写项目的第二层目录myblog
    module          = myblog.wsgi
    # the virtualenv (full path)
    #填写虚拟环境的绝对路径
    home            = /root/Envs/myblog
    # process-related settings
    # master
    master          = true
    # maximum number of worker processes
    开启进程数量
    processes       = 5
    # the socket (use the full path to be safe
    #指定socket协议,运行django,只能与nginx结合时使用
    #指定socket协议,运行django,只能与nginx结合时使用
    socket          = 0.0.0.0:8000

    #如果你没用nginx,只想启动一个http界面,用这个
    #http          = 0.0.0.0:8000

    # ... with appropriate permissions - may be needed
    # chmod-socket    = 664
    # clear environment on exit
    vacuum          = true
    #########################

    2.通过配置文件启动uwsgi
    (myblog) [root@localhost myblog]# ls
    backend  db.sqlite3  manage.py  media  myblog  repository  static  templates  utils  web
    (myblog) [root@localhost myblog]# uwsgi --ini uwsgi.ini

    
5.收集myblog的静态文件
编辑myblog的settings.py配置文件
#定义django的静态资源根目录,便于用命令收集资源,存放的地儿
STATIC_ROOT="/opt/myblog_static"

[root@localhost myblog]# vim settings.py 
加上STATIC_ROOT="/opt/myblog_static"
用命令收集静态文件
[root@localhost myblog]# python3 manage.py collectstatic

6.配置nginx,反向代理django服务器,且解析静态文件
proxy_pass仅仅是请求转发的参数,与uwsgi结合,还有更高级的协议参数 

修改nginx配置文件如下:
http {  
    server {
        listen       80;
        #server_name  myblog.com;
        server_name  localhost;
        location / {    
        #使用uwsgi_pass转发基于uwsgi协议的一个请求
        include /opt/nginx112/conf/uwsgi_params;
        uwsgi_pass 192.168.0.101:8000;        
        }
    #配置一个url的入口,告诉django静态文件去哪里找
        #当请求静态文件是就进行别名,nginx去/opt/myblog_static/下找,注意不要用tab键切换,敲空格
        location /static{alias /opt/myblog_static/;}
    }
}

7.此时nginx结合uwsgi已经完成
192.168.0.101:8000/访问不到,避免了端口工具
192.168.0.101通过nginx的反向代理访问


8.配置supervisor工具,管理django后台【记住这里退出虚拟环境,使用物理环境去运行】
    1.下载supervisor
    [root@localhost ~]# easy_install supervisor
    2.配置supervisor的配置文件,编写django任务
    (myblog) [root@localhost myblog]# deactivate 
    [root@localhost myblog]# echo_supervisord_conf > /etc/supervisor.conf
    [root@localhost myblog]# vim /etc/supervisor.conf
    最底行写入:

    [program:myblog]
    command=/root/Envs/myblog/bin/uwsgi --ini /opt/myblog/uwsgi.ini  ;  #写绝对路径
    autostart=true
    stopasgroup=true
    killasgroup=true

    3.启动supervisor服务端
    [root@localhost myblog]# supervisord -c /etc/supervisor.conf 
    通过客户端命令查看任务
    [root@localhost myblog]# supervisorctl -c /etc/supervisor.conf 
    myblog                           RUNNING   pid 21129, uptime 0:00:14
    supervisor> 

    4.supervisor管理命令
    [root@localhost myblog]# supervisorctl -c /etc/supervisor.conf 
    myblog                           RUNNING   pid 21129, uptime 0:00:14
    supervisor> 
    supervisor> stop myblog  #停止所有任务
    myblog: stopped
    supervisor> start myblog  #启动所有任务
    myblog: started
    supervisor> 
    supervisor> status         
    myblog                           RUNNING   pid 21284, uptime 0:01:17
    supervisor> 




其他:
找uwsgi的绝对路径
(myblog) [root@localhost myblog]# which uwsgi
/root/Envs/myblog/bin/uwsgi
(myblog) [root@localhost myblog]# pwd
/opt/myblog


怎么查看虚拟环境绝对路径:
(myblog) [root@localhost opt]# cdvirtualenv 
(myblog) [root@localhost myblog]# pwd
/root/Envs/myblog


找uwsgi_params的路径
[root@localhost myblog]# find / -name uwsgi_params
/opt/nginx-1.12.0/conf/uwsgi_params
/opt/nginx112/conf/uwsgi_params
[root@localhost myblog]# 
部署myblog

相关文章: