Apache + Node.js + mod_proxy. 如何将一个域名路由到端口号为 :3000 的服务器,另一个域名路由到端口号为 :80 的服务器。

32
问题:我需要在不同的域上托管一个Node应用程序和一个php应用程序,例子.com应该像正常情况一样使用端口80,但node-example.com应该路由到端口3000。
使用mod_proxy将所有流量从端口80路由到3000可以很好地解决问题。
<VirtualHost *:80>
    ServerAdmin info@node-example.com
    ServerName  node-example.com
    ServerAlias www.node-example.com

    ProxyRequests off

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

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

</VirtualHost>

然而,这样会使得 example.com 和 node-example.com 都指向 localhost:3000 并运行 Node 应用程序。

有没有办法使 example.com 仍然指向端口80?

同时,example.com/old-admin 指向端口80也是可以的。

2个回答

39

只需创建两个<VirtualHost *:80>标签即可

<VirtualHost *:80>
    ServerAdmin info@node-example.com
    ServerName www.node-example.com

    ProxyRequests off

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

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

</VirtualHost>
<VirtualHost *:80>
    ServerAdmin info@node-example.com
    ServerName  node-example.com    

    ProxyRequests off

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

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

</VirtualHost>

它应该那样工作;)

或者,如果您的localhost:80应用程序不是Node.js,您可以删除那个目标的<Proxy *><Location />标签,并将其替换为DocumentRoot /var/www/node-example.com - 指向index.html的静态路径。


我之前尝试使用两个VirtualHost标签,但是没有起作用......结果发现我忘记设置“NameVirtualHost *”了。不过还是谢谢你的答案! - olke
1
哇!你解决了iptables和它的隐形规则问题 :) 非常好用。谢谢啊,伙计。 - Maziyar
2
如果你仍然无法使其工作,请确保在Apache配置中启用了mod_proxymod_proxy_http,并重新启动服务器。 - Bilal
我需要在所有Apache网站文件中添加“ProxyRequests off”吗? - tani-rokk
文档中可以得知:如果您正在使用正向代理(使用ProxyRequests指令),则严格限制访问是必不可少的。否则,任何客户端都可以使用您的服务器来访问任意主机并隐藏他或她的真实身份。这对于您的网络和整个互联网都是危险的。当使用反向代理(使用ProxyPass指令和ProxyRequests Off)时,访问控制就不那么关键了,因为客户端只能联系您特别配置的主机。 - drinchev

5
我建议您为两个域名创建两个不同的虚拟主机配置文件。这将使您能够独立配置它们,以便在扩展时将它们移动到不同的服务器上。对于默认安装位置的apache2,
请在/etc/apache2/sites-available/ www.example1.com.conf中创建一个文件。
<VirtualHost *:80>
        ServerName  www.example1.com
        ServerAdmin webmaster@example1.com

        <Directory /home/example1/api/admin/docs>
                Options -Indexes +FollowSymLinks
                AllowOverride All
                Require all granted
                DirectoryIndex index.html
        </Directory>

        <Directory /home/example1/api/mobile/docs>
                Options -Indexes +FollowSymLinks
                AllowOverride All
                Require all granted
                DirectoryIndex index.html
        </Directory>

        ProxyRequests Off
        ProxyPreserveHost On

        ProxyPass /api/         "http://localhost:30007/"
        ProxyPassReverse /      "http://localhost:30007/"

        ErrorLog ${APACHE_LOG_DIR}/example1/example1.log
        CustomLog ${APACHE_LOG_DIR}/example1/example1.log combined

</VirtualHost>

在`sites-available`中创建另一个文件www.example2.com.conf,并将上述配置复制并用example2替换example1。对于子域名,在文件名和配置中替换www为您的子域名,例如:api
创建配置文件后,必须使用以下命令启用它们: a2ensite www.example1.com.conf 然后使用以下命令重新加载apache2: sudo systemctl reload apache2 在重新加载apache之前,请确保已在APACHE_LOG_DIR中创建了目录example1example2
完成以上步骤后,可以在您的域名注册商或CDN中配置您的域名A记录以匹配服务器IP地址,然后即可使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接