翼度科技»论坛 编程开发 python 查看内容

Flask 生产环境部署(Falsk + uWSGI + nginx)

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
前言

最近自己做了个 Falsk 小项目,在部署上服务器的时候,发现虽然不乏相关教程,但大多都是将自己项目代码复制出来,不讲核心逻辑,不太简洁,于是将自己部署的经验写成内容分享出来。
uWSGI 简介

uWSGI: 一种实现了多种协议(包括 uwsgi、http)并能提供服务器搭建功能的 Python 包
Difference between WSGI , uWSGI and UWSGI
在 Flask 和 nginx 之间使用 uWSGI 的必要性:nginx 并不能直接与 Python 中的 WSGI 通信。WSGI 是 Python 中网络服务的标准。What is the point of uWSGI?
uWSGI 安装

pip 安装,如果失败则用 conda 安装。Error installing uwsgi in virtualenv
Flask 注意

既然看到这篇内容 Flask 程序编写肯定已经不是问题了,不过多介绍。Flask 官网中 Quickstart 的代码为
  1. # app.py
  2. from flask import Flask
  3. app = Flask(__name__)
  4. @app.route("/")
  5. def hello_world():
  6.     return "<p>Hello, World!</p>"
复制代码
通过 flask --app hello run 启动。
要提的是代码中如果有 app.run(),要将其放在 if __name__ == "__main__": 中,即:
  1. # app.py
  2. if __name__ == "__main__":
  3.     app.run()
复制代码
快速上手 uWSGI

文件目录下运行:uwsgi --http 0.0.0.0:5001 -w app:app。第一个 app 是 Flask 代码文件名,第一个 app 是代码中 Flask 对象变量名,即赋值为 Flask(__name__) 的变量名。
打开浏览器访问对应端口测试
部署

部署上服务器需要添加名为 uwsgi.ini 的 uwsgi 配置文件,放在项目根目录下。
基本配置:
  1. ; uwsgi.ini
  2. [uwsgi]
  3. module = app:app
  4. ; http 和 socket 二选一
  5. ; socket 用的是 uwsgi 协议通信
  6. ; http = 127.0.0.1:3031
  7. socket = 127.0.0.1:3031
  8. daemonize = ./uwsgi/uwsgi.log ; 后台运行
  9. pidfile = ./uwsgi/uwsgi.pid   ; 保存 pid 方便后台运行时的程序管理
复制代码
并在根目录下创建 uwsgi 文件夹,就能运行最基础的服务器了。

  • 启动:uwsgi --ini uwsgi.ini
  • 关闭:uwsgi --stop ./uwsgi/uwsgi.pid
  • 配置文件更改后:uwsgi --reload ./uwsgi/uwsgi.pid
配置文件中的变量名就是命令行中参数名的全称。
还建议配置:
  1. master = 1
  2. processes = 4
  3. ; 上面两个参数配置并发,根据服务器性能配置
  4. enable-threads = 1  ; 开启多线程
  5. stats = 0.0.0.0:9191  ; 开启监控端口,以 json 格式返回当下 uwsgi 运行状态
  6. stats-http = 1        ; 开启 http 访问监控端口
复制代码
奇怪的是在本地测试时可以在浏览器直接访问 9191 端口,而在服务员上部署成功后却无法访问,但是有返回的内容,可以用 curl 获取内容。
除此之外,要监控 uwsgi 的运行状态,还可以通过 pip 安装 uwsgitop,而后在 shell 中输入 uwsgitop 就能查看监控,就像 linux 中的 top 一样。
nginx 配置

nginx 基础不多介绍,直入正题配合使用 uwsgi 时该如何配置。
location 中照如下设置:
  1. # 如果是用 socket:
  2. location / {
  3.     include uwsgi_params;
  4.     uwsgi_pass 127.0.0.1:3031;    # 端口号和前述配置文件一样
  5. }
  6. # 如果是用 http:
  7. location / {
  8.     proxy_pass http://127.0.0.1:3031;  # 端口号和前述配置文件一样
  9. }
复制代码
现在可以通过浏览器访问了。

来源:https://www.cnblogs.com/liurundong/p/18134229
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具