1-centos_virtualenv_nginx_uwsgi_django_pyecharts_apscheduler项目上线全流程
ct上线流程整理
技术
- Django
- pyecharts
- apscheduler
- nginx
- uwsgi
- virtualenv
流程
-
更新系统软件包
-
yum update -y
-
-
安装软件管理包和可能使用的依赖
-
yum -y groupinstall "Development tools" yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel
-
-
编译安装python3
-
# 下载Pyhton3到/usr/local 目录 cd /usr/local wget https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tgz # 解压 tar -zxvf Python-3.6.6.tgz # 进入 Python-3.6.6路径 cd Python-3.6.6 # 编译安装到指定路径 ./configure --prefix=/usr/local/python3 # 安装python3 make make install # 安装完成之后 建立软链接 添加变量 方便在终端中直接使用python3 ln -s /usr/local/python3/bin/python3.6 /usr/bin/python3 # 给pip3建立软链接 ln -s /usr/local/python3/bin/pip3.6 /usr/bin/pip3
-
-
安装virtualenv,进行不同版本项目管理
-
pip3 install virtualenv # 建立软链接 ln -s /usr/local/python3/bin/virtualenv /usr/bin/virtualenv # 在根目录下建立两个文件夹,主要用于存放环境和项目 mkdir -p /BI/env mkdir -p /BI/WS
-
-
切换到/BI/env/下,创建指定版本的虚拟环境
-
cd /BI/env virtualenv --python=/usr/bin/python3 ct # 然后进入/BI/env/ct/bin,启动虚拟环境 source ./activate
-
-
虚拟环境里用pip3安django和uwsgi
-
pip3 install django pip3 install uwsgi # uwsgi要安装两次,先在系统里安装一次,然后进入对应的虚拟环境安装一次 # 给uwsgi建立软链接,方便使用 ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
-
-
切换到项目目录/BI/WS,创建Django项目
-
django-admin.py startproject ctProject # 然后新建立一个名叫ct的APP python3 manage.py startapp ct
-
-
进入项目文件夹/BI/WS/ctProject,添加static和templates,分别用于存放静态文件和模板文件。
-
cd /BI/WS/ctProject mkdir static mkdir templates
-
-
修改settings.py
-
vim /BI/WS/ctProject/ctProject/settings.py # 在INSTALLED_APPS 列表里添加'ct' # 修改ALLOWED_HOSTS,['*'],可以让任何IP访问 # TEMPLATES的DIRS里添加模板路径:os.path.join(BASE_DIR, 'templates') # 尾部添加:STATICFILES_DIRS = (os.path.join(BASE_DIR,'static'),) # DEBUG = False
-
-
编写测试文件
-
# 在templates下添加index.html文件,输入下面内容 vim /BI/WS/ctProject/templates/index.html
-
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>test</title> </head> <body> <h1>test</h1> </body> </html>
-
-
配置URL
-
vim /BI/WS/ctProject/ctProject/urls.py
-
from cohort import views #导入views urlpatterns = [ path('admin/', admin.site.urls), path('index', views.index), #添加这行 ]
-
-
编辑视图函数
-
vim /BI/WS/ctProject/ct/views.py
-
def index(request): return render(request, 'index.html')
-
-
启动项目
-
# 获取内网ip,注意不要用127.0.0.1 ifconfig -a python3 manage.py runserver 172.***.***.173:8000
-
-
配置uwsgi
-
Django+uwsgi+nginx原理:
-
''' 1、Nginx作为反向代理服务器,负责静态资源处理、动态请求转发以及结果的回复 2、uWSGI作为Web服务器,负责接收Nginx请求转发并处理后发给Django以及接收Django返回信息转发给Nginx 3、Django作为应用框架,收到请求后处理数据并响应结果给uWSGI服务器 Nginx与uWSGI通过uwsgi协议通信 uWSGI与Django通过WSGI协议通信 4、WSGI是用在 python web 框架编写的应用程序与后端服务器之间的规范。它使得Web App可以与Web Server顺利通信。所有使用 WSGI 的服务器都可以运行使用 WSGI 规范的web 框架。它规定WSGI application应该实现为一个可调用对象 5、uWSGI: 是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。用于接收前端服务器转发的动态请求并处理后发给web应用程序 6、uwsgi是uWSGI服务器实现的独有的协议 7、wsgi.py,生成Django项目时默认生成的python文件,用于web server与Django进行通信 8、无论是Django自带的Web Server还是uWSGI,在启动时都会去加载你的Django项目下的wsgi.py文件,这个文件内部返回了一个application实例 9、application实例其实也是一个可调用对象,因为这个类中实现了call使得它能被像函数一样调用 10、在uWSGI中,读取完application后,会起一个主进程去监听用户的请求,根据你的配置的进程数会产生相同数量的子进程,例如你配置2个进程,则产生2个子进程。一旦有请求过来,则会让子进程去执行请求 11、假如有3个请求同时过来,而你只配置了2个进程去处理请求,那么第三个请求将会阻塞。例如一个请求需要执行10s,则第三个请求需要执行20s '''
-
-
XML格式的配置文件
-
vim /BI/WS/ctProject/ct_uwsgi.xml
-
<uwsgi> <socket>127.0.0.1:8997</socket> <!-- 内部端口,自定义 --> <chdir>/BI/WS/ctProject/</chdir> <!-- 项目路径 --> <module>ctProject.wsgi</module> <!-- mysite为wsgi.py所在目录名--> <processes>4</processes> <!-- 进程数 --> <daemonize>uwsgi.log</daemonize> <!-- 日志文件 --> </uwsgi>
-
# uwsgi启动与终止 #启动uwsgl uwsgi -x ct_uwsgi.xml #uwsgi有没有启动成功,可以用下面的命令查看 ps -ef|grep uwsgi #如果想重启uwsgi,先使用下面的命令杀掉进程,再启动uwsgi killall -9 uwsgi
-
-
-
安装nginx和配置nginx.conf文件
-
cd /home/ wget http://nginx.org/download/nginx-1.13.7.tar.gz tar -zxvf nginx-1.13.7.tar.gz cd nginx-1.13.7 ./configure make make install # nginx一般默认安装好的路径为/usr/local/nginx # 在/usr/local/nginx/conf/中先备份一下nginx.conf文件,以防意外 cp nginx.conf nginx.conf.bak # 然后打开nginx.conf,把原来的内容删除,直接加入以下内容:
-
events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; server { listen 80; server_name 127.0.0.1:80; #改为自己的域名,没域名修改为127.0.0.1:80 charset utf-8; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:8997; #端口要和uwsgi里配置的一样 uwsgi_param UWSGI_SCRIPT ctProject.wsgi; #wsgi.py所在的目录名+.wsgi uwsgi_param UWSGI_CHDIR /BI/WS/cProject/; #项目路径 } location /static/ { alias /BI/WS/ctProject/static/; #静态资源路径 } } }
-
# 进入/usr/local/nginx/sbin/目录 cd /usr/local/nginx/sbin # 执行./nginx -t命令先检查配置文件是否有错, ./nginx -t ./nginx # 重启./nginx -s reload # 退出nginx -s quit # 快速停止或关闭Nginx:nginx -s stop
-
-
浏览器访问http://112.xxx.xxx.177:8000/index/ 测试是否成功
-
安装配置pyecharts
-
pip3 install pyecharts # 将虚拟环境中pyecharts.render.templates下的模板拷贝至/BI/WS/ctProject/templates cp -r /BI/env/cohort/lib/python3.6/site-packages/pyecharts/render/templates/* /BI/WS/ctProject/templates/
-
-
编写主任务脚本task.py,渲染页面至templates
-
page.render('./templates/ct.html')
-
-
编写视图函数,返回页面内容为ct.html
-
def ct(request): return render(request, 'ct.html')
-
-
安装配置apscheduler,设定定时任务
-
pip3 install apscheduler pip3 install django-apscheduler
-
# 将django-apscheduler加到项目中settings的INSTALLED_APPS中 'django_apscheduler',
-
# 在主urls.py中引入如下内容 from apscheduler.schedulers.background import BackgroundScheduler from cohort.task import cohort_new urlpatterns = [ path('admin/', admin.site.urls), path('ct/', views.ct), ] def timing_job(): ct_new() scheduler = BackgroundScheduler() scheduler.add_job(timing_job, 'cron', hour=0, minute=1) try: scheduler.start() except (KeyboardInterrupt, SystemExit): pass
-
-
编写start.sh、stop.sh进行任务的启动与关闭,用nohup进行后台运行
-
vim /BI/WS/ctProject/start.sh ps -aux | grep manage.py| xargs kill -9 nohup python manage.py runserver 172.***.***.173:8000 >djo.out 2>&1 &
-
vim /BI/WS/ctProject/stop.sh ps -aux | grep manage.py|xargs kill -9
-
-
开启项目
-
/BI/WS/ctProject/start.sh
-