Fedora 上的 Apache、PHP、Nodejs 运行,根据所选域路由到 php 和 nodejs

Apache, PHP, Nodejs running on Fedora, routing to both php and nodejs depending on selected domain

我使用的是 Digital Ocean droplet(也许它可以帮助解决我的问题)。

我的配置是这样的:

以上所有应用程序都处于默认 "after installation" 状态。

目前PHP在端口80上是运行,nodejs在端口3000上是运行。所以我必须输入:

我想做的是:

如果我输入 someDomainForPhp.com/ 我会转到 php 默认位置,即 /var/www/html/

如果我输入 otherDomainforNode.com/ 我会转到节点默认位置 /root/

据我所知,apache 必须进行一些内部端口重新路由才能完成此任务。

我一直在关注 Internet 上描述如何操作的许多指南,但我认为它们适用于对该主题有一些基本知识的人。我对此非常陌生,"green",我正在努力解决它。

如果有人愿意帮忙,我可以使用以下信息:


编辑 2015 年 8 月 3 日

我用谷歌搜索并尝试了以下方式:

<VirtualHost 109.74.199.47:80> # server ip address or *
    ServerAdmin davy.brion@thatextramile.be # any email address
    ServerName thatextramile.be # domain name
    ServerAlias www.thatextramile.be # any domain alias

    ProxyRequests off

    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    <Location />
        ProxyPass http://localhost:3000/ 
        ProxyPassReverse http://localhost:3000/
    </Location>
</VirtualHost>

我把它放在这个文件 /etc/httpd/conf/httpd.conf 的最底部。许多人报告说这种方法对他们有效,但是如果我尝试了,我在访问域时得到了 503 error。所以我在谷歌上搜索了这个 503 错误,我发现有人遇到了类似的问题,他声称他通过 modyfing Location 标签按以下方式使其工作:

<Location /path/of/my/project> # for me it would be /root/
    ProxyPass http://localhost:3000/ 
    ProxyPassReverse http://localhost:3000/
</Location>

当我尝试这样做时,服务器表现得就像根本没有虚拟主机指令一样,通过访问域,我收到了来自 apache 的常规 /var/www/html/index.php 文件,没有代理,没有端口更改。

我还读到 localhost 是错误的方式,它应该是 127.0.0.1,但是这并没有改变任何东西。

我没有更改任何默认配置,我只是在 httpd conf 中添加了 virtualhost 指令。我也确定所有需要的 mod 规则都已启用,例如 mod 代理,我搜索了 fedora 20 文档并检查了服务器状态,它们默认包含并启用。这真的很奇怪,对于某些人来说,添加上面的行就足够了。对我来说 none 它有效,我要么面临 503 错误并且不知道如何修复它,要么根本没有代理。我希望有人会过来帮助有需要的初学者开发人员 ;)


编辑 04.08.2015

我正在做研究,我发现有些人遇到了与 chmod 设置相关的问题,这些设置位于 php 和 nodejs 的根位置目录。这对我来说似乎不太合逻辑,但我还是尝试了,我已经将与这两个应用程序相关的所有目录的 chmods 配置更改为(出于测试目的)"allow all"。一点用都没有。

我还阅读了博客,其中有人声称问题可能是我只包含到端口 3000 的代理路由,而我没有为要显示的常规 php 创建规则。教程显示除了为 nodejs 创建的规则外,它还应该包含:

<VirtualHost 109.74.199.47:80> # server ip address or *
    ServerAdmin davy.brion@thatextramile.be # any email address
    ServerName thatextramile.be # domain name
    ServerAlias www.thatextramile.be # any domain alias
    DocumentRoot /var/www/html/
</VirtualHost>

所以第一个规则是路由到 nodejs 的端口 3000,这个规则适用于 php。问题是,当我实施此规则时,我有无限循环并且服务器永远不会加载。因此,当我输入为 nodejs 准备的域时出现 503 错误,当我尝试访问 php.

的域时出现 502 错误

看完之后我想我可以指出问题出在哪里,但我仍然可以使用有关精确解决方案的帮助。

这是用于测试的 server.js 文件。它永远使用节点无限启动 module:

var express = require('express');
var app = express();

app.get('/', function (req, res) {
    res.send('Hello World!');
});

var server = app.listen(3000, function () {
    var host = server.address().address;
    var port = server.address().port;

    console.log('Example app listening at http://%s:%s', host, port);
});

前几句解释:

  1. 在声明 <VirtualHost> 指令之前,您需要添加 NameVirtualHost *。您可以精确定义所指的 domain/ip 而不是 ** 当然可以,但它被认为不太安全且速度较慢。

  2. 为了允许传递代理 - 您需要定义指令 <Proxy>,您定义的唯一问题是 Allow from all。此语法适用于 apache 2.2,您使用的是 apache 2.4,因此根据 upgreading docs 应该使用 Require all granted.

  3. <Location> 标签在你的情况下应该和你在开始时一样,只有单斜线 <Location />。原因是您 not 通过额外的命名空间访问您的应用程序,您通过输入直接域名来访问它。

  4. 如果您想使用 phpdomain.com 访问端口 80 上的 php 文件,使用 3000 访问端口 3000 上的 node.js 服务器 nodejsdomain.com,那么你应该 not 创建 2 个虚拟主机。您只创建一个,如果您输入 nodejsdomain.com 将打开端口 3000。只有当您使用更多 node.js 服务器或其他平台时,您才需要第二个和更多虚拟主机。由于您创建了它,因此您陷入了无限循环。

您的代理无法工作的 main 原因是端口 3000 默认在 SELinux 上被阻止。所以先运行这个命令semanage port -a -t http_port_t -p tcp 3000。 (如果您没有以 root 身份登录,则在上述语法之前输入 sudo)。

然后使用虚拟主机指令:

NameVirtualHost *
<VirtualHost *:80>
    ServerName nodejsdomain.com

    ProxyRequests off

    <Proxy *>
        Require all granted
    </Proxy>

    <Location />
        ProxyPass http://localhost:3000/
        ProxyPassReverse http://localhost:3000/
    </Location>

</VirtualHost>