发布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脚本来控制。
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]#