IONOS VPS上NodeJS搭建WebSocket遇426 Upgrade Required错误求助
问题核心定位
- 你在Plesk的NodeJS配置中,把应用URL设为了
http://[my.url],这会导致域名下所有HTTP/HTTPS请求都被转发到仅处理WebSocket连接的Node服务(app.js)。但你的app.js只监听WebSocket升级请求,不处理普通HTTP页面请求,因此任何页面访问都会触发「Upgrade Required」426错误。 - 测试页面的WebSocket连接地址完全错误:
ws://[my.url]/server/app.js不符合WebSocket服务的连接逻辑——你的Node服务是独立监听8080端口的,不是通过HTTP路径映射调用的。
修复步骤
1. 调整Plesk NodeJS路由,避免占用整个域名
登录Plesk找到你的NodeJS应用配置,把应用URL修改为http://[my.url]/ws(或其他自定义子路径,比如/game-ws)。这样只有访问该子路径的请求才会转发到Node服务,其他页面请求仍由Plesk的Web服务器(NGINX/Apache)正常处理。
2. 修正客户端WebSocket连接地址
根据部署方式选择正确的连接地址:
- 直接连接Node服务的8080端口:
const ws = new WebSocket('ws://[my.url]:8080'); - 通过Plesk反向代理(即上面设置的
/ws路径)连接:
若反向代理下WebSocket无法连接,需在Plesk的「Apache & NGINX Settings」中手动添加NGINX规则:const ws = new WebSocket('ws://[my.url]/ws');location /ws { proxy_pass http://localhost:8080; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; }
3. 分离页面与服务部署
把测试页面ws_test.html放在httpdocs根目录下(而非server目录),这样访问http://[my.url]/ws_test.html时,请求由Web服务器直接处理,不会触发Node服务的426错误。
4. 给Node服务添加普通HTTP响应处理
修改app.js,让它能处理普通HTTP请求(避免误访问8080端口时返回426):
const http = require('http'); const WebSocket = require('ws'); // 处理普通HTTP请求 const server = http.createServer((req, res) => { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('WebSocket game service is running\n'); }); // 挂载WebSocket服务 const wss = new WebSocket.Server({ server }); wss.on('connection', (ws) => { // 你的WebSocket业务逻辑 ws.on('message', (data) => { console.log('Received:', data); ws.send('Server received: ' + data); }); }); server.listen(8080);
5. 验证服务可用性
用wscat工具测试WebSocket服务是否正常:
npm install -g wscat wscat -c ws://[my.url]:8080
若能成功连接并收发消息,说明服务本身无问题,仅需调整Plesk路由配置。
额外检查点
- 确认IONOS服务器防火墙和Plesk防火墙都已开放8080端口;
- 重启Plesk的NodeJS应用和Web服务器,确保配置生效。
内容的提问来源于stack exchange,提问作者pundabuyer
相关产品推荐
相关产品推荐

