【发布时间】:2017-05-24 06:43:39
【问题描述】:
我正在尝试使用 Cloudflare 运行带有 Node.JS + Socket.IO 的 Apache 以进行 CDN/保护,但出现了问题。
我尝试了很多方法来让 Apache 处理 Socket.IO 连接(不是通过 SSL),包括 ProxyPass
<VirtualHost *:80>
ServerName play.example.me
ServerAlias example.me
DocumentRoot /home/web/
AccessFileName .htaccess
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyRequests off
<Location /socket.io>
ProxyPreserveHost On
ProxyPass ws://localhost:8080/socket.io/
ProxyPassReverse ws://localhost:8080/socket.io/
</Location>
</VirtualHost>
这会给出 520 HTTP 错误,这是 Cloudflare 的一般错误。
我尝试在 Node.JS + Socket.IO 上使用 Let's Encrypt 的 SSL 证书,但它给出了 ERR_SSL_PROTOCOL_ERROR。
我用来在 Node.JS 上创建服务器的代码是
var app = new express();
var options = {
key: fs.readFileSync("/etc/letsencrypt/live/play.example.me/privkey.pem"),
cert: fs.readFileSync("/etc/letsencrypt/live/play.example.me/cert.pem"),
ca: fs.readFileSync("/etc/letsencrypt/live/play.example.me/chain.pem"),
requestCert: false,
rejectUnauthorized: false
};
var server = require("https").createServer(options, app);
var io = require("socket.io").listen(server, { serveClient: false });
我实际上是在使用 ProxyPass 来处理子域“api”。传递给 Node.JS / Express:
<VirtualHost *:80>
ServerName api.example.me
ServerAlias example.me
ProxyRequests off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
<Location />
ProxyPass http://localhost:8080/
ProxyPassReverse http://localhost:8080/
</Location>
</VirtualHost>
这是有效的,但 webosocket 没有。 没有 Apache(直接在 Express 上运行)一切正常,包括 websocket。但是,我也需要运行 Apache,因为该网站是用 PHP 编写的。
我做错了吗?
【问题讨论】:
标签: node.js apache proxy socket.io cloudflare