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