nginx reverse-proxy 实现后,Js Client 连接 Flask socketio 但收不到任何消息
After implementation of nginx reverse-proxy Js Client connects with Flask socketio but doesn't receive any messages
出于某种原因,我的 Angular 客户端连接到后端服务器(显然成功),但它没有收到任何消息。既不直接消息也不广播。
此问题是在使用配置为后端反向代理的 Nginx 后引入的。我按照 flask socketio 模块的最新官方文档,但仍然没有找到任何线索。
在客户端上,我连接并准备接收消息:
const API = "http://146.250.180.213/api/"
::
socket: io;
::
this.socket = io(API);
::
this.socket.on('connect', function() {
console.log('Conection with server estblished - socketio');
});
::
this.socket.on('update_monitor', (data: any) => {
console.log('Broadcasted message received! Data:', data);
});
在 Flask 上,我启动服务器并定义端点:
app = Flask(__name__)
socketio = SocketIO(app)
if __name__ == '__main__':
socketio.run(app, port=5000, debug=True)
===
@app.route('/test_endpoint', methods=['GET'])
def test_endpoint():
socketio.emit('update_monitor', {"mrtp": app.config['MOST_RECENT_TIMESTAMP_PROCESSED'], 'updated_elements': ['ESICAS23C_ESICAS23']})
return jsonify({'message': 'ok'}), 200
@socketio.on('connect')
def connect():
print('Client connected')
我使用 'test_endpoint' 通过向 Postman 请求来测试 socketio 机制。
在Nginx上,我按照documentation:
提供的配置
server {
listen 0.0.0.0:80;
root /usr/share/nginx/html;
index index.html index.htm;
include /etc/nginx/mime.types;
location / {
try_files $uri /index.html;
}
location /socket.io {
# include proxy_params; dont know what this stands for
proxy_http_version 1.1;
proxy_buffering off;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_pass http://127.0.0.1:5000/socket.io;
}
location /grafana/ {
proxy_pass http://localhost:3000/;
proxy_hide_header X-Frame-Options;
}
location /api {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_hide_header X-Frame-Options;
proxy_connect_timeout 9999;
proxy_send_timeout 9999;
proxy_read_timeout 9999;
send_timeout 9999;
rewrite ^/api/(.*) / break;
proxy_pass http://localhost:5000;
}
}
我看到客户端和后端都已连接,但客户端从未收到任何消息。
已经检查过nginx (docker logs) 日志输出,没有异常发生。任何地方都没有任何错误消息。有什么线索吗?建议?
解决方案是使用 http://146.250.180.213/
作为 API url,即没有 /api/
命名空间。
出于某种原因,我的 Angular 客户端连接到后端服务器(显然成功),但它没有收到任何消息。既不直接消息也不广播。
此问题是在使用配置为后端反向代理的 Nginx 后引入的。我按照 flask socketio 模块的最新官方文档,但仍然没有找到任何线索。
在客户端上,我连接并准备接收消息:
const API = "http://146.250.180.213/api/"
::
socket: io;
::
this.socket = io(API);
::
this.socket.on('connect', function() {
console.log('Conection with server estblished - socketio');
});
::
this.socket.on('update_monitor', (data: any) => {
console.log('Broadcasted message received! Data:', data);
});
在 Flask 上,我启动服务器并定义端点:
app = Flask(__name__)
socketio = SocketIO(app)
if __name__ == '__main__':
socketio.run(app, port=5000, debug=True)
===
@app.route('/test_endpoint', methods=['GET'])
def test_endpoint():
socketio.emit('update_monitor', {"mrtp": app.config['MOST_RECENT_TIMESTAMP_PROCESSED'], 'updated_elements': ['ESICAS23C_ESICAS23']})
return jsonify({'message': 'ok'}), 200
@socketio.on('connect')
def connect():
print('Client connected')
我使用 'test_endpoint' 通过向 Postman 请求来测试 socketio 机制。
在Nginx上,我按照documentation:
提供的配置server {
listen 0.0.0.0:80;
root /usr/share/nginx/html;
index index.html index.htm;
include /etc/nginx/mime.types;
location / {
try_files $uri /index.html;
}
location /socket.io {
# include proxy_params; dont know what this stands for
proxy_http_version 1.1;
proxy_buffering off;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_pass http://127.0.0.1:5000/socket.io;
}
location /grafana/ {
proxy_pass http://localhost:3000/;
proxy_hide_header X-Frame-Options;
}
location /api {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_hide_header X-Frame-Options;
proxy_connect_timeout 9999;
proxy_send_timeout 9999;
proxy_read_timeout 9999;
send_timeout 9999;
rewrite ^/api/(.*) / break;
proxy_pass http://localhost:5000;
}
}
我看到客户端和后端都已连接,但客户端从未收到任何消息。
已经检查过nginx (docker logs) 日志输出,没有异常发生。任何地方都没有任何错误消息。有什么线索吗?建议?
解决方案是使用 http://146.250.180.213/
作为 API url,即没有 /api/
命名空间。