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(也许它可以帮助解决我的问题)。
我的配置是这样的:
- 软呢帽 22 [link]
- 阿帕奇 2.4 [link]
- PHP 5.6.11 [link]
- MariaDB 10.0.20 [link]
- phpMyAdmin 4.4.12 [link]
- 节点 0.12.7 [link]
以上所有应用程序都处于默认 "after installation" 状态。
目前PHP在端口80上是运行,nodejs在端口3000上是运行。所以我必须输入:
mydomain.com
对于 php
mydomain.com:3000
对于 nodejs
我想做的是:
如果我输入 someDomainForPhp.com/
我会转到 php 默认位置,即 /var/www/html/
如果我输入 otherDomainforNode.com/
我会转到节点默认位置 /root/
据我所知,apache 必须进行一些内部端口重新路由才能完成此任务。
我一直在关注 Internet 上描述如何操作的许多指南,但我认为它们适用于对该主题有一些基本知识的人。我对此非常陌生,"green",我正在努力解决它。
如果有人愿意帮忙,我可以使用以下信息:
- 要编辑哪些文件
- 他们在哪里
- 如何编辑它们
- 如果需要安装任何其他 mod 规则,它们的名称是什么
编辑 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 错误
看完之后我想我可以指出问题出在哪里,但我仍然可以使用有关精确解决方案的帮助。
- 可能是 linux 防火墙阻止 80 以外的端口(在本例中为 3000),也许在向防火墙添加一些例外后问题将得到解决
- 可能是我的nodejs server.js脚本有问题
这是用于测试的 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);
});
前几句解释:
在声明 <VirtualHost>
指令之前,您需要添加 NameVirtualHost *
。您可以精确定义所指的 domain/ip 而不是 *
。 *
当然可以,但它被认为不太安全且速度较慢。
为了允许传递代理 - 您需要定义指令 <Proxy>
,您定义的唯一问题是 Allow from all
。此语法适用于 apache 2.2,您使用的是 apache 2.4,因此根据 upgreading docs 应该使用 Require all granted
.
<Location>
标签在你的情况下应该和你在开始时一样,只有单斜线 <Location />
。原因是您 not
通过额外的命名空间访问您的应用程序,您通过输入直接域名来访问它。
如果您想使用 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>
我使用的是 Digital Ocean droplet(也许它可以帮助解决我的问题)。
我的配置是这样的:
- 软呢帽 22 [link]
- 阿帕奇 2.4 [link]
- PHP 5.6.11 [link]
- MariaDB 10.0.20 [link]
- phpMyAdmin 4.4.12 [link]
- 节点 0.12.7 [link]
以上所有应用程序都处于默认 "after installation" 状态。
目前PHP在端口80上是运行,nodejs在端口3000上是运行。所以我必须输入:
mydomain.com
对于 phpmydomain.com:3000
对于 nodejs
我想做的是:
如果我输入 someDomainForPhp.com/
我会转到 php 默认位置,即 /var/www/html/
如果我输入 otherDomainforNode.com/
我会转到节点默认位置 /root/
据我所知,apache 必须进行一些内部端口重新路由才能完成此任务。
我一直在关注 Internet 上描述如何操作的许多指南,但我认为它们适用于对该主题有一些基本知识的人。我对此非常陌生,"green",我正在努力解决它。
如果有人愿意帮忙,我可以使用以下信息:
- 要编辑哪些文件
- 他们在哪里
- 如何编辑它们
- 如果需要安装任何其他 mod 规则,它们的名称是什么
编辑 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 错误看完之后我想我可以指出问题出在哪里,但我仍然可以使用有关精确解决方案的帮助。
- 可能是 linux 防火墙阻止 80 以外的端口(在本例中为 3000),也许在向防火墙添加一些例外后问题将得到解决
- 可能是我的nodejs server.js脚本有问题
这是用于测试的 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);
});
前几句解释:
在声明
<VirtualHost>
指令之前,您需要添加NameVirtualHost *
。您可以精确定义所指的 domain/ip 而不是*
。*
当然可以,但它被认为不太安全且速度较慢。为了允许传递代理 - 您需要定义指令
<Proxy>
,您定义的唯一问题是Allow from all
。此语法适用于 apache 2.2,您使用的是 apache 2.4,因此根据 upgreading docs 应该使用Require all granted
.<Location>
标签在你的情况下应该和你在开始时一样,只有单斜线<Location />
。原因是您not
通过额外的命名空间访问您的应用程序,您通过输入直接域名来访问它。如果您想使用
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>