我有一个在端口 80 上运行的 apache 服务器,我想让一个子域指向同一台服务器上的端口 3000。端口 3000 上的服务器是 ruby on rails 服务器,但理想情况下,我可以在端口 80 上的 apache2 上托管我的主网站,然后托管一个子域,如 api.mycompany.com,专门处理端口 3000 上的 API 请求。我该怎么做?
答案1
创建两个指向同一服务器的 A 记录
示例.com--> 87.45.34.31 (替换为您的服务器的 IP 地址)
api.example.com--> 87.45.34.31 (替换为您的 IP)
创建一个虚拟主机对于 Apache 上的域名 example.com,为您的前端静态文件指向 /var/www/html。创建另一个虚拟主机对于 api.example.com,在端口 localhost:3000 上使用反向代理
答案2
一种方法是使用 Apache 作为所谓的“反向代理”。这基本上就是告诉 Apache 服务器“无论进入此虚拟主机的内容是什么,都将其发送到 1.2.3.4:3000,并传递来自那里的响应”。
对于 Apache,这可以通过模块来完成,它提供像ProxyPassReverse apache2ctl -M proxy_module (shared)'mod_proxy
这样的指令。ProxyPass
. The module should have been installed with your standard Apache setup. You can check whether the output of
contains something along the lines of
然后,设置一个额外的虚拟主机来处理主机名api.mycompany.com
。在此虚拟主机中,设置反向代理
ProxyPass "/" "http://127.0.0.1:3000"
ProxyPassReverse "/" "http://127.0.0.1:3000"
http://127.0.0.1:3000
假设您的 Rails 应用程序正在从服务器的角度运行。
根据你的 Rails 应用的具体需求,可能还需要考虑其他因素(例如ProxyPreserveHost,仅举一例)。但这是基本原则。
一些额外的想法:
- 不要忘记检查是否有 DNS 记录
api.mycompany.com
,以及该记录是否指向您的服务器。 - 确保运行 Rails 应用程序的服务器只能从
localhost
(127.0.0.1
和之间的某个地址127.255.255.254
) 访问。不再需要让应用程序从公共 IP 访问,这是 Apache 的工作。