Debian9部署Python3.7+Pipenv+Flask+Uwsgi+Nginx+Jenkins+Docker+Superivsor

文章目录

[隐藏]

  • 一、获取最新的软件包/升级已安装的所有软件包
  • 二、安装:Python3.7依赖包
  • 三、安装:python3.7(或更高版本)
  • 四、安装Git并且拉取项目
  • 五、安装:Pipenv
  • 六、安装:Nginx
  • 七、安装:Uwsgi(注意用的pip3而且不需要安装在虚拟环境中)
  • 八、测试一下Nginx
  • 九、使用:Uwsgi启动项目
  • 十、配置:Nginx
  • 十一、启动项目
一、获取最新的软件包/升级已安装的所有软件包
apt-get update  apt-get upgrade  
二、安装:Python3.7依赖包
sudo apt update  sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget  
三、安装:python3.7(或更高版本)

任意目录:

cd /srv/  

下载方法一:

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

下载方法二:

curl -O https://www.python.org/ftp/python/3.7.3/Python-3.7.0.tar.xz  

解压Python-3.7.0.tgz:

tar -zxvf Python-3.7.0.tgz  

检查依赖:

cd Python-3.7.0  

键入:

./configure --enable-optimizations  

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

键入:

make -j 1  

安装Python二进制文件:

sudo make altinstall  

检查:

python3.7 --version  

创建python与python3和pip软连接(即:键入python3得到python3.7[操作系统默认python3.5])
查看python3.7的路径:

which python3.7  

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

vim ~/.bashrc  alias python='/usr/local/bin/python3.7'  alias python3='/usr/local/bin/python3.7'  wq保存并退出  生效配置文件:  source ~/.bashrc  

检查python3.7:
分别键入python和python3输出的版本均为python3.7

Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 16:52:21)  [Clang 6.0 (clang-600.0.57)] on darwin  Type "help", "copyright", "credits" or "license" for more information.  >>>  

在环境变量中添加pip软连接:

vim ~/.bashrc  alias pip3='/usr/local/bin/pip3.7'  wq保存并退出  生效配置文件:  source ~/.bashrc  

检查pip3
键入which pip3 (显示路径与/usr/local/bin/pip3.7一致)

root@instance-1:~# which pip3  /usr/bin/pip3  root@instance-1:~#  

键入pip3 -V(显示python3.7表示正确)

root@instance-1:~# pip3 -V  pip 10.0.1 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)  root@instance-1:~#  
四、安装Git并且拉取项目
apt-get install git -y  git --version  cd /srv/  git clone https://github.com/xxx/xxx.git  
五、安装:Pipenv
pip3 install Pipenv  

可以先使用demo进行调试后在使用git拉取的项目
创建一个demo:

cd /srv/  mkdir myproject  cd myproject  vim run.py  # 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)    按:esc  保存并退出:wq  

使用Pipenv
键入:pipenv shell创建一个虚拟环境

root@instance-1:/srv/YangZhiXiaoBlog# pipenv shell  Launching subshell in virtual environment…  root@instance-1:/srv/YangZhiXiaoBlog#  . /root/.local/share/virtualenvs/YangZhiXiaoBlog-gAVpubB9/bin/activate  (YangZhiXiaoBlog) root@instance-1:/srv/YangZhiXiaoBlog#  

查看虚拟环境路径:pipenv –venv用于Uwsgi配置文件中的home参数
安装包(例如Flask):pipenv install flask
(如果是已经有的项目直接使用:pipenv install安装项目中的所有包)(Pipenv不作详细介绍)

六、安装:Nginx
apt-get install nginx  
七、安装:Uwsgi(注意用的pip3而且不需要安装在虚拟环境中)
pip3 install uwsgi  
八、测试一下Nginx

启动:Nginx service nginx start
在浏览器中访问ip+80端口 如:59.12.32.4:80
出现以下页面表示成功

九、使用:Uwsgi启动项目

在项目根目录创建uwsgi配置文件.ini:文件名称随便取我取名:test.ini

