• 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
        
  • 相关阅读:
    217. Contains Duplicate (leetcode)
    242. Valid Anagram(leetcode)
    JVM的逃逸分析
    有 a
    Maven 项目管理从未如此通畅
    Spring学习手札(四)谈谈Spring Bean的生命周期及作用域
    Spring学习手札(三)理解IoC 拯救不开心
    Spring学习手札(二)面向切面编程AOP
    Spring学习手札(一)
    Java提供了哪些IO方式?IO, BIO, NIO, AIO是什么?
  • 原文地址:https://www.cnblogs.com/lotuslaw/p/14655338.html
Copyright © 2020-2023  润新知