flask+uWSGI+nginx+flask

您所在的位置:网站首页 flask-vue flask+uWSGI+nginx+flask

flask+uWSGI+nginx+flask

2023-06-08 19:42| 来源: 网络整理| 查看: 265

部署环境说明

在Ubuntu18.04的服务器上部署的程序。然后分别启动了两个docker,dockerA是我自己用DockerFile编写的环境,用于运行vue项目。dockerB则是直接从nginx官网拉下来的docker(docker pull nginx)

方式一:通过HTTP协议 使用 HTTP 协议,通过端口(如 :5000)接收请求需要 Nginx 或其他 Web 服务器代理,然后转发到 uWSGI配置简单,适合小型项目

uWSGI的配置文件:

[uwsgi] http = :5000 # 监听5000的端口来处理HTTP请求 chdir = /tired/gate/management # 运行目录 wsgi-file = main.py # 指定运行的Python文件 callable = APP # 这个文件中名为APP的可调用对象,它是一个Flask应用程序对象。 master = true # 启用主进程模式 http-websockets = true # 启用通过HTTP进行WebSocket通信的支持 gevent = 1000 # 将gevent工作进程的数量设置为1000。Gevent是一个基于协程的并发库

nginx的配置文件:

# 运行的子线程数量 worker_processes 5; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; keepalive_timeout 65; server { listen 80; server_name localhost; # web应用后端服务 location /api { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://XXX.XXX.XXX.XXX:5000/api; } # web应用的前端服务 location / { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Headers X-Requested-With; add_header Access-Control-Allow-Methods GET,POST,OPTIONS; uwsgi_send_timeout 600; uwsgi_connect_timeout 600; uwsgi_read_timeout 600; root /management/dist; index index.html; try_files $uri $uri/ /index.html; } # 代理 uWSGI 和 Flask-SocketIO 之间的 WebSockets 连接 location /socket.io/ { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://XXX.XXX.XXX.XXX:5000/socket.io/; proxy_http_version 1.1; proxy_buffering off; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; } } }

后端的关键代码

APP = Flask(__name__) APP.config['SECRET_KEY'] = 'secret!' SOCKETIO = SocketIO(APP, async_mode="gevent_uwsgi") SOCKETIO.init_app(APP, cors_allowed_origins='*') NAME_PLACE = "/realtime"

前端的关键代码

const socket = io('/realtime') 注意事项 dockerA在运行启动的时候,需要把5000端口映射出来nginx中的http://XXX.XXX.XXX.XXX要根据不同部署机器的IP进行修改其中nginx中的配置可以进行替换,前提在nginx的docker中含有/etc/nginx/proxy_params文件 proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme;

可替换为include proxy_params; 4. 前端代码的IO可以修改为对应的io('http://XXX.XXX.XXX.XXX:5000/realtime'),这样nginx配置文件中的location /socket.io/就不需要弄了(也会失去nginx高性能代理的能力)。 5. uWSGI配置文件中gevent = 1000不能丢了,不然前端 socketio可以访问到后端,后端的socketio无法访问前端。(这个不知道为啥会这样,欢迎懂得一起交流)

方式二:通过socket协议 使用 uWSGI 的 socket 协议,通过文件(/tired/gate/management/uwsgi_main.sock)接收请求无需 Web 服务器,uWSGI 自身就可以处理请求配置相对复杂,但性能更高,适合大型项目 uWSGI的配置文件: [uwsgi] module = main:APP socket = /tired/gate/management/uwsgi_main.sock chmod-socket = 666 vacuum = true die-on-term = true master = true http-websockets = true gevent = 1000 processes = 1

nginx的配置文件:

# 运行的子线程数量 # 运行的子线程数量 worker_processes 5; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; keepalive_timeout 65; server { listen 80; server_name localhost; # web应用后端服务及,代理 uWSGI 和 Flask-SocketIO 之间的 WebSockets 连接 location ~ ^/(api|socket.io) { include uwsgi_params; uwsgi_pass unix:/management/uwsgi_main.sock; # 提高uwsgi服务器接受请求数据的缓冲区大小,防止JS过大,访问失败 uwsgi_buffer_size 2m; uwsgi_buffers 4 2m; } # web应用的前端服务 location / { root /management/dist; index index.html; try_files $uri $uri/ /index.html; } } } 说明

建议使用该方法,原因:

不用每部署到一台机器,就修改对应的IP地址socket文件的性能比http的要高


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3