如何在同一个域中托管我的 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/apimysite.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,同时将它们分开?

如何将域中的多个路径重定向到不同的 AWS 负载均衡器?

如何在自托管 Web API 应用程序中配置 OData 端点

在同一个 Web 应用程序中托管 WCF 服务和 Web API

支持 https 的 Owin 自托管控制台应用程序(无 Web api,无 SignalR)

如何在 firebase 托管中托管单页 webapp 的静态文件,并将 web API 部署在不同的服务器中