PC端websocket调试成功,但是手机无法通信有问题,节点启动服务的命令行界面没有打印出用户访问页面的信息,也就是页面手机上没有连接websocket服务,而且本地电脑和手机连接的是同一个wifi,也就是说网络环境是一样的,那为什么本地调试可行,而手机呢access无法连接到websocket服务?网上查到的各种资料基本都和这个问题无关。最后突然想起前段时间做的一个python项目。linux搭建的环境是gunicorn+python+nginx,gunicorn作为启动python环境。role,gunicorn访问localhost+port,然后使用nginx作为反向代理。这个项目很像,于是想到了做nginx反向代理。nginx反向代理简单的解释就是用户访问页面,由nginx中转,中转到服务器端内部开放的端口(不是外部)。问题原因:移动端进入页面时,访问的是内网ip。此时nginx可以识别内网ip并转入对应的项目,但是socket=io('ws://内网ip:3000'),并不能直接访问websocket,会先转入nginx,然后nginx将访问websocket服务。websocket开放的端口相当于内部端口,外部无法访问。解决方法:修改html的js,varsocket=io('ws://intranetip:81');这里的81不是websocket的访问端口,而是nginx作为反向代理的访问端口(配置如下)map$http_upgrade$connection_upgrade{defaultupgrade;''close;}upstreamwebsocket{serverlocalhost:3000;#这里是websocket的访问端口}server{server_name192.168.33.174;#这里是内网端口listen81;位置/{proxy_passhttp://websocket;proxy_read_timeout300s;proxy_send_timeout300s;proxy_set_header主机$host;proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;proxy_http_version1.1;proxy_set_header升级$http_upgrade;proxy_set_header连接$connection_upgrade;').createServer()vario=require('socket.io')(app);app.listen(3000);//网络套接字t访问的端口varamount=0index.htmlvarsocket=io('ws://192.168.33.174:81');//内网ip+端口加粗文字
