我使用数字海洋液滴(也许它可以帮助解决我的问题)。
我的配置如下:
- 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);
});
开头几句解释:
-
在声明
<VirtualHost>
指令之前,您需要添加NameVirtualHost *
。而不是*
,你可以精确地定义哪个域/ip你引用。*
当然可以工作,但它被认为不太安全且速度较慢。 -
为了允许代理被传递-你需要定义指令
<Proxy>
和你的定义的唯一问题是Allow from all
。此语法适用于apache 2.2,您使用的是apache 2.4,因此根据升级文档,应该使用Require all granted
。 -
<Location>
标签在您的情况下应该像您在开始时一样,只有一个斜杠<Location />
。原因是你是not
通过额外的命名空间访问你的应用程序,你是通过直接输入域名访问它。 -
如果你想用
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>