阅读 878

Debian部署python3+flask+uwsgi+Nginx+Supervisor

一、安装编译用的包

  • 如果在root下就不用输入 sudo。在子用户下就在命令前加上 sudo。
  1. $ sudo apt-get install build-essential
  2. $ sudo apt-get install libncurses5-dev libncursesw5-dev libreadline6-dev
  3. $ sudo apt-get install libdb5.1-dev libgdbm-dev libsqlite3-dev libssl-dev
  4. $ sudo apt-get install libbz2-dev libexpat1-dev liblzma-dev zlib1g-dev

二、下载安装 python3

  1. 下载python3包

     $ wget --no-check-certificate https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tgz复制代码

    '下载可能会出现证书无效问题,只要安装个ca-certificates或使用--no-check-certificate下载就可以避免下面的错误'

  2. 进入下载目录
     $ cd 下载的目录下/复制代码
  3. 解压包
     $ tar -zxf Python-3.6.3.tgz复制代码
  4. 进入python3
     $ cd Python-3.6.3复制代码

三、编译安装

  1. 解决PIP包管理器所需依赖包
     $ vim Modules/Setup.dist复制代码
  2. 将下面1行取消注释,大概在文件的361行左右.修改后esc:wq保存并退出
     zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz复制代码

四、自定义安装目录

  1. 创建安装目录
     $ mkdir -p /usr/local/python3.6.3复制代码
  2. 进入python3目录
     $ cd Python-3.6.3复制代码
  3. 指定到安装目录
     $ ./configure --prefix=/usr/local/python3.6.3
     $ ./configure --enable-optimizations复制代码
  4. 这里编译使用的是make all没有直接使用make,all参数会编译所有子模块。

     $ make all
     $ make install复制代码

五、把 python3 添加到PATH里

  1. 打开~/.bashrc 文件
  2. 添加执行路径
     $ sudo vim ~/.bashrc
     export PATH=$PATH:/usr/local/python3.6.3/bin复制代码
    添加新的别名信息来修改默认使用的Python版本
     alias python='/usr/bin/python3.6.3'复制代码
  3. 生效配置文件
     $ source .bashrc复制代码
  4. 查看版本:
    因为上面已经添加了默认使用python3.6.3,所以直接输入$ python -V 会出现 (-bash: /usr/bin/python3.6.3: No such file or directory)报错
     查看python版本输入以下:
     $ python2 -V :显示为系统自带的python2.7.3
     $ python3 -V :显示为系统自带的python3.6.3复制代码

六、安装 Nginx

  1. 安装
    $ sudo apt-get install nginx
    # 查看版本
    $ nginx -v复制代码
  2. 启动 nginx

     $ sudo /etc/init.d/nginx start复制代码

    浏览器访问:你的服务器ip地址 如:http://45.45.162.162


    出现上图:表示成功

  3. 停止 nginx
     $ sudo nginx -s stop复制代码

七、安装 uWSGI

  1. 因为已经安装python3所以要使用pip3进行安装
     $ pip3 install uwsgi复制代码
  2. 查看版本
     $ uwsgi --version复制代码
  3. 安装方法二:下载:
     $ wget http://projects.unbit.it/downloads/uwsgi-latest.tar.gz复制代码
  4. 解压:
     $ tar zxvf uwsgi-latest.tar.gz复制代码

八、测试

如果:有现成的项目可以把项目上传到服务器中,在git 管理项目,只需要 git clone 一下就可以了。

