首页 > 解决方案 > 使用 SSL 运行的 NodeJS,Apache2 代理不起作用

问题描述

我一直在尝试运行一个可以使用 :x (端口号)正常访问的 NodeJS 应用程序,但它运行在一个子域上

subdomain.domain.com:x

当 NodeJS 应用程序与http没有 SSL 配置的服务器一起提供时,Apache 配置工作正常并且new.domain.com被代理subdomain.domain.com:x就好了。

但是当 NodeJS 应用程序是服务器时https,Apache 会生成 502 Bad Gateway 错误。下面是我一直在使用的配置。我尝试了一切,但它不起作用。

请注意,我已将原始端口号和子域替换为随机名称,以隐藏真实域名。


<VirtualHost *:443>
        DocumentRoot /var/www/html


        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined


        ServerName new.domain.com 

        SSLProxyEngine On
        SSLEngine On
        SSLCertificateFile <Path/To/SSLCertificate>/fullchain.pem
        SSLCertificateKeyFile <Path/To/SSLCertificateKeyFile>/privkey.pem
        Include /etc/letsencrypt/options-ssl-apache.conf

        ProxyRequests off
        ProxyPreserveHost On
        ProxyPass / https://subdomain.domain.com:x/
</VirtualHost>
<VirtualHost *:80>
   CustomLog ${APACHE_LOG_DIR}/subdomain.domain.com-access.log combined
   ErrorLog ${APACHE_LOG_DIR}/subdomain.domain.com-error.log

   ServerName new.domain.com   
   Redirect "/" "https://new.domain.com/"

</VirtualHost>

NodeJS 也在一个非常简单的设置中运行,如下所示;

const https = require("https"),
  fs = require("fs");

const options = {
  key: fs.readFileSync("/srv/www/keys/my-site-key.pem"),
  cert: fs.readFileSync("/srv/www/keys/chain.pem")
};

const app = express();

app.use((req, res) => {
  res.writeHead(200);
  res.end("hello world\n");
});

app.listen(8000);

https.createServer(options, app).listen(8080);


标签: node.jsapachesslapache2lets-encrypt

解决方案


推荐阅读