在apache服务器中代理节点/反应应用程序

时间:2019-05-31 02:31:07

标签: node.js reactjs apache reverse-proxy

使用永久在虚拟机上永久运行节点服务器,如果不像在URL中那样显式添加端口,则无法使应用程序运行:URL.com:8080 如果我不使用URL中的端口,则会加载应用程序的文件结构。

重现步骤:我有一个create-react-app应用程序。在虚拟服务器上,我运行“ npm run build”以确保有可用的构建。然后,我永远在应用程序的根目录上运行。

下面的代码应提供所有必要的详细信息。如果您需要,我可以提供更多。

我花了很多时间来调整.conf文件,以尝试不同的配置,但我似乎无法理解。我正在使用它,并且成功托管了两个静态html网站,但没有成功托管此节点应用程序。

Package.json:

...
"main":"server/index.js",
"proxy":"http://localhost:8080"
...

Apache url.conf:

<VirtualHost *:80>
    ServerName URL.com
    ServerAlias URL.com:8080/
    DocumentRoot /var/www/nameOfApp/
<Directory />
    Options -Indexes +FollowSymLinks
    AllowOverride All
</Directory>
<Directory /var/www/nameOfApp/public>
    Options +Indexes +FollowSymLinks +MultiViews
    AllowOverride All
</Directory>
</VirtualHost>

使用express的节点服务器文件:

app.use(express.static(`${__dirname}/../build`));

我还确保启用了允许代理的模块。因此,我认为本质上来说,我需要的是请求此网站,而最后不需要:8080。

2 个答案:

答案 0 :(得分:0)

Apache和NodeJS是两个不同且独立的应用程序。 您可以通过向他们正在侦听的端口发送请求来与他们进行交互。对于您的情况,

  

Apache正在监听端口80

     

您的NodeJS应用程序正在侦听端口8080

因此,对端口80的所有请求将由Apache处理,并且由于您没有index.html,因此Apache将默认只列出文件和目录(选项索引)。到目前为止,您的节点应用程序对您的请求一无所知。

因此,您需要定义一个端点,例如url.com/node,并告诉Apache将该端点的所有请求转发到端口8080,并让您的节点应用程序来完成这项工作。

该怎么做?

http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxypass

Best practices when running Node.js with port 80 (Ubuntu / Linode)

Node.js + Nginx - What now?

希望这会为您指明正确的方向。

答案 1 :(得分:0)

最终有效的配置是如此简单:

<VirtualHost *:80>
    ServerName yourdomain.com
    ProxyPreserveHost on
    ProxyPass / http://localhost:8080/
</VirtualHost>

好像我在尝试创建复杂的代理程序时使它过于复杂,但是解决方案只是将其添加到节点应用程序的配置中,然后运行sudo systemctl restart apache2,一切正常。