如何在同一个域中托管我的 API 和 Web 应用程序?
Posted
技术标签:
【中文标题】如何在同一个域中托管我的 API 和 Web 应用程序?【英文标题】:How can I host my API and web app on the same domain? 【发布时间】:2016-10-05 11:20:49 【问题描述】:我有一个 Rails API 和一个 Web 应用程序(使用 express),它们完全独立且相互独立。我想知道的是,我是否必须单独部署它们?如果我这样做了,我怎样才能让我的 api 在mysite.com/api
和mysite.com/
的网络应用程序中
我见过很多这样做的项目,甚至将 api 和应用程序放在单独的存储库中。
【问题讨论】:
【参考方案1】:通常您不会将此类 Web 应用程序直接暴露给客户端。相反,您使用代理服务器,它将所有传入请求转发到节点或 rails 服务器。
nginx 是一个受欢迎的选择。 beginners guide 甚至包含一个与您正在尝试执行的操作非常相似的示例。
你可以通过类似这样的配置实现你想要的:
server
location /api/
proxy_pass http://localhost:8000;
location /
proxy_pass http://localhost:3000;
这是假设您的 API 在端口 8000 上本地运行,而您的 express 应用程序在端口 3000 上运行。此外,这不是一个完整的配置文件 - 这需要加载或添加到 http
块中。从发行版的默认配置开始。
当有多个位置条目时,nginx 会选择最具体的一个。您甚至可以添加更多条目,例如提供静态内容。
【讨论】:
太棒了!非常感谢:)【参考方案2】:虽然 Svens 的回答对于给出的问题是完全正确的。我更喜欢在 DNS 级别执行此操作,以便我可以将服务器更改为新位置,以防我的 API 或 Web 应用程序负载过重。这有助于我们在不影响 WebApp 的情况下运行我们的 API,反之亦然
DNS 结构
api.mysite.com => 9.9.9.9
mysite.com = > 9.9.9.9
既然现在您希望 WebApp 和 API 在同一台服务器上运行,您可以使用 nginx 适当地转发请求。
server
listen 80;
server_name api.mysite.com;
# ..
# Removed for simplicity
# ..
location /
proxy_pass http://localhost:3000;
server
listen 80;
server_name www.mysite.com;
# ..
# Removed for simplicity
# ..
location /
proxy_pass http://localhost:8000;
如果您以后遇到流量过大的情况,您只需将 DNS 更改为指向新服务器即可。
【讨论】:
太棒了!也很高兴知道其他方式。谢谢你:) 很高兴它有帮助。 :) 每当我尝试访问api.mysite.com
时,都会出现网关错误
您可能想要检查您的服务器是否正在通过 CURL 请求在给定端口向您的服务器运行。还有就是上面的nginx配置不完整。您可能希望根据您的应用程序更改它。它只让您了解它是如何工作的。例如,对于 Rails,您可能需要提供 root /path-to-your-rails-app/public;
以使其工作以上是关于如何在同一个域中托管我的 API 和 Web 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章
如何从同一服务器托管 Web 应用程序和 API,同时将它们分开?
如何在自托管 Web API 应用程序中配置 OData 端点
在同一个 Web 应用程序中托管 WCF 服务和 Web API