我有一台服务器,想要为两个不同的网站提供服务:
- 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)上使用它,否则请求将被排队。