如何在 Ubuntu 16.04 上使用 Nginx 的 map 模块

介绍

例如,也许某些文件应该被用户的浏览器缓存比其他更长时间,或者网站的某些部分只能通过安全连接允许(如任何需要用户密码的文件),而网站的其他部分则不允许。

另一个简单,常见的例子是确保当新网页发布而不是旧网页时,所有旧地址都将重定向到正确的位置,这是有用的,因为这意味着旧链接和标记不会停止工作,而且还保留了谷歌的缓存。

Nginx 地图模块允许您在 Nginx 配置文件中创建变量,其值是有条件的,即它们取决于其他变量的值. 在本指南中,我们将研究如何使用 Nginx 地图模块实现两个例子:如何设置从旧网站 URL 到新网站的重定向列表以及如何创建一个允许列表的国家来控制流量到您的网站。

前提条件

要遵循本教程,您将需要:

步骤 1 – 创建和测试示例网页

首先,我们将创建一个测试文件,代表一个新发布的网站,我们将使用此文件来测试我们的配置。

让我们在默认的 Nginx 网站目录中创建一个简单的页面,index.html。

1sudo sh -c 'echo "Home" > /var/www/html/index.html'

有了這個測試檔案,接下來我們會檢查它是否正確地用「curl」服務. 我們不需要為這個命令指定「index.html」,因為如果沒有提供準確的檔案名稱,該檔案是默認提供的。

1curl http://localhost/

作为回应,你应该看到一个单词说 ** Home** 就像下面一样:

1[label Nginx response]
2Home

现在让我们尝试访问在 /var/www/html/ 中不存在的文件,例如 old.html

1curl -L http://localhost/old.html

答案将是一个系统错误消息, 404 Not Found,这意味着页面不存在。

1[label Nginx response]
2<html>
3<head><title>404 Not Found</title></head>
4<body bgcolor="white">
5<center><h1>404 Not Found</h1></center>
6<hr><center>nginx/1.10.0 (Ubuntu)</center>
7</body>
8</html>

我们只是在本教程中使用一个愚蠢的网站,但如果‘old.html’是以前存在并被删除的真实网站上的页面,那么返回一个404将意味着所有链接到该页面都被打破。

在下一步中,我们将使用地图模块来确保这个旧地址通过自动将观众重定向到新的替代程序来再次工作。

步骤 2 – 配置重定向

对于仅有几页的小型网站,简单的如果条件声明可以用于重定向和类似的东西,然而,由于条件列表的长度增加,这种配置并不容易维护或延长。

地图模块是一个更优雅、更简洁的解决方案. 它允许您将 Nginx 变量值与条件列表进行比较,然后将新的值与变量相关联,取决于匹配。

地图模块是一个核心的 Nginx 模块,这意味着它不需要单独安装才能使用。 要创建必要的地图和重定向配置,请在nano或您最喜欢的文本编辑器中打开默认服务器封锁的 Nginx 配置文件。

1sudo nano /etc/nginx/sites-available/default

