37创客科创中心

 找回密码
 立即注册
查看: 1733|回复: 0

Flask 应用部署到腾讯云的轻量应用服务器

[复制链接]

194

主题

324

帖子

2405

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2405
发表于 2023-5-30 22:20:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1. Python 及其虚拟环境
  • Python
    Tencent的轻量应用服务器可以安装ubuntu镜像,Ubuntu系统已经预先安装了python2 和 python3, 以及对应的包管理工具pip, 并用pip 和 pip3 加以区分。 查看系统的python3版本:
    python3 --version
    查看 pip3 安装的包列表
    pip3 list
    PS: 对于没有预先装python的系统,参考:Ubuntu安装Python3
  • 虚拟环境
    为了避免“死亡依赖”的发生,使各个项目独立,我们需要为每个项目构建一个虚拟环境,首先用pip下载python虚拟环境工具virtualenv:
    sudo pip3 install virtualenv
    PS: 使用sudo安装,后续才可以访问到这个命令。
    接下来利用virtualenv为我们的flask项目创建虚拟环境,首先创建一个目录,例如:home/lighthouse/www/flask_project,进入这个目录,然后运行:
    sudo virtualenv venv
    如果出现权限问题使用ubuntu的权限设置和归属设置命令chmod chown
    这会在当前目录下创建一个名为venv的文件夹,就是存放python解释器和package的地方。使用activate命令激活(进入)虚拟环境:
    source venv/bin/activate
    执行后,命令行最前方会出现:
    ( venv )
    说明虚拟环境 venv 已经激活。
    PS: 输入命令 deactivate 退出虚拟环境

2. 配置flask项目
  • 上传项目文件
    • 通过github
      如果你的项目在github上,那么直接从github clone过来
      git clone https://.....git
      PS:如果是私有库的话,还得配置一下SSH公钥。
    • 通过文件传输协议
      如果你在windows上开发可以使用WinSCP软件进行文件传输:WinSCP

    假设项目成功上传至 home/lighthouse/www/flask_project 目录下,并只有一个app.py文件:
    # app.pyfrom flask import Flaskapp = Flask(__name__)@app.route("/")def hello():return "Hello World!"if __name__ == "__main__":    app.run(host='0.0.0.0', port=5001)
  • 安装flask
        pip3 install flask

3. Flask生产运行环境 uWSGI (Web Server Gateway Interface)
  • WSGI 是Web服务器(Nginx等)与Python应用程序之间的一座桥。uWSGI 是对WSGI的一种实现,此外uWSGI还实现了http等协议。
  • 安装uWSGIpip3 install uwsgi
    PS: 在虚拟环境venv中安装,可以不用sudo

4. Web服务器nginx
  • Nginx 是高效的 Web 服务器和反向代理服务器, 实现了负载均衡,提升了对静态文件处理的性能。支持高并发。其实只有uWSGI也可以,但是Nginx可以提升性能,并且当有多个服务器和不同的代码编写的应用程序监听同一端口时,就必须得使用Nginx来处理了。
  • 安装
    sudo apt-get install nginx
  • 启动
    sudo service nginx start
    访问服务器的公网IP就能看到Nginx的默认页面:


    Nginx

5. 编写 uwsgi 和 nginx 配置文件
  • 修改nginx默认配置文件
    sudo vim /etc/nginx/sites-enabled/default
    修改为:
    server {      listen 80;      server_name 114.132.226.129; # 域名或者公网IP      charset utf-8;      location / {              include uwsgi_params;              uwsgi_pass 127.0.0.1:8000; #uwsgi和nginx通信端口              uwsgi_param UWSGI_PYTHON /home/lighthouse/www/flask_project/venv; #python路径              uwsgi_param UWSGI_CHDIR /home/lighthouse/www/flask_project;              uwsgi_param UWSGI_SCRIPT app:app;      }  }
    重启Nginx:
    sudo /etc/init.d/nginx restart
    刷新网页,出现的就不再是Nginx的欢迎页面了,而是 502 bad way. 因为我们还没有配置uwsgi。
  • 编写uwsgi配置文件:uwsgi.ini(文件名自定义)
    [uwsgi]                                               socket = 127.0.0.1:8000             # uwsgi的监听端口                                    plugins = python                    # 这行一定要加上,不然请求时会出现-- unavailable modifier requested: 0 --错误提示chdir = /home/lighthouse/...               # flask项目根目录wsgi-file = app.py               # flask程序的启动文件                                                    callable = app                      # 程序变量名       python-autoreload=1             # python文件改动后,自动重启
    启动uwsgi
    uwsgi --ini uwsgi.ini &
    要在虚拟环境中使用哦,因为只有虚拟环境中安装了uwsgi
    刷新网页,就能看到Hello World了。YEAH!
    在一台服务器上运行多个应用,其实只需要改一下文件名,分别处理 uWSGI 和 Nginx 的配置文件即可(Nginx 的配置,可以写在同一个文件中,写两个 server 就行了)
  • supervisor 监控
    单独一个uwsgi程序运行短时间可能没问题,但万一程序停了,你的网页就不工作了,为了防止出现意外情况,我们需要一个监控程序来监控uwsgi的状况,并根据其状态进行相应的处理,这就是supervisor
    安装
    sudo apt-get install supervisor
    生成默认配置文件模板
    echo supervisord_config > flask_supervisord.conf
    为配置文件添加一个程序监控:
    [program:flask_app]          ;项目名,这个和pid对应!!              command = uwsgi --ini /home/lighthouse/www/flask_project/uwsgi.ini  ;跟手动启动的命令一样stopsignal=QUITautostart=trueautorestart=truestdout_logfile=/var/log/uwsgi/supervisor_flask_app.log      ;运行日志stderr_logfile=/var/log/uwsgi/supervisor_flask_app_err.log  ;错误日志
    启动supervisor
    supervisorctl reload
    这里可能会报错:error: <class 'socket.error'>, [Errno 2] No such file or directory
    手动运行supervisor并指定刚才添加的.conf
    sudo supervisord -c flask_supervisord.conf
    有一点非常的重要,就是你的uwsgi.ini里要添加一个pid来告诉supervisor所监控的程序:
    pidfile = /tmp/flask_app.pid
    现在查看uwsgi进程:
    ps aux|grep uwsgi
    然后kill掉这个进程,看supervisor能否帮你重启:
    sudo killall uswgi
    现在如果看到新的uwsgi进程,则说明supervisor监控成功

常用命令
停止某个端口(如 9090)上的应用程序
fuser -k 9090/tcp
uwsgi
uwsgi --reload xxx.piduwsgi --stop xxx.pid
nginx
service nginx start   #启动service nginx stop    #停止service nginx reload  #重启
supervisor
service supervisor startservice supervisor stopsupervisorctl status  # 查看启动的项目supervisorctl start module_name  # 启动项目supervisorctl stop module_name   # 停止木箱supervisorctl shutdown   # 关闭所有项目和服务
本文使用 Zhihu On VSCode 创作并发布

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|37创客科创中心

GMT+8, 2025-12-13 08:13 , Processed in 0.141625 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表