我正在尝试连接到一个运行在Nginx反向代理后面的socket.io服务器。我的Nginx代理服务器使用https confighttps://api.xxx.com
运行。节点js socket.io服务器正在另一台服务器上运行http confighttp://a.b.c.d:8081/app/v2
。
在android端作为套接字客户端,我使用implementation'com.github.nkzawa:socket.io-client:0.3.0
。
代理的配置如下:
location /app/v2 {
proxy_cache apicache;
proxy_cache_revalidate on;
proxy_cache_min_uses 2;
proxy_cache_use_stale error timeout updating http_500 http_502
http_503 http_504;
proxy_cache_lock on;
proxy_cache_bypass $http_cache_control;
add_header X-Proxy-Cache $upstream_cache_status;
proxy_cache_methods GET;
proxy_cache_valid 200 302 2s;
proxy_cache_valid 404 1m;
proxy_pass http://a.b.c.d:8081/app/v2;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
节点js服务器:
socketio = socketio.listen(server);
socketio.set('transports', ['websocket']);
socketio.of('/app/v2/socketio/livefeed/').on('connection', function (socket) {
console.log("device connected");
socket.emit('clientAction','connected');
socket.on('disconnect', function () {
console.log("device disconnected");
socket.emit('clientAction','disconnected');
});
});
在尝试将android应用程序连接到socket时,如下所示
`try {
mSocket = IO.socket("https://api.xxx.com/app/v2/socketio/livefeed/");
} catch (URISyntaxException e) {
Log.d(TAG, String.valueOf(e));
}
mSocket.connect();`
套接字客户端未连接到socket.io服务器。代理服务器后面的android socket客户端应该如何连接socket服务器呢?
您使用的url是问题所在,因为您可能需要将它传递给代理,以便进行路由,请在您的nginx conf中尝试以下操作。希望这能帮上忙。
location ~ /app/v2/(?<section>.*) {
proxy_cache apicache;
proxy_cache_revalidate on;
proxy_cache_min_uses 2;
proxy_cache_use_stale error timeout updating http_500 http_502
http_503 http_504;
proxy_cache_lock on;
proxy_cache_bypass $http_cache_control;
add_header X-Proxy-Cache $upstream_cache_status;
proxy_cache_methods GET;
proxy_cache_valid 200 302 2s;
proxy_cache_valid 404 1m;
proxy_pass http://a.b.c.d:8081/app/v2/$section;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
我在插座上遇到过这样的问题。
在我的例子中,通过在nginx.conf
中添加这个来解决这个问题
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}