在所有行业的垂直领域中,网站性能和用户参与度之间都存在着关联。拥有一个能够处理高流量的服务器解决方案,快速响应请求,并减轻网络风险,对客户满意度和保留率都是有益的。
Apache是一个流行的开源服务器,为提高应用性能和安全性提供了若干好处。超过30%的网站使用Apache,包括许多知名公司的网站,如Slack、《纽约时报》和LinkedIn。
在这篇文章中,我们将研究Apache给Node.js应用程序带来的一些好处。我们还将通过一个带有工作代码样本的教程来演示如何为Node应用程序配置Apache。
前提条件
- 最新版本的Node.js和npm
- 用于安装软件包和测试代码的终端
- VS Code,或你喜欢的代码编辑器
注意,本文的教程部分是使用Ubuntu 18.04操作系统和Node.js v14.17.6开发的。
让我们开始吧!
为Node.js配置Apache的好处
Apache为Node应用程序提供了三个核心优势。
让我们来探讨一下每个好处的使用情况。
缓存
当一个应用程序的内容快速加载时,它更有可能留住用户。缓存通过节省带宽和提高应用程序的速度来提高应用程序的性能。任何时候,当一个Node应用程序对相同的静态内容同时收到多个请求时,缓存是必不可少的。
通过为一个Node应用程序配置Apache,我们允许Apache服务器安装静态内容。当以后有相同内容的请求时,响应将直接来自Apache,而不是来自应用程序的服务器。
负载平衡
一个高性能的应用程序必须能随时提供给用户,即使它在扩展时也是如此。负载平衡通过将传入的请求分布在多个服务器上来提高应用程序的响应能力。一个受欢迎的应用程序可能每秒会有成千上万的请求。通过为Node应用程序配置Apache,我们允许Apache将多个事件分布在应用程序的所有服务器上。
反向代理
确保您的应用程序免受病毒、恶意软件和其他网络风险的影响是很重要的。通过反向代理,Apache可以被配置为对所有进入的请求充当防火墙或过滤器。反向代理有助于减轻一些安全威胁,如DDoS攻击。反向代理的其他好处是改善用户请求管理,以及对应用程序的IP地址和数据进行加密。
现在我们已经回顾了使用Apache服务器的好处,让我们来安装和启动Apache服务器。
安装和启动Apache服务器
首先,让我们通过运行这个命令来检查Apache是否已经安装在我们的系统上。
apache2 -v
这将显示当前安装的Apache的版本。

如果目前没有安装Apache,而且你使用的是Ubuntu操作系统,请按照以下四个步骤在你的系统上安装apache2 。
- 用下面的命令更新你的软件包库。
sudo apt-get update
- 一旦你的资源库被成功更新,通过运行这个命令来安装Apache。
sudo apt-get install apache2
- 在你的浏览器中粘贴http://127.0.0.1,检查Apache是否已经正确安装。如果安装成功,你应该看到以下默认页面。

接下来,使用以下命令检查你的IP地址。
ifconfig
如果你在浏览器中粘贴你的IP地址,你应该看到屏幕上显示同样的默认页面。
- 安装后,Ubuntu会自动启动Apache服务器。现在,确认
apache2的状态。
sudo systemctl status apache2
状态屏幕应该确认Apache服务器已经启动并运行。

审查Apache服务器的基本命令
现在我们已经安装了Apache服务器(或者确认它已经被安装),让我们回顾一下一些重要的命令。
重新启动Apache服务器。
sudo systemctl restart apache2
在添加配置后重新加载Apache服务器。
sudo systemctl reload apache2
禁用Apache服务器在重启后自动启动。
sudo systemctl disable apache2
在Apache服务器被禁用后启用它。
sudo systemctl enable apache2
回顾Apache服务器的基本内容和文件结构
让我们回顾一下Apache服务器的一些基本内容和文件。我们可以用这个命令查看可用文件的列表。
ls /etc/apache2/
下面是输出结果。

apache2.conf 文件包含Apache服务器的配置。
sites-available 目录是我们可以创建Apache将运行的配置文件的地方。
sites-enabled 目录包含指向sites-available 目录中定义的配置文件的符号链接。
Apache服务器将从sites-enabled 目录中加载文件,同时应用sites-available 目录中定义的配置。
sites-enabled 和sites-available 目录都是为Node配置Apache的关键。安装时,Apache会自动在这些目录中创建默认文件。
要查看默认文件,cd 到sites-available 目录。
现在,运行ls 命令。

终端显示sites-available 目录中的默认文件。
我们可以看到有两个默认的配置文件,000-default-conf 和default-ssl.conf ,在sites-available 目录中。
现在,让我们把cd 到sites-enabled 目录中。
cd ../sites-enabled
再次,运行ls 命令。

