(Plesk for Linux)为网站设置IP地理定位
IP地理定位会将网站访问者的IP地址映射到他们真实世界的地理位置,例如,一个国家或一个城市。
有了IP地理定位,你可以根据访问者居住的地方定制如何向他们显示您的网站的方式。例如,您可以将访问者重定向到指定位置的网页,或者您可以阻止指定国家的访问者访问您的网站。
在本小节中,您将了解到如何在Plesk中设置IP地理定位,以及如何在通用实例中使用IP地理定位,例如:
- 阻止来自指定国家的访问者访问某个网站。
- 阻止来自指定国家的访问者访问服务器上托管的所有网站。
- 将网站访问者重定向到一个指定的地理位置 URL。
- 将基于地理位置的决策应用于属于某个主机方案的网站。
- 保护网站免受来自同一国家的暴力攻击。
在Plesk中设置IP地理定位
您可以使用内置的ngx_http_geoip2_module
nginx 模块和MaxMind地理定位数据库(您需要下载)在Plesk中设置IP地理定位。
1. Downloading MaxMind Geolocation Databases
MaxMind 公司提供了两个地理定位数据库:免费的GeoLite2和付费的GeoIP2(比免费的对应数据库更准确)。
在本小节中,我们将使用免费的GeoLite2数据库为例。您可以随时将其升级到GeoIP2。
要下载GeoLite2地理定位数据库,首先需要创建一个免费的GeoLite2帐户,然后选择如何下载这些数据库。您可以通过以下方法进行此操作:
-
直接下载数据库的存档,然后将其上传到您的Plesk服务器。
-
获取永久链接。要下载数据库,请使用这些永久链接与脚本或``curl``和``get``命令。您还需要为GeoLite2帐户生成然后使用许可证密钥。了解更多如何获取和使用永久链接的信息。
-
(推荐)使用
geoipupdate
工具。我们建议以这种方式下载地理定位数据库,因为此工具可以从主要的Linux发行版中的系统包存储库中获得。使用``geoipupdate``实用工具,您不仅可以下载,还可以更新地理定位数据库。
要使用 geoipupdate
实用工具下载GeoLite2地理定位数据库,请如下操作:
注解: 要查看哪个实用工具版本可用以及查看实用工具设置,请运行 geoipupdate -v
。
-
登录到您的GeoLite2帐户,并生成一个许可证密钥。完成后,复制该密钥,并将其安全保存。出于安全考虑,许可证密钥只在生成时显示。
在生成许可证密钥时,您还将可以看到您的帐户ID。在下一步操作中,您将同时需要帐户ID和许可证密钥。
-
打开用于编辑的
/etc/GeoIP.conf
文件。GeoIP.conf
文件的路径可能因Linux发行版的不同而有所不同。 -
粘贴您的帐户ID、许可证密钥和您要下载的数据库的版本ID。使用空格分隔多个版本。完成设置后,请保存该文件。
-
要下载数据库,请运行
sudo geoipupdate
或sudo geoipupdate -v
(查看下载数据库的详细信息)。
2. Enabling ngx_http_geoip2_module in Plesk
在Plesk 18.0.46及更高版本中,nginx已经用 ngx_http_geoip2_module 进行编译了。该模块默认被禁用。
注解: 要查看 nginx 是否与该模块一起进行了编译,请运行 nginx-V
。如果是,您将在输出中看到 mod_geoip2
。
若要启用 ngx_http_geoip2_module,请如下操作:
- 通过 SSH 登录您的 Plesk 服务器。
- 通过运行
plesk bin nginx -e geoip2
启用该模块。
模块已启用。如果您运行``plesk bin nginx -s``,您将在已启用的nginx模块列表中看到该模块。
3. Configuring variables
要使用地理位置数据并基于这些数据做出决策,您需要将网站访问者的IP地址映射到各种属性(如国家或城市名称),并将这些数据作为变量存储在nginx配置文件中。
要配置变量,请如下操作:
-
将以下指令添加到
/etc/nginx/conf.d/geoip2.conf
文件:geoip2 <path-to-the-database>/GeoLite2-Country.mmdb { auto_reload 5m; $geoip2_metadata_country_build metadata build_epoch; $geoip2_data_country_code country iso_code; $geoip2_data_country_name country names en; } geoip2 <path-to-the-database>/GeoLite2-City.mmdb { $geoip2_data_city_name city names en; }
用实际的数据库路径替换
<path-to-the-database>
,例如:/usr/share/GeoIP/GeoLite2-Country.mmdb在CentOS、AlmaLinux和其他类似Red Hat的操作系统上,数据库的默认位置如下:
/usr/share/GeoIP/GeoLite2-ASN.mmdb
/usr/share/GeoIP/GeoLite2-City.mmdb
/usr/share/GeoIP/GeoLite2-Country.mmdb
在 Debian 和 Ubuntu 上,数据库默认的位置是
/var/lib/GeoIP
。 -
运行
service nginx reload
命令以重新加载 nginx 配置文件。
您已经在Plesk中完成了IP地理定位的设置。您现在可以在下面描述的各种用例中使用``ngx_http_geoip2_module``。
若要应用这些用例,您需要配置引用以下变量的nginx指令:
变量名称 | 变量意义 |
---|---|
$geoip2_metadata_country_build |
GeoLite2-Country 数据库的构建时间 |
$geoip2_data_country_code |
国家的两个字母 ISO 代码 |
$geoip2_data_country_name |
国家名称(英文版) |
$geoip2_data_city_name |
城市名称(英文版) |
阻止来自指定国家的访问者访问网站
您可以拒绝来自指定国家的访问者访问网站。当他们试图访问该网站时,他们将看到HTTP 403 状态代码,这表示禁止访问请求的资源。
要阻止来自指定国家的访问者访问某个网站,请如下操作:
-
转到 网站与域名 > 域名 > “主机与DNS” 标签 > Apache 与 nginx 设置。
-
将以下内容放在“其它的nginx指令”文本框中,然后点击 确定。
if ($geoip2_data_country_code = "XX") { return 403; }
其中
XX
是您想要阻止其访问者访问的国家的两个字母ISO代码(例如,AQ
代表南极洲)。
来自您所指定的ISO代码的国家的访问者不再可以访问您的网站。
将网站访问者重定向到指定地理定位的 URL
您可以将访问通用 URL(例如 https://example.com/test
)的访问者重定向到指定国家的URL(例如 https://example.com/US/test
)。
要将网站访问者重定向到指定地理位置的URL,请如下操作:
-
转到 网站与域名 > 域名 > “主机与DNS” 标签 > Apache 与 nginx 设置。
-
将以下内容放在“其它的nginx指令”文本框中,然后点击 确定。
location = /test { return 301 https://$host/$geoip2_data_country_code/<geolocation-specific-URL-part>; }
其中
<geolocation-specific-URL-part>
是指定地理位置的 URL 部分(例如test
)。
例如,来自美国的访问者现在将被重定向到 https://example.com/US/test
。
将基于地理位置的决策应用于属于某个主机方案的网站
例如,您可以阻止或重定向来自指定国家的访问者,但这不是应用于单个网站,而是应用于属于某个主机方案的所有网站。这种情况类似于之前两种有单个网站的情况。唯一的区别是,您需要使用的不是域名,而是主机方案的nginx设置。
让我们以网站访问区块为例,看看如何操作。
要阻止来自指定国家的访问者访问属于某个主机方案的网站,请如下操作:
-
转到**服务方案**,然后单击要阻止其网站的服务方案的名称。
-
转到 “Web 服务器” 标签,将以下内容添加到“其它的nginx指令”文本框中,然后点击 确定。
if ($geoip2_data_country_code = "XX") { return 403; }
其中
XX
是您想要阻止其访问者访问的国家的两个字母ISO代码(例如,AQ
代表南极洲)。
来自您所指定的ISO代码的国家的访问者不再可以访问属于该主机方案的所有网站。
阻止来自指定国家的访问者访问服务器上托管的所有网站
有两种方法来实现此目的:使用配置模板或主机方案设置。我们之前已经描述了如何使用主机方案设置。下面,我们将向您展示如何使用自定义配置模板。
注解: 您需要使用配置模板或主机方案设置。无法通过将全局的nginx配置文件添加到``/etc/nginx/conf.d``中来拒绝向服务器上托管的所有网站进行访问。
要阻止来自指定国家的访问者访问服务器上托管的所有网站:
-
使用 此流程 创建自定义配置模板``nginxDomainVirtualHost.php``。
-
在复制的默认模板的末尾找到以下文本:
<?php if (is_file($VAR->domain->physicalHosting->customNginxConfigFile)) : ?> include "<?php echo $VAR->domain->physicalHosting->customNginxConfigFile ?>"; <?php endif ?> }
并如下在右大括号前插入访问限制指令:
<?php if (is_file($VAR->domain->physicalHosting->customNginxConfigFile)) : ?> include "<?php echo $VAR->domain->physicalHosting->customNginxConfigFile ?>"; <?php endif ?> if ($geoip2_data_country_code = "XX") { return 403; } }
其中
XX
是您想要阻止其访问者访问的国家的两个字母ISO代码(例如,AQ
代表南极洲)。 -
运行以下命令,检查修改后的模板是否是有效的PHP文件:
php -l nginxDomainVirtualHost.php
-
运行以下命令以生成新的配置文件:
plesk sbin httpdmng --reconfigure-all
来自您所指定的ISO代码的国家的访问者不再可以访问在服务器上托管的所有网站。
保护网站免受来自同一个国家的暴力攻击
您可以通过限制来自具有相同ISO国家代码的IP地址的请求来保护您的网站免受暴力攻击。您可以对以下应用此保护:
- 单个网站
- 属于一个主机方案的所有的网站
- 在服务器上托管的所有网站
- 一个或多个网页(例如,
example.com/test
)
若要保护一个或多个网站免受来自同一国家的暴力攻击,请如下操作:
-
添加以下模式的指令到
/etc/nginx/conf.d/limit_req_zone.conf
文件:limit_req_zone $geoip_data_country_code zone=country_code:10m rate=5r/m;
这将创建一个在 nginx worker 进程之间共享的内存区。该区域会存储每个IP地址的状态,以及它访问限制请求的URL的频率。上述指令将来自具有相同ISO国家代码的IP地址的请求限制为每分钟5次(
速率=5r/m
)。 -
第二步取决于您想要保护的网站和网站数量:
-
(单个网站)转到 网站与域名 > 域名 > “主机与 DNS” 标签 > Apache 与 nginx 设置,将以下放置 “其它的 nginx 指令” 文本框中,然后点击 确定:
limit_req zone=country_code;
-
(所有属于一个主机方案的网站)转到**服务方案**,并单击您想要保护其网站的服务方案的名称。然后进入“Web 服务器”标签,添加以下内容到“其它的 nginx指令”文本框中,并单击**确定**:
limit_req zone=country_code;
-
(服务器上托管的所有网站)将以下内容放到``/etc/nginx/conf.d/limit_req.conf`` 文件中:
limit_req zone=country_code;
-
您已将来自具有相同国家 ISO 代码的 IP 地址的一个或多个网站的请求限制为每分钟五次。
您还可以通过限制来自具有相同ISO国家代码的IP地址的请求来保护单个或多个网页。该流程根据您的网站主机类型而有所不同:
- Apache+nginx 主机
- 仅 nginx 主机
- 配置用于直接服务 PHP 的 nginx
(Apache+nginx 主机) 若要保护一个指定的网页免受来自同一国家的暴力攻击,请如下操作:
-
添加以下模式的指令到
/etc/nginx/conf.d/limit_req_zone.conf
文件:limit_req_zone $geoip_data_country_code zone=country_code:10m rate=5r/m;
这将创建一个在 nginx worker 进程之间共享的内存区。该区域会存储每个IP地址的状态,以及它访问限制请求的URL的频率。上述指令将来自具有相同ISO国家代码的IP地址的请求限制为每分钟5次(
速率=5r/m
)。 -
使用 此流程 创建自定义配置模板``nginxDomainVirtualHost.php``。
-
在复制的默认模板的末尾找到以下文本:
<?php if ($VAR->domain->physicalHosting->proxySettings['nginxProxyMode']): ?> location / { <?php if ($VAR->domain->physicalHosting->scriptTimeout): ?> proxy_read_timeout <?php echo min($VAR->domain->physicalHosting->scriptTimeout, 2147483) ?>; <?php endif ?> <?php echo $VAR->includeTemplate('domain/service/proxy.php', $OPT) ?> }
并如下在其之后插入您的指令,用您的域名替换``example.com``,并用您想要应用限制的确切网页替换
/test
:<?php if ($VAR->domain->physicalHosting->proxySettings['nginxProxyMode']): ?> location / { <?php if ($VAR->domain->physicalHosting->scriptTimeout): ?> proxy_read_timeout <?php echo min($VAR->domain->physicalHosting->scriptTimeout, 2147483) ?>; <?php endif ?> <?php echo $VAR->includeTemplate('domain/service/proxy.php', $OPT) ?> } <?php if ($VAR->domain->asciiName == 'example.com'): ?> location = /test { limit_req zone=country_code; <?php if ($VAR->domain->physicalHosting->scriptTimeout): ?> proxy_read_timeout <?php echo min($VAR->domain->physicalHosting->scriptTimeout, 2147483) ?>; <?php endif ?> <?php echo $VAR->includeTemplate('domain/service/proxy.php', $OPT) ?> } <?php endif ?>
-
运行以下命令,检查修改后的模板是否是有效的PHP文件:
php -l nginxDomainVirtualHost.php
-
运行以下命令以生成新的配置文件:
plesk sbin httpdmng --reconfigure-all
您已将来自具有相同国家 ISO 代码的 IP 地址的网页的请求限制为每分钟 5 次。
(仅 nginx 主机) 若要保护一个指定的网页免受来自同一国家的暴力攻击,请如下操作:
-
添加以下模式的指令到
/etc/nginx/conf.d/limit_req_zone.conf
文件:limit_req_zone $geoip_data_country_code zone=country_code:10m rate=5r/m;
这将创建一个在 nginx worker 进程之间共享的内存区。该区域会存储每个IP地址的状态,以及它访问限制请求的URL的频率。上述指令将来自具有相同ISO国家代码的IP地址的请求限制为每分钟5次(
速率=5r/m
)。 -
转到 网站与域名 > 域名 > “主机与DNS” 标签 > Apache 与 nginx 设置。
-
将以下内容放在“其它的nginx指令”文本框中,用您想要应用该限制的确切网页替换``/test``:
location = /test { limit_req zone=country_code; }
-
点击 确定 。
您已将来自具有相同国家 ISO 代码的 IP 地址的网页的请求限制为每分钟 5 次。
(直接服务 PHP 的 nginx) 若要保护一个指定的 PHP 脚本免受来自同一国家的暴力攻击,请如下操作:
-
添加以下模式的指令到
/etc/nginx/conf.d/limit_req_zone.conf
文件:limit_req_zone $geoip_data_country_code zone=country_code:10m rate=5r/m;
这将创建一个在 nginx worker 进程之间共享的内存区。该区域会存储每个IP地址的状态,以及它访问限制请求的URL的频率。上述指令将来自具有相同ISO国家代码的IP地址的请求限制为每分钟5次(
速率=5r/m
)。 -
使用 此流程 创建自定义配置模板``nginxDomainVirtualHost.php``。
-
在复制的默认模板的末尾找到以下文本:
location ~ \.php(/.*)?$ { <?php if ($VAR->domain->physicalHosting->scriptTimeout): ?> fastcgi_read_timeout <?php echo min($VAR->domain->physicalHosting->scriptTimeout, 2147483) ?>; <?php endif ?> <?php echo $VAR->includeTemplate('domain/service/fpm.php', $OPT) ?> }
并在文本之前插入以下指令,包括``limit_req``,并使用您的域名替换``example.com``,以及使用您想要应用该限制的确切PHP脚本替换
/test\.php
:<?php if ($VAR->domain->asciiName == 'example.com'): ?> location ~ ^/test\.php$ { limit_req zone=country_code; <?php if ($VAR->domain->physicalHosting->scriptTimeout): ?> fastcgi_read_timeout <?php echo min($VAR->domain->physicalHosting->scriptTimeout, 2147483) ?>; <?php endif ?> <?php echo $VAR->includeTemplate('domain/service/fpm.php', $OPT) ?> } <?php endif ?> location ~ \.php(/.*)?$ { <?php if ($VAR->domain->physicalHosting->scriptTimeout): ?> fastcgi_read_timeout <?php echo min($VAR->domain->physicalHosting->scriptTimeout, 2147483) ?>; <?php endif ?> <?php echo $VAR->includeTemplate('domain/service/fpm.php', $OPT) ?> }
-
运行以下命令,检查修改后的模板是否是有效的PHP文件:
php -l nginxDomainVirtualHost.php
-
运行以下命令以生成新的配置文件:
plesk sbin httpdmng --reconfigure-all
您已将来自具有相同国家 ISO 代码的 IP 地址的 PHP 脚本的请求限制为每分钟 5 次。