Apache 不会代理到 Node.js 后端

问题描述 投票:0回答:1

我有一个在 Ubuntu 上运行的 apache 服务器,它运行没有问题。 Apache 目前提供静态网页服务,并配置了多个虚拟主机。问题是尝试配置 Vhost 来代理 Node.js 后端。我尝试过的所有方法都没有任何明显的结果,并且只是显示 apache 文件系统,就好像根本不存在代理一样。

我尝试过多种不同的方式配置虚拟主机,包括逐字复制 digitalocean 的多个教程中所说的内容。我希望当我在 Web 浏览器的地址栏中输入 api.rpgrat.org 时,我将获得 node.js 服务器的输出而不是 apache 文件系统查看器。我不知道我目前做错了什么,所以非常感谢任何帮助。

完整的 000-defaults.conf 如下,当我启动或重新启动 apache 时,不会抛出任何错误,并且所有其他虚拟主机都按预期工作(rpgrat.org 转到主页,play.rpgrat.org 转到当前的文件系统,chess.rpgrat.org 重定向到 rpgrat.org/chess 等):

ServerAdmin administrator@localhost
DocumentRoot /web/

<VirtualHost *:80>
    ServerName www.rpgrat.org
    ServerAlias rpgrat.org https://rpgrat.org
    DocumentRoot /web/static

    ErrorLog /web/logs/main_errors.log
    CustomLog /web/logs/main_other.log combined
</VirtualHost>

<VirtualHost *:80>
    ServerName play.rpgrat.org
    DocumentRoot /web/node

    ErrorLog /web/logs/node_errors.log
    CustomLog /web/logs/node_other.log combined
</VirtualHost>

<VirtualHost *:80>
        ServerName chess.rpgrat.org
        RewriteEngine on
    Redirect / https://rpgrat.org/chess
</VirtualHost>

#problem is this one \/
<VirtualHost *:80>
    ServerName api.rpgrat.org
    DocumentRoot /web/public

    ProxyRequests Off
    ProxyPreserveHost On
    ProxyVia Full

    <Proxy *>
        Require all granted
    </Proxy>
    proxyPass / http://localhost:8000/
    proxyPassReverse / http://localhost:8000/

    Header set Access-Control-Allow-Origin "*"
    ErrorLog /web/logs/public_errors.log
    CustomLog /web/logs/public_other.log combined
</VirtualHost>

后端工作正常,正在运行于

localhost:8000
;这可以通过
curl localhost:8000
轻松测试,给出输出
API Backend
,正如它应该的那样。节点服务器的代码如下:

const http = require("http");
const host = 'localhost';
const port = 8000;

const requestListener = function (req, res) {
  res.writeHead(200);
  res.end("API Backend\n");
};

const server = http.createServer(requestListener);
server.listen(port, host, () => {
    console.log(`API Server is running on http://${host}:${port}`);
});

我将更新此内容以显示到目前为止我已尝试解决此问题所做的工作,我已重新安装了所有必要的 apache 模块,我将在此处列出这些模块以及用于安装它们的命令。

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_balancer
sudo a2enmod lbmethod_byrequests

当然,每次更改后我都会重新启动 apache2,并在 UFW 中打开必要的端口,我将在下面包含这些端口,以防在某些方面有用:

80/tcp                     ALLOW       Anywhere
443                        ALLOW       Anywhere
8000                       ALLOW       Anywhere

我还在我的服务器环境上用 lynx 做了一些测试,我可以再次确认连接到

localhost
会打开我的主页,正如预期的那样,连接到
localhost:8000
api.localhost:8000
会打开 Node.js 服务器,但是
api.localhost
似乎没有任何原因地重定向到 apache 文件系统,只是看起来 proxyPass 根本没有做任何事情。错误日志文件是干净的,保存了我在启用 CORS 之前发出的一些被阻止的获取请求,但为了更好地衡量,我还将包含错误日志:

[Tue Jan 23 03:35:46.328697 2024] [authz_core:error] [pid 140060:tid 140348785419840] [client 137.184.150.232:59380] AH01630: client denied by server configuration: /web/public/server-status
[Tue Jan 23 03:35:47.993133 2024] [authz_core:error] [pid 140059:tid 140347770394176] [client 134.122.89.242:34688] AH01630: client denied by server configuration: /web/public/server-status

主日志仅记录我为解决此问题而建立的数百个测试连接,并且太长,无法包含在此处。

node.js apache proxy reverse-proxy vhosts
1个回答
0
投票

我最终确实弄清楚了这一点,我的 SSL 配置被映射到端口 80 而不是端口 443。我不确定为什么 Apache 的日志没有捕获到这一点,但这似乎就是问题所在。如果您遇到此问题,请确保正确设置 SSL 并使用正确的端口!

© www.soinside.com 2019 - 2024. All rights reserved.