【问题标题】:What is the correct way to call a localhost api url on my deployed nginx app?在我部署的 nginx 应用程序上调用 localhost api url 的正确方法是什么?
【发布时间】:2020-04-08 01:33:21
【问题描述】:

编辑

我的问题和问题的更简洁的总结如下:

我有一个 QA 测试员,他需要验证 QA 服务器上的功能 通过点击app.com 域来直观地检查应用程序,然后需要针对同一台服务器发出一系列邮递员 api 请求。问题是域名不一样。

所以在看到app.com 的代码按预期工作后,qa-tester 将访问以下域

differentdomain_one.com/users   ----> localhost
differentdomain_two.com/blogs   ----> localhost
differentdomain_three.com/      ----> localhost

这些域由 app.com 处理,但需要在邮递员中由 differentdomain_one.com 等显式调用。我希望这些域是 localhost 映射到 localhost。 app.com 将命中其相应的 A 记录,并且 api 将命中 localhost。我该怎么做?

#####编辑完成

我有一个具有以下域的生产 Rails 应用程序:

app.com

现在在这个 rails 应用程序中有一个 api 代码,它会到达另一个 url 端点。该端点如下所示:

api.app.com

所以在生产中,用户可以执行以下端点:

api.app.com/users
api.app.com/users/1
api.app.com/users/1/posts

等等。等等

现在我已经为我的开发环境设置了它,以便我的开发 url 是传统的端口 3000 端点。正在开发的应用如下:

app.local:3000

伴随这个url,api url如下:

api.app.local:3000

通过邮递员,我可以拨打以下电话:

api.app.local:3000/users
api.app.local:3000/users/1
api.app.local:3000/users/1/posts

值得注意的是,我的/etc/hosts 中有这个api 条目。

127.0.0.1 api.app.local

通过在/etc/hosts 中输入此条目,我可以与 Postman 通话以进行本地开发通话。

现在我遇到的问题是,我需要在部署环境中为我的 qa 测试人员做同样的事情,仅用于 qa。我已将 Rails 应用程序部署到 ec2 实例。该环境具有映射到 IP 的以下 url。

1.2.3.4.5 qa.app.com 

点击qa.app.com就可以看到渲染出来的应用了。现在的问题是api部分。我认为需要做的就像我的开发环境一样,我需要在我的/etc/hosts 中放置一些东西,但我不确定是什么。

这是我首先尝试的。我尝试将以下内容放入/etc/hosts

1.2.3.4.5 api.app.local

据我所知,这将告诉 nginx 立即将 api.app.local 映射到注册的 ip 1.2.3.4.5 而无需进行 dns 查找。但现在我对邮递员感到困惑。通过执行以下 api 调用,我收到一条错误消息,指出邮递员无法连接。

Could not get any response
There was an error connecting to https://api.app.local:3000/users.

我知道我不在本地主机上,所以端口可能是问题所在。但是,如果我在没有端口的情况下进行此 api 调用,我会得到同样的错误:

Could not get any response
There was an error connecting to https://api.app.local/users.

这让我想知道我应该如何从这个 qa 环境中调用 api。这甚至是正确的方法还是proxy_pass 指令更合适?这是我用于检查的 nginx conf 文件。

server {
    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    server_name 1.2.3.4.5;
    passenger_enabled on;
    rails_env qa;
    root /home/ubuntu/app/public;
    include snippets/self-signed.conf;
    include snippets/ssl-params.conf;

}

我需要将api.app.local 添加到server_name 块中吗?我认为不是因为我在/etc/host 中有它。如果有人熟悉这方面的专业知识,我将非常感谢我如何通过 nginx 实现访问 api。

【问题讨论】:

    标签: ruby-on-rails nginx


    【解决方案1】:

    不要在您的 QA 服务器上将 qa.app.com 映射到 /etc/hosts

    您首先需要在域名注册商中设置 CNAME 以将子域映射到 IP 地址。

    然后你需要将你的nginx配置从server_name 1.2.3.4.5; 更改为server_name qa.app.com;并重启nginx。

    附:将 DNS 映射到 IP 可能需要很少的时间。

    如果您想从 QA 服务器或任何其他机器调用本地 API,您需要使用隧道实用程序,例如 ngrok

    【讨论】:

    • 非常感谢您的回答。在这个问题上真的很难找到帮助。但是,我不确定您的回答是否适用于我最近的编辑。你能看看我在问题顶部的编辑吗?非常感谢您的帮助。我关心的不是代理传递,而是访问完全不同的域主机端点。 ngrok 能做到这一点吗?
    猜你喜欢
    • 2021-02-07
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 2019-09-08
    • 2014-04-19
    • 1970-01-01
    相关资源
    最近更新 更多