Apache, PHP, Nodejs在Fedora上运行,路由到PHP和Nodejs取决于所选的域



我使用数字海洋液滴(也许它可以帮助解决我的问题)。

我的配置如下:

    Fedora 22 [link] Apache 2.4PHP 5.6.11 [link]
  • MariaDB 10.0.20 [link]
  • phpMyAdmin 4.4.12 [link]
  • Node 0.12.7 [link]

上述所有应用程序都处于默认的"安装后"状态。

当前PHP运行在端口80上,nodejs运行在端口3000上。所以我要输入:

  • mydomain.com for php
  • mydomain.com:3000 for nodejs

我想做的是:

如果我输入someDomainForPhp.com/,我将进入php的默认位置/var/www/html/

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

所以从我的理解apache将不得不做一些内部端口重路由来完成这个任务。

我一直在网上遵循许多指南来描述如何做,但我认为它们是为那些对这个主题有一些基本知识的人准备的。我对这个非常陌生,而且是"新手",我正在努力适应它。

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

  • 要编辑哪些文件
  • 如何编辑
  • 如果需要安装任何其他模块,它们的名称是什么

编辑03.08.2015

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

<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错误,我发现有些人有类似的问题,他声称他通过以下方式修改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代理都是启用的,我搜索了fedora 20文档并检查了服务器状态,它们默认包含并启用了。这看起来真的很奇怪,对一些人来说,只需要在上面加几行就足够了。对我来说,这些都不起作用,我要么面临503错误,不知道如何修复它,要么根本没有代理。我希望有人能过来帮助需要的初学者开发;)


编辑04.08.2015

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

我也读过博客,有人声称问题可能是我只包括代理路由到端口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错误。

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

  • 可能是linux防火墙阻塞端口,而不是80(在这种情况下是3000),也许在防火墙添加一些例外后,问题将解决
  • 可能是我的nodejs server.js脚本有问题

这是用于测试的server.js文件。使用node forever模块无限启动:

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 *。而不是*,你可以精确地定义哪个域/ip你引用。*当然可以工作,但它被认为不太安全且速度较慢。

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

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

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

您的代理不工作的main原因是因为端口3000默认情况下在SELinux上被阻塞。因此,首先运行semanage port -a -t http_port_t -p tcp 3000命令。(如果您在上述语法之前没有作为根类型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>

最新更新