阿里云部署flask

阿里云部署日志

一、软件安装篇

1. python解释器安装

  1. 从源码编译python

    • 在root用户的家目录下创建一个独立目录,专门编译python.

      $ mkdir soft-build/python-lab
      $ cd soft-build/python-lab
      
    • 下载python 3.6 源码, 并解压到当前目录下,进入源码主目录

      $ wget https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tgz
      $ tar -zxvf Python-3.6.7.tgz
      $ cd Python-3.6.7.tgz
      
    • 准备编译前的依赖库和编译工具

      $ yum install gcc		# 默认centos7.4已经安装了gcc工具,此步骤可以省略
      # 下载编译python所需的依赖库,这些库都以devel为后缀
      $ yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel expat-devel
      
    • 编译并安装

      # 配置python3.6的安装目录为/usr/local/python36目录下,以优化方式进行编译
      $ ./configure --prefix=/usr/local/python36 --enable-optimizations
      # 若成功,则在源码主目录下,生成Makefile文件,然后就可以make编译了
      $ make
      # 经过一段时间,编译完成,把编译完成的文件安装在/usr/local/python36目录下
      $ make install
      
  2. 注册 python 3.6 的系统环境

    • 将存储python解释器的目录添加到系统PATH路径上

      # Centos中用户登录后,会自动执行/etc/profile脚本,该脚本里会对PATH变量进行配置
      # 做法1: 在该文件的最后添加python解释器的目录,即/usr/local/python36/bin
      $ vim /etc/profile
      ...
      export PATH=$PATH:/usr/local/python36/bin
      # 不过该文件注释也说明了,这种做法不太推荐,建议是在/etc/profile.d/目录下创建一个.sh后缀文件
      # 主要目的是方便日后维护
      $ vim /etc/profile.d/py36.sh
      # 添加如下内容
      export PATH=$PATH:/usr/local/python36/bin
      

      若不重启Linux系统,则可以使用如下命令验证:

      $ source /etc/profile		# 重新让shell加载配置文件
      
  3. pip安装源的确认

    • 默认阿里云的服务器会在root目录下创建一个.pip目录,并且设置一个pip.conf文件,里面会配置pip源为阿里云的源,速度比较快.
    • 只是注意如果新建用户后,也需要在用户的家目录下创建一个.pip/pip.conf文件,设置相同的源即可.
  4. virtualenv工具的安装

    # 直接使用pip3安装virtualenv即可,这样安装到的是在python36目录下的bin目录里
    $ pip3 install virtualenv
    

2. Redis的安装及基本配置

  • 下载源码

    # 建议以root身份创建redis源码安装目录
    $ mkdir -p /root/soft-build/redis-lab
    # 下载redis源码,目前下载4.0版本
    $ wget http://download.redis.io/releases/redis-4.0.11.tar.gz
    # 解压
    $ tar -zxvf redis-4.0.11.tar.gz
    
  • 编译及安装

    $ make
    # 为了可以在系统任何位置上都可以使用redis,同时也方便管理,在/usr/local内,创建redis目录
    $ mkdir -p /usr/local/redis4.0/bin
    # 进入到redis源码目录的src目录
    $ cd src
    # 拷贝编译好的可执行文件到/usr/local/redis4.0/bin目录下
    $ cp mkreleasehdr.sh /usr/local/redis4.0/bin/
    $ cp redis-benchmark /usr/local/redis4.0/bin/
    $ cp redis-check-aof /usr/local/redis4.0/bin/
    $ cp redis-check-rdb /usr/local/redis4.0/bin/
    $ cp redis-cli /usr/local/redis4.0/bin/
    $ cp redis-sentinel /usr/local/redis4.0/bin/
    $ cp redis-server /usr/local/redis4.0/bin/
    # 将/usr/local/redis4.0/bin目录配置到系统PATH路径上
    # 在/etc/profile.d/下创建一个叫redis.sh文件
    export PATH=$PATH:/usr/local/redis4.0/bin
    
  • 配置文件

    • 默认在源码目录下,会有一个参考配置文件redis.conf,可以在这个文件基础上进行二次修改.

二、用户管理篇

1. 网站开发项目组管理

  • 添加开发项目

    $ groupadd --system webapps
    

2. 网站开发项目组成员管理

  • 为开发组添加用户

    $ useradd --system --gid webapps --home /webapps/xxx 用户名
    
  • 验证过程

    • 在/etc/password里,看是否有新加用户信息行
  • 为该用户设置密码

    $ passwd 用户名
    
  • 创建家目录

    $ mkdir -p /webapps/whn
    

3. 成员权限管理

  • 工作目录的权限切换

    $ chown 用户名 需要修改所属用户的目录
    $ chgrp 组名  需要修改所属用户的目录
    
  • 成员具备提升为root的权限

    # 在/etc/sudoers.d/里新建一个权限申请单,名字建议使用同名的用户名
    $ vim /etc/sudoers.d/用户名
    ....
    用户名    ALL=(ALL)       ALL
    

