全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
查看: 615|回复: 12

50元找人写一个nginx配置文件

[复制链接]
发表于 前天 12:17 | 显示全部楼层 |阅读模式
付费50元,找人帮我写一个NGINX配置文件:

当用户是中国的广东省和上海市的时候,20%的概率跳转去 "https://example.com"

请私信我
发表于 前天 12:20 | 显示全部楼层
这个可以使用DNS分区解析实现的
发表于 前天 12:23 | 显示全部楼层
同意2楼,建议用DNS分区解析实现。
Nginx实现我以前做过,需要接入Lua提供随机数才能做到20%概率,如果只用Nginx实现会变成要么100%要么0%.
发表于 前天 12:24 | 显示全部楼层
打钱吧

  1. http {
  2.     # GeoIP2 数据库配置
  3.     geoip2 /usr/share/GeoIP/GeoLite2-City.mmdb {
  4.         auto_reload 60m;
  5.         $geoip2_data_region_name default=- source=$remote_addr region name en;
  6.         $geoip2_data_city_name default=- source=$remote_addr city name en;
  7.     }

  8.     # 定义随机数变量
  9.     map $remote_addr $random {
  10.         default       0;
  11.         "~."         "${time_iso8601}${remote_addr}";
  12.     }

  13.     # 定义跳转概率变量(20%概率)
  14.     map $random $redirect {
  15.         "~^.{8}[0-3]"  1;  # 约20%概率 (4/20)
  16.         default        0;
  17.     }

  18.     # 定义是否在目标地区
  19.     map $geoip2_data_region_name$geoip2_data_city_name $is_target_location {
  20.         "GuangdongShanghai"  1;
  21.         default             0;
  22.     }

  23.     server {
  24.         listen 80;
  25.         server_name your_domain.com;

  26.         location / {
  27.             if ($is_target_location = 1) {
  28.                 if ($redirect = 1) {
  29.                     return 302 https://example.com;
  30.                 }
  31.             }
  32.             
  33.             # 如果不满足跳转条件,继续处理正常内容
  34.             proxy_pass http://backend;
  35.             # ... 其他正常的配置 ...
  36.         }
  37.     }
  38. }

  39. events {
  40.     worker_connections 1024;
  41. }
复制代码
发表于 前天 12:27 | 显示全部楼层
AI实现不了?
 楼主| 发表于 前天 13:10 | 显示全部楼层


这个是加载一次  /usr/share/GeoIP/GeoLite2-City.mmdb  所有来访用户共用,还是每个来访用户都加载一次?

发表于 前天 13:16 | 显示全部楼层
  1. http {
  2.     # 定义地理信息模块,识别客户端IP对应的地区信息
  3.     geo $geo {
  4.         default 0;
  5.         # 根据实际的IP地址范围来设置对应地区标识,这里示例简单示意,实际需准确的IP段配置
  6.         include conf/geoip/geoip.conf;
  7.     }

  8.     # 定义映射关系,用于后续判断是否跳转等逻辑
  9.     map $geo $redirect {
  10.         default 0;
  11.         "广东" 1;
  12.         "上海" 1;
  13.     }

  14.     # 定义变量用于模拟20%概率
  15.     map $redirect $random_redirect {
  16.         0 0;
  17.         1 $random;
  18.     }

  19.     # 配置server块,根据你的实际域名等情况调整
  20.     server {
  21.         listen 80;
  22.         server_name your_domain.com;

  23.         location / {
  24.             if ($random_redirect ~ "0.2") {
  25.                 return 302 https://example.com;
  26.             }
  27.             # 这里正常处理其他请求,比如可以配置代理等逻辑,下面是简单示例返回
  28.             root /var/www/html;
  29.             index index.html;
  30.         }
  31.     }
  32. }
复制代码


几点说明:

上述配置中的 include conf/geoip/geoip.conf 部分,你需要在 conf/geoip/ 目录下有一个准确的 geoip.conf 文件,里面按照 ngx_http_geo_module 的语法格式填写好广东省和上海市对应的IP段范围,例如:
  1. geoip_country /path/to/GeoIP.dat;
  2. geoip_city /path/to/GeoLiteCity.dat;

  3. map $geoip_country_code $geo {
  4.     CN {
  5.         if ($geoip_city ~* "广州|深圳|佛山|东莞|珠海|中山|惠州|汕头|江门|肇庆|湛江|茂名|韶关|清远|云浮|阳江|河源|汕尾|潮州|揭阳|梅州|上海") {
  6.             return $geoip_city;
  7.         }
  8.     }
  9.     default 0;
  10. }
复制代码

这里假设你安装了对应的 GeoIP 相关的数据库文件(可从官方渠道获取并配置好路径),并且通过正则表达式来匹配广东省主要城市以及上海市来标记地区。

