You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache反向代理下Node.js应用无响应的排查求助

问题解决步骤

1. 调整Apache虚拟主机配置

你的当前配置缺少WebSocket代理支持,且路径匹配规则存在问题,修改后的完整配置如下:

<VirtualHost *:443>
    ServerName jutechs.de

    SSLProxyEngine On
    SSLProxyCheckPeerCN on
    SSLProxyCheckPeerExpire on

    ProxyRequests Off
    ProxyPreserveHost On
    ProxyVia Full

    <Proxy *>
        Require all granted
    </Proxy>

    # 处理socket.io的WebSocket请求转发
    RewriteEngine On
    RewriteCond %{REQUEST_URI}  ^/textEdit/socket.io            [NC]
    RewriteCond %{QUERY_STRING} transport=websocket            [NC]
    RewriteRule /textEdit/(.*)  wss://127.0.0.1:2096/$1 [P,L]

    # 代理HTTP请求到Node应用,注意路径尾斜杠的匹配
    <Location /textEdit/>
        ProxyPass https://127.0.0.1:2096/
        ProxyPassReverse https://127.0.0.1:2096/
    </Location>

    <Directory "/var/www/html/textEdit">
        AllowOverride All
    </Directory>
</VirtualHost>

核心改动说明:

  • 启用Rewrite规则,将socket.io的WebSocket请求(wss协议)转发到Node服务
  • 为Location和ProxyPass添加尾斜杠,确保子路径下的所有请求都能被正确代理

2. 修改Node.js应用配置(Express + socket.io)

由于应用通过/textEdit子路径对外提供服务,需要给Express和socket.io设置路径前缀:

const express = require('express');
const http = require('http');
const { Server } = require('socket.io');

const app = express();
const server = http.createServer(app);

// 将静态文件挂载到/textEdit路径下
app.use('/textEdit', express.static('public'));

// 配置socket.io的路径前缀与跨域规则
const io = new Server(server, {
    path: '/textEdit/socket.io',
    cors: {
        origin: 'https://jutechs.de',
        methods: ["GET", "POST"]
    }
});

// 在线用户计数逻辑
io.on('connection', (socket) => {
    io.emit('user count', io.engine.clientsCount);
    
    socket.on('disconnect', () => {
        io.emit('user count', io.engine.clientsCount);
    });
});

server.listen(2096, () => {
    console.log('服务运行在 *:2096');
});

核心改动说明:

  • Express静态资源挂载到/textEdit,匹配代理路径
  • socket.io指定path为/textEdit/socket.io,对应Apache的转发规则
  • 明确CORS允许的域名,避免跨域拦截

3. 修正前端socket.io连接代码

前端页面中需要指定正确的socket.io连接路径:

// 前端JS代码
const socket = io({
    path: '/textEdit/socket.io'
});

// 监听用户计数更新
socket.on('user count', (count) => {
    document.getElementById('user-count').textContent = count;
});

验证步骤

  1. 重启Apache服务:sudo systemctl restart apache2
  2. 重启Node.js应用
  3. 访问https://jutechs.de/textEdit,检查用户计数器是否正常更新

内容的提问来源于stack exchange,提问作者Sobig_F

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 17:42:22