Nginx 怎么设置“只允许某个国家的 IP 访问网站”
发布日期:
作者: 西木
评论数:1 评论
该教程适用于通过apt(debian仓库)方式安装的nginx。
要在 Nginx 中设置“只允许某个国家的 IP 访问网站”,需要借助 GeoIP2 模块 来识别访客的 IP 所属国家,然后基于此设置访问规则。
安装 geoip2
模块(如已安装请忽略):
sudo apt update
sudo apt install libnginx-mod-http-geoip2
安装 geoip2
模块后,系统里面会有下面这个文件:
/usr/lib/nginx/modules/ngx_http_geoip2_module.so
现在可以配置 geoip2
来 只允许某个国家 IP 访问网站,并拒绝其他国家的访问。以下是配置步骤:
第 1 步:下载 GeoIP2 数据库
创建一个目录来存放数据库:
sudo mkdir -p /etc/nginx/geoip2
下载 GeoLite2-Country 数据库 .mmdb
文件并放入存放数据库的目录:
sudo wget -O /etc/nginx/geoip2/GeoLite2-Country.mmdb https://github.com/P3TERX/GeoLite.mmdb/raw/download/GeoLite2-Country.mmdb
第 2 步:配置 geoip2 参数
这里以只允许中国ip访问网站为例,在 /etc/nginx/nginx.conf
中的 http {}
区块添加下面加粗部分的内容:
http {
# 加载 GeoIP2 国家数据库
geoip2 /etc/nginx/geoip2/GeoLite2-Country.mmdb {
auto_reload 5m;
$geoip2_country_code default=ZZ source=$remote_addr country iso_code;
}
map $geoip2_country_code $allowed_country {
default no;
CN yes; # 只允许中国ip
}
...
}
如果需要配置允许多个国家,例如允许中国和美国,就在 CN yes;
下面多加一行 US yes;
即可。
如果要只拒绝中国ip,将里面的 default 后面改成 yes ,CN 改成 no 即可。
查看ISO 3166-1 alpha-2标准的国家代码,可以参考:https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes
第 3 步:在你的网站配置中限制非中国 IP
例如 /etc/nginx/sites-available/default
,添加下面加粗部分的内容,非中国ip访问会返回403 Forbidden:
server {
listen 80;
server_name domian.com;
root /usr/share/nginx/html;
index index.php index.html index.htm;
# 拒绝非中国ip访问
if ($allowed_country = no) {
return 403;
}
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
}
}
第 4 步:重启 Nginx 生效
先检查配置是否正确:
sudo nginx -t
然后重启Nginx:
sudo systemctl restart nginx
可选:自动更新GeoLite2-Country.mmdb
用 root 用户添加定时任务:
sudo crontab -e
添加以下定时任务(每天凌晨 3 点更新):
0 3 * * * wget -q -O /etc/nginx/geoip2/GeoLite2-Country.mmdb https://github.com/P3TERX/GeoLite.mmdb/raw/download/GeoLite2-Country.mmdb
含义说明:
字段 | 含义 |
---|---|
0 3 * * * | 每天凌晨 3 点执行 |
wget -q -O | 安静下载并覆盖保存为目标文件 |
你也可以换一个时间,比如 2 点或 4 点。
可选:立即测试更新是否成功
你可以手动执行这行命令,看看是否正常:
wget -q -O /etc/nginx/geoip2/GeoLite2-Country.mmdb https://github.com/P3TERX/GeoLite.mmdb/raw/download/GeoLite2-Country.mmdb
成功后你可以用 ls -l
查看文件时间:
ls -l /etc/nginx/geoip2/GeoLite2-Country.mmdb
GeoIP2 自动生效无需重启 Nginx
由于在 geoip2
配置中启用了:
auto_reload 5m;
这表示 Nginx 会每 5 分钟检查一次
.mmdb
文件有没有变化,发现变化就自动重新加载,无需手动重启服务。
Mia (Area 52)
说:Nice share!