如果:你需要从本地上传项目文件,可以用scp命令,这里就不啰嗦用法了。总之我们将项目文件放到服务器,然后就可以用virtualenv管理Python环境
virtualenv就不多说了。这里直接用flask demo进行。

  1. 安装虚拟环境

     $ pip3 install virtualenv复制代码
  2. 创建一个包

     $ mkdir myproject
     $ cd myproject复制代码
  3. 创建虚拟环境
     $ virtualenv env复制代码
    (1)激活虚拟环境
     $ source env/bin/activate复制代码
    (2)在虚环境中安装flask
     $ pip3 install flask复制代码
    (3)退出虚环境
     $ deactivate复制代码
    (4)创建启动文件
     $ vim run.py复制代码
    (5)写入一个flask,端口自己进行设置。我这里用的80端口。
     from flask import Flask
     app = Flask(__name__)
     @app.route("/")
     def hello():
         return "Hello World!"
     if __name__ == "__main__":
         app.run(host='0.0.0.0', port=80)复制代码
    (6)esc+wq保存并且退出
  4. 运行这个run.py文件
    (1)先停止Nginx
     $ nginx -s stop复制代码
    (2)打开你设置的端口(端口默认全部是关闭状态)端口自行设置。
     $ iptables -A INPUT -p tcp --dport 80 -j ACCEPT
     # 如果想关闭打开的端口:
     $ iptables -A INPUT -p tcp --dport 80 -j DROP复制代码
    (3)启动flask程序
     $ cd myproject
     $ python3 run.py复制代码
  5. 用其他电脑和手机4G访问你的服务器ip地址+上端口。
     如:http://45.32.122.555:80/
     出现:Hello World! 那就成功了。复制代码

九、配置 Nginx

  1. *
    (1)进入
     $ cd /etc/nginx/sites-enabled/复制代码
    (2)编辑default
     $ vim default复制代码
    —————————————————————————————————
     # 或者直接配置 $ cd /etc/nginx 
     $ vim nginx.conf
     # 不过要根据其语法来配置其实最后nginx.conf还是会调用/etc/nginx/sites-enabled/default的配置。复制代码
    (3)在最后写入后 :wq保存并且退出
     server {
     listen  80;
     server_name 45.32.162.255; 
     charset      utf-8;
     client_max_body_size 75M;
     location / {
         include      uwsgi_params;
         uwsgi_pass   127.0.0.1:8000;  
         uwsgi_param UWSGI_PYHOME /root/myproject/venv;
         uwsgi_param UWSGI_CHDIR  /root/myproject; 
         uwsgi_param UWSGI_SCRIPT run:app; 
         }
     }复制代码
    解析
    listen 80; # 服务器监听端口
    server_name 45.32.162.255; # 这里写你的域名或者公网IP
    charset utf-8; # 编码
    client_max_body_size 75M; # 之前写的关于GET和POST的区别
    include uwsgi_params; # 导入uwsgi配置
    uwsgi_pass 127.0.0.1:8000; # 转发端口,需要和uwsgi配置当中的监听端口一致 (下面会配置uwsgi)
    uwsgi_param UWSGI_PYTHON /root/myproject/venv; # Python解释器所在的路径(这里为虚拟环境)【路径按照自己具体的路径填写】
    uwsgi_param UWSGI_CHDIR /root/myproject; # 项目根目录
    uwsgi_param UWSGI_SCRIPT run:app; # 项目的主程序,即Flask app所在的位置【run是运行文件run.py文件(根据自己创建的文件名)app是falsk实例】

(4)测试一下配置文件是否正确,若检测配置文件失败,再好好检查下配置文件有没有疏漏。

    $ nginx -t复制代码

# 表示测试成功

(5)此时访问Nginx服务器应该会得到502 Bad Gateway的提示,因为请求被Nginx转发了,但是并没有转发服务器来处理请求(还没有配置好uwsgi)。

    $ service nginx start复制代码

