dd998 发表于 3 天前

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

付费50元,找人帮我写一个NGINX配置文件:

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

请私信我

solomon 发表于 3 天前

这个可以使用DNS分区解析实现的

shc 发表于 3 天前

同意2楼,建议用DNS分区解析实现。
Nginx实现我以前做过,需要接入Lua提供随机数才能做到20%概率,如果只用Nginx实现会变成要么100%要么0%.

小学生 发表于 3 天前

打钱吧

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

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

    # 定义跳转概率变量(20%概率)
    map $random $redirect {
      "~^.{8}"1;# 约20%概率 (4/20)
      default      0;
    }

    # 定义是否在目标地区
    map $geoip2_data_region_name$geoip2_data_city_name $is_target_location {
      "GuangdongShanghai"1;
      default             0;
    }

    server {
      listen 80;
      server_name your_domain.com;

      location / {
            if ($is_target_location = 1) {
                if ($redirect = 1) {
                  return 302 https://example.com;
                }
            }
            
            # 如果不满足跳转条件,继续处理正常内容
            proxy_pass http://backend;
            # ... 其他正常的配置 ...
      }
    }
}

events {
    worker_connections 1024;
}

stingeo 发表于 3 天前

AI实现不了?:o:o:o

dd998 发表于 3 天前

小学生 发表于 2025-1-13 12:24
打钱吧

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

武大娘 发表于 3 天前

http {
    # 定义地理信息模块,识别客户端IP对应的地区信息
    geo $geo {
      default 0;
      # 根据实际的IP地址范围来设置对应地区标识,这里示例简单示意,实际需准确的IP段配置
      include conf/geoip/geoip.conf;
    }

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

    # 定义变量用于模拟20%概率
    map $redirect $random_redirect {
      0 0;
      1 $random;
    }

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

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


几点说明:

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

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

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

概率部分通过 $random 变量结合 map 来简单模拟,它在每次请求时会生成一个0到1之间的随机数,我们通过 if 判断这个随机数是否接近0.2来模拟20%概率跳转的情况。
确保你的NGINX已经正确安装了相关的模块(比如 ngx_http_geo_module 、 ngx_http_map_module 等,一般默认是安装了的),并且根据实际情况调整好 server_name 等配置内容来适配你的真实服务场景。

人穷器短 发表于 3 天前

dd998 发表于 2025-1-13 13:10
这个是加载一次/usr/share/GeoIP/GeoLite2-City.mmdb所有来访用户共用,还是每个来访用户都加载一次 ...

这还用问。。。

更好的实现方法楼上都讲了

文化痞子 发表于 3 天前

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 配置文件中,添加以下内容:

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

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

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

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

    server {
      listen       80;
      server_nameyourdomain.com;

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

      # ------------------------------------------
      # 其余情况,正常访问
      # ------------------------------------------
      location / {
            # 正常业务逻辑
            # 例如:
            # proxy_pass http://127.0.0.1:8080;
            # 或直接提供静态文件
      }
    }
}
配置说明
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。

1121744186 发表于 3 天前

小学生 发表于 2025-1-13 12:24
打钱吧

有错误吧,好像 location 里面的 if 不能嵌套
页: [1] 2
查看完整版本: 50元找人写一个nginx配置文件