作者选择了 开放式互联网 / 自由言论基金作为 写给捐赠计划的一部分接受捐款。
介绍
Nginx 地图模块允许您在 Nginx 配置文件中创建变量,其值是有条件的,也就是说,它们取决于其他变量的值。
前提条件
要遵循本教程,您将需要:
- 一个Ubuntu 20.04服务器与一个正常的,非根用户与sudo特权. 你可以学习如何通过遵循这个 初始服务器设置教程来准备你的服务器。
- Nginx 安装在你的服务器上,通过遵循 如何在Ubuntu 20.04上安装 Nginx 教程 。
步骤 1 – 创建和测试示例网页
首先,我们将创建一个测试文件,代表一个新发布的网站,我们将使用此文件来测试我们的配置。
让我们在默认的 Nginx 网站目录中创建一个简单的页面,index.html。
1sudo sh -c 'echo "Home" > /var/www/html/index.html'
有了這個測試檔案,我們會檢查它是否正確地用「curl」服務. 我們不需要為這個命令指定「index.html」,因為如果沒有提供精確的檔案名稱,該檔案會默認提供:
1curl http://localhost/
作为回应,你应该看到一个单词说 ** Home** 就像下面一样:
1[secondary_label Output]
2Home
现在让我们尝试访问在 /var/www/html/
中不存在的文件,例如 old.html
:
1curl -L http://localhost/old.html
答案将是一个系统错误消息, 404 Not Found,这意味着页面不存在:
1[secondary_label Output]
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.18.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 /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[secondary_label Output]
2Home
这意味着地图已正确配置,您可以通过添加更多条目来重定向URL。
重定向 URL 是地图模块的一个有用的应用程序. 另一个,我们将在下一步探索,是根据访问者的地理位置过滤流量。
步骤 3 – 限制网站访问到某些国家
有时,服务器可能会收到大量的自动化、恶意请求,这可能是DDoS攻击,试图强制对网站管理面板的密码,或者试图利用软件中已知的漏洞攻击网站并使用它发送垃圾邮件或修改网站内容。
此类自动攻击可能来自许多不同国家的不同分布式服务器,这使其难以阻止。
它不是一个完美的解决方案,但在基于访问者地理位置限制访问网站的情况下,这是一个明智的选择,并且不限制网站的受众,这种解决方案具有快速和更少错误的优势。
服务器级别的过滤比网站级别的过滤更快,还涵盖所有请求(包括静态文件,如图像)。
要利用地理过滤,我们必须先安装 Nginx GeoIP 模块以及包含访问者 IP 地址与各自国家之间的映射的 GeoIP 数据库。
1sudo apt install libnginx-mod-http-geoip geoip-database
现在,让我们先创建一个新的配置文件:
1sudo nano /etc/nginx/conf.d/geoip.conf
将下列内容粘贴到文件中,这会告诉 Nginx 在哪里找到 GeoIP 数据库以根据访问者的 IP 地址识别国家:
1[label /etc/nginx/conf.d/geoip.conf]
2# GeoIP database path
3#
4
5geoip_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_1
和country_code_2
作为位置持有者。 用您想要允许的国家或国家的两位数国家代码来代替这些变量。 例如,您可以使用 ISO 的所有国家代码的完整可搜索列表(https://www.iso.org/obp/ui/#search)来查找。
与第一个示例不同的是,在这个地图
块中,$allowed_country
变量将始终设置为某个位置。默认情况下,它设置为不
;如果$geoip_country_code
变量匹配区块中的一个国家代码,则设置为是
。
要启用新的配置,请重新启动 Nginx:
1sudo systemctl restart nginx
如果你没有将你的国家添加到允许列表中,当你尝试访问http://your_server_ip
,你会看到一个错误消息,如页面不起作用
或页面没有发送任何数据
。
结论
地图模块不仅允许简单的比较,还支持常规表达式,允许更复杂的匹配。
更详细的信息可以找到 在 Nginx 的官方地图模块文档。