4. 系统用户环境初始化

  • 改变命令提示符的显示效果

    • 默认初始化时,系统用户提示符没有被配置,临时更改的方法是:

      $ PS1="[\u@\h \W]# "
      
    • 将系统登录后自动改变提示符效果

      # 可以仿照/root/目录下的.bash开头的文件,在系统用户的家目录下,创建类似的文件,并填充相关内容
      vi .bashrc
      vi .bash_profile
      vi .bash_history ()
      vi .bash_logout ()
      
  • 增加pip源

    • 在家目录下,创建.pip目录,并在该目录下创建pip.conf文件

    • 编写内容如下:

      [global]
      index-url=http://mirrors.aliyun.com/pypi/simple/
      
      [install]
      trusted-host=mirrors.aliyun.com
      
  • 创建虚拟环境

    • 在开发工作目录下,创建python虚拟环境

      $ virtualenv -p /usr/local/python36/bin/python3 ./virtualenv/elm
      
    • 安装项目需要的依赖文件

      • 在windows的测试项目中,执行如下命令,将需要的python库导出

        $ pip freeze > requirements.txt
        
      • 在生产环境下pip导入依赖文件

        $ pip install -r requirements.txt
        
  • 测试flask自带服务器能否运行

    • 编写app启动flask的对象

      cms_app.py:
      # 从工厂模块中导入创建后台服务网站的功能函数
      from apps import create_cms_app
      
      # 利用功能函数实例化Flask的网站app对象
      cms_app = create_cms_app('apps.settings.DevCMSConfig')
      
      
      if __name__ == '__main__':
          from apps.models import db
      	# 利用db.create_all产生数据表,注意只能新建一次
          with cms_app.app_context():
              db.create_all()
          # 启动flask自带的web服务器开始测试
          cms_app.run(host='0.0.0.0', port=9800)
      
    • 执行效果

      (elm) $ python cms_app.py 
      

三、WSGI服务器篇

  • 常用的WSGI标准的服务器

    • WSGI是python提供的web服务器和web框架代码之间的一种接口规范
    • 只要符合这个规范的任意python模块,就可以对接到实现WSGI协议的服务器上
    • 目前市面上,有很多现成的WSGI服务器,常用的是:
      • uWSGI
      • gunicorn
  • 安装uWSGI服务器

    • 利用pip安装,注意uWSGI安装时,需要系统有gcc等的C语言编译环境

      $ pip install uwsgi
      

      安装需要一段编译时间,耐心等待.

    • 支持WSGI协议的简单代码

      # 根据WSGI协议的要求,实现一个最简单的python模块文件
      def application(env, start_response):
          start_response('200 OK', [('Content-Type','text/html')])
          return [b"Hello World"]
      
  • 配置uwsgi服务器

    • 命令行启动uwsgi服务器,同时指定wsgi模块的位置

      $ uwsgi --http :9090 --wsgi-file mydemo.py
      
    • 配置文件管理方式

      • 建议将uwsgi的配置信息保存在文件进行维护,方便管理.在开发环境中增加一个uwsgi_ini目录,将目录内容同步到生产环境中.

      • uwsgi都运行在127.0.0.1内部端口,由nginx的反向代理来把数据交付过来.

      • 商家后台服务配置文件参考:

        [uwsgi]
        # 所有的配置文件的路径必须为绝对路径
        
        # uwsgi服务开放的socket接口的信息
        socket = 127.0.0.1:5050
        # wsgi规范的模块的路径信息
        wsgi-file = /webapps/whn/elm_webapps/cms_app.py
        # application的对象名
        callable = cms_app
        
        # 运行时,先进入到哪个工程目录
        chdir = /webapps/whn/elm_webapps/
        
        # 虚拟环境的路径
        virtualenv = /webapps/whn/virtual/elm/
        
        processes = 1
        threads = 1
        master = true
        # 守护进行的日志文件路径
        daemonize = /webapps/whn/logs/cms.log
        
      • 买家前台服务配置文件参考:

        [uwsgi]
        # 所有的配置文件的路径必须为绝对路径
        
        # 服务的端口
        socket = 127.0.0.1:5080
        # wsgi规范的模块的路径信息
        wsgi-file = /webapps/whn/elm_webapps/api_app.py
        callable = api_app
        
        # 运行时,先进入到哪个工程目录
        chdir = /webapps/whn/elm_webapps/
        
        # 虚拟环境的路径
        virtualenv = /webapps/whn/virtual/elm/
        
        processes = 1
        threads = 1
        master = true
        
        daemonize = /webapps/whn/logs/api.log
        

