使用 Nginx 作为反向代理缓存来加速您的网站

2025-06-07

使用 Nginx 作为反向代理缓存来加速您的网站

优化 Web 性能是我们必须持续努力的悬而未决的问题。目前有多种解决方案可以提升我们的响应时间。

什么是反向代理缓存?

在计算领域,反向代理是一种位于客户端和服务器(或 Web 服务器)之间的服务器,用于检索这些服务器的资源。这些资源返回给客户端,就像 Web 服务器本身返回资源一样。本质上,它是一个可以扮演不同角色的中介。

我们可以赋予此代理的可能应用是将其用作内部网络的防火墙、负载平衡器、应用 AB 测试的工具或本文的原因,用作静态缓存服务器。

静态缓存服务器
图片来源:加拿大隐私局(https://privacycanada.net

本质上,该服务器用作缓存,如果请求的资源不存在,就会向 Web 服务器查询,即发生“未命中”(MISS),并将该资源存储在内存中。对同一资源的下一个请求将由代理服务器以非常高效的方式处理,生成“命中”,并避免在给定的生存时间(TTL)内调用 Web 服务器。通过这种方式,我们可以集中安装一个静态服务器,并从中提供所有静态内容。

有多种技术可以实现此场景。其中最知名的工具之一是 Varnish,但 Nginx 除了作为 Web 服务器之外,还可以配置为反向代理缓存。阅读了一些比较和基准测试文章后,我们发现两者之间的差异很小,因此今天我们将重点讨论 Nginx-Nginx 场景。

但是,我们可以用不同的组合来表示相同的场景:Varnish-Apache、Varnish-Nginx 或 Nginx-Apache,其中第一个是缓存服务器,第二个是 Web 服务器。

为什么选择 Nginx?

与 Varnish 类似,Nginx 也能够充当 Web 缓存,但并非所有系统管理员都了解这一点。Nginx 能够以非常高效的方式直接提供静态内容,并且能够像 Varnish 一样充当前端缓存。Varnish 的唯一功能是充当具有高级选项的缓存,而 Nginx 功能多样,提供了多种替代方案。

事实是,我不知道该拒绝哪一个选项,但决定只使用 nginx,就不会在我们的基础设施中引入需要学习和维护的新技术,而且 nginx 的配置似乎比 Varnish 简单得多。

安装基础设施

安装 Nginx

要在我们的服务器上安装 nginx,我们只需执行以下命令:

sudo apt-get install nginx

默认情况下,nginx 会安装在你的系统上,监听 80 端口,并提供静态的欢迎 HTML。让我们看看如何配置 nginx。

配置 Web 服务器

首先,我们必须考虑到读取我们文件系统资源的 Web 服务器不应再监听端口 80,因为将由代理代替。

我们将创建一个文件夹来托管我们的资源:

mkdir /var/www/assets

接下来,我们将配置 nginx,使其监听 81 端口,并将资源目录定义为根目录,并设置资源的有效期为 12 小时。这可以通过允许配置的正则表达式来实现。为此,我们生成以下文件 /etc/nginx/sites-available/static-server

server {
listen 81;
server_name {{tu ip o subdominio}};
access_log /var/log/nginx/static-server.log;
location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {
expires 12h;
root /var/www/assets;
add_header Cache-Control "public";
}
}

最后,我们将其移动到 /etc/nginx/sites-enabled/static-server。如果我们现在通过 81 端口向资源发出请求,应该能够收到它。

配置代理缓存

要将 nginx 配置为缓存,我们将使用 proxy_cache_path 指令。该指令指定了计算机上所有需要缓存的资源的存储目录。

此目录应包含 www-data 组和 700 权限,以便代理可以正确写入。此外,此指令指示一个 keys_zone 标识符,该标识符定义名称、此缓存的最大大小(max_size)以及缓存中文件夹层次结构的间接级别。

我们还将依赖另一个 proxy_cache_key 指令,它是存储缓存资源的键。nginx 会对该结构进行哈希处理,以便选择缓存级别,例如,是否在 URL 中使用相同的参数。

一旦我们明确了这两个指令,我们将指示代理侦听端口 80,并且任何到达的请求都会检查我们定义的缓存区域,否则使用 proxy_pass 指令检查侦听端口 81 的 Web 服务器

此外,Nginx 还包含一个名为 X-Proxy-Cache 的头,用于告知客户端该资源是否由缓存返回(命中,HIT)或需要咨询 Web 服务器(未命中,MISS)。这些信息对于调试一切是否正常非常有用。

现在我离开缓存服务器的完整配置:

#/etc/nginx/sites-enabled/caching-server
proxy_cache_path /tmp/nginx levels=1:2 keys_zone=assets_zone:10m inactive=60m;
proxy_cache_key "$scheme$request_method$host$request_uri";
server {
listen 80;
server_name {{tu ip o subdominio}};
access_log /var/log/nginx/caching-server.log;
location /static/ {
proxy_cache assets_zone;
add_header X-Proxy-Cache $upstream_cache_status;
include proxy_params;
proxy_pass http://localhost:81/;
}
}

我希望这篇文章有趣且有用,我希望您告诉我们您优化网站的经验以及您遇到的问题和您实施的解决方案。

相关链接:

https://serversforhackers.com/nginx-caching

https://www.digitalocean.com/community/tutorials/understanding-nginx-http-proxying-load-balancing-buffering-and-caching

文章来源:https://dev.to/shameemreza/accelerate-your-website-with-nginx-as-a-reverse-proxy-cache-a9o
PREV
使用 Linux Shell 处理文本 - 第 1 部分 sed 的世界
NEXT
使用 Git Hooks 自动化开发任务的 3 个技巧