帮酷LOGO
0 0 评论
文章标签:模块  Nginx  Ubuntu  

介绍

Nginx的map模块允许你在Nginx的配置文件中创建变量,这些变量的值是有条件的,也就是说,它们依赖于其他变量的值,本文将介绍如何使用Nginx模块的map实现两个例子: 如何设置从旧网站URL到新URL的重定向列表,以及如何创建国家白名单以控制网站流量。

步骤1创建和测试例子网页

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

在默认Nginx网站目录中创建一个简单的页面index.html ,此文件将只包含描述内部内容的纯文本: Home 。


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


curl http://localhost/

在响应里,你应该看到一个与下面类似的单词:

 
Home

 

现在尝试访问一个在/var/www/html/中不存在的文件,如old.html


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

响应将是系统错误消息404 not Found,这意味着该页不存在。

Nginx响应

<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.10.0 (Ubuntu)</center>
</body>
</html>

在下一步中,我们利用map模块,以确保将查看器重定向到新的替换。

步骤2配置重定向

map模块是一个更加优雅,简洁的解决方案,它允许你将Nginx变量值与条件列表进行比较,然后根据匹配项将新值与变量关联起来,对于每个旧地址,我们把新的地址关联起来。

map模块是Nginx核心模块,这意味着它不需要单独安装,要创建必要的映射和重定向配置,请在nano或你喜欢的文本编辑器中打开缺省服务器块Nginx配置文件。


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

查找server配置块,它外观如下所示:

/etc/nginx/sites-available/default

. . .
# Default server configuration
#

server {
 listen 80 default_server;
 listen [::]:80 default_server;

. . .

我们将添加两个新部分: 一个在server块之前,一个在它里面。

块之前的部分是一个新的map块,它定义了使用map模块的旧URL和新的server之间的映射,server块内部的部分是重定向本身。

修改/etc/nginx/sites-available/default

. . .
# Default server configuration
#

# Old website redirect map
#
map $uri $new_uri {
 /old.html /index.html;
}

server {
 listen 80 default_server;
 listen [::]:80 default_server;

 # Old website redirect
 if ($new_uri) {
 rewrite ^ $new_uri permanent;
 }
. . .

map块内的行/old.html /index.html意味着如果$uri的值为/old.html,则将$new_uri更改为/index.html ,如果不匹配,则不更改,这个我们只定义一个条件,但是,你可以在map中定义任意数量的条件。

然后,在server块内使用条件if语句,检查变量的$new_uri值是否被设置,如果是,就意味着map中的条件被满足,我们应该使用rewrite命令重定向到新的网站,permanent 关键字确保重定向是永久HTTP重定向,这意味着旧地址不再有效。

保存并关闭文件以便退出。

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


sudo systemctl restart nginx

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


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

此时将在输出中找不到404个错误,相反,你将看到我们在步骤1中创建的简单主页。

Nginx响应
 
Home

 

这意味着映射已经正确配置,你可以通过向map添加更多条目来重定向URL 。

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

第3步限制网站访问某些国家

有时,服务器收到过多的恶意请求,这可能是一种发布攻击,尝试强制网站管理面板的密码,或者尝试利用软件的已知漏洞。

这种自动攻击可能来自许多不同国家的许多分布式服务器,因此难以阻止这些攻击,解决这种攻击的一种解决方案是创建一个可以访问网站的国家白名单。

这不是一个完美的解决方案,但是在访问某些情况下是理想的选择。

在服务器级别过滤比在网站级别过滤要快,同时也涵盖了(包括静态文件,像图像)的所有请求,这种过滤还可以防止请求到达网站软件,这使得漏洞难以利用。

为了使用地理过滤,我们首先创建一个新的配置文件。


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

将以下内容粘贴到文件中,这告诉nginx在哪里可以找到GeoIP数据库,其中包含访问者IP地址与其各自国家之间的映射,此数据库来自Ubuntu 16.04.

/etc/nginx/conf.d/geoip.conf

. . .
# GeoIP database path
#

geoip_country /usr/share/GeoIP/GeoIP.dat;

下一步是创建必要的映射和限制配置,打开默认服务器块Nginx配置。


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

查找server配置块,在步骤1和2中修改后,如下所示:

/etc/nginx/sites-available/default

. . .
# Default server configuration
#

# Old website redirect map
#
map $uri $new_uri {
 /old.html /index.html;
}

server {
 listen 80 default_server;
 listen [::]:80 default_server;

 # Old website redirect
 if ($new_uri) {
 rewrite ^ $new_uri permanent;
 }
. . .

我们将添加两个新部分: 一个在server块之前,一个在它里面。

server块之前的部分是新的map块,它定义了默认操作(禁止访问)以及允许访问网站的国家代码列表,如果map结果如此的话,server块内部的部分拒绝访问该网站。

修改的/etc/nginx/sites-available/default

. . .
# Default server configuration
#

# Allowed countries
#
map $geoip_country_code $allowed_country {
 default no;
 country_code_1 yes;
 country_code_2 yes;
}

# Old website redirect map
#
map $uri $new_uri {
 /old.html /index.html;
}

server {
 listen 80 default_server;
 listen [::]:80 default_server;

 # Disallow access based on GeoIP
 if ($allowed_country = no) {
 return 444;
 }

 # Old website redirect
 if ($new_uri) {
 rewrite ^ $new_uri permanent;
 }
. . .

保存并关闭文件以便退出。

这里我们用了 country_code_1country_code_2 作为占位符,将这些变量替换为两个字符国家或国家/地区代码,你可以使用ISO查找所有国家/地区代码列表,例如,美国的两个字符代码是US

和第一个例子不同,在这个map块中,$allowed_country变量总是被设置为,默认情况下,它设置为no ; 如果$geoip_country_code变量与块中的某个国家代码匹配,则将它设置为yes ,如果$allowed_country变量是no,我们返回444个连接而不响应。

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


sudo systemctl restart nginx

如果你没有将国家/地区添加到白名单中,请在你尝试访问,http://your_server_ip 你将看到一条错误消息,如page isn't working或者 page didn't send any data,如果你将国家添加到白名单中,你将看到主页。

结束语

在nginx官方map模块的文档中可以找到更详细的信息。



文章标签:模块  Ubuntu  Nginx  

Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语