cd /srv/myproject/    vim test.ini  
  • chdir:项目的路径
  • module:模块:启动文件的名称不需要加上.py
  • home:python的虚拟环境路径
  • master:是否启用mater模式
  • processes:启动的工作进程-生成指定数目的worker/进程进程数(根据你服务器的配置去设定一般cup数*2)
  • threads:线程数(一般processes * 2)
  • buffesocket:socket文件地址用于与Nginx进行通讯r-size:用于uwsgi包解析的内部缓存区大小为64k。默认是4k。
  • socket:socket文件地址用于与Nginx进行通讯(不需要手动创建·只需设置)
  • wsgi-file:wsgi文件(相当于flask的启动文件run.py)
  • callable:wsgi文件中的app变量(也就是flask的实例)
  • chmod-socket:
  • plugins:调用python3插件(如果使用.ini的配置文件不需要配置这一项否者会报错:open(“./python3_plugin.so”): No such file or directory [core/utils.c line 3724]
    !!! UNABLE to load uWSGI plugin: ./python3_plugin.so: cannot open shared object file: No such file or directory !!!)
  • enable-threads:允许用内嵌的语言启动线程。这将允许你在app程序中产生一个子线程
  • vacuum:当服务器退出的时候自动清理环境,删除unix socket文件和pid文件(try to remove all of the generated file/sockets)(此项可以不配置)
  • pidfile:指定pid文件的位置,记录主进程的pid号(此项可以不配置)
  • 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]    # 基本配置  chdir           = /srv/YangZhiXiaoBlog  module          = run  home            = /root/.local/share/virtualenvs/YangZhiXiaoBlog-gAVpubB9  master          = true  processes       = 2  threads         = 4  buffer-size     = 32768  socket          = /srv/YangZhiXiaoBlog/YangZhiXiaoBlog.sock  wsgi-file       = /srv/YangZhiXiaoBlog/run.py  callable        = create_app()  chmod-socket    = 666  # plugins         = python3  enable-threads  = true  vacuum          = true    # 处理(超时/请求/进程结束/虚拟内存)  reload-mercy    = 8  harakiri        = 60  limit-as        = 256  max-requests    = 5000  listen          = 120    # 日志  daemonize       = /srv/log/myapp_uwsgi.log  disable-logging = true  log-maxsize     = 50000000  

保存退出

创建存放日志的文件夹mkdir /srv/log

由于需要与Nginx进行通信才能启动,接下来我们配置Nginx。

十、配置:Nginx

在以下路径下创建配置文件(名字可以随便取)这里我取名:myproject.conf

如果需要使用Nginx代理多个项目就创建多个配置文件(不一样的端口)

cd /etc/nginx/conf.d/    vim myproject.conf  
  • upstream myproject:同一台服务器之间的请求转化,使用套接字方式通信。配置nginx与uwsgi的通信方式和名称.名称为:myproject 即 项目的名称
  • server unix:///srv/okc/okc.sock;:nginx使用socket的方式与uwsgi进行通信,指向项目目录下的cocket文件 即 上面uwsgi配置的.sock(不需要手动创建·只需设置.运行时自动创建)
  • listen:监听的端口(配置完之后需要打开该端口否则无法访问)
  • server_name:IP地址或者域名
  • charset:编码
  • client_max_body_size:最大的上传
  • location /:用于配置服务端,前端,静态文件等路径(这里项目是使用的前后分离,不过并不影像调试)(详细使用请查看官方文档)
  • uwsgi_pass:需要与upstream的一致 即 myproject
  • include:参数文件

PS:以下这种将前后端一起配置在同一端口下的话要将前端打包的dist文件里面的所有东西放到flask的static文件里面(或者将dist重命名为static覆盖flask中的static才能通过-> ip:9999/web 访问到flask,因为会默认访问static)

upstream YangZhiXiaoBlog {          server unix:///srv/YangZhiXiaoBlog/YangZhiXiaoBlog.sock;  }  server {      listen      9999;      server_name ip;      charset     utf-8;      client_max_body_size 75M;        # 服务端      location / {          uwsgi_pass YangZhiXiaoBlog;          include         /etc/nginx/uwsgi_params;      }        # 前端      location /web {          root /srv/Vue_Projects/dist;          try_files $uri $uri/ /index.html; # 官网介绍设置这条可以解决history路由的问题          index index.html;      }  }  

第二种把前端分开另一个配置文件设置不一样的端口:如下(这样就可以通过:ip:9977启动前端)

server {      listen      9977;      server_name ip;      charset     utf-8;      client_max_body_size 75M;        location / {          root /srv/Vue_Projects/dist;          index index.html;          # 官网介绍设置这条可以解决history路由的问题          try_files $uri $uri/ /index.html last;            # add_header Content-Type "text/plain;charset=utf-8";          add_header 'Access-Control-Allow-Origin' '*';          add_header 'Access-Control-Allow-Credentials' 'true';          # add_header 'Access-Control-Allow-Methods' 'GET, POST';      }    }  

保存并退出

验证配置文件是否正常使用以下命令

nginx -t 或者 service nginx configtest  

出现以下提示证明配置已经ok了

打开所配置的端口(如果是阿里云,腾讯云,谷歌云,亚马逊云等需要在云控制台配置出入口才能生效)

iptables -A INPUT -p tcp --dport 8099 -j ACCEPT  

如果你想关闭它

iptables -A INPUT -p tcp --dport 8099 -j DROP  

重启以下Nginx

service nginx restart  
十一、启动项目

进去项目目录

cd /srv/myproject/  

启动项目

uwsgi --ini test.ini  

打开浏览器输入IP+端口号 例子如下

66.42.100.165:8099  

最后可以直接使用git上的项目进行部署

原文出处:juejin -> https://juejin.im/post/5d08574351882563f967d5b9

本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如果侵犯你的利益,请发送邮箱到 [email protected],我们会很快的为您处理。