查找服务器配置块,它看起来像这样:

 1[label /etc/nginx/sites-available/default]
 2. . .
 3# Default server configuration
 4#
 5
 6server {
 7    listen 80 default_server;
 8    listen [::]:80 default_server;
 9
10. . .

我们将添加两个新部分:一个在服务器块前,一个在里面。

服务器块前的部分是一个新的地图块,它定义了使用地图模块的旧 URL 和新 URL 之间的映射。

 1[label Modified /etc/nginx/sites-available/default]
 2. . .
 3# Default server configuration
 4#
 5
 6# Old website redirect map
 7#
 8map $uri $new_uri {
 9    /old.html /index.html;
10}
11
12server {
13    listen 80 default_server;
14    listen [::]:80 default_server;
15
16    # Old website redirect
17    if ($new_uri) {
18        rewrite ^ $new_uri permanent;
19    }
20. . .

「map $uri $new_uri」指令采用系统变量「$uri」的内容,该变量包含所请求的页面的URL地址,然后将其比较到曲线夹中的条件列表.条件列表中的每个项目有两个部分:要匹配的值,如果匹配,则将新值分配给变量。

map块中的字符串 /old.html/index.html 意味着如果 $uri 的值是 /old.html,则 $new_uri 将更改为 `/index.html。

然后,在服务器块中使用一个有条件的如果声明,我们检查是否设置了$new_uri变量值。如果是,这意味着地图中的条件已经满足,我们应该使用重写命令重定向到新网站。

保存并关闭文件以退出。

要启用新配置,请重新启动 Nginx。

1sudo systemctl restart nginx

若要测试新配置,请执行与以前相同的请求:

1curl -L http://localhost/old.html

这一次,输出中不会有 404 Not Found 错误,相反,你会看到我们在步骤 1 中创建的简单主页。

1[label Nginx response]
2Home

这意味着地图已正确配置,您可以通过将更多条目添加到地图中来重定向URL。

重定向 URL 是地图模块的一个有用的应用程序. 另一个,我们将在下一步探索,是根据访问者的地理位置过滤流量。

步骤 3 – 限制网站访问到某些国家

有时,服务器可能会收到大量的自动化、恶意请求,这可能是DDoS攻击,试图强制对网站管理面板的密码,或者试图利用软件中已知的漏洞攻击网站并使用它发送垃圾邮件或修改网站内容。

此类自动攻击可能来自许多不同国家的不同分布式服务器,这使其难以阻止。

它不是一个完美的解决方案,但在基于访问者地理位置限制访问网站的情况下,这是一个明智的选择,并且不限制网站的受众,这种解决方案具有快速和更少的错误倾向的好处。

服务器级别的过滤比网站级别的过滤更快,还涵盖了所有请求(包括静态文件,如图像)。

要利用地理过滤,我们先创建一个新的配置文件。

1sudo nano /etc/nginx/conf.d/geoip.conf

将下列内容粘贴到文件中. 这告诉 Nginx 在哪里找到包含访问者 IP 地址和各自国家之间的映射的 GeoIP 数据库。

1[label /etc/nginx/conf.d/geoip.conf]
2. . .
3# GeoIP database path
4#
5
6geoip_country /usr/share/GeoIP/GeoIP.dat;

下一步是创建必要的地图和限制配置,打开默认服务器封锁 Nginx 配置。

1sudo nano /etc/nginx/sites-available/default

查找服务器配置块,在步骤1和步骤2中的修改后,它看起来像这样:

 1[label /etc/nginx/sites-available/default]
 2. . .
 3# Default server configuration
 4#
 5
 6# Old website redirect map
 7#
 8map $uri $new_uri {
 9    /old.html /index.html;
10}
11
12server {
13    listen 80 default_server;
14    listen [::]:80 default_server;
15
16    # Old website redirect
17    if ($new_uri) {
18        rewrite ^ $new_uri permanent;
19    }
20. . .

我们将添加两个新部分:一个在服务器块前,一个在里面。

服务器块前的部分是一个新的地图块,它定义了默认操作(禁用访问)以及允许访问网站的国家代码列表。

 1[label Modified /etc/nginx/sites-available/default]
 2. . .
 3# Default server configuration
 4#
 5
 6# Allowed countries
 7#
 8map $geoip_country_code $allowed_country {
 9    default no;
10    country_code_1 yes;
11    country_code_2 yes;
12}
13
14# Old website redirect map
15#
16map $uri $new_uri {
17    /old.html /index.html;
18}
19
20server {
21    listen 80 default_server;
22    listen [::]:80 default_server;
23
24    # Disallow access based on GeoIP
25    if ($allowed_country = no) {
26        return 444;
27    }
28
29    # Old website redirect
30    if ($new_uri) {
31        rewrite ^ $new_uri permanent;
32    }
33. . .

保存并关闭文件以退出。

在这里,我们使用country_code_1country_code_2作为位置持有者。 用你想要的国家或国家的两个字符国家代码来代替这些变量,你可以使用ISO的所有国家代码的完整可搜索列表(https://www.iso.org/obp/ui/#search)来找到它。

与第一个示例不同的是,在这个地图块中,$allowed_country变量将始终设置为某个位置。默认情况下,它设置为;如果$geoip_country_code变量匹配区块中的一个国家代码,则设置为

要启用新配置,请重新启动 Nginx。

1sudo systemctl restart nginx

如果你没有将你的国家添加到允许列表中,当你尝试访问http://your_server_ip,你会看到一个错误消息,如页面不起作用页面没有发送任何数据

结论

虽然它可能是一个非常简单的示例如何使用地图模块,但它显示了机制,可以用许多其他不同的方式。地图模块不仅允许简单的比较,而且还支持常规表达式,允许更复杂的匹配。

地图模块的另一个非常流行的用例是网站的安全部分的条件重定向,而不是SSL环境。仅为需要输入密码的表单设置强迫SSL连接是如何在现实世界的情况下应用地图模块的一个很好的例子,我鼓励尝试这种设置。

更详细的信息可以找到 在 Nginx 的官方地图模块文档

Published At
Categories with 技术
comments powered by Disqus