概率部分通过 $random 变量结合 map 来简单模拟,它在每次请求时会生成一个0到1之间的随机数,我们通过 if 判断这个随机数是否接近0.2来模拟20%概率跳转的情况。
确保你的NGINX已经正确安装了相关的模块(比如 ngx_http_geo_module 、 ngx_http_map_module 等,一般默认是安装了的),并且根据实际情况调整好 server_name 等配置内容来适配你的真实服务场景。
发表于 前天 13:17 | 显示全部楼层
dd998 发表于 2025-1-13 13:10
这个是加载一次  /usr/share/GeoIP/GeoLite2-City.mmdb  所有来访用户共用,还是每个来访用户都加载一次 ...

这还用问。。。

更好的实现方法楼上都讲了
发表于 前天 13:19 | 显示全部楼层
1. 安装并配置 GeoIP2
下载 MaxMind 的 GeoLite2-City 数据库(免费版本)
解压并将 GeoLite2-City.mmdb 放到服务器上的某个目录,比如 /etc/nginx/GeoLite2-City.mmdb。
确认你的 NGINX 已编译并支持 ngx_http_geoip2_module,或者安装对应的第三方模块。
2. 配置示例
假设你想在 server_name yourdomain.com; 这个虚拟主机中进行操作,可以在主配置文件(一般是 /etc/nginx/nginx.conf)或者对应的 vhost 配置文件中,添加以下内容:

  1. nginx
  2. 复制代码
  3. http {
  4.     # ------------------------------------------
  5.     # 1. 载入 GeoIP2 数据库,并映射到变量
  6.     # ------------------------------------------
  7.     geoip2 /etc/nginx/GeoLite2-City.mmdb {
  8.         # 国家代码
  9.         $geoip2_data_country_code country iso_code;
  10.         # 省份(对于中国而言,这里表示 "subdivision 1")
  11.         $geoip2_data_subdivision_1_name subdivision 1 names en;
  12.     }

  13.     # ------------------------------------------
  14.     # 2. 判断是否为广东省或上海市
  15.     #    根据 $geoip2_data_subdivision_1_name
  16.     #    可能需要检查实际数据库返回的字段 "Guangdong"/"Shanghai" 等字样
  17.     # ------------------------------------------
  18.     map $geoip2_data_subdivision_1_name $target_province {
  19.         default    0;                 # 默认为 0,表示不匹配
  20.         "Guangdong" 1;                # 广东
  21.         "Shanghai"  1;                # 上海
  22.     }

  23.     # ------------------------------------------
  24.     # 3. 按一定概率拆分用户:20% 重定向,80% 不重定向
  25.     #    split_clients 指令基于一致性哈希,可用 IP、User-Agent 等
  26.     # ------------------------------------------
  27.     split_clients "${remote_addr}" $bucket_split {
  28.         20%    "redirect";        # 这里设置 20% 概率
  29.         *      "no_redirect";
  30.     }

  31.     # ------------------------------------------
  32.     # 4. 根据上面两个条件联合判断是否重定向
  33.     #    可以使用 map 将两个变量组合,或直接在 server 中 if 判断
  34.     # ------------------------------------------

  35.     server {
  36.         listen       80;
  37.         server_name  yourdomain.com;

  38.         # 4.1 若是广东或上海,且 bucket_split 为 "redirect",则执行跳转
  39.         if ($target_province = 1) {
  40.             if ($bucket_split = "redirect") {
  41.                 return 302 https://example.com;
  42.             }
  43.         }

  44.         # ------------------------------------------
  45.         # 其余情况,正常访问
  46.         # ------------------------------------------
  47.         location / {
  48.             # 正常业务逻辑
  49.             # 例如:
  50.             # proxy_pass http://127.0.0.1:8080;
  51.             # 或直接提供静态文件
  52.         }
  53.     }
  54. }
复制代码

配置说明
geoip2 指令块

geoip2 /etc/nginx/GeoLite2-City.mmdb {...} 用于指定城市级数据库路径。
$geoip2_data_country_code 变量中会存储 IP 所属国家的 ISO Code(比如 CN), $geoip2_data_subdivision_1_name 变量中会存储该 IP 所属的省/州名称(比如 Guangdong 或 Shanghai)。
map 指令

将 $geoip2_data_subdivision_1_name 的取值进行映射,当检测到 “Guangdong” 或 “Shanghai” 时,赋值为 1,否则为 0。
如果你的 GeoIP2 数据库返回的中文字段(比如 广东省、上海市),或是拼音(比如 Guangdong Sheng 等),请相应修改映射的值。
split_clients 指令

按 20% 对 80% 的比例,将用户分配到 redirect 或 no_redirect 两个桶中。
这里使用了 "$remote_addr" 作为散列依据,也可以改用 "$remote_addr$http_user_agent" 等组合,以减少同 IP 多次访问时固定分配的问题。
if 判断

首先检查 $target_province 是否为 1(即是否为广东/上海),再检查 $bucket_split 是否为 redirect,若都满足则重定向到 https://example.com。
发表于 前天 13:34 来自手机 | 显示全部楼层
小学生 发表于 2025-1-13 12:24
打钱吧

有错误吧,好像 location 里面的 if 不能嵌套
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2025-1-15 20:01 , Processed in 0.068151 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表