Debian9部署Python3.9+Pipenv+Flask+Uwsgi+Nginx+Jenkins+Docker+Superivsor(2022更新)

2,603 阅读6分钟

一、更新依赖包

  • sudo apt update
  • sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget

二、Python3.9环境搭建

  • 任意目录:

  • cd /srv/

  • 下载方法一:

  • wget https://www.python.org/ftp/python/3.9.4/Python-3.9.4.tgz

  • 下载方法二:

  • curl -O https://www.python.org/ftp/python/3.9.4/Python-3.9.4.tar.xz

  • 解压Python-3.9.4.tgz:

  • tar -zxvf Python-3.9.4.tgz

  • 编译:

  • cd Python-3.9.4

  • ./configure --enable-optimizations

  • 运行make以启动构建过程(为了缩短构建时间,请根据处理器修改-j标志。 如果你不知道处理器的核心数,可以通过键入nproc来找到它。 我的系统有1个内核,所以我使用-j1标志。)

  • 键入:

  • make -j 1

  • 安装Python二进制文件:

  • sudo make altinstall

  • 检查:

  • python3.9 --version

  • 创建python与python3和pip软连接

  • 查看python3.9的路径:

  • which python3.9

  • 在环境变量中添加该软连接(把which python3.9的路径写到配置中):

  • vim ~/.bashrc

    alias python='/usr/local/bin/python3.9'
    alias python3='/usr/local/bin/python3.9'
    alias pip3='/usr/local/bin/pip3.9'
    
  • wq保存并退出

  • 生效配置文件:

  • source ~/.bashrc

  • 检查python3.9:

  • 分别键入pythonpython3输出的版本均为python3.9

    Python 3.9.4 (default, Jan 17 2022, 14:22:53) 
    [GCC 8.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> 
    
  • 检查pip3

  • 键入which pip3 (显示路径与/usr/local/bin/pip3.9一致)

    root@iZwz9hokpg2hhzpa7pr3p3Z:/srv# which pip3
    /usr/local/bin/pip3
    
  • 键入pip3 -V(显示python3.9表示正确)

    root@iZwz9hokpg2hhzpa7pr3p3Z:/srv# pip3 -V
    pip 21.3.1 from /usr/local/lib/python3.9/site-packages/pip (python 3.9)
    

三、安装:Pipenv

  • pip3 install Pipenv
  • 可以先使用demo进行调试后在使用git拉取的项目
  • 创建一个demo:
  • cd /srv/
  • mkdir myproject
  • cd myproject
  • vim run.py
    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route("/")
    def helloWorld():
        return "Hello World"
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=5000)
    
  • 使用Pipenv创建一个虚拟环境
  • pipenv install
    [root@centos7_template_v20211103 myproject]# pipenv install
    Creating a virtualenv for this project...
    Pipfile: /srv/myproject/Pipfile
    Using /usr/bin/python3 (3.9.4) to create virtualenv...
    ⠧ Creating virtual environment...created virtual environment CPython3.9.4.final.0-64 in 345ms
      creator CPython3Posix(dest=/root/.local/share/virtualenvs/myproject-oukWrxAT, clear=False, no_vcs_ignore=False, global=False)
      seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/root/.local/share/virtualenv)
        added seed packages: pip==21.3.1, setuptools==60.2.0, wheel==0.37.1
      activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator
    
    ✔ Successfully created virtual environment! 
    Virtualenv location: /root/.local/share/virtualenvs/myproject-oukWrxAT
    Creating a Pipfile for this project...
    Pipfile.lock not found, creating...
    Locking [dev-packages] dependencies...
    Locking [packages] dependencies...
    Updated Pipfile.lock (16c839)!
    Installing dependencies from Pipfile.lock (16c839)...
      🐍   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 0/000:00:00
    To activate this project's virtualenv, run pipenv shell.
    Alternatively, run a command inside the virtualenv with pipenv run.
    
  • 进入虚拟环境:pipenv shell
  • 查看虚拟环境路径:pipenv --venv用于Uwsgi配置文件中的home参数
  • 安装包(例如Flask):pipenv install flask
  • (如果是已经有的项目直接使用:pipenv install安装项目中的所有包)(Pipenv不作详细介绍)

四、安装:Uwsgi

  • 注意不需要安装在pipenv虚拟环境中
  • apt-get install libpcre3
  • apt-get install libpcre3-dev -y
  • pip3 install uwsgi --no-cache-dir

