部署knight项目
发布CRM你将使用以下软件
- nginx
- uWSGI
- CentOS7
- CRM项目文件
- virtualenv
- 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
构建一个干净,隔离的python解释器环境,防止软件依赖,冲突等问题,建议使用。
Supervisor
Supervisor(http://supervisord.org/)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制。
项目部署
上传knight项目到linux服务器
使用xftp工具,进项上传文件夹,将knight代码,传到linux服务器当中
完成python3解释器的安装
完成virtualenvwrapper工具的配置,解决虚拟环境问题
vim ~/.bashrc 最下面添加如下内容 WORKON_HOME=~/Envs #设置virtualenv的统一管理目录,以后自动下载的虚拟环境,全都放这了 VIRTUALENVWRAPPER_VIRTUALENV_ARGS='--no-site-packages' #添加virtualenvwrapper的参数,生成干净隔绝的环境 VIRTUALENVWRAPPER_PYTHON=/opt/python36/bin/python3 #指定python解释器的本体 #必须要有这个参数,才会在每次登陆linux的时候,加载这个虚拟环境脚本工具 source /opt/python36/bin/virtualenvwrapper.sh #执行virtualenvwrapper安装脚本
1.新建一个knight虚拟环境用于运行 crm项目 cd /opt/knight mkvirtualenv knight
完成centos7下安装配置mariadb数据库,且创建数据库数据,迁移导入knight数据
#centos7底下,mariadb就是mysql数据库,只是包名的不同 yum install mariadb-server mariadb -y #启动mariadb服务端 systemctl start mariadb #使用客户端去链接mysql服务端 1.mysql -uroot -p #注意,linux的数据库,需要对root用户设置远程链接的权限, #授权所有的权限,在所有库,所有表 对 root用户在所有的主机上, 设置权限密码是 redhat grant all privileges on *.* to root@'%' identified by 'redhat'; #刷新授权表 flush privileges; 注意2,linux的防火墙要给关闭,否则windows去链接linux的3306端口可能被拒绝 在linux服务端,mysql,导入knight的数据 1.mysql数据的导出,与导入 这个命令是在linux/windows中敲的 mysqldump -u root -p --all-databases > knight.dump 2.上传这个数据文件到linux系统的/opt/目录中 3.在linux的mysql,导入这个数据文件 mysql -uroot -p < /opt/knight.dump #会出现这个报错,是兼容问题,不影响 ERROR 1911 (HY000) at line 5417: Unknown option 'STATS_PERSISTENT'
测试使用linux的python解释器去运行项目(注意要解决解释器的模块问题,才能正常运转项目)
pip3 install django==1.11.16 pip3 install pymysql pip3 install -i htttps://pypi.douban.com/simple django-multiselectield(注意安装的是django-multiselectield,错误提示的是缺少的是multiselectield) 改setings里面的数据库配置ip 还有ALLOWED_HOSTS = ['*'] python3 manage.py runserver 0.0.0.0:8000
安装uwsgi
1.安装uwsgi pip3 install uwsgi 2.使用学习uwsgi命令,如何启动python应用 通过uwsgi运行一个python web文件 3.通过命令去启动python web应用 uwsgi --http :8000 --wsgi-file test.py --http 指定http协议 --wsgi-file 指定一个支持python wsgi协议的文件 4.通过uwsgi启动django项目(注意这里要进入knight项目目录) uwsgi --http :8000 --module knight.wsgi
5.uwsgi自动重启python程序
uwsgi --http :8000 --module knight.wsgi --py-autoreload=1
在生产中,您可以监视文件/目录更改以触发重新加载(touch-reload,fs-reload ...)。
在开发过程中,可以方便地使用所有已加载/使用的python模块的监视器。但请仅在开发期间使用它。
检查由一个以指定频率扫描模块列表的线程完成:
[uwsgi]
...
py-autoreload = 2
将每2秒检查python模块更改并最终重新启动实例。
使用uwsgi.ini配置文件去启动项目,这个文件自己去创建即可,放哪都可以
[uwsgi] # Django-related settings # the base directory (full path) #写上项目的绝对路径 chdir = /opt/knight # Django's wsgi file #填写找到django的wsgi文件,填写相对路径,以chdir参数为相对路径 module = knight.wsgi # the virtualenv (full path) #填写虚拟环境的绝对路径 home = /root/Envs/knight/ # process-related settings # master #启动uwsgi主进程 master = true # maximum number of worker processes processes = 5 #如果你使用了nginx,做反向代理,必须填写socket链接,而不是http参数 # the socket (use the full path to be safe #socket = 0.0.0.0:8000 #如果你不用nginx,直接使用uwsgi,运行一个http服务端,就用这个http参数 http = 0.0.0.0:8000 # ... with appropriate permissions - may be needed # chmod-socket = 664 # clear environment on exit vacuum = true
指定配置文件(注意文件位置)去启动uwsgi
uwsgi --ini uwsgi.ini (注意写清配置文件位置)
使用ngixn处理django的静态文件
1.设置django的静态文件目录,收集一下 修改knight/settings.py ,写入如下参数 STATIC_ROOT= '/opt/static' 2.使用命令收集django的静态文件 python3 manage.py collectstatic 3.查看django的静态文件收集目录 ls /opt/static 4.配置nginx,反向代理,找到uwsgi项目,且配置nginx处理uwsgi的静态文件 nginx.conf 修改配置如下 server { listen 80; server_name qishijd.com; #只要用户访问qishijd.com:80/ 就走这个location匹配>,反向代理给uwsgi: location / { include uwsgi_params; uwsgi_pass 0.0.0.0:8000; } #当用户请求是qishijd.com/static/的时候 #就会进入这个location匹配 #通过alias参数进行路径别名,让nginx去/opt/static底下去找静>态资源 location /static { alias /opt/static; } }
访问域名或者ip,查看项目
qishijd.com/login 查看静态页面是否正常
supervisor
本来我们是用命令启动管理项目,
现在讲这些命令,写入到supervisor,通过superviosr去启动管理这些命令
使用python2的模块管理工具,去下载supervisor ,注意此时,退出虚拟环境
使用python2的模块管理工具,去下载supervisor ,注意此时,退出虚拟环境
使用python2的模块管理工具,去下载supervisor ,注意此时,退出虚拟环境
安装supervisor yum install python-setuptools #安装 easy_install supervisor #进入虚拟环境执行下面步骤: 2.使用supervisor命令,生成配置文件 echo_supervisord_conf > /etc/supervisor.conf 3.在这个配置文件中,写入我们想要管理的任务 vim /etc/supervisor.conf 在最底行写入如下配置 #定义一个任务,名字自定义 #commnad=参数,定义我们启动项目的命令 [program:crm_knight] command=/root/Envs/knight/bin/uwsgi /opt/knight/uwsgi.ini stopasgroup=true ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程 killasgroup=true ;默认为false,向进程组发送kill信号,包括子进程 4.通过配置文件启动supervisor服务 supervisord -c /etc/supervisor.conf 5.启动了supervisor服务端后,管理任务 supervisorctl -c /etc/supervisor.conf 任务管理命令如下:有两种,一个是交互式,一个是参数形式 #参数形式 supervisorctl -c /etc/supervisor.conf stop/start/restart all supervisorctl -c /etc/supervisor.conf start crm_knight #交互式形式 supervisorctl -c /etc/supervisor.conf start 项目名 stop 项目名