使用我的R管道工程API在EC2实例上托管的连接问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用我的R管道工程API在EC2实例上托管的连接问题相关的知识,希望对你有一定的参考价值。

我在AWS EC2实例上创建了一个R管道工程API,但是我公司的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吗?

任何帮助解决这个问题将非常感谢!!

编辑1:来自我正在使用的开发人员的评论 - “如果我使用来自本地浏览器的http URL然后它工作并显示CSV,但由于某种原因它没有显示使用curl程序。我们添加了12.345.678.90 IP in我们的防火墙也没有运气。“

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

一如既往地谢谢!

答案

我在内部运行了许多管道工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的简单演练。

另一答案

我希望答案可能很简单,因为我没有启用端口80(HTTP)和443(HTTPS)。

现在发现。

以上是关于使用我的R管道工程API在EC2实例上托管的连接问题的主要内容,如果未能解决你的问题,请参考以下文章

HTTP 连接在 Amazon EC2 上托管的 nodejs 应用程序中过早终止

在 ec2 上托管的 apache spark 中使用 AWS EMRFS

使用NGINX在端口80上为使用虚拟主机的Amazon EC2上托管的域的node.js应用程序提供HTTP流量

安装没有在R包仓库CRAN上托管的R包

如何安全地将 EC2 托管的 Shiny 应用程序集成到 asp.net 项目中

将托管在 AWS EC2 上的 Asp.net Web api 连接到 AWS API Gateway