我有一个在 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
主日志仅记录我为解决此问题而建立的数百个测试连接,并且太长,无法包含在此处。
我最终确实弄清楚了这一点,我的 SSL 配置被映射到端口 80 而不是端口 443。我不确定为什么 Apache 的日志没有捕获到这一点,但这似乎就是问题所在。如果您遇到此问题,请确保正确设置 SSL 并使用正确的端口!