四、Nginx服务器篇

  • Nginx安装

    • 阿里云自带了nginx的yum源,可以直接使用yum进行安装,建议还是使用root用户进行安装

      $ yum install nginx
      
  • Nginx的常用控制方式

    • nginx的启动

      $ nginx
      
    • nginx的重启

      $ nginx -s reload
      
    • nginx的配置文件测试

      $ nginx -t
      
  • Nginx的配置文件

    • nginx的配置文件采用的是主从配置的关系,即由主配置文件,然后在主配置文件内通过include包含其他子配置文件.

    • nginx的主配置文件所在位置: /etc/nginx/nginx.conf

    • nginx主配置文件main空间字段含义:

      # user指定了nginx的worker进程以什么用户和组权限运行,必须改为你开发的用户和所属组
      user whn webapps;			# 需要修改
      # worker_processes代表工人进程的数量,建议和CPU核心数一致
      worker_processes auto;
      # 全局错误日志文件
      error_log /var/log/nginx/error.log;
      # master进程的进程号存放的位置
      pid /run/nginx.pid;
      # Load dynamic modules. See /usr/share/nginx/README.dynamic.
      include /usr/share/nginx/modules/*.conf;
      # ★ 不建议修改这里的include文件,他是代表全局; ★
      # ★ 建议修改http空间里的include来包含个人业务网站的配置信息. ★
      
    • nginx的事件空间字段含义:

      events {
      	# 每个工人进程的连接最大数
          worker_connections 1024;
          # 使用什么模型进行IO复用
          use epoll;
      }
      
    • nginx的http空间字段含义:

      http {
      	# 日志打印格式
          log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                            '$status $body_bytes_sent "$http_referer" '
                            '"$http_user_agent" "$http_x_forwarded_for"';
          
          # 访问日志存储位置及存储内容所使用的格式
          access_log  /var/log/nginx/access.log  main;
      
      	# 打开内核文件传输的开关
          sendfile            on;
          tcp_nopush          on;
          tcp_nodelay         on;
          keepalive_timeout   65;
          types_hash_max_size 2048;
      	
      	# 包含content-type的取值依据文件
          include             /etc/nginx/mime.types;
          # 若传输文件后缀名无效时,默认content-type的取值
          default_type        application/octet-stream;
          
          # Load modular configuration files from the /etc/nginx/conf.d directory.
          # See http://nginx.org/en/docs/ngx_core_module.html#include
          # for more information.
          # ★ 系统默认的子配置存储的位置,建议屏蔽后,包含自己工程目录下的文件 ★
          include /etc/nginx/conf.d/*.conf;
          # ★ 配置自己工程项目的nginx配置文件 ★
          include /webapps/whn/elm_webapps/conf.d/*.conf;
      
      	# nginx官方提供的参考server配置,可以屏蔽来使自定义的虚拟服务起作用
          # server {
          #     listen       80 default_server;
          #     listen       [::]:80 default_server;
          #     server_name  _;
          #     root         /usr/share/nginx/html;
      
          # Load configuration files for the default server block.
          #     include /etc/nginx/default.d/*.conf;
      
          #    location / {
          #     }
      
          #     error_page 404 /404.html;
          #         location = /40x.html {
          #     }
      
          #     error_page 500 502 503 504 /50x.html;
          #         location = /50x.html {
          #     }
          # }
      }
      
    • nginx的server空间段含义:

      • nginx的server空间又称之为虚拟服务器,每一个虚拟服务器可以对接一个业务,这样就可以保证一台服务器上运行多个网站.
      • 具体配置参考nginx方向代理的说明
  • Nginx的反向代理

    • nginx的虚拟服务器配置,其实就是把静态请求和动态请求通过location区分出来

    • 后台虚拟服务的参考配置:

      server {
      	# listen代表监听端口
          listen   80;
          # server_name代表虚拟服务器的域名
          server_name _;
      
      	# location代表一条匹配规则,当规则满足时,指定括号里的映射关系
          location /static/ {
          	# 使用alias做虚拟url和物理目录的映射关系.
              alias    /webapps/whn/elm_webapps/apps/cms_statics/;
          }
      
          location / {
          	# 加载nginx提供的uwsgi模块
              include uwsgi_params;
              # 利用uwsgi_pass访问本地socket的5050端口,进行进程间通信
              uwsgi_pass 127.0.0.1:5050;
          }
      }
      
    • API虚拟服务的参考配置:

      server {
          listen   9801;
          server_name _;
      
          location /api/ {
              include uwsgi_params;
              uwsgi_pass 127.0.0.1:5080;
          }
      
          location / {
              alias   /webapps/whn/elm_webapps/apps/vue_client/;
              # 默认访问该路径时,找哪个文件作为首页文件
              index   index.html;
          }
      }
      

猜你喜欢

转载自blog.csdn.net/weixin_43958804/article/details/86695679