十、配置 uwsgi

  1. # 在项目文件根目录新建配置文件uwsgi.ini(uwsgi支持多种配置文件格式: xml, ini, json等)
    (1)进入项目根目录

     $ cd myproject复制代码

    (2)创建uwsgi文件

     $ vim uwsgi.ini复制代码

    (3)写入以下内容后 :wq保存并退出

     [uwsgi]                                                     
     socket = 127.0.0.1:8000                         
     plugins = python                                        
     chidir = /root/myproject                                    
     wsgi-file = run.py                                       
     callable = app                  复制代码

    # uwsgi的监听端口【要跟上面nginx配置里的端口一样】
    # 这行一定要加上,不然请求时会出现-- unavailable modifier requested: 0 --错误提示
    # 项目根目录【路径按照自己具体的路径填写】
    # flask程序的启动文件【这里我命名为run.py】
    # 程序变量名 【app是falsk实例变量】

  2. 启动测试
    (1)启动 Nginx

     $ service nginx restart复制代码

    (2)启动 uwsgi #注意要回到项目根目录下执行

     $ cd ~
     $ cd myproject
     $ uwsgi uwsgi.ini
     若一切正常的话就可以在终端上看到uwsgi的启动信息了复制代码

    (3)打开浏览器

     访问你的ip加上端口
     例:http://45.32.162.255:80
     页面出现:Hello World!复制代码

    # 说明Nginx和uwsgi配置成功了

    # 但离真正项目上线还差一段,因为uwsgi是直接在前台启动的,当我们的连接终端跟服务器断开的时候uwsgi进程也被关闭了,所以我们需要uwsgi在后台运行。

    解释一下上面这段话:我们在连接服务器启动项目后可以用浏览器访问成功。但是我们一但关闭与服务器的连接后再用浏览器访问就不行了.项目是运行在前台的也就是说.在关闭与服务器连接的同时也关闭了服务器的命令窗.运行在前台的项目也同时关闭。所以我们需要把项目运行在后台。

  3. 后台启动项目
    (1)用nohup启动:不挂断运行命令,用"&"可以让你的命令在后台执行
    (nohup详细的命名参数请到官网查询)注意:别漏了&号。
     $ nohup uwsgi uwsgi.ini &复制代码
    (2)关闭与服务器的连接,然后用浏览器访问你的ip地址:
     显示:Hello World! 表示ok了!复制代码
    (3)可以通过命令把这个项目从后台停止,查询uwsgi的进程(linux命令不详细说了)
     $ ps -ef|grep uwsgi复制代码
    找到uwsgi进程uwsgi.ini:
    root 7950 1 0 14:57 ? 00:00:00 uwsgi uwsgi.ini
    进程id每个人都不一样 这里的id是7950。
    (4)杀掉后台的uwsgi进程kill -9 后面加上进程的id 或者 killall uwsgi杀掉全部同名为uwsgi的进程。
     $ kill -9 7950
     $ killall uwsgi复制代码
    (5)再用浏览器去访问ip
     浏览器页面显示:502 Bad Gateway 表示停止掉uwsgi程序的运行复制代码
    (6)项目根目录下会生成 nohup.out 记录日志

十一、使用Supervisor进程监控

# Supervisor是python2写就的一款强大的运维工具。
目前Supervisor还不支持python3。可以通过以下方法解决。

