阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)

[复制链接]
发表于 昨天 09:46 | 显示全部楼层 |阅读模式

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

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

×
从零搭一个 Flask + Gunicorn 服务,中间最容易卡住的不是装包,而是 gunicorn 跑到一半报 WORKER TIMEOUT。这篇把整条链路走一遍:virtualenv 建虚拟环境、创建 app.py、用 gunicorn 拉起 4 个 worker、排查超时报错并加 --timeout,最后用配置文件启动并放开 5000 端口从公网访问。每一步的截图和完整报错都留在下面。

一、安装虚拟环境 virtualenv

先进入 home 目录,再装 virtualenv:
  1. cd /home
  2. pip install virtualenv
复制代码

创建新的虚拟环境:
  1. virtualenv myenv
复制代码

激活虚拟环境(激活之后可以在当前环境里装包):
  1. source myenv/bin/activate
复制代码

此时终端会显示当前已激活的虚拟环境名(myenv)。退出虚拟环境:
  1. deactivate
复制代码

如果想给虚拟环境指定 Python 版本,用这个写法:
  1. virtualenv -p=/usr/bin/python<version> path/to/new/virtualenv/
复制代码

安装过程的两张截图:





二、创建 Flask 应用

进入虚拟环境目录,新建一个 Python 文件 app.py:
  1. cd /home/myenv
  2. touch app.py
复制代码

装 Flask:
  1. pip install Flask
复制代码

用 nano 编辑 app.py:
  1. nano app.py
复制代码
  1. from flask import Flask
  2. app = Flask(__name__)
  3. @app.route('/', methods=['GET'])
  4. def hello_world():
  5.     return 'Hello Flask!'
  6. if __name__ == '__main__':
  7.     app.run(host='0.0.0.0', port=5000)
复制代码

写完后按 ctrl+O 保存,提示时回车;再按 ctrl+x 退出。

三、安装 gunicorn 并启动服务
  1. pip install gunicorn
复制代码

几个常用的 gunicorn 命令:查看进程树、关闭、重启:
  1. pstree -ap|grep gunicorn
  2. kill -9 3308
  3. kill -HUP 3308
复制代码

然后用 gunicorn 启动 app.py:
  1. gunicorn -w 4 -b 0.0.0.0:5000 app:app
复制代码

参数含义


  • -w:工作进程数
  • -b:绑定的地址和端口
  • app:Flask 启动的 Python 文件名
  • app:脚本中创建的 Flask 对象名


四、踩坑:报 WORKER TIMEOUT 超时错误

启动后直接报错,提示超时(timeout):
  1. [2025-06-09 16:29:31 +0800] [48889] [CRITICAL] WORKER TIMEOUT (pid:48892)
  2. [2025-06-09 16:29:31 +0800] [48892] [ERROR] Error handling request (no URI read)
  3. Traceback (most recent call last):
  4.   File "/home/myenv/lib/python3.10/site-packages/gunicorn/workers/sync.py", line 133, in handle
  5.     req = next(parser)
  6.   File "/home/myenv/lib/python3.10/site-packages/gunicorn/http/parser.py", line 41, in __next__
  7.     self.mesg = self.mesg_class(self.cfg, self.unreader, self.source_addr, self.req_count)
  8.   File "/home/myenv/lib/python3.10/site-packages/gunicorn/http/message.py", line 259, in __init__
  9.     super().__init__(cfg, unreader, peer_addr)
  10.   File "/home/myenv/lib/python3.10/site-packages/gunicorn/http/message.py", line 60, in __init__
  11.     unused = self.parse(self.unreader)
  12.   File "/home/myenv/lib/python3.10/site-packages/gunicorn/http/message.py", line 271, in parse
  13.     self.get_data(unreader, buf, stop=True)
  14.   File "/home/myenv/lib/python3.10/site-packages/gunicorn/http/message.py", line 262, in get_data
  15.     data = unreader.read()
  16.   File "/home/myenv/lib/python3.10/site-packages/gunicorn/http/unreader.py", line 36, in read
  17.     d = self.chunk()
  18.   File "/home/myenv/lib/python3.10/site-packages/gunicorn/http/unreader.py", line 63, in chunk
  19.     return self.sock.recv(self.mxchunk)
  20.   File "/home/myenv/lib/python3.10/site-packages/gunicorn/workers/base.py", line 204, in handle_abort
  21.     sys.exit(1)
  22. SystemExit: 1
复制代码

报错原因:接口返回时间超时。gunicorn 默认超时是 30 秒,接口 30 秒内没有返回结果,gunicorn 就会抛超时错误并杀掉 flask 服务重启。

解决办法:在启动命令里加大超时参数 --timeout。比如把超时设成 200 秒(单位是秒):
  1. gunicorn -w 4 -b 0.0.0.0:5000 --timeout 200 app:app
复制代码

重新启动一次同样的命令:
  1. gunicorn -w 4 -b 0.0.0.0:5000 --timeout 200 app:app
复制代码

注意启动文件必须在 myenv 文件夹下,否则不会成功。报错页面和二次启动成功的效果截图在下面:



再次启动就成功了。直接访问时记得用阿里云公网 IP 加端口号(安全组要添加 5000 端口):



五、用配置文件管理 gunicorn 参数

在 myenv 下创建 gunconf.py:
  1. # 是否开启debug模式
  2. debug = False
  3. # 访问地址
  4. bind = "0.0.0.0:5000"
  5. # 工作进程数
  6. workers = 4
  7. # 工作线程数
  8. threads = 2
  9. # 超时时间
  10. timeout = 200
  11. # 输出日志级别
  12. loglevel = 'debug'
  13. # 存放日志路径
  14. pidfile = "log/gunicorn.pid"
  15. # 存放日志路径
  16. accesslog = "log/access.log"
  17. # 存放日志路径
  18. errorlog = "log/debug.log"
  19. # gunicorn + apscheduler场景下,解决多worker运行定时任务重复执行的问题
  20. preload_app = True
复制代码

注意:还要在 myenv 下分别创建 log/gunicorn.pid、log/access.log、log/debug.log 这三个目录/文件。





然后用配置文件启动:



至此搭建完毕!更多 gunicorn 命令参考:https://cloud.tencent.com/developer/article/1902723

六、几个常用的 Ubuntu 命令


  • 复制文件:cp example.txt /home/user/documents/
  • 删除文件:rm app.py
  • 创建文件:touch app.py
  • 创建文件夹:mkdir myfolder


查看端口被占用的情况:


  • 查某个特定端口的占用情况:如果知道某个端口被占用,可以配合 grep 命令查。比如想看 80 端口的使用情况,输入:netstat -tln | grep 80
  • 查占用某端口的进程:比如查占用 80 端口的进程,输入:lsof -i:80
  • 终止进程:kill -9 80


编辑提示:接口慢就先量清楚一个请求到底花多少秒,再对着 30 秒默认值决定要不要改 --timeout;改完顺手确认阿里云安全组放行的是 5000 而不是 80。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表