我需要在端口443上运行socket.io(其中apache使用Let的加密运行https站点)
我们的想法是使用apache代理将流量重定向到socket.io端口.我找到了解决方案:
<VirtualHost *:443>
ServerName mysite.com
ServerAlias www.mysite.com
SSLEngine on
SSLProxyEngine On
ProxyRequests Off
SSLCertificateFile /etc/apache2/ssl/mysite.com.crt
SSLCertificateKeyFile /etc/apache2/ssl/mysite.com.key
SSLCertificateChainFile /etc/apache2/ssl/ca.cer
DocumentRoot /var/www/errorPages
ErrorDocument 503 /503.html
ProxyPass /503.html !
ProxyPass / http://localhost:3999/
ProxyPassReverse / http://localhost:3999/
RewriteEngine on
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]
RewriteRule .* ws://localhost:3999%{REQUEST_URI} [P]
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
我在端口3999 HTTPS站点上运行socket.io工作正常,但我得到了http 404错误.我想问题是在rewriteCond上.
websocket.js:112 WebSocket连接到'wss://mysite.com/socket.io/?id = 11518237&username = john failed:WebSocket握手期间出错:意外响应代码:404
我已在此聊天中添加了语音,因此现在它是语音/文本组合聊天。您可以在 github 上找到我的贡献,网址如下:
https://github.com/HowardRichman/simple-text-voice-chat-in-node-and-javascript
以下是在 Centos 6.9 中使用 Node.js 服务器和 jquery javascript 客户端进行安全 Websocket 聊天的工作示例。仅涉及两个文件:(1) server.js 和 (2) client.htm。
以下是我使用以下 Linux 命令行运行的 server.js 代码:node server.js
const fs = require('fs');
const https = require('https');
const WebSocket = require('ws');
const server = new https.createServer({
cert: fs.readFileSync('/var/cpanel/ssl/apache_tls/example.com/combined'),
key: fs.readFileSync('/var/cpanel/ssl/apache_tls/example.com/combined')
});
const wss = new WebSocket.Server({ server });
var msg;
wss.on('connection', function connection(ws)
{
ws.on('message', function incoming(message)
{
msg = message;
console.log('received: %s', msg);
wss.clients.forEach(function (client)
{
if (client.readyState == WebSocket.OPEN)
{
client.send( msg …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 mod_proxy 和 mod_proxy_wstunnel 模块将流量从 Apache 重定向到 Tomcat。HTTP 流量重定向没有问题,但我无法使用迄今为止尝试过的任何配置成功重定向 websocket 流量。
我正在使用 Apache 2.4.28 和 Tomcat 8.5.13
我必须说,当我在没有 Apache 的情况下使用 Tomcat 时,websockets 工作得非常好:
适用于此配置的 Tomcat 连接器是下一个:
<Connector URIEncoding="UTF-8"
compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript"
compression="on"
compressionMinSize="1024"
connectionTimeout="20000"
noCompressionUserAgents="gozilla, traviata"
port="443"
protocol="org.apache.coyote.http11.Http11AprProtocol"
SSLEnabled="true"
scheme="https"
secure="true">
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
<SSLHostConfig>
<Certificate certificateKeyFile="/opt/tomcat/cert/privkey.pem"
certificateFile="/opt/tomcat/cert/cert.pem"
certificateChainFile="/opt/tomcat/cert/chain.pem"
type="RSA" />
</SSLHostConfig>
</Connector>
Run Code Online (Sandbox Code Playgroud)
到此为止已经很清楚了。现在我在 Tomcat 前面启动一个 Apache 服务器,我改变的第一件事是像这样的 Tomcat 连接器:
<Connector URIEncoding="UTF-8"
compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript"
compression="on"
compressionMinSize="1024"
connectionTimeout="20000"
noCompressionUserAgents="gozilla, traviata"
port="8080"
protocol="org.apache.coyote.http11.Http11AprProtocol">
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
</Connector>
Run Code Online (Sandbox Code Playgroud)
在 Apache 中,我成功加载了下一个模块(我已经检查过它们确实已加载):
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module …Run Code Online (Sandbox Code Playgroud)