终端显示sites-enabled 目录中的内容。
接下来,让我们来设置Node应用程序!
设置Node.js应用程序
在本教程中,我们将使用一个Node.js演示应用程序,它是在Express.js框架上建立的,有一个MongoDB数据库。
以下是跟随的步骤。
让我们先来看看演示的app.js 文件。
require('dotenv').config();
const express = require('express');
const app = express();
const mongoose = require('mongoose');
const cors = require('cors');
const bcrypt = require('bcrypt');
const bodyParser = require('body-parser');
const crypto = require('crypto');
const jwt = require('jsonwebtoken');
const authRoute = require('./routes/auth.route');
const suggestionRoute = require('./routes/suggestion.route');
const documentationRoute = require('./routes/documentation.route');
const port = process.env.PORT || 3000;
const corsOptions = {
"origin": "*",
optionsSuccessStatus: 200
}
//middlewares
app.use(cors(corsOptions));
app.use(bodyParser.json());
app.use(express.json());
//routes
app.use('/', documentationRoute);
app.use('/api', authRoute);
app.use('/api', suggestionRoute);
//Connection to mongoose
try {
mongoose.connect(process.env.DB_CONNECTION, {
useNewUrlParser: true,
useUnifiedTopology: true,
useFindAndModify: false,
useCreateIndex: true
}, () => console.log('Connected to DB'));
} catch (error) {
console.log(`connection failed!! ${error}`)
}
app.listen(port, (() =>; console.log(`server started on port ${port}`)));
在controllers 文件夹中,我们定义了documentationRoute 。
然后我们在根请求上发送documentationRoute 。
这里是Node应用程序的文件结构。

现在,让我们导航到controllers 文件夹中的documentation.controllers.js 文件,并查看其内容。
exports.documentation = (request, response) => {
response.redirect("https://explore.postman.com/templates/15198/store");
}
exports.documentation 函数接受一个请求,并响应一个指向Node API文档的链接,postman。
这个Node应用程序是建立在MongoDB上的。我们将需要创建我们自己的MongoDB集群,以便生成我们的URI。
在代码编辑器中,我们创建一个.env 文本配置文件,为我们的会话设置一个DB_CONNECTION 的字符串。
DB_CONNECTION =
接下来,让我们测试一下该应用程序,以确保它成功连接到数据库并运行。
启动Node应用程序。
npm start
下面是结果。

Node应用程序已连接到数据库,并在port 3000 。
接下来,让我们为Node应用程序配置Apache服务器吧!
为Node.js配置Apache
我们将重新配置Apache服务器以监听port 80 ,并将所有请求重定向到运行在port 3000 的Node应用程序。
为了给Node应用程序配置Apache服务器,我们将遵循以下步骤。
确认Apache服务器正在运行
要开始,我们需要启动Apache服务器。如果你一直在关注这个教程,Apache服务器应该还在运行。如果是这种情况,只需运行以下命令。
sudo systemctl status apache2
你应该看到以下输出。

终端显示Apache服务器正在运行。
将localhost 粘贴到浏览器中。如果Apache运行成功,将显示以下内容。

创建Apache配置文件
接下来,我们需要创建配置文件。首先,打开一个新的标签,cd 到sites-available 目录。
cd /etc/apache2/sites-available
现在,运行ls 命令。

终端显示sites-available 目录中可用的默认文件。
接下来,我们将打开000-default.conf 默认配置文件,以便进行编辑。
sudo nano 000-default.conf
这里是打开的默认配置文件。

终端显示000-default.conf 默认配置文件。
VirtualHost 使Apache服务器能够与多个域或主机名共享其资源。对配置的任何编辑都必须在VirtualHost's opening and closing tags之间进行。有关VirtualHost 的其他信息,请参考Apache文档。
Apache的VirtualHost 是在000-default.conf 文件中定义的,并被设置为在port 80 上监听请求。
我们将配置000-default.conf 文件,以便所有通过port 80 进入的请求将被代理,或转发到运行在port 3000 的Node应用程序。
我们使用ProxyPass ,在指定地址映射根URL。 [http://localhost:3000](http://localhost:3000).
ProxyPass / http://localhost:3000/
将以下内容复制到000-default.conf 文件中。

终端显示000-default.conf 默认配置文件。
接下来,使用Control+X 命令来保存和退出。
启用proxy 和proxy_http 模块
为了使ProxyPass 工作,我们必须启用作为网关的proxy 和proxy_http 模块,以允许请求的传递。
在sites-enabled 目录中,运行以下程序。
sudo a2enmod
a2enmod 是 "Apache2启用模块 "的首字母缩写。运行这个命令将列出所有可被启用的模块。
接下来,我们会被提示输入我们想启用的模块名称。

a2enmod 终端中运行的脚本。
我们在提示下输入proxy ,以启用proxy 模块。

proxy 模块已启用。
接下来,我们在提示符下输入proxy_http ,以启用proxy_http 模块。

proxy_http 模块已启用。
值得注意的是,我们使用sudo 命令来运行a2enmod 脚本。在没有sudo 命令的情况下运行a2enmod 脚本将导致Permission denied 错误。

权限被拒绝的错误。
应用配置
由于我们改变了配置文件,我们必须重新加载Apache服务器,以便应用配置。
在sites-enabled 目录中,使用下面的命令来重新加载apache2 服务器。
sudo systemctl reload apache2
现在,使用这个命令来stop apache2 服务器。
sudo systemctl stop apache2
接下来,使用这个命令,start apache2 服务器。
sudo systemctl start apache2
测试配置
要检查Apache的配置是否正确,请将 [http://localhost:3000](http://localhost:3000)到浏览器窗口中。
如果配置被成功应用,我们将看到显示的Node应用程序。

结论
在这篇文章中,我们回顾了Apache服务器的一些优点、基本命令和文件结构。我们还演示了如何为一个Node应用程序配置Apache服务器,以提高性能和安全性。请参阅Apache服务器文档和Wiki,了解更多信息、技巧和窍门。
为Node.js配置Apache一文出现在LogRocket博客上。