五、编写:Uwsgi启动文件

  • cd /srv/myproject
  • vim myproject.ini
  • http:因为后面会用到nginx代理,连接方式使用http即可
  • home:使用虚拟环境 即 pipenv --venv
  • chdir:项目的路径 如 /srv/myproject
  • module:模块:启动文件的名称不需要加上.py
  • callable:wsgi文件中的app变量(也就是flask的实例)
  • processes:启动的工作进程-生成指定数目的worker/进程进程数(根据你服务器的配置去设定一般cup数*2)
  • threads:线程数(一般processes * 2)
  • master:是否启用mater模式
  • wsgi-file:启动文件
  • enable-threads:允许用内嵌的语言启动线程。这将允许你在app程序中产生一个子线程
  • vacuum:当服务器退出的时候自动清理环境,删除unix socket文件和pid文件(try to remove all of the generated file/sockets)(此项可以不配置)
  • reload-mercy:设置在平滑的重启(直到接收到的请求处理完才重启)一个工作子进程中,等待这个工作结束的最长秒数。这个配置会使在平滑地重启工作子进程中,如果工作进程结束时间超过了'reload-mercy'秒就会被强行结束(忽略之前已经接收到的请求而直接结束)
  • harakiri:一个请求花费的时间超过了这个harakiri超时时间,那么这个请求都会被丢弃,并且当前处理这个请求的工作进程会被回收再利用(即重启)
  • limit-as:通过使用POSIX/UNIX的setrlimit()函数来限制每个uWSGI进程的虚拟内存使用数。这个配置会限制uWSGI的进程占用虚拟内存不超过256M。如果虚拟内存已经达到256M,并继续申请虚拟内存则会使程序报内存错误,本次的http请求将返回500错误。
  • max-requests:为每个工作进程设置请求数的上限。当一个工作进程处理的请求数达到这个值,那么该工作进程就会被回收重用(重启)你可以使用这个选项来默默地对抗内存泄漏
  • listen:设置socket的监听队列大小(默认:100)
  • daemonize:日志文件路径(使进程在后台运行,并将日志打到指定的日志文件或者udp服务器)
  • disable-logging:不记录请求信息的日志。只记录错误以及uWSGI内部消息到日志中
  • log-maxsize:以固定的文件大小(单位KB),切割日志文件。 例如:log-maxsize = 50000000 就是50M一个日志文件
  • 其他配置的参数这里不作详细介绍,可查阅uwsgi官网文档
[uwsgi]

# 连接方式
# socket          = /srv/myproject/myproject.sock
http            = 0.0.0.0:5000
# http-socket     = 0.0.0.0:5000

# 基本配置
home            = /Users/yangyuexiong/.local/share/virtualenvs/xxxxxx-MNTQRX14
chdir           = /srv/myproject
module          = run
callable        = app
processes       = 2
threads         = 4
master          = true
buffer-size     = 32768
wsgi-file       = /srv/myproject/run.py
chmod-socket    = 660
enable-threads  = true
vacuum          = true

# 处理(超时/请求/进程结束/虚拟内存)
reload-mercy   = 8
harakiri        = 60
limit-as        = 256
max-requests   = 5000
listen          = 120

# 日志
daemonize       = /srv/myproject/uwsgi.log
disable-logging = true
log-maxsize     = 50000000
  • 本机调试uwsgi启动:
  • 开启端口:iptables -I INPUT -p tcp --dport 5000 -j ACCEPT
  • cd /srv/myproject
  • 执行:uwsgi --ini myproject.ini
  • 调试完毕后 control+ckillall -9 uwsgi 结束进程即可

六、安装:Nginx

  • apt-get install nginx
  • nginx -v

七、编写:Nginx配置

  • cd /etc/nginx/conf.d/
  • vim myproject.conf
  • 按照以下配置删改对应参数即可,如 iplocation
upstream flask_server {
    server 123.45.678.900:5000;
    # server 123.45.678.900:5001;
    # server 123.45.678.900:5002;
    # server 123.45.678.900:5003;
}

server {
    listen      80;
    server_name 123.45.678.900;
    charset     utf-8;
    client_max_body_size 75M;


    # 前端页面
    location / {

        add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS';  # 允许请求方法
    
        if ($request_method = 'OPTIONS') {
    	    add_header 'Access-Control-Max-Age' 1728000;   # OPTIONS 请求的有效期,在有效期内不用发出另一条预检请求
    	    add_header 'Content-Type' 'text/plain; charset=utf-8';
    	    add_header 'Content-Length' 0;
    	    return 200;
    	}

        root        /srv/dist; # 前端打包完成的文件路径
        index       index.html index.htm;
        try_files   $uri $uri/ /index.html; # 官网介绍设置这条可以解决history路由的问题
        expires     -1;                     # 首页一般没有强制缓存
        add_header  Cache-Control no-cache;
        access_log          /srv/logs/access.log;
        error_log           /srv/logs/err.log;
    }

    # 后端接口
    location /api {
        proxy_pass  http://flask_server;
    }

    # 静态资源
    location /static {
        alias                   /srv/dist/static; # 静态资源目录
        autoindex               on;    # 开启静态资源列目录
        autoindex_exact_size    off;   # on(默认)显示文件的确切大小,单位是byte;off显示文件大概大小,单位KB、MB、GB
        autoindex_localtime     off;   # off(默认)时显示的文件时间为GMT时间;on显示的文件时间为服务器时间
    }
}
  • 检查配置:nginx -t
  • 重启:nginx -s reloadservice nginx restart

八、启动项目

  • cd /srv/myproject/
  • uwsgi --ini myproject.ini
  • 最后可以直接使用git上的项目进行部署

九、使用:Jenknis持续集成项目后续的更新迭代

后续更新...
  • 大可不必

十、使用:Superivsor监控项目进程启停

调试中...
  • 大可不必

十一、使用:Docker部署