Linux06 /Python web项目部署

1. 部署方式

  • 纯后端代码部署

    nginx + uwsgi + crm + mysql+virtualenv+supervisor

  • 前后端分离项目部署

    nginx + vue + uwsgi+django rest fraemwork + virtualenv + mysql + redis + supervisor

  • Python的调试启动方式,调用wsgiref单机模块,测试代码是否能够正常运行的,性能低下,单进程,单线程

    python3 manage.py runserver

2. 纯后端代码部署/CRM为例

1. 部署方式

  • nginx + uwsgi + crm + mysql+virtualenv+supervisor

2. crm项目详细部署步骤

  • 创建一个新的虚拟环境,用于运行crm新业务 mkvirtualenv crm

  • 上传crm代码到服务器

  • 解决代码的模块依赖

    pip3 freeze >  requirements.txt
    pip3 install -i https://pypi.douban.com/simple -r requirements.txt
  • 安装uwsgi工具,启动crm

    pip3 install -i https://pypi.douban.com/simple uwsgi
  • 使用uwsgi的配置文件,启动crm项目

    # 在项目的第一级目录,手动创建uwsgi的配置文件
    touch uwsgi.ini
    [uwsgi]
    # Django-related settings
    # the base directory (full path)
    # 填写项目的完整绝对路径,第一层
    chdir = /opt/crm
    # Django's wsgi file
    #指定django的wsgi文件路径,填写相对路径
    module = crm.wsgi
    # the virtualenv (full path)
    # 填写虚拟环境的绝对路径
    home = /root/Envs/CRM
    # process-related settings
    # master
    master = true
    # maximum number of worker processes
    # 定义程序的多进程数量的,以cpu核数的2倍+1数量填写 2n+1 数量
    processes = 3
    # the socket (use the full path to be safe
    # 把uwsgi启动在socket协议上,的8000端口
    socket = 0.0.0.0:8000
    # 指定http协议的话,用户是可以直接访问到的,不安全的,因此使用socket协议
    # 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    # 指定配置文件启动
  • 配置nginx,进行静态文件解析,以及反向代理crm的动态请求

    server {
    listen 80;
    server_name _;
    # 只要在server{}标签中看到root关键字,说明这个虚拟主机是一个静态文件服务器
    # 将server_name后面的www.pythoncrm.com 这个域名所有的请求,都分发给uwsgi
    location / {
    uwsgi_pass 127.0.0.1:8000;
    include uwsgi_params;
    }
    }
  • 重新加载nginx,让配置生效

    nginx -s reload
  • 把ip做一个本地的hosts解析,添加一个假的域名(可以不设置)

    找到本地机器的hosts文件C:\Windows\System32\drivers\etc
    192.168.16.85 www.s24pythoncrm.com
  • 收集crm所有的静态文件,交给nginx去处理

    # 修改django的settings.py配置文件,添加如下配置
    STATIC_URL = '/static/'
    STATIC_ROOT='/opt/crmstatic' # 通过命令收集django所有的静态文件,就会将项目的所有的静态文件打包放到/opt目录下,以crmstatic作为文件名
    python3 manage.py collectstatic
  • 配置nginx找到crm的静态文件

    # 修改配置如下形式
    # 配置nginx找到crm所有的静态文件
    # 只要是以/static开头的请求,就走如下配置
    location /static {
    # http://www.pythoncrm.com/static/login/css/style.css
    alias /opt/crmstatic/;
    }
  • 重启nginx,查看crm项目(使用本地hosts文件设置的IP)

    # 1.重启nginx
    nginx -s reload # 2.查看crm项目
    http://www.pythoncrm.com
  • 通过supervisor进程管理工具,管理uwsgi的后台,这个工具,其实就是在帮我们执行启动命令,需要下载安装即可

    yum install supervisor
  • 配置supervisor的配置文件

    echo_supervisord_conf >  /etc/supervisor.conf  # 生成配置文件的目录
  • 修改配置文件,让supervisor管理uwsgi

    vim /etc/supervisord.conf   # 注意使用的是supervisord
    [program:s24crm]
    command=/root/Envs/CRM/bin/uwsgi --ini /opt/crm/uwsgi.ini ; 程序启动命令
    autostart=true ; 在supervisord启动的时候也自动启动
    stopasgroup=true ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
    killasgroup=true ;默认为false,向进程组发送kill信号,包括子进程 # /root/Envs/CRM/bin/uwsgi:启动项目的uwsgi的位置
    # /opt/crm/uwsgi.ini:项目uwsgi配置文件的位置
  • 启动supervisord服务端,进入supervisor的管理交互式终端,管理任务

    supervisord -c  /etc/supervisord.conf
    supervisorctl -c /etc/supervisord.conf
    # supervisor的管理命令
    status # 查看状态
    start all # 启动所有任务
    restart all # 重启所有任务
    stop 进程名称

