• 案例


     一、部署说明

      部署Python语言开发的web项目
      Centos7.5 + Nginx + Python + Django + uwsgi + MySQL
      uwsgi作用是把Python变成一个服务

    二、部署流程

    • Nginx安装:

      略。

    • MySQL5安装:

        

      使用的工具包版本:cmake-3.6.0-rc1.tar.gz    boost_1_59_0.tar.gz  mysql-5.7.27.tar.gz

      以上版本已经过测试,工具包保存在腾讯微云和U盘,其他版本慎重选择

      说明:安装MySQL5只能使用boost_1_59_0.tar.gz,安装MySQL8需要安装最新版的boost

      官网:cmake.org   boost.org

      1)安装依赖包
      yum -y install ncurses-devel gcc-* bzip2-* bison
    yum -y install gcc-*
      2)安装cmake工具(MySQL使用cmake命令代替configure来配置)
            wget https://cmake.org/files/v3.6/cmake-3.6.0-rc1.tar.gz
      tar xf cmake-3.6.0-rc1.tar.gz
      cd cmake-3.6.0-rc1
      ./configure
    make -j4
      make install
      cmake --version
      3)放好boost库文件,编译时会自动解压
      wget https://dl.bintray.com/boostorg/release/1.59.0/source/boost_1_59_0.tar.gz
      mkdir /usr/local/boost #没有就创建
      cp boost_1_59_0.tar.gz /usr/local/boost/
      4)安装MySQL
      ①下载MySQL5.7.27源码包,(采用源码安装)
      ②tar xf mysql-5.7.27.tar.gz
      ③cd mysql-5.7.27
      -----------------------编译-----------------
      ④
      cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MYISAM_STORAGE_ENGINE=1 -DENABLED_LOCAL_INFILE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_DEBUG=0 -DWITH_EMBEDDED_SERVER=1 -DDOWNLOAD_BOOST=1 -DENABLE_DOWNLOADS=1 -DWITH_BOOST=/usr/local/boost
      ---------------------------------------------
      cmake .
      -DCMAKE_INSTALL_PREFIX=/usr/local/mysql #指定安装路径
      -DMYSQL_DATADIR=/usr/local/mysql/data #指定数据目录
      -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock #指定sock文件路径
      -DWITH_INNOBASE_STORAGE_ENGINE=1 #安装Innodb存储引擎
      -DWITH_MYISAM_STORAGE_ENGINE=1 #安装myisam存储引擎
      -DENABLED_LOCAL_INFILE=1 #允许使用Load data命令从本地导入数据
      -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci #安装所有字符集,默认字符集utf-8,校验字符
      -DWITH_DEBUG=0 #关闭DEBUG
      -DWITH_EMBEDDED_SERVER=1 #生成一个libmysqld.a(.so)的库,这个库同时完成了MySQL服务与客户端API
      -DDOWNLOAD_BOOST=1 -DENABLE_DOWNLOADS=1 -DWITH_BOOST=/usr/local/boost #允许boost,允许下载boost库文件
      -------------------
      如果编译过程出错,想重新配置,先`rm -f CMakeCache.txt`再重新配置即可,如果还不行,就删除刚刚解压的mysql-5.7.27目录,重新编译
      ⑤4核同时工作继续编译:make -j4
          如果出现`c++: 编译器内部错误:已杀死(程序 cc1plus)`可能是内存不足,增加内存再试
      ⑥make install
      ⑦初始化
      cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
      chmod 755 /etc/init.d/mysql
      useradd -s /sbin/nologin -r mysql
      chown mysql.mysql /usr/local/mysql/ -R #下面的ln语句一起复制

    ln -sf /usr/local/mysql/bin/* /usr/bin/
    ln -sf /usr/local/mysql/lib/* /usr/lib/
    ln -sf /usr/local/mysql/libexec/* /usr/local/libexec
    ln -sf /usr/local/mysql/share/man/man1/* /usr/share/man/man1
    ln -sf /usr/local/mysql/share/man/man8/* /usr/share/man/man8

          ⑧ vim /etc/my.cnf
      修改5个地方:basedir、 datadir、 socket、 log-error、 pid-file

              

          ⑨ 生成root的临时密码,记住这个密码
      /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/
      5)启动测试
      /etc/init.d/mysql start
      isof -i :3306
      修改密码:mysql_secure_installation 删除匿名用户
      登录:mysql -u root -p12345678

    • Python安装:
    ①下载:
      wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tar.xz
    ②解压:
      tar xf Python-3.7.4.tar.xz
    ③编译:
      yum -y install gcc-* openssl-* libffi-devel sqlite-devel
      ./configure --enable-optimizations --with-openssl=/usr/bin/openssl
    ④安装:
      make -j4
      make install
    ⑤完成
      可执行文件安装路径:/usr/local/lib/Python3.7
      输入:Python3进行测试
      升级pip:pip3 install --upgrade pip
    可以选择删除安装文件夹:rm -rf Python3.7.4

      

    ⑥装虚拟环境  pip3 install virtualenv
    virtualenv是一个创建隔绝的Python环境的工具。virtualenv创建一个包含所有必要的可执行文件的文件夹,用来使用Python工程所需的包
    因为用Python开发了好几个项目,每个项目使用的环境和插件都不一样,这样就需要来回装插件和卸插件,
    如果有了虚拟化环境,就把Python虚拟成多个环境,每个项目使用一个环境
    附一般使用方法:

        

    1.比如某项目,需要独立Python环境,先创建目录:
      mkdir myproject; cd myproject;
    2.使用命令`virtualenv`创建一个独立的Python运行环境,参数--no-site-packages表示不复制所有已经安装在系统的Python环境中的第三方包,得到干净的Python环境
      virtualenv --no-site-packages venv
    3.新建的Python环境放在当前目录下的venv目录,可以用source进入该环境
      source venv/bin/activate
    4.注意到命令提示符变了,有个(venv)前缀,表示当前环境是一个名为venv的Python环境,
    venv环境下,用pip安装的包都被安装到venv这个环境下,系统Python环境不受任何影响。也就是说,venv环境是专门针对myproject这个应用创建的
    退出当前的venv环境,使用deactivate命令:
      deactivate
    ⑦安装Django
      pip3 install django==2.2
    •  发布网站

      

    实验结果:访问127.0.0.1出现Django的欢迎界面,直接访问127.0.0.1:9090不会出现Django的欢迎界面,不知道为什么
    Django项目所在路径:/usr/local/nginx/html/myweb
    wsgi文件所在路径在项目下的:myweb/wsgi.py myweb.wsgi
    所用的Python虚拟环境:/usr/local/nginx/html/myweb/venv

    ①安装uwsgi
    uwsgi是服务器和服务端应用程序的通信协议,规定了怎么把请求转发给应用服务器和返回
    uWSGI是一个web服务器,它实现了WSGI协议、uwsgi、http等协议。
    Nginx中HTTPUwsgiModule的作用是与uWSGI服务器进行交换。
    Nginx和uWSGI交互就必须使用同一个协议。而上面说了uwsgi支持fastcgi,uwsgi,http协议,这些都是nginx支持的协议
    只要大家沟通好使用哪个协议,就可以正常运行了。
    pip3 install uwsgi

    ②编辑uwsgi配置文件,添加uwsgi账户
    useradd -s /sbin/nologin -r uwsgi
    mkdir /etc/uwsgi
    vim /etc/uwsgi/uwsgi.ini
    ----------
    [uwsgi]
    uid = uwsgi //uwsgi服务所有者
    gid = uwsgi //uwsgi服务所有组
    socket=127.0.0.1:9090 //监听的端口,相当于Django项目的8000端口,这里改成了9090
    master = true //启动主进程
    vhost = true //多站模式,可以发布多个网站
    no-site = true //多站模式时不设置入口模块和文件
    workers = 2 //子进程数
    reload-mercy=10 //平滑的重启
    vacuum=true //退出、重启时清理文件
    max-requests=1000 //开启10000个进程后,自动respawn下,处理多少个请求后,重新生成一个请求
    limit-as=512 //将进程的总内存量控制在512M
    buffer-size = 30000
    pidfile = /var/run/uwsgi9090.pid //pid文件,用于下面的脚本启动、停止该进程
    daemonize = /var/log/uwsgi9090.log //uwsgi运行日志
    pythonpath = /usr/local/nginx/html/myweb/venv/lib/python3.7/site-packages #该项目的Python虚拟环境中的Django包所在目录,加入到Python环境变量
    --------------
    ③启动uwsgi
    uwsgi --ini /etc/uwsgi/uwsgi.ini
    netstat -ntpl
    ④停止uwsgi
    cat /var/run/uwsgi9090.pid
    101445
    kill -9 101445
    ⑤启停uwsgi的脚本
    vim /etc/init.d/uwsgi
    chmod 755 /etc/init.d/uwsgi
    ⑥脚本使用
    /etc/init.d/uwsgi status
    /etc/init.d/uwsgi start
    /etc/init.d/uwsgi stop
    --------------
    #! /bin/sh
    DESC="uwsgi daemon"
    NAME=uwsgi
    DAEMON=/usr/local/bin/uwsgi
    CONFIGFILE=/etc/uwsgi/$NAME.ini
    PIDFILE=/var/run/{$NAME}9090.pid
    SCRIPTNAME=/etc/init.d/$NAME
    FIFOFILE=/tmp/uwsgififo
    set -e
    [ -x "$DAEMON" ] || exit 0

    do_start() {
    if [ ! -f $PIDFILE ];then
    $DAEMON $CONFIGFILE || echo -n "uwsgi already running"
    else
    echo "The PID is exist..."
    fi
    }

    do_stop() {
    if [ ! -f $PIDFILE ];then
    $DAEMON --stop $PIDFILE || echo -n "uwsgi not running"
    rm -f $PIDFILE
    echo "$DAEMON STOPED."
    else
    echo "The $PIDFILE doesn't found"
    fi
    }

    do_reload() {
    if [ -p $FIFOFILE ];then
    echo w > $FIFOFILE
    else
    $DAEMON --touch-workers-reload $PIDFILE || echo -n "uwsgi can't reload"
    fi
    }

    do_status() {
    ps aux|grep $DAEMON
    }

    case "$1" in
    status)
    echo -en "Status $NAME: "
    do_status
    ;;
    start)
    echo -en "Starting $NAME: "
    do_start
    ;;
    stop)
    echo -en "Stopping $NAME: "
    do_stop
    ;;
    reload|graceful)
    echo -en "Reloading $NAME: "
    do_reload
    ;;
    *)
    echo "Usage: $SCRIPTNAME {start|stop|reload}" >&2
    exit 3
    ;;
    esac
    exit 0
    ---------------
    Nginx发布网站
    nginx配置文件
    `访问127.0.0.1出现Django的欢迎界面`
    -----
    server {
    listen 80;
    server_name localhost;
    #access_log logs/abc.log main;
    location / { //此处配置的是动态页面的处理,即类似交给127.0.0.1:8000端口进行处理,静态页面或文件另配一个location
    include uwsgi_params;
    uwsgi_pass 127.0.0.1:9090;
    uwsgi_param UWSGI_SCRIPT myweb.wsgi; //uwsgi运行的参数1:Django项目中的uwsgi.py文件的位置,相当于myweb/wsgi.py
    uwsgi_param UWSGI_CHDIR /usr/local/nginx/html/myweb; //uwsgi运行的参数2:Django项目的路径
    index index.html index.htm;
    client_max_body_size 35m; //客户端最大请求体大小
    #下面是线上优化方案,可以直接用
    #uwsgi_cache_valid 1m;
    #uwsgi_temp_file_write_size 64k;
    #uwsgi_busy_buffers_size 64k;
    #uwsgi_buffers 8 64k;
    #uwsgi_buffer_size 64k;
    #uwsgi_read_timeout 300;
    #uwsgi_send_timeout 300;
    #uwsgi_connect_timeout 300;
    }
    }
    ---
  • 相关阅读:
    步步为营 .NET 设计模式学习笔记 四、Singleton(单例模式)
    步步为营 .NET 设计模式学习笔记 九、Command(命令模式)
    步步为营 .NET 设计模式学习笔记 十八、Template(模板模式)
    步步为营 .NET 代码重构学习笔记 七
    步步为营 .NET 设计模式学习笔记 十九、Chain of Responsibility(职责链模式)
    步步为营 .NET 设计模式学习笔记 二十二、Memento(备望录模式)
    步步为营 .NET 设计模式学习笔记 十四、Decorator(装饰模式)
    步步为营 .NET 代码重构学习 十一
    步步为营 .NET 设计模式学习笔记 一、开篇(设计模式之泡妞二十三招)
    步步为营 .NET 设计模式学习笔记 七、Proxy(代理模式)
  • 原文地址:https://www.cnblogs.com/staff/p/11511135.html
Copyright © 2020-2023  润新知