(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 次。