3. vue+drf的前后端分离项目部署

1. 部署方式

  1. nginx + vue + uwsgi+django rest fraemwork + virtualenv + mysql + redis + supervisor

  2. 端口划分:

    vue+nginx的端口 是81

    vue向后台发请求,首先发给的是代理服务器,这里模拟是nginx的 9000

    drf后台运行在 9005端口上

2. 前端部署过程

  • 获取前端代码(前端示例代码)

    # 1.下载前端示例代码
    wget https://files.cnblogs.com/files/pyyu/07-luffy_project_01.zip # 2.解压缩,准备编译前端代码
    unzip 07-luffy_project_01.zip
  • 下载node源码,配置nodejs编译环境,加入环境变量中

    # 1.下载node源码
    wget https://nodejs.org/download/release/v8.6.0/node-v8.6.0-linux-x64.tar.gz # 2.解压缩
    tar -zxvf node-v8.6.0-linux-x64.tar.gz # 3.编辑配置文件profile
    vim /etc/profile # 4.将node的bin目录加入到环境变量PATH中
    PATH="/opt/python367/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/tbnginx/sbin:/opt/node-v8.6.0-linux-x64/bin"
  • 修改vue的数据提交地址,修改如下配置文件

    # 1.定位到该文件
    /opt/07-luffy_project_01/src/restful/api.js # 2.批量替换ip地址信息
    sed -i 's/127.0.0.1:8000/192.168.16.85:9000/g' src/restful/api.js
  • 安装vue代码所需的模块、将前端静态文件打包到dist

    # 1.定位到前端项目的一级目录,确认有package.json文件,该文件有vue项目所需的模块
    /opt/07-luffy_project_01/ # 2.下载vue所需模块,要在前端项目的一级目录
    npm install # 2.始编译前端代码,生成dist静态文件夹,前端所有代码,都打包编译生成了一个dist
    npm run build
  • 生成了dist静态文件夹之后,交给nginx去处理

    # 返回项目首页的静态文件服务器
    server {
    listen 81;
    server_name _;
    # 最低级url匹配,所有请求都走到了这里
    location / {
    root /opt/07-luffy_project_01/dist;
    index index.html;
    }
    }
    # 反向代理虚拟主机,vue的请求转发给drf
    server {
    listen 9000;
    server_name _;
    location / {
    uwsgi_pass 0.0.0.0:9005;
    include uwsgi_params;
    }
    }
  • 重启nginx

    nginx -s reload

