IP地理定位会将网站访问者的IP地址映射到他们真实世界的地理位置,例如,一个国家或一个城市。

有了IP地理定位,你可以根据访问者居住的地方定制如何向他们显示您的网站的方式。例如,您可以将访问者重定向到指定位置的网页,或者您可以阻止指定国家的访问者访问您的网站。

在本小节中,您将了解到如何在Plesk中设置IP地理定位,以及如何在通用实例中使用IP地理定位,例如:

在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

  1. 注册以获得一个免费的GeoLite2帐户

  2. 登录到您的GeoLite2帐户,并生成一个许可证密钥。完成后,复制该密钥,并将其安全保存。出于安全考虑,许可证密钥只在生成时显示。

    在生成许可证密钥时,您还将可以看到您的帐户ID。在下一步操作中,您将同时需要帐户ID和许可证密钥。

  3. 打开用于编辑的/etc/GeoIP.conf文件。GeoIP.conf文件的路径可能因Linux发行版的不同而有所不同。

  4. 粘贴您的帐户ID、许可证密钥和您要下载的数据库的版本ID。使用空格分隔多个版本。完成设置后,请保存该文件。

  5. 要下载数据库,请运行 sudo geoipupdatesudo 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,请如下操作:

  1. 通过 SSH 登录您的 Plesk 服务器。
  2. 通过运行 plesk bin nginx -e geoip2 启用该模块。

模块已启用。如果您运行``plesk bin nginx -s``,您将在已启用的nginx模块列表中看到该模块。

3. Configuring variables

要使用地理位置数据并基于这些数据做出决策,您需要将网站访问者的IP地址映射到各种属性(如国家或城市名称),并将这些数据作为变量存储在nginx配置文件中。

要配置变量,请如下操作:

  1. 将以下指令添加到 /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

  2. 运行 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 状态代码,这表示禁止访问请求的资源。

要阻止来自指定国家的访问者访问某个网站,请如下操作:

  1. 转到 网站与域名 > 域名 > “主机与DNS” 标签 > Apache 与 nginx 设置

  2. 将以下内容放在“其它的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,请如下操作:

  1. 转到 网站与域名 > 域名 > “主机与DNS” 标签 > Apache 与 nginx 设置

  2. 将以下内容放在“其它的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设置。

让我们以网站访问区块为例,看看如何操作。

要阻止来自指定国家的访问者访问属于某个主机方案的网站,请如下操作:

  1. 转到**服务方案**,然后单击要阻止其网站的服务方案的名称。

  2. 转到 “Web 服务器” 标签,将以下内容添加到“其它的nginx指令”文本框中,然后点击 确定

    if ($geoip2_data_country_code = "XX") {
        return 403;
    }
    

    其中XX是您想要阻止其访问者访问的国家的两个字母ISO代码(例如,AQ代表南极洲)。

来自您所指定的ISO代码的国家的访问者不再可以访问属于该主机方案的所有网站。

阻止来自指定国家的访问者访问服务器上托管的所有网站

有两种方法来实现此目的:使用配置模板或主机方案设置。我们之前已经描述了如何使用主机方案设置。下面,我们将向您展示如何使用自定义配置模板。

注解: 您需要使用配置模板或主机方案设置。无法通过将全局的nginx配置文件添加到``/etc/nginx/conf.d``中来拒绝向服务器上托管的所有网站进行访问。

要阻止来自指定国家的访问者访问服务器上托管的所有网站:

  1. 使用 此流程 创建自定义配置模板``nginxDomainVirtualHost.php``。

  2. 在复制的默认模板的末尾找到以下文本:

    <?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代表南极洲)。

  3. 运行以下命令,检查修改后的模板是否是有效的PHP文件:

    php -l nginxDomainVirtualHost.php
    
  4. 运行以下命令以生成新的配置文件:

    plesk sbin httpdmng --reconfigure-all
    

来自您所指定的ISO代码的国家的访问者不再可以访问在服务器上托管的所有网站。

保护网站免受来自同一个国家的暴力攻击

您可以通过限制来自具有相同ISO国家代码的IP地址的请求来保护您的网站免受暴力攻击。您可以对以下应用此保护:

  • 单个网站
  • 属于一个主机方案的所有的网站
  • 在服务器上托管的所有网站
  • 一个或多个网页(例如,example.com/test

若要保护一个或多个网站免受来自同一国家的暴力攻击,请如下操作:

  1. 添加以下模式的指令到 /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)。

    了解更多有关 nginx 中速率限制的信息

  2. 第二步取决于您想要保护的网站和网站数量:

    • (单个网站)转到 网站与域名 > 域名 > “主机与 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 主机) 若要保护一个指定的网页免受来自同一国家的暴力攻击,请如下操作:

  1. 添加以下模式的指令到 /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)。

    了解更多有关 nginx 中速率限制的信息

  2. 使用 此流程 创建自定义配置模板``nginxDomainVirtualHost.php``。

  3. 在复制的默认模板的末尾找到以下文本:

    <?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 ?>
    
  4. 运行以下命令,检查修改后的模板是否是有效的PHP文件:

    php -l nginxDomainVirtualHost.php
    
  5. 运行以下命令以生成新的配置文件:

    plesk sbin httpdmng --reconfigure-all
    

您已将来自具有相同国家 ISO 代码的 IP 地址的网页的请求限制为每分钟 5 次。

(仅 nginx 主机) 若要保护一个指定的网页免受来自同一国家的暴力攻击,请如下操作:

  1. 添加以下模式的指令到 /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)。

    了解更多有关 nginx 中速率限制的信息

  2. 转到 网站与域名 > 域名 > “主机与DNS” 标签 > Apache 与 nginx 设置

  3. 将以下内容放在“其它的nginx指令”文本框中,用您想要应用该限制的确切网页替换``/test``:

    location = /test {
        limit_req zone=country_code;
    }
    
  4. 点击 确定

您已将来自具有相同国家 ISO 代码的 IP 地址的网页的请求限制为每分钟 5 次。

(直接服务 PHP 的 nginx) 若要保护一个指定的 PHP 脚本免受来自同一国家的暴力攻击,请如下操作:

  1. 添加以下模式的指令到 /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)。

    了解更多有关 nginx 中速率限制的信息

  2. 使用 此流程 创建自定义配置模板``nginxDomainVirtualHost.php``。

  3. 在复制的默认模板的末尾找到以下文本:

    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) ?>
    }
    
  4. 运行以下命令,检查修改后的模板是否是有效的PHP文件:

    php -l nginxDomainVirtualHost.php
    
  5. 运行以下命令以生成新的配置文件:

    plesk sbin httpdmng --reconfigure-all
    

您已将来自具有相同国家 ISO 代码的 IP 地址的 PHP 脚本的请求限制为每分钟 5 次。