全球主机交流论坛备用站

 找回密码
 立即注册

QQ登录

只需一步,快速开始

全球云38元起免备案V2EX搬瓦工VPS
SEO查询超级PING网站测速
Virmach特价鸡乌云漏洞吾爱破解
查看: 295|回复: 11

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

[复制链接]

28

主题

16

回帖

178

积分

注册会员

Rank: 2

积分
178
发表于 2025-1-13 12:17:19 | 显示全部楼层 |阅读模式
20230417
付费50元,找人帮我写一个NGINX配置文件:

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

请私信我
MJJ,你的签名掉了~~~
回复

使用道具 举报

115

主题

1978

回帖

5429

积分

论坛元老

Rank: 8Rank: 8

积分
5429
发表于 2025-1-13 12:20:49 | 显示全部楼层
这个可以使用DNS分区解析实现的
MJJ,你的签名掉了~~~
回复 支持 反对

使用道具 举报

47

主题

499

回帖

1461

积分

金牌会员

Rank: 6Rank: 6

积分
1461
发表于 2025-1-13 12:23:54 | 显示全部楼层
同意2楼,建议用DNS分区解析实现。
Nginx实现我以前做过,需要接入Lua提供随机数才能做到20%概率,如果只用Nginx实现会变成要么100%要么0%.
MJJ,你的签名掉了~~~
回复 支持 反对

使用道具 举报

330

主题

2289

回帖

6710

积分

论坛元老

Rank: 8Rank: 8

积分
6710
发表于 2025-1-13 12:24: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. proxy_pass http://backend;
  34. # ... 其他正常的配置 ...
  35. }
  36. }
  37. }

  38. events {
  39. worker_connections 1024;
  40. }
复制代码
MJJ,你的签名掉了~~~
回复 支持 反对

使用道具 举报

321

主题

2185

回帖

6399

积分

论坛元老

Rank: 8Rank: 8

积分
6399
发表于 2025-1-13 12:27:32 | 显示全部楼层
AI实现不了?
MJJ,你的签名掉了~~~
回复 支持 反对

使用道具 举报

28

主题

16

回帖

178

积分

注册会员

Rank: 2

积分
178
 楼主| 发表于 2025-1-13 13:10:31 | 显示全部楼层


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

MJJ,你的签名掉了~~~
回复 支持 反对

使用道具 举报

51

主题

254

回帖

943

积分

高级会员

Rank: 4

积分
943
发表于 2025-1-13 12:24:00 | 显示全部楼层
  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 等配置内容来适配你的真实服务场景。
MJJ,你的签名掉了~~~
回复 支持 反对

使用道具 举报

130

主题

678

回帖

2448

积分

金牌会员

Rank: 6Rank: 6

积分
2448
发表于 2025-1-13 13:16:19 | 显示全部楼层
dd998 发表于 2025-1-13 13:10
这个是加载一次/usr/share/GeoIP/GeoLite2-City.mmdb所有来访用户共用,还是每个来访用户都加载一次 ...

这还用问。。。

更好的实现方法楼上都讲了
MJJ,你的签名掉了~~~
回复 支持 反对

使用道具 举报

3

主题

12

回帖

51

积分

注册会员

Rank: 2

积分
51
发表于 2025-1-13 13:17:42 | 显示全部楼层
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_nameyourdomain.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。
MJJ,你的签名掉了~~~
回复 支持 反对

使用道具 举报

0

主题

1

回帖

4

积分

新手上路

Rank: 1

积分
4
发表于 2025-1-13 13:10:00 | 显示全部楼层
小学生 发表于 2025-1-13 12:24
打钱吧

有错误吧,好像 location 里面的 if 不能嵌套
  1. # 定义geo模块,根据IP地址确定地区
  2. geo $region {
  3. default "";
  4. # 广东省的IP地址段,此处需要替换为真实的广东省IP地址段范围,可从相关IP地址库获取
  5. 113.0.0.0/8"guangdong";
  6. # 上海市的IP地址段,此处需要替换为真实的上海市IP地址段范围,可从相关IP地址库获取
  7. 101.0.0.0/8"shanghai";
  8. }

  9. server {
  10. listen 80;
  11. server_nameyour_domain.com; # 替换为你的域名

  12. # 生成一个0到1之间的随机数
  13. set $random_number ${random};
  14. # 计算是否需要跳转,这里使用random变量模拟20%的概率,即如果随机数小于0.2则跳转
  15. set $should_redirect "";
  16. if ($region ~* "guangdong|shanghai" && $random_number < 0.2) {
  17. set $should_redirect "yes";
  18. }

  19. if ($should_redirect = "yes") {
  20. return 302 https://example.com; # 跳转到目标网址
  21. }

  22. # 其他正常的server配置内容
  23. location / {
  24. # 这里是网站的默认处理逻辑
  25. root /usr/share/nginx/html;
  26. indexindex.html index.htm;
  27. }
  28. }
复制代码
MJJ,你的签名掉了~~~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

展开

QQ|Archiver|手机版|小黑屋|全球主机交流论坛备用站

GMT+8, 2025-5-4 06:59 , Processed in 0.047255 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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