我使用数字海洋液滴(也许它可以帮助解决我的问题)。
我的配置是:
以上所有应用程序都是默认设置"安装后#34;状态。
目前PHP正在端口80上运行,nodejs正在端口3000上运行。所以我必须输入:
mydomain.com
for php mydomain.com:3000
for nodejs 我想要做的是:
如果我输入someDomainForPhp.com/
,我会转到php默认位置/var/www/html/
如果我输入otherDomainforNode.com/
,我会转到节点默认位置/root/
因此,根据我的理解,apache必须进行一些内部端口重新路由才能完成此任务。
我一直关注互联网上的许多指南,描述如何做到这一点,但我认为他们是针对那些对这个主题有一些基本知识的人。我是一个非常新的"绿色"对此,我正在与它斗争。
如果有人愿意提供帮助,我可以使用以下信息:
我用Google搜索并尝试了以下方式:
<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
。所以我用Google搜索了这个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
,但是这并没有改变任何东西。
我没有更改任何默认配置,我只将virtualhost指令添加到httpd conf。我也确定所有需要的模块如mod代理都已启用,我搜索了fedora 20文档并检查了服务器状态,它们默认包含并启用。这真的很奇怪,对于某些人来说,只需添加上面的行就足够了。对我来说,没有一个工作,我要么面临503错误,不知道如何解决它或根本没有代理。我希望有人能够帮助初学者,帮助他们;)
我正在做研究,我发现有些人遇到了与chmod
设置相关的问题,这些设置放在作为php和nodejs根目录的目录上。这对我来说似乎不太合乎逻辑,但无论如何我都尝试了它,我已经改变了(为了测试目的)chmods&#34;允许所有&#34;与两个应用程序相关的所有目录的配置。它根本没用。
我也读过博客,有人声称问题可能是我只包括到端口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文件。它是使用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);
});
答案 0 :(得分:0)
前几句解释:
在声明<VirtualHost>
指令之前,您需要添加NameVirtualHost *
。而不是*
,您可以精确定义您指的是哪个域/ IP。 *
当然会起作用,但它被认为不那么安全和慢。
为了允许代理被传递 - 您需要定义指令<Proxy>
,并且您定义的唯一问题是Allow from all
。这个语法适用于apache 2.2,你使用apache 2.4所以根据upgreading docs这应该用Require all granted
。
<Location>
标记应该与开头时一样,只有一个斜杠<Location />
。原因是您not
通过额外的命名空间访问您的应用程序,您通过输入直接域名来访问它。
如果要使用80
访问端口phpdomain.com
上的php文件,使用3000
访问端口nodejsdomain.com
上的node.js服务器,那么您应该{{ 1}}创建2个虚拟主机。您只创建了一个,以防您输入not
将打开一个端口3000.只有当您使用更多node.js服务器或其他平台时,才需要第二个和更多虚拟主机。由于你创建了它,你最终陷入了无限循环。
代理不起作用的nodejsdomain.com
原因是因为端口3000默认情况下在main
上被阻止。首先运行此命令SELinux
。 (如果您在上述语法之前未以root类型semanage port -a -t http_port_t -p tcp 3000
登录)。
然后使用虚拟主机指令:
sudo