将Apache的https代理到一个节点服务器

4
我正在尝试将Apache服务器作为我的Node服务器的网关。
我的Apache将提供静态页面,而Node将充当REST API服务器。
Node和Apache都位于同一台Ubuntu 64位EC2服务器上。
我曾尝试过用HTTPS实现此操作,但失败了。后来我尝试打开代理传递的HTTP端口,并且它可以工作(我改变了节点以便其能够正常工作)。
如果一切尝试都失败了,我的最后选择将是将Node转换为Web服务器,但我希望保持简单,因为很快就会重构并使用Meteor。
我将感谢任何建议。
这是我的Apache配置:
<VirtualHost *:443>

    ServerName secure.mysite.co.il
    ServerAdmin admin@mysite.com
    DocumentRoot /var/www/html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    SSLEngine on
    SSLCertificateFile /ssl/mysite.crt
    SSLCertificateKeyFile /ssl/mysite.key
    SSLCertificateChainFile /ssl/ca-bundle-client.crt

    ProxyPreserveHost On
    ProxyRequests Off
    ProxyPass /echo/test https://127.0.0.1:8001/echo/test
    ProxyPassReverse /echo/test https://127.0.0.1:8001/echo/test

成功的HTTP配置

<VirtualHost *:80>
    ServerAdmin admin@mysite.com
    ServerName mysite.co.il
    ServerAlias www.mysite.co.il
    DocumentRoot /var/www/html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    ProxyPreserveHost On
    ProxyRequests Off
    ProxyPass / http://127.0.0.1:8001/
    ProxyPassReverse / http://127.0.0.1:8001/
</VirtualHost>

1
你的节点服务是否配置了SSL? - Barry Pollard
var server = restify.createServer({ key: fs.readFileSync('/ssl/mysite.key'), certificate: fs.readFileSync('/ssl//mysite.crt'), name: 'mysite-rest', version: '1.0.0' });这段代码创建了一个名为“mysite-rest”的服务器,使用了SSL证书来保护通信。 - Tal
我不明白Node如何同时为https和http连接设置端口8001。你尝试过使用OpenSSL直接测试https连接吗(“openssl s_client -connect 127.0.0.1:8001”)? - Barry Pollard
正如我所提到的:“(我已经更改了节点为http,以便它能够工作)”。我刚刚删除了crt和key,以使其仅限于测试使用http。 - Tal
不确定您是否指的是在Apache中禁用它(只需将其更改为http)还是两者都禁用了。您能否再次在节点中启用它,尝试上述OpenSSL命令,然后将该输出和完整的节点应用程序添加到您的问题中。您的Apache配置看起来很好,因此怀疑是节点问题。 - Barry Pollard
3个回答

6

请注意,通常情况下,不应在充当转发代理(使用<Proxy>或<ProxyRequest>指令)的虚拟主机中包含SSLProxyEngine指令。 SSLProxyEngine不需要启用转发代理服务器来代理SSL/TLS请求。 - Barry Pollard
3
BazzaDP所说的内容适用于“正向”代理配置。Tal正在使用“反向”代理(更常见)...这需要SSLProxyEngine打开。 - Brandon Harris
你说得对。我的代理混淆了,我检查了自己的配置文件,没有看到它,但现在我看到了,显然之前检查错了。这是我的失误 :-) - Barry Pollard

3
以下配置适用于我。我使用了端口4433,但显然这是任意的。
<VirtualHost _default_:443>
    SSLProxyEngine on

    ServerName example.com
    ServerAlias www.example.com 

    ProxyRequests Off
    ProxyPreserveHost On
    ProxyVia Full
    <Proxy *>
      Require all granted
    </Proxy>

    ServerAdmin info@example.com
    DocumentRoot /var/www/example.com/public_html

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

    SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf
    #SSLCertificateChainFile /etc/letsencrypt/live/fullchain1.pem


    ProxyPass / https://example.com:4433/
    ProxyPassReverse / https://example.com:4433 /

    <Directory "/var/www/example.com/public_html">
        AllowOverride All
    </Directory>        

</VirtualHost>


0

这些技术不兼容或可互换,例如,您不能同时使用JavaScript和PHP,或HTML和CSS与REACT、NODEJS和WebPack3。您必须选择一种,可能是两种技术,并决定使用可靠的代码库,因为代码库经常会出现故障并且不可靠。您会发现,尝试整合更多软件只会破坏您现有的代码。


目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接