前言
我和我妹最近在玩猜人物的游戏, 一个人通过提问来猜, 另一个人回答是或不是, 然后心血来潮地想写成个网页游戏, 哈哈哈, 然后开始自学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)