gpt4 book ai didi

javascript - Cloudflare SSL 错误 522 Express

转载 作者:太空宇宙 更新时间:2023-11-03 14:29:27 25 4
gpt4 key购买 nike

我使用 express-generator 设置了一个 express 项目,现在我正尝试将其转换为使用 cloudflare SSL 证书通过 https

我在 443 端口上运行我的 express 应用。

但是,当我转到该域时,出现了 cloudflare 522 错误,即使阅读了文档,我也无法弄清楚是什么原因造成的。

服务器代码

#!/usr/bin/env node

/**
* Module dependencies.
*/

var app = require('../app');
var debug = require('debug')('myapp:server');
var http = require('http');

/**
* Get port from environment and store in Express.
*/

var port = normalizePort(process.env.PORT || '443');

app.set('port', port);

/**
* Create HTTP server.
*/

var fs = require('fs')
var https = require('https');
var options = {
key: fs.readFileSync(__dirname + '/certs/key.pem'),
cert: fs.readFileSync(__dirname + '/certs/cert.pem')
};

var server = https.createServer(options, app);

/**
* Listen on provided port, on all network interfaces.
*/

server.listen(port);
server.on('error', onError);
server.on('listening', onListening);

/**
* Normalize a port into a number, string, or false.
*/

function normalizePort(val) {
var port = parseInt(val, 10);

if (isNaN(port)) {
// named pipe
return val;
}

if (port >= 0) {
// port number
return port;
}

return false;
}

/**
* Event listener for HTTP server "error" event.
*/

function onError(error) {
if (error.syscall !== 'listen') {
throw error;
}

var bind = typeof port === 'string'
? 'Pipe ' + port
: 'Port ' + port;

// handle specific listen errors with friendly messages
switch (error.code) {
case 'EACCES':
console.error(bind + ' requires elevated privileges');
process.exit(1);
break;
case 'EADDRINUSE':
console.error(bind + ' is already in use');
process.exit(1);
break;
default:
throw error;
}
}

/**
* Event listener for HTTP server "listening" event.
*/

function onListening() {
var addr = server.address();
var bind = typeof addr === 'string'
? 'pipe ' + addr
: 'port ' + addr.port;
debug('Listening on ' + bind);
}

其中服务器是在这部分创建的;

var fs = require('fs')
var https = require('https');
var options = {
key: fs.readFileSync(__dirname + '/certs/key.pem'),
cert: fs.readFileSync(__dirname + '/certs/cert.pem')
};

var server = https.createServer(options, app);

最佳答案

I run my express app on port 3000 and use iptables to forward traffic from 80 and 443 to my app (3000).

根据您的代码,您的 nodejs 应用程序将处理 https。它不会处理纯 HTTP。但是通过简单地将端口 80 转发到端口 3000,纯 HTTP 请求将发送到应用程序。

... when I then go to the domain I get the cloudflare 522 error

如果您只是“转到域”,则默认协议(protocol)是 HTTP。这意味着您的浏览器将在端口 80 上向 Cloudflare 发送一个 HTTP 请求,然后 Cloudflare 会将这个普通的 HTTP 请求转发到端口 80 上的系统,然后您将在端口 3000 上将这个普通的 HTTP 请求转发到您的 nodejs 应用程序。只是,这个应用程序不能处理纯 HTTP。相反,它需要 HTTPS,这意味着它需要 TLS 握手 (ClientHello) 的开始,而不是普通的 HTTP 请求。这可能会导致您看到错误,因为 nodejs 应用程序可能会等待预期的输入而不响应纯 HTTP 请求。

要解决此问题,您可以让 nodejs 应用程序在不同端口上同时监听 HTTP 和 HTTPS as described here然后将 80 重定向到 http-listener,将 443 重定向到 https-listener。

关于javascript - Cloudflare SSL 错误 522 Express,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54029437/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com