如何让apache、node.js、beego和https很好的协同工作?

如何让apache、node.js、beego和https很好的协同工作?

我有一台服务器,想要为两个不同的网站提供服务:

  • a.example.com 应该定向到监听 8081/8443 的 node.js
  • b.example.com 应该被引导到 8081/8444 上的 beego 监听

我有 apache httpd 在 80 上监听并使用以下指令来

<VirtualHost *:80>
ServerName a.example.com
ProxyPreserveHost On

<Proxy *>
    Order allow,deny
    Allow from all
</Proxy>
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
</VirtualHost>

<VirtualHost *:80>
ServerName b.example.com
ProxyPreserveHost On

<Proxy *>
    Order allow,deny
    Allow from all
</Proxy>
ProxyPass / http://localhost:8081/
ProxyPassReverse / http://localhost:8081/
</VirtualHost>

通过 http 使用这些协议就像您想象的那样。现在我的问题是如何通过 https 保护网站。当我让任何一个网站在端口 80 上监听并且关闭 Apache httpd 时,https 就可以正常工作。但是让它们与 Apache 很好地配合并不容易。

所以我尝试添加

<VirtualHost *:443>
ServerName a.example.com
ProxyPreserveHost On

SSLProxyEngine on
SSLEngine on
SSLCertificateFile /path/to/a/sslcert/server.crt
SSLCertificateKeyFile /path/to/a/sslcert/server.key

<Proxy *>
    Order allow,deny
    Allow from all
</Proxy>
ProxyPass / https://localhost:8443/
ProxyPassReverse / https://localhost:8443/
</VirtualHost>

和 b.example.com 等效,但是尝试访问 https://{a|b}.example.com 会得到

Proxy Error
The proxy server could not handle the request GET /
Reason: Error during SSL Handshake with remote server

我猜想这可能和 beego 和 node.js 都使用自己的 httpd 来建立 https 有关,所以我又试了一次……但没有 4 行与 SSL 相关的代码。
这次的结果是

Error code: ERR_SSL_PROTOCOL_ERROR (chrome)
Error code: ssl_error_rx_record_too_long (firefox)

我不知道下一步该尝试什么,谷歌搜索无果,所以我希望你们能提供一些帮助?

我需要 beego 和 node.js 站点都能够设置自己的 https 设置,这样它们就可以在有或没有 Apache 的情况下工作。这可行吗?

# httpd -S
VirtualHost configuration:
*:443                  is a NameVirtualHost
     default server a.example.com (/etc/httpd/conf/extra/httpd-   vhosts.conf:30)
     port 443 namevhost a.example.com (/etc/httpd/conf/extra/httpd-vhosts.conf:30)
     port 443 namevhost b.example.com (/etc/httpd/conf/extra/httpd-vhosts.conf:62)
*:80                   is a NameVirtualHost
     default server www.example.com (/etc/httpd/conf/extra/httpd-vhosts.conf:24)
     port 80 namevhost www.pontusfa.lk (/etc/httpd/conf/extra/httpd-vhosts.conf:24)
             alias example.com
     port 80 namevhost a.example.com (/etc/httpd/conf/extra/httpd-vhosts.conf:48)
     port 80 namevhost b.example.com (/etc/httpd/conf/extra/httpd-vhosts.conf:80)
ServerRoot: "/etc/httpd"
Main DocumentRoot: "/srv/http"
Main ErrorLog: "/var/log/httpd/error_log"
Mutex ssl-stapling: using_defaults
Mutex proxy: using_defaults
Mutex ssl-cache: using_defaults
Mutex default: dir="/run/httpd/" mechanism=default 
Mutex mpm-accept: using_defaults
Mutex proxy-balancer-shm: using_defaults
PidFile: "/run/httpd/httpd.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="http" id=33
Group: name="http" id=33

答案1

我不明白使用 HTTPS 连接到节点/beego 有什么意义。

你试一试:

客户 ---> HTTPS-Apache ---> HTTP 节点

请记住节点是单线程的,所以您不应该在密集型 CPU(和 SSL)上使用它,否则请求将被排队。

相关内容