我在EC2实例上托管的R plumber API的连接问题

时间:2018-07-06 21:18:42

标签: r amazon-ec2 plumber

我已经创建了一个R plumber API,该API托管在一个AWS EC2实例上,但是我公司的Web开发人员尝试对我的API执行GET请求时,收到连接错误。我不知道为什么。这是他们从开发服务器上运行的内容,试图将数据托管在我的API端点上:

curl -X GET http://12.345.678.90:8003/path-to-endpoint

这就是他们收到的...

About to connect() to 12.345.678.90 port 8003 (#0)  
Trying 12.345.678.90...   
Connection refused      
Failed connect to 12.345.678.90:8003; Connection refused
Closing connection 0 

如果我只是在本地浏览器中或从任何浏览器中访问端点,则它可以工作并显示数据,但是由于某种原因,它没有使用curl程序进行连接。另外,这些相同的URL终结点可在公司的生产服务器上运行,而不能在其开发服务器上运行-因此,我不确定我的EC2实例是否只是不允许访问开发服务器IP。

如何解决

在EC2实例中,我尝试制定自定义TCP规则以允许入站 来自任何地方的连接。我的实例具有以下入站和出站安全规则:

enter image description here

enter image description here

尽管如此,我公司的Web开发人员仍然无法通过连接从http://12.345.678.90:8003/path-to-endpoint的端点获取API。我有没有在做的事情允许他们访问API?

任何解决此问题的帮助将不胜感激!!

Edit1 :正在与我合作的开发人员的注释-“如果我使用本地浏览器中的http URL,那么它将正常工作并显示CSV,但由于某些原因,它不会显示为curl程序。我们还在防火墙中添加了12.345.678.90 IP,但仍然没有运气。”

Edit2 :这与主题相关,但与问题不直接相关-我如何允许公共访问/通过https(而非http)对端点的任何访问。即使在我自己的本地浏览器中,我也无法通过https URL访问端点?

一如既往的感谢!

1 个答案:

答案 0 :(得分:1)

我内部运行了许多管道工API。

通常,这是防火墙问题。

您可以打开这些端口。但是,每次要提供新服务要求他们打开新端口时,您就不得不重新进入网络。

但这是反向代理闪耀的地方。

我使用nginx

如果将流量路由到端口80上的新端点,则可以拥有与端口一样多的端点(而不必回头并要求更多防火墙)。

有效示例

以下示例在以下位置配置端点:

http://12.345.678.90/myplumberapi/path-to-endpoint

此nginx.conf在端口80上提供服务

(为nginx专家提供的提示,很抱歉,这里有些效率低下,我很抱歉)

http {
        default_type application/json;
        sendfile   on;
        tcp_nopush on;
        server_names_hash_bucket_size 128;

        # note I only list one server here, but if you want
        # to serve your endpoints on more locations, change this
        upstream myplumberapi_pool {
                least_conn;
                server localhost:8003 weight=1;
        }


        map $http_upgrade $connection_upgrade {
                default upgrade;
                ''      close;
        }

        server {
                listen 80;
                listen  [::]:80 default_server;
                location /myplumberapi/ {
                            access_log /var/log/nginx/app.log;
                            rewrite ^/myplumberapi/(.*)$ /$1 break;
                            proxy_set_header Upgrade $http_upgrade;
                            proxy_set_header Connection $connection_upgrade;
                            proxy_set_header Host $host;
                            proxy_set_header X-Real-IP $remote_addr;
                            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                            proxy_pass http://myplumberapi_pool;
                            proxy_read_timeout 20d;
                            proxy_next_upstream error timeout http_500;
                    }

         }
}

events {
        worker_connections 4096;
}

您可以通过相同的方式添加更多API


回复编辑:

关于如何支持https,您需要证书和域名(不能通过IP执行https),但是如果同时拥有,则可以轻松地通过nginx进行演练。