可通过pip安装.这里用的是python3的pip.所以会安装失败.使用以下.

  1. 首先安装supervisor (默认由自带的python2.7驱动)
     $ apt-get install supervisor复制代码
  2. 进入默认配置文件(修改配置文件)

     $ cd /etc/supervisor/
     $ vim supervisord.conf 
     按shift+G 跳到末尾
     添加:files = /etc/supervisor/*.conf
     esc:wq 保存复制代码

     这样方便为每个app单独设置conf文件而不必全部写在全局设置里面
     在启动supervisorctl须先启动supervisord。
     否则会出现error: 
     <class 'socket.error'>, [Errno 99] Cannot assign requested address: file: /usr/lib/python2.7/socket.py line: 575错误
    
     执行:(若不是在root下执行在最前面加上 sudo)
    
     $ supervisord -c /etc/supervisor/supervisord.conf
     $ supervisorctl -c /etc/supervisor/supervisord.conf
     # 这里补充以一下:每当修改完配置后如果出现
     error: <class 'socket.error'>, [Errno 2] No such file or directory: file: /usr/lib/python2.7/socket.
     # 请重新执行以上的两句命令
    
     进入:supervisor shell模式表示成功
     退出:supervisor shell
     supervisor> exit复制代码
  3. 创建脚本文件,生成默认配置文件.

     $ cd /etc/supervisor/conf.d/
     新建app.conf文件(文件名自己定义)
     $ vim app.conf复制代码
  4. 进入编辑模式添加配置

     [program:myproject]
     directory = /root/myproject/
     command= uwsgi --ini /root/myproject/uwsgi.ini
     autostart = true
     startsecs = 5
     autorestart = true
     startretries = 3
     user = root
     redirect_stderr = true
     stdout_logfile_maxbytes = 20MB
     stdout_logfile_backups = 20
     stdout_logfile = /tmp/app.log
     stopasgroup=false
     killasgroup=false 复制代码

    esc:wq 保存并退出

    # 解析
    [program:myproject]:# 项目的包名字(我的是myproject)

    directory = /root/myproject/:# 程序的启动目录路径

    command= uwsgi --ini /root/myproject/uwsgi.ini:#启动命令
    (相当于直接启动 uwsgi uwsgi.ini一样只是加上了路径)

    autostart = true:# 在 supervisord 启动的时候也自动启动
    startsecs = 5: # 启动 5 秒后没有异常退出,就当作已经正常启动了
    autorestart = true:# 程序异常退出后自动重启
    startretries = 3:# 启动失败自动重试次数,默认是 3
    user = root: # 使用哪个用户启动(我这里用的root)

    redirect_stderr = true:# 把 stderr 重定向到 stdout,默认 false
    stdout_logfile_maxbytes = 20MB:# stdout 日志文件大小,默认 50MB
    stdout_logfile_backups = 20:# stdout 日志文件备份数

    注意:stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord会自动创建日志文件)别忘了配置之后创建下面继续。

    stdout_logfile = /tmp/app.log

    说下这两个有用的配置项stopasgroup和killasgroup,如果我们用Flask等Rest服务,通常其会开启几个进程,那么如果stopasgroup不启用的话,supervisor无法重启此服务(关闭主进程时其子进程没有关闭,再开启主进程时会提示端口被占用等错误信息)。

    stopasgroup=false:
    默认为 false,如果设置为 true,当进程收到 stop 信号时,会自动将该信号发给该进程的子进程。如果这个配置项为 true,那么也隐含 killasgroup 为 true。例如在 Debug 模式使用 Flask 时,Flask 不会将接收到的 stop 信号也传递给它的子进程,因此就需要设置这个配置项。

    killasgroup=false:
    默认为 false,如果设置为 true,当进程收到 kill 信号时,会自动将该信号发给该进程的子进程。如果这个程序使用了 python 的 multiprocessing 时,就能自动停止它的子线程。

         # 创建日志的文件夹
         $ cd ~
         $ cd /myproject/
         $ mkdir tmp复制代码

    配置完成

    # 还有更多的配置参数请查阅官网

    #这里我们可以看出,虽然supervisor是python2写的,但只要我们指定运行的python3解释器去运行程序就行了。

  5. 使配置生效(每当修改主配置文件或增改子配置文件都需要执行使它生效)
    需要先进入$ cd /etc/supervisor目录或者项目的目录cd myproject/才可以运行相关的命令如:supervisorctl reload等相关命令

     $ supervisorctl update # 因为是python3执行该命令可能会报错
     # 可以使用以下命令:重新加载配置文件
     $ supervisorctl reload复制代码
  6. 运行supervisorctl,即可进入shell里面方便的操作,如start app、restart app等。

     $ cd /etc/supervisor
     $ supervisorctl
     $ start myproject # 你的项目名称
     # 执行start后可以看到 myproject RUNNING pid 16758, uptime 0:02:58
     $ restart myproject # 重新启动
     $ stop myproject # 停止
     # 更多相关命令可以到官网上查阅这里不消息介绍复制代码
  7. 以上我们只能在控制台查看运行.我们需要web界面上查看

     # 添加修改配置文件
     $ cd /etc/supervisor/
     $ vim supervisord.conf
     # 如果在vim模式下找到则对应修改
     # 如果没有 按shift+G 跳至末尾添加
    
     # IP和绑定端口
     # 管理员名称
     # 管理员密码
     [inet_http_server]
     port = 45.32.111.111:9001   
     username = user 
     password = 666666
     # 如果不需要密码可以注释在最前面机上;号
     # ;username = user 
     # ;password = 666666
     # 重新加载配置文件使它生效
     $ cd /etc/supervisor
     $ supervisorctl reload
     # 最后你需要打开你的这个端口并且重启supervisorctl
     $ iptables -A INPUT -p tcp --dport 9001 -j ACCEPT
     $ cd /etc/supervisor
     $ supervisorctl复制代码
  8. 用浏览器启动

     # 输入你的ip和端口
     45.32.111.111:9001复制代码

看到上图界面表示已经成功,之后可以通过打开Supervisor端口去监控管理你的项目一键启动/停止你的项目。

——————————————————————————————————
有什么遗漏不足的请多多指导!!!

觉得好的~点个赞打赏下咯~谢谢!!!

关注下面的标签,发现更多相似文章
评论