Node.js WebSocket和Apache代理:如何配置mod_proxy_wstunel?
我有:Node.js WebSocket和Apache代理:如何配置mod_proxy_wstunel?,node.js,apache,proxy,websocket,socket.io,Node.js,Apache,Proxy,Websocket,Socket.io,我有: www.domain1.com(v2.4)的服务器端口80上的Apache,并启用 同一服务器的3001端口上的node.js+socket.io 访问www.domain2.com(带有端口80)将重定向到2。幸亏我已经在Apache配置中设置了这一点: <VirtualHost *:80> ServerName www.domain2.com ProxyPass / http://localhost:3001/ ProxyPassReverse /
www.domain1.com
(v2.4)的服务器端口80上的Apache,并启用www.domain2.com
(带有端口80)将重定向到2。幸亏我已经在Apache配置中设置了这一点:
<VirtualHost *:80>
ServerName www.domain2.com
ProxyPass / http://localhost:3001/
ProxyPassReverse / http://localhost:3001/
ProxyPass / ws://localhost:3001/
ProxyPassReverse / ws://localhost:3001/
</VirtualHost>
问题:如何使Apache代理也成为WebSocket?多亏了 待办事项: 1) 安装Apache 2.4(与2.2不兼容),并执行以下操作: 2) 在端口3001上运行
nodejs
3) 在Apache配置中执行此操作
<VirtualHost *:80>
ServerName www.domain2.com
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/socket.io [NC]
RewriteCond %{QUERY_STRING} transport=websocket [NC]
RewriteRule /(.*) ws://localhost:3001/$1 [P,L]
ProxyPass / http://localhost:3001/
ProxyPassReverse / http://localhost:3001/
</VirtualHost>
服务器名www.domain2.com
重新启动发动机
RewriteCond%{REQUEST_URI}^/socket.io[NC]
RewriteCond%{QUERY_STRING}transport=websocket[NC]
重写规则/(*)ws://localhost:3001/$1[P,L]
ProxyPass/http://localhost:3001/
ProxyPassReverse/http://localhost:3001/
注意:如果在使用WebSocket的同一台服务器上有多个服务,则可能需要将它们分开。可能有用。 只是所有查询都通过ws-to节点发送
<VirtualHost *:80>
ServerName www.domain2.com
<Location "/">
ProxyPass "ws://localhost:3001/"
</Location>
</VirtualHost>
服务器名www.domain2.com
ProxyPass“ws://localhost:3001/”
我的设置:
- Apache 2.4.10(运行Debian)
- Node.js(版本4.1.1)应用程序运行在端口3000上,在路径
/api/ws
<VirtualHost *:80>
ServerName *******
ServerAlias *******
ProxyPass / http://localhost:3000/
ProxyPassReverse / http://localhost:3000/
<Location "/api/ws">
ProxyPass "ws://localhost:3000/api/ws"
</Location>
</VirtualHost>
服务器名*******
服务器别名*******
ProxyPass/http://localhost:3000/
ProxyPassReverse/http://localhost:3000/
ProxyPass“ws://localhost:3000/api/ws”
希望对您有所帮助。您也可以通过HTTP头进行过滤,而不是通过URL进行过滤。此配置适用于使用WebSocket的任何web应用程序,如果它们未使用socket.io:
<VirtualHost *:80>
ServerName www.domain2.com
RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /(.*) ws://localhost:3001/$1 [P,L]
RewriteCond %{HTTP:Upgrade} !=websocket [NC]
RewriteRule /(.*) http://localhost:3001/$1 [P,L]
ProxyPassReverse / http://localhost:3001/
</VirtualHost>
服务器名www.domain2.com
重新启动发动机
RewriteCond%{HTTP:Upgrade}=websocket[NC]
重写规则/(*)ws://localhost:3001/$1[P,L]
重写cond%{HTTP:Upgrade}=websocket[NC]
重写规则/(*))http://localhost:3001/$1[P,L]
ProxyPassReverse/http://localhost:3001/
自Socket.IO 1.0(2014年5月)起,所有连接都以HTTP轮询请求开始(更多信息)。这意味着除了转发WebSocket流量外,还需要转发任何transport=polling
HTTP请求
下面的解决方案应该正确重定向所有套接字通信,而不重定向任何其他通信
sudo a2enmod proxy rewrite proxy\u http proxy\u wstunnel
/etc/apache2/sites available/mysite.com.conf
)。我已经加入了注释来解释每件作品:
服务器名www.mydomain.com
#启用重写引擎
#需要:sudo a2enmod proxy rewrite proxy\u http proxy\u wstunnel
#在规则/条件中,[NC]表示不区分大小写,[P]表示代理
重新启动发动机
#socket.io 1.0+使用HTTP轮询请求启动所有连接
RewriteCond%{QUERY_STRING}传输=轮询[NC]
重写规则/(*))http://localhost:3001/$1[P]
#当socket.io想要启动WebSocket连接时,它会发送一个
#应传输到ws的“升级:websocket”请求://
RewriteCond%{HTTP:Upgrade}websocket[NC]
重写规则/(*)ws://localhost:3001/$1[P]
#可选:将/节点上的所有HTTP流量路由到端口3001
代理请求关闭
代理过程/节点http://localhost:3001
ProxyPassReverse/节点http://localhost:3001
/node
流量添加了一个额外的部分,我觉得这很方便,有关更多信息,请参阅在这些答案的帮助下,我终于得到了Node RED的反向代理,它运行在Raspberry Pi上,Ubuntu Mate和Apache2正在运行,使用Apache2站点配置:
<VirtualHost *:80>
ServerName nodered.domain.com
RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /(.*) ws://localhost:1880/$1 [P,L]
RewriteCond %{HTTP:Upgrade} !=websocket [NC]
RewriteRule /(.*) http://localhost:1880/$1 [P,L]
</VirtualHost>
用于“轮询”传输
阿帕奇方面:
<VirtualHost *:80>
ServerName mysite.com
DocumentRoot /my/path
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass /my-connect-3001 http://127.0.0.1:3001/socket.io
ProxyPassReverse /my-connect-3001 http://127.0.0.1:3001/socket.io
</VirtualHost>
使用此链接可获得ws-perfact解决方案 您只需执行以下步骤 转到可用的
/etc/apache2/mods
步骤…1
使用以下命令启用模式代理\u wstunnel.load
$a2enmod proxy_wstunnel.load
第二步
转到/etc/apache2/可用站点
并在虚拟主机内的.conf文件中添加以下行
ProxyPass "/ws2/" "ws://localhost:8080/"
ProxyPass "/wss2/" "wss://localhost:8080/"
注意:8080表示您的tomcat运行端口,因为我们希望连接ws
,我们的War文件放在tomcat中,tomcat为ws
提供apache服务。
多谢各位
我的配置
ws://localhost/ws2/ALLCAD-Unifiedcommunication-1.0/chatserver?userid=4 =Connected
待办事项:
a2enmod代理
和a2enmod代理_wstunnel.load
只需在文件中添加两行,其中8080是tomcat的运行端口
<VirtualHost *:80>
ProxyPass "/ws2/" "ws://localhost:8080/"
ProxyPass "/wss2/" "wss://localhost:8080/"
</VirtualHost *:80>
ProxyPass“/ws2/”ws://localhost:8080/“
ProxyPass“/wss2/”wss://localhost:8080/"
除了主要答案之外:如果在使用WebSocket的同一台服务器上有多个服务,您可能希望使用(*)将它们分开: 节点服务器:
var io = require('socket.io')({ path: '/ws_website1'}).listen(server);
客户端HTML:
<script src="/ws_website1/socket.io.js"></script>
...
<script>
var socket = io('', { path: '/ws_website1' });
...
(*)注意:使用默认的
RewriteCond%{REQUEST_URI}^/socket.io
不会特定于某个网站,而websockets请求会在不同的网站之间混淆 对运行静态、rest和websocket内容的spring应用程序执行了以下操作
Apache用作以下URI的代理和SSL端点:
- /应用程序→ 静态内容
- /原料药→ RESTAPI
- /api/ws→ 网袋
ws://localhost/ws2/ALLCAD-Unifiedcommunication-1.0/chatserver?userid=4 =Connected
<VirtualHost *:80>
ProxyPass "/ws2/" "ws://localhost:8080/"
ProxyPass "/wss2/" "wss://localhost:8080/"
</VirtualHost *:80>
var io = require('socket.io')({ path: '/ws_website1'}).listen(server);
<script src="/ws_website1/socket.io.js"></script>
...
<script>
var socket = io('', { path: '/ws_website1' });
...
RewriteEngine On
RewriteRule ^/website1(.*)$ http://localhost:3001$1 [P,L]
RewriteCond %{REQUEST_URI} ^/ws_website1 [NC]
RewriteCond %{QUERY_STRING} transport=websocket [NC]
RewriteRule ^(.*)$ ws://localhost:3001$1 [P,L]
RewriteCond %{REQUEST_URI} ^/ws_website1 [NC]
RewriteRule ^(.*)$ http://localhost:3001$1 [P,L]
<VirtualHost *:80>
ServerName xxx.xxx.xxx
ProxyRequests Off
ProxyVia Off
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
RewriteEngine On
# websocket
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule ^/api/ws/(.*) ws://localhost:8080/api/ws/$1 [P,L]
# rest
ProxyPass /api http://localhost:8080/api
ProxyPassReverse /api http://localhost:8080/api
# static content
ProxyPass /app http://localhost:8080/app
ProxyPassReverse /app http://localhost:8080/app
</VirtualHost>
server.use-forward-headers: true
<VirtualHost *:80>
ServerName: xxxxx
#ProxyPassReverse is not needed
ProxyPass /log4j ws://localhost:4711/logs
<VirtualHost *:80>