静态提供在自定义端口上打开的内部(apache 服务器)NodeJS api 并将其转发到公共 url

Posted

技术标签:

【中文标题】静态提供在自定义端口上打开的内部(apache 服务器)NodeJS api 并将其转发到公共 url【英文标题】:Statically serve internal (apache server) NodeJS api open on a custom port and forward it to the public url 【发布时间】:2021-09-02 12:39:09 【问题描述】:

简介

我有一个大学管理的服务器,它不允许学生访问开放端口以进行互联网流量,但学生仍然可以打开端口(例如 4040 用于他们的 NodeJS 应用程序以进行内部访问)。

每个学生的帐户都有一个public_html 文件夹(类似于/var/www/),该文件夹以静态方式(或由php 呈现)提供此URL(使用Apache 服务器)上public_html 中的所有文件:

http://mi-linux.wlv.ac.uk/~studentid/

问题

但是,就我而言,我想使用 postman 公开一个用于外部测试的 API,并将其添加到 React 应用程序中。问题是,它使用 NodeJS 和 express,并在端口 4040 上创建自己的服务器。

我可以在内部使用来自 ssh 的 curl 命令访问 API,例如:

studentid@csl-student:~$ curl http://localhost:4040
"message": "Hey! The backend is working. Explore routes from the code"

现在,由于学生不能允许针对 HTTP 流量的公开帖子,人们根本无法从服务器外部访问我的 NodeJS API(我必须这样做)。

我查过的东西

我广泛搜索了诸如如何静态地为 nodejs 应用程序提供服务、如何将端口从 8080(https 端口)转发到 4040(我的 NodeJS 端口)等主题,但其中大多数 需要 sudo 访问权限 ,其中一些根本不起作用。

我提出的解决方案

我想我仍然可以访问我的public_html 文件夹,该文件夹是静态服务的,并且可以呈现PHP。我知道我可以创建一个index.html(或index.php)文件,该文件将在内部获取http://localhost:4040,并简单地转发结果,因为API 端口在内部是打开的,并且index.html 文件可以在外部提供。

文件可以做什么

在加载文件时使用

http://mi-linux.wlv.ac.uk/~studentid/index.html

该文件可以在服务器本身内部加载来自localhost:4040 的响应(因为 API 可在内部访问),然后将结果连同状态代码和标头一起发送。

但是,我的 API 有多个路由,我无法对每个路由进行硬编码。必须有更有效的方法来做到这一点。

我在寻找什么

如果有人可以将我引导到一个已经制作的包,我将非常感激,该包是为了转发静态文件以及从内部 API 预加载的响应。

或者我可以有一个 php 脚本,它可以完成我需要的所有转发并将 API 公开。

PS:我知道这应该在 Server Fault 上问,但是因为我认为这可以通过使用脚本或其他东西来完成,所以我在这里问了。

【问题讨论】:

我想说您需要询问负责这些限制的人员。他们应该能够为您的要求命名一个解决方案,如果它是合法的...... @arkascha 我很想这样做,但这是我必须部署网站的任务的一部分,剩下不到 18 小时。我需要一个临时解决方案,或者如果我得到足够好的答案,我可以稍后编辑我的作业提交。考虑为这个问题增加赏金,但它说我需要等待 2 天,如果您可以投票或做类似的事情来获得更多关注,我们将不胜感激。谢谢... 【参考方案1】:

解决方法是将您的 NodeJs 代码托管在第三方平台上,例如 Heroku。

并创建一个 PHP 脚本,充当中间件代理并向您的 Heroku-Hosted-NodeJs API 端点执行 curl 请求。

【讨论】:

是的,我知道我可以做到这一点(在其他地方托管),这就是我在答案中包含的内容,但我不知道该怎么做,我正在寻找一个脚本可以做到这一点,同时仍然保留状态代码...顺便说一句,感谢您的时间,如果您可以编辑答案以包含这样的脚本,将不胜感激。再次感谢。【参考方案2】:

服务器上是否启用了 Apache 的插件 mod_rewritemod_proxy

如果是这样,也许您可​​以在 .htaccess 文件中使用带有 mod_rewrite 的 P 标志 的 ProxyReverse,如 in this post 所述

RewriteEngine On
RewriteRule ^/node/(.*)$ 
http://localhost:4040/$1 [L,P]
ProxyPassReverse /node http://localhost:4040

(我现在无法测试,所以我的回答纯属推测,抱歉。)

另一个选项,如果服务器配置无法修改,可以使用mod_headers 和位置,但我不确定它是否透明:

Header edit Location ^http://internal\.example\.com/(.*) http://example.com/$1

【讨论】:

也相关:***.com/questions/23027847/…

以上是关于静态提供在自定义端口上打开的内部(apache 服务器)NodeJS api 并将其转发到公共 url的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 CRACO 在自定义端口上启动响应应用程序?

我的 ngrok Tunne 状态显示正在重新连接在自定义端口上运行 (4901)

Nginx 为 apache 提供静态内容和代理

如何在自定义 CDN 服务器上静态部署 python ***包?

apache 别人无法访问

Django:在自定义 URL 后面提供媒体服务