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

1、获取最新的软件包/升级已安装的全部软件包

  • apt-get update
  • apt-get upgrade

2、安装: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

3、安装: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:
  • 分别键入pythonpython3输出的版本均为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:~# 
    复制代码

3、安装Git而且拉取项目

  • apt-get install git -y
  • git --version
  • cd /srv/
  • git clone https://github.com/xxx/xxx.git

4、安装: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不做详细介绍)

5、安装:Nginx

  • apt-get install nginx

6、安装:Uwsgi(注意用的pip3并且不须要安装在虚拟环境中)

  • pip3 install uwsgi

7、测试一下Nginx

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

8、使用:Uwsgi启动项目

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

  • cd /srv/myproject/前端

  • vim test.inipython

  • chdir:项目的路径nginx

  • module:模块:启动文件的名称不须要加上.pygit

  • home:python的虚拟环境路径github

  • master:是否启用mater模式web

  • processes:启动的工做进程-生成指定数目的worker/进程进程数(根据你服务器的配置去设定通常cup数*2)shell

  • threads:线程数(通常processes * 2)flask

  • buffesocket:socket文件地址用于与Nginx进行通信r-size:用于uwsgi包解析的内部缓存区大小为64k。默认是4k。vim

  • 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。

9、配置: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启动前端)

    后端配置文件以下:

    (其实就是把上面配置前端部分去掉):

    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;
            }
        }
    复制代码

    前端配置文件以下:

    (经过Nginx转发找到:http://你的ip或者域名/cms/ ,这种方法同时能够解决options浏览器预请求的问题,注意:http://你的ip或者域名/cms/ 要与你前端代码里面写的请求地址url一致 或许你会叫作: http://123.456.789:8080/api/):

    server {
        	listen      9977;
        	server_name 你的ip或者域名;
        	harset     utf-8;
        	client_max_body_size 75M;
    
        	location / {
        		root /srv/YangZhiXiaoBlog-Cms/dist; # 前端打包完成的文件路径
            	index index.html;
            	try_files $uri $uri/ /index.html; # 官网介绍设置这条能够解决history路由的问题
           	} 
    
          	location /web/ {
            	proxy_pass http://你的ip或者域名/cms/;
          	} 
        }
    复制代码
  • 保存并退出

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

  • 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或者nginx -s reload

10、启动项目

  • 进去项目目录

  • cd /srv/myproject/

  • 启动项目

  • uwsgi --ini test.ini

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

  • 66.42.100.165:8099

  • 最后能够直接使用git上的项目进行部署

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

后续更新...
复制代码

12、使用:Docker容器化MySQL,Redis等

后续更新...
复制代码

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

调试中...
复制代码
相关文章
相关标签/搜索