2. 后端部署过程

  • 整一个新的虚拟环境,然后下载后端示例代码

    # 1.创建虚拟环境
    mkvirtualenv luffy # 2.下载后端示例代码
    wget https://files.cnblogs.com/files/pyyu/luffy_boy.zip
  • 解决drf运行的模块问题(最好使用requirements.txt文件去处理模块问题)

    1、requirements.txt文件处理模块,创建requirements.txt文件并将以下内容写入到文件中

    certifi==2018.11.29
    chardet==3.0.4
    crypto==1.4.1
    Django==2.1.4
    django-redis==4.10.0
    django-rest-framework==0.1.0
    djangorestframework==3.9.0
    idna==2.8
    Naked==0.1.31
    pycrypto==2.6.1
    pytz==2018.7
    PyYAML==3.13
    redis==3.0.1
    requests==2.21.0
    shellescape==3.4.1
    urllib3==1.24.1
    uWSGI==2.0.17.1

    2、手动解决办法如下,根据相应的报错提示,安装相应的模块

    pip3 install -i https://pypi.douban.com/simple django==2.1.4
    python3 manage.py runserver
    pip3 install -i https://pypi.douban.com/simple djangorestframework
    python3 manage.py runserver
    pip3 install -i https://pypi.douban.com/simple requests
    python3 manage.py runserver
    pip3 install -i https://pypi.douban.com/simple django_redis
    python3 manage.py runserver
    pip3 install -i https://pypi.douban.com/simple pycrypto
  • 用uwsgi去启动drf后台,在项目一级目录创建uwsgi.ini文件,写入如下参数

    [uwsgi]
    # Django-related settings
    # the base directory (full path)
    # 填写项目的完整绝对路径,第一层
    chdir = /opt/luffy_boy
    # Django's wsgi file
    # 指定django的wsgi文件路径,填写相对路径
    module = luffy_boy.wsgi
    # the virtualenv (full path)
    # 填写虚拟环境的绝对路径
    home = /root/Envs/luffy
    # process-related settings
    # master
    master = true
    # maximum number of worker processes
    # 定义程序的多进程数量的,以cpu核数的2倍+1数量填写 2n+1 数量
    processes = 3
    # the socket (use the full path to be safe
    # 把uwsgi启动在socket协议上,的8000端口 socket = 0.0.0.0:9005 # 指定http协议的话,用户是可以直接访问到的,不安全的,因此使用socket协议
    # http =0.0.0.0:8000 # ... with appropriate permissions - may be needed
    # chmod-socket = 664
    # clear environment on exit
    vacuum = true
  • 使用supervisor进程管理工具,同时管理crm和前后端分离项目的进程

    vim /etc/supervisord.conf   # 注意使用的是supervisord
    [program:s24crm]
    command=/root/Envs/s24crm/bin/uwsgi --ini /s24fuxi/IGnb/uwsgi.ini ; 程序启动命令
    autostart=true ; 在supervisord启动的时候也自动启动
    stopasgroup=true ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
    killasgroup=true ;默认为false,向进程组发送kill信号,包括子进程 [program:s24luffy]
    command=/root/Envs/luffy/bin/uwsgi --ini /opt/luffy_boy/uwsgi.ini ; 程序启动命令
    autostart=true ; 在supervisord启动的时候也自动启动
    stopasgroup=true ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
    killasgroup=true ;默认为false,向进程组发送kill信号,包括子进程
  • 启动项目后台

    # 1.先杀掉supervisor和uwsgi所有的进程,注意杀进程时是否会造成影响
    pkill -9 supervisor
    pkill -9 uwsgi # 2.然后重启supervisor
    supervisord -c /etc/supervisord.conf
    supervisorctl -c /etc/supervisord.conf
  • 本项目有用到redis,所以还得启动redis数据库,才能够正常访问项目

    # 1.安装redis
    yum install redis -y # 2.启动redis
    systemctl start redis # 3.检查redis是否正常
  • 访问项目,验证各功能是否正常

Linux06 /Python web项目部署的更多相关文章

  1. Web项目部署指南

    Web项目部署指南 本文记录了部署Vue项目到阿里云服务器上的过程,其中云服务器的操作系统是CentOS 7,Web服务器用的是nginx.因为项目涉及发送异步请求,而由Flask编写的后端应用监听的 ...

  2. 如何将Java Web项目部署到服务器上

    转自:(此处更详细)http://blog.csdn.net/gulu_gulu_jp/article/details/50994003 一.前言 前面我们已经尝过了在云服务器上部署代码的甜头了,现在 ...

  3. Pycharm+django新建Python Web项目

    这两天初学Python,首先是学习Python语法有PyCharm就可以运行Console程序了,因为是初学所以,尽量写的比较详细,包括参考的资料地址...   1.下载Python,并安装[本文版本 ...

  4. 怎样将本地web项目部署到腾讯云服务器上?

    怎样将本地web项目部署到腾讯云服务器上? 1.本地计算机的工作: (1).用eclipse新建一个web项目,然后在webcontent下新建一个index.html,然后在本地部署到Tomcat服 ...

  5. Maven Web项目部署到Tomcat下问题

    但是也遇到了很多问题,下面记录一下Web项目部署到Tomcat下的问题 1.普通的WEB项目,就是虽然是用maven搭建的,但是没有使用profiles.xml文件来配置参数.这样的项目可以通过以下的 ...

  6. Spring整合Redis&JSON序列化&Spring/Web项目部署相关

    几种JSON框架用法和效率对比: https://blog.csdn.net/sisyphus_z/article/details/53333925 https://blog.csdn.net/wei ...

  7. web项目部署在不同环境中需要修改配置文件的解决方法

    web项目部署中存在的配置文件问题: web项目以war包的形式,部署在tomcat中,同时项目需要访问一些其他的东东,例如访问数据库,调用别的项目的API.在开发中,这些需要访问的外部地址通常以配置 ...

  8. Eclipse导入git上的maven web项目 部署 - lpshou

    http://www.tuicool.com/articles/fqm2Qf   推酷 文章 微博 主题 站点 活动 应用 周刊 登录   Eclipse导入git上的maven web项目 部署 - ...

  9. eclipse修改web项目部署路径 wtpwebapps webapps 的设置

    eclipse修改web项目部署路径 wtpwebapps   webapps  的设置,在添加完server------>tomcat后,到server控制台进行设置 eclipse默认的部署 ...

随机推荐

  1. Jackson乱码问题

    在配置文件中加入下面的内容 <!-- Json乱码问题配置--> <mvc:annotation-driven> <mvc:message-converters regi ...

  2. laravel模板使用

    {{ $var }} - 打印内容 {{ $var or 'default' }} - 打印内容并带一个默认值 {{{ $var }}} - 打印转义内容 {{-- Comment --}} - 注释 ...

  3. [转] 间接系统调用syscall(SYS_gettid)

    点击阅读原文 在linux下每一个进程都一个进程id,类型pid_t,可以由 getpid()获取. POSIX线程也有线程id,类型pthread_t,可以由 pthread_self()获取,线程 ...

  4. @topcoder - SRM614D1L3@ TorusSailing

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个 N*M 的方格图,某人从 (0, 0) 出发想要走到 ...

  5. [每日一题2020.06.16] leetcode双周赛T3 5423 找两个和为目标值且不重叠的子数组 DP, 前缀和

    题目链接 给你一个整数数组 arr 和一个整数值 target . 请你在 arr 中找 两个互不重叠的子数组 且它们的和都等于 target .可能会有多种方案,请你返回满足要求的两个子数组长度和的 ...

  6. SpringMVC框架搭建流程(完整详细版)

    SpringMVC框架搭建流程 开发过程 1)配置DispatcherServlet前端控制器 2)开发处理具体业务逻辑的Handler(@Controller. @RequestMapping) 3 ...

  7. Python 为什么推荐蛇形命名法?

    关于变量的命名,这又是一个容易引发程序员论战的话题.如何命名才能更具有可读性.易写性与明义性呢?众说纷纭. 本期"Python为什么"栏目,我们将聚焦于变量命名中的连接方式,来切入 ...

  8. 国外一教授坦言,用这方法能迅速成为python程序员,但都不愿意说_编程小十

    越来越多的人学习python,但你学习python用了多长的时间?#Python# 你知道如何才能迅速掌握并成为python程序员吗?   有这样的一位国外的教授说,要迅速成为python程序员,几乎 ...

  9. Java学习笔记4(多线程)

    多线程 多个程序块同时运行的现象被称作并发执行.多线程就是指一个应用程序中有多条并发执行的线索,每条线索都被称作一条线程,它们会交替执行,彼此间可以进行通信. 进程:在一个操作系统中,每个独立执行的程 ...

  10. HttpClient优化

    HttpClient优化思路: 1.池化 2.长连接 3.httpclient和httpget复用 4.合理的配置参数(最大并发请求数,各种超时时间,重试次数) 5.异步 6.多读源码 1.背景我们有 ...