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