Apache 通过 HTTPS 向 Node 服务器反向代理发送 502 错误,端口不同

Apache 通过 HTTPS 向 Node 服务器反向代理发送 502 错误,端口不同

我有一个在端口 3030 上运行的节点应用程序,用于我想通过 HTTPS 访问的 API。

如果我访问http://api.example.com:3030/*** 我可以毫无问题地加载 200 响应,因此节点应用程序肯定正在运行,但是如果我访问https://api.example.com/**** 我在浏览器中收到以下错误:

Proxy Error
The proxy server received an invalid response from an upstream server.
The proxy server could not handle the request GET /api/posts.

Apache 错误日志中的内容如下:

[Sun Jun 03 15:30:47.942229 2018] [proxy_http:error] [pid 30884] (103)Software caused connection abort: [client xx.xx.xx.xx:xxxxx] AH01102: error reading status line from remote server api.example.com:3030
[Sun Jun 03 15:30:47.942414 2018] [proxy:error] [pid 30884] [client xx.xx.xx.xx:xxxxx] AH00898: Error reading from remote server returned by /***

这是我的 Apache 配置:

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName www.api.example.com
        ServerAlias api.example.com
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html/xxxxxx/

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

<Directory /var/www/html/xxxxxx/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
    </Directory>
RewriteEngine on

SetEnv proxy-initial-not-pooled 1
SSLEngine On
SSLProxyEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
ProxyPreserveHost On
ProxyPass / https://api.example.com:3030/
ProxyPassReverse / https://api.example.com:3030/

</VirtualHost>
</IfModule>

Apache 和 Node 的版本:

  • 节点 8.11.2
  • Apache 2.4.7

非常感谢任何支持,谢谢。

答案1

您的 nodejs 需要在其端口上使用 HTTP,这从您的工作测试中可以看出:

如果我访问http://api.example.com:3030/我可以毫无问题地加载 200 响应

但你将 Apache 配置为通过 https 访问

ProxyPass / https://api.example.com:3030/
ProxyPassReverse / https://api.example.com:3030/

将您的 Apache 配置更改为使用 http 并且它将会工作。

ProxyPass / http://api.example.com:3030/
ProxyPassReverse / http://api.example.com:3030/

补充说明:
通常的做法是不将应用服务器的端口公开。您应该将 nodejs 配置为仅监听您的环回设备 ( 127.0.0.1),然后将您的代理指令更改为连接到localhost:3030而不是api.example.com

相关内容