Flask + flask-socketio + uWSGI + Nginx 配置

godbei
2024-12-03 / 0 评论 / 8 阅读 / 正在检测是否收录...

前言

我和我妹最近在玩猜人物的游戏, 一个人通过提问来猜, 另一个人回答是或不是, 然后心血来潮地想写成个网页游戏, 哈哈哈, 然后开始自学flask-socketio, 在windows电脑上测试的时候没什么问题, 但想要在不同的地方一起玩, 还是得部署到服务器上.

在部署到服务器上的时候, 毕竟是兴趣爱好, 自学的, 也没人教. 各种问题, 搞得我头都大了, 但还好最后还是搞定了(应该是吧?).

现在来记录一下是怎么配置的, 以防忘记.

开发环境

  • Flask == 3.1.0
  • flask-socketio == 5.4.1
  • uWSGI == 2.0.28
  • Nginx == 1.22.1
  • gevent == 24.11.1

配置记录

Flask后端简单示例代码

使用gevent_uwsgi 作为异步模式

socketio = SocketIO(app, async_mode='gevent_uwsgi')

from flask import Flask, request
from flask_socketio import SocketIO, emit, Namespace

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
# 使用gevent, 配置async_mode为"gevent_uwsgi", 需要安装"gevent"库
socketio = SocketIO(app, async_mode='gevent_uwsgi')
# 允许跨域
socketio.init_app(app, cors_allowed_origin='*')


class MyCustomNamespace(Namespace):
    def on_connect(self):  # 连接时
        print("连接了")
        self.emit("message", {"msg": str(request.sid) + "连接"})

    def on_disconnect(self):  # 创建断开连接时
        print("关闭连接")
        self.emit("message", {"msg": str(request.sid) + "连接已关闭!"})

    def on_message(self, data):  # 收到消息时
        print("收到消息: ", data)
        self.emit("message", {"msg": str(request.sid) + "收到消息!"})


socketio.on_namespace(MyCustomNamespace('/test'))

if __name__ == '__main__':
    socketio.run(app, host="0.0.0.0", port=12306)

uWSGI配置

uwsgi.ini

使用http, 而不是socket

http-websockets = true 启用 WebSockets 支持

gevent = 1000 使用 gevent 来处理并发请求,并且允许最多 1000 个协程同时运行。

[uwsgi]
#项目目录
chdir=xxx

#指定项目application
wsgi-file=./app.py

#python 程序内用以启动的application 变量名
callable=app

# 进程个数
processes=1

# 线程个数
threads=2

#指定启动时的pid文件路径(用于停止服务和重启服务,请勿删除)
pidfile=./uwsgi.pid

# 指定ip及端口
http= :12306 # 要用http模式
#socket= :12306

#启动uwsgi的用户名和用户组
uid=www
gid=www

#启用主进程
master=true

# 设置缓冲区大小
buffer-size = 32768

# 后台运行,并输出日志
daemonize = ./uwsgi.log

# 设置http-websockets为true
http-websockets = true
# 使用 gevent 来处理并发请求,并且允许最多 1000 个协程同时运行。
gevent = 1000

Nginx配置

主要加一个 location /socket.io/

location /socket.io/表示nginx会匹配所有以/socket.io/开头的请求 URI。例如,像/socket.io/?EIO=3&transport=polling这样的请求就会被这个location块所匹配。

处理Socket.io相关请求:当nginx接收到匹配/socket.io/路径的请求时,它会按照这个location块中的配置规则来处理这些请求。

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://127.0.0.1:12306/socket.io/;
  proxy_http_version 1.1;
  proxy_buffering off;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "Upgrade";
        }
0

评论 (0)

取消