Comments (5)
问 ai
nodejs如何做到像 nginx 一样的websocket ,通过 /a 或者 /b 或者 /c ,location 到 8080端口
ChatGPT
ChatGPT
ChatGPT
Poe
要在 Node.js 中实现类似 Nginx 的 WebSocket 代理功能,让不同的路径(例如 /a、/b、/c)转发到不同的后端 WebSocket 服务器(例如 8080 端口),可以使用以下代码示例:
javascript
复制
const http = require('http');
const httpProxy = require('http-proxy');
const WebSocket = require('ws');
// 创建一个 HTTP 代理服务器
const proxy = httpProxy.createProxyServer({});
// 创建一个 HTTP 服务器
const server = http.createServer((req, res) => {
const { url } = req;
// 根据请求路径进行分流
if (url.startsWith('/a')) {
proxy.web(req, res, { target: 'ws://localhost:8080' });
} else if (url.startsWith('/b')) {
proxy.web(req, res, { target: 'ws://localhost:8081' });
} else if (url.startsWith('/c')) {
proxy.web(req, res, { target: 'ws://localhost:8082' });
} else {
res.statusCode = 404;
res.end('Not Found');
}
});
// 创建 WebSocket 服务器
const wss1 = new WebSocket.Server({ noServer: true });
const wss2 = new WebSocket.Server({ noServer: true });
const wss3 = new WebSocket.Server({ noServer: true });
// 将 WebSocket 服务器附加到 HTTP 服务器上
server.on('upgrade', (req, socket, head) => {
const { url } = req;
// 根据请求路径进行 WebSocket 升级
if (url.startsWith('/a')) {
wss1.handleUpgrade(req, socket, head, (ws) => {
wss1.emit('connection', ws, req);
});
} else if (url.startsWith('/b')) {
wss2.handleUpgrade(req, socket, head, (ws) => {
wss2.emit('connection', ws, req);
});
} else if (url.startsWith('/c')) {
wss3.handleUpgrade(req, socket, head, (ws) => {
wss3.emit('connection', ws, req);
});
} else {
socket.destroy();
}
});
// 启动服务器
server.listen(80, () => {
console.log('Server is running on port 80');
});
以上代码使用了 http-proxy 模块来创建一个 HTTP 代理服务器,并使用 http 模块创建一个 HTTP 服务器。根据请求的路径进行分流,将不同的路径转发到不同的后端 WebSocket 服务器。
同时,使用 ws 模块创建了三个 WebSocket 服务器,并通过 handleUpgrade 方法将它们附加到 HTTP 服务器上,以便处理 WebSocket 升级请求。
你可以根据需要修改示例中的路径、后端 WebSocket 服务器的地址和端口,以及服务器的监听端口。启动该 Node.js 代码后,它将监听指定的端口(例如 80),并根据请求路径将 WebSocket 请求转发到相应的后端 WebSocket 服务器。
Gemini
只使用 Node.js 实现类似 Nginx 的 WebSocket 功能,可以通过以下步骤进行:
- 安装依赖库
首先,需要安装 Node.js 的 WebSocket 库,例如 ws 或 socket.io。
npm install ws
- 创建 WebSocket 服务器
使用 ws 库创建 WebSocket 服务器,并监听指定的端口。
JavaScript
const WebSocket = require('ws');
const server = new WebSocket.Server({ port: 8080 });
server.on('connection', (socket) => {
// 处理 WebSocket 连接
});
请谨慎使用代码。
- 处理不同路径
根据不同的路径,使用不同的处理逻辑。例如,可以根据路径的不同,发送不同的消息或执行不同的操作。
JavaScript
const WebSocket = require('ws');
const server = new WebSocket.Server({ port: 8080 });
server.on('connection', (socket, request) => {
const pathname = request.url.pathname;
switch (pathname) {
case '/a':
// 处理 `/a` 路径
break;
case '/b':
// 处理 `/b` 路径
break;
case '/c':
// 处理 `/c` 路径
break;
}
});
请谨慎使用代码。
示例代码:
JavaScript
// server.js
const WebSocket = require('ws');
const server = new WebSocket.Server({ port: 8080 });
server.on('connection', (socket, request) => {
const pathname = request.url.pathname;
switch (pathname) {
case '/a':
socket.send('This is /a');
break;
case '/b':
socket.send('This is /b');
break;
case '/c':
socket.send('This is /c');
break;
}
});
请谨慎使用代码。
运行示例:
node server.js
测试:
使用浏览器或 WebSocket 客户端连接到 http://localhost:8080/a、http://localhost:8080/b 或 http://localhost:8080/c,即可建立 WebSocket 连接,并收到相应的消息。
from argo-xray-js-paas.
目前已经摸索着找到对的方法了。
隧道的配置端口就是和NodeJS的监听端口一致才对,如果是Nginx建站也要和Nginx的监听端口一致,不会冲突。关于为什么我会说到冲突可能就是Path上的问题,然后我误以为是端口的问题。下图就是我现在NodeJS的中间件配置,由于我只用vless,所以只有一个,如果想多协议应该是可以加的,3002是vless inbound port。作者目前的代理中间件代理的是根路径,我感觉是错的,但是也说不出什么所以然。
这样设置的话,隧道域名和容器域名都能正常访问路径提供的服务
容器www.example.com/UUID www.example.com/PATH www.example.com/list www.example.com/status
隧道www.trycloudflare.com/UUID www.trycloudflare.com/PATH www.trycloudflare.com/list www.trycloudflare.com/status
from argo-xray-js-paas.
作者目前的代理中间件代理的是根路径
那个根路径因为不能直连可以去掉的,从其他项目直接搬过来,之前不严谨而已,我在另外的科学项目上已经去掉了,无意义的。
现在的方案科学数据直接通过隧道到达平台的 xray 8080 inbound,再通过不同的指定的路径,回落到相应的 xray 的其他 ws 协议的 inbound ,当然,这个是在xray里分流,没有经过 nodejs 的网的。
你的需求是想要隧道先去到 nodejs 的 3000 端口,再在上面使用类似 nginx 的分流,是访问根的就去到伪装网 80 端口,有指定路径的就分流去到 8080 的 xray inbound。这个需求我自己没有做过,不过问问 GPT 使用什么中间件,如何通过路径分流,会问的话应该不太难。
from argo-xray-js-paas.
from argo-xray-js-paas.
那个根路径因为不能直连可以去掉的,从其他项目直接搬过来,之前不严格限制,我在另外的科学项目上已经去掉了,没有意义的。 现在的方案科学数据直接通过到达隧道平台的xray 8080入站,再通过不同的指定的路径,回落到相应的xray的其他ws协议的入站,当然,这个是在xray里分流,没有经过nodejs的网络的。你的需求是想要tunnel先去nodejs的3000端口,再在上面使用类似nginx的分流,是访问根的就去到伪装网80端口,有指定路径的就分流去8080的xray入站。这个需求我自己没有,不过询问GPT使用什么中间件,如何通过路径分流,会问的话应该不太难。当时为什么没有设计tunnel去nodejs使用的3000端口,像你的需求那样呢。因为我想使用本项目的大部分需求都是科学的,有ws+tls+cdn应该很安全的了,不需要伪装网,所以隧道就直接去到xray入站,这样可以减少一个阶段,在我看来能高效点(虽然速度上肯定感觉不出来,只是心理觉得),如果你是这样改的话,我想甚至你都可以在xray上只做1个vless+ws的127.0.0.1入站3011,通过nodejs分流到该3011端口。
你是对的,vm+tls+cdn相较其他来说在很长时间处于稳定状态,不管什么方法能科学就足够了。是的,我的config inbound只有vless+ws。谢谢你的回复。
from argo-xray-js-paas.
Related Issues (9)
- 有没有考虑为deta.space构建一个? HOT 1
- 部署在在Glitch 平台且设置了Argo 固定域名隧道的两个参数,输出节点里还是动态的 HOT 9
- 用json固定argo隧道,部分paas平台疯狂创建argo端口,网速也不通 HOT 23
- No Argo JS version? HOT 1
- codesandbox部署内存疯涨 HOT 3
- Argo-X-Container-PaaS目录结构变化导致web.js文件无法下载,另NeZha Argo通道也在这边也更新一下吧,十分感谢 HOT 2
- render似乎无法运行 HOT 2
- argo在xxx.com/list中没有显示,log也没有。
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from argo-xray-js-paas.