Nginx提供公网IP,经纬度,服务器时间的配置

使用Nginx 来提供公网IP,经纬度和服务器时间的配置,是一种比较简单和实用的做法,无需额外开销和代码,简单实用。
系统环境:CentOS9,宝塔面板 ,Debian的也差不多。
目标,用Nginx实现返回公网IP、经纬度和服务器时间, 并且尽可能用宝塔面板提供的Nginx实现,方便管理和运维。
第一步,准备依赖环境

1、网络环境

如果您的服务器不能顺利访问github获取ngx_http_geoip2_module ,建议您参照以下这篇解决一下,或用其他魔法。

2、 依赖环境

# 安装 libmaxminddb 开发库
dnf install libmaxminddb-devel -y

# 安装 Git
dnf install git -y

第二步,下载模块源码(存放在安全目录)

为了避免被宝塔清理,我们将源码放在 /www/server/modules(手动创建,宝塔脚本不会清理这个子目录):

mkdir -p /www/server/modules
cd /www/server/modules

# 下载模块源码
git clone https://github.com/leev/ngx_http_geoip2_module.git

# 设置权限,宝塔编译进程通常有 root 权限,但设置 755 最稳妥
chmod -R 755 /www/server/modules/ngx_http_geoip2_module
# 验证 config 文件是否存在
ls -l /www/server/modules/ngx_http_geoip2_module/config

第三步,在宝塔面板编译 Nginx

1、 先卸载已安装的Nginx

宝塔面板->软件商店->已安装->Nginx->卸载(注意备份站点配置)

2、 点击 安装 -> 选择Nginx版本->选择编译安装(不要选极速安装)。

3、点击 添加自定义模块:

  • 模块名称:ngx_http_geoip2_module
  • 模块描述:IP 地理位置查询
  • 参数:–add-module=/www/server/modules/ngx_http_geoip2_module

4、递交,启用,并安装。安装完成验证

nginx -V

返回的字符中包含geoip2

Nginx提供公网IP,经纬度,服务器时间的配置

第四步, 准备GeoIP数据库

1、创建数据库存放目录:

mkdir -p /etc/nginx/geoip

2、手动上传:将您下载好的 GeoLite2-City.mmdb 上传至该目录。

(如果您没有库文件,请先去 MaxMind 官网注册免费账号下载,或者在后面步骤通过脚本自动下载)。MaxMind会限制从CN节点下载。

可以考虑用替代方案,自己AI解决。

第五步,修改Nginx全局配置

Nginx 设置 -> 配置修改。在 http { … } 内部,include mime.types; 之后插入:

# 关联数据库并定义变量
geoip2 /etc/nginx/geoip/GeoLite2-City.mmdb {
    auto_reload 5m;
    $res_latitude  location latitude;
    $res_longitude location longitude;
    $res_city_en   city names en;
}

# 格式化时间变量
map $time_iso8601 $fmt_time {
    "~^(?<ymd>\d{4}-\d{2}-\d{2})T(?<hms>\d{2}:\d{2}:\d{2})" "$ymd $hms";
}

如果您的服务器托管在Cloudflare ,需排除CDN , 在 http { … } 块内插入以下代码:

# 引入自动生成的 CDN IP 信任列表,
# 路确保与脚本中的 CF_CONF_PATH 一致
include /www/server/nginx/conf/cloudflare_ips.conf;

这个cloudflare_ips.conf ,在自动更新脚本中生成。

第六步,创建并配置站点返回 JSON

1、添加站点

网站->添加站点, 填写服务器域名或IP

2、站点->设置->配置文件

在Server 块内,增加一个location

    #返回公网IP、经纬度以及服务器时间   
    location / {
      default_type application/json;
      add_header Access-Control-Allow-Origin *; # 允许前端调用
      return 200 '{
          "status": "success",
          "ip": "$remote_addr",
          "location": {
              "city": "$res_city_en",
              "latitude": $res_latitude,
              "longitude": $res_longitude
              "coord_system": "WGS-84"
          },
          "server": {
              "time": "$fmt_time",
              "timestamp": "$msec"
          }
      }\n';
    }

3、重启Nginx

第七步, 验证

Nginx提供公网IP,经纬度,服务器时间的配置

第八步,配置自动更新GeoIP数据库和cloudflare_ips

1、 创建自动化脚本geo.sh

#!/bin/bash
# 下载和更新 GeoIP2 数据库及 Cloudflare CDN IP 段

set -e

# ===== 配置 =====
GEOIP_DIR="/etc/nginx/geoip"
TMP_DIR="/tmp/geoip_update"
FINAL_FILE="${GEOIP_DIR}/GeoLite2-City.mmdb"
# Cloudflare 配置文件路径(请确保在 Nginx 配置中 include 了它)
CF_CONF_PATH="/www/server/nginx/conf/cloudflare_ips.conf"

URL_1="https://cdn.jsdelivr.net/npm/geolite2-city/GeoLite2-City.mmdb.gz"
URL_2="https://github.com/P3TERX/GeoLite.mmdb/releases/latest/download/GeoLite2-City.mmdb"

# ===== 初始化 =====
mkdir -p "$GEOIP_DIR"
mkdir -p "$TMP_DIR"
mkdir -p "$(dirname "$CF_CONF_PATH")"

echo "===> 1. 开始更新 Cloudflare CDN IP 段"

# 注意:这里改用括号配合重定向,确保只有指令进入文件
{
    echo "# Cloudflare IP Ranges"
    echo "# Generated at $(date)"
    
    # 获取 IPv4 并格式化。2>/dev/null 确保 curl 的错误不混入文件
    curl -s https://www.cloudflare.com/ips-v4 | sed 's/^/set_real_ip_from /; s/$/;/'
    
    # 获取 IPv6 并格式化
    curl -s https://www.cloudflare.com/ips-v6 | sed 's/^/set_real_ip_from /; s/$/;/'
    
    # 写入 Real-IP 核心配置
    echo "real_ip_header CF-Connecting-IP;"
    echo "real_ip_recursive on;"
} > "${CF_CONF_PATH}.tmp"

# 提示信息输出到屏幕(标准错误输出),而不是重定向进文件
echo "===> 正在获取并格式化 IP 段..." >&2

# 原子替换配置文件
mv "${CF_CONF_PATH}.tmp" "$CF_CONF_PATH"
echo "✅ Cloudflare IP 段更新成功"

echo "===> 2. 开始更新 GeoLite2 数据库"
cd "$TMP_DIR"

# ===== 尝试下载源1(jsDelivr)=====
echo "===> 尝试源1(jsDelivr)..."
if wget -q -T 30 -O GeoLite2-City.mmdb.gz "$URL_1"; then
    echo "源1下载成功,开始解压..."
    gunzip -f GeoLite2-City.mmdb.gz
    NEW_FILE="$TMP_DIR/GeoLite2-City.mmdb"
else
    echo "源1失败,尝试源2(GitHub)..."
    if wget -q -T 30 -O GeoLite2-City.mmdb "$URL_2"; then
        echo "源2下载成功"
        NEW_FILE="$TMP_DIR/GeoLite2-City.mmdb"
    else
        echo "❌ 所有下载源失败,退出(保留旧文件)"
        # 注意:即使地理库失败,由于配置已改,我们仍需检查 Nginx 状态
        exit 1
    fi
fi

# ===== 校验文件 =====
if [ ! -s "$NEW_FILE" ]; then
    echo "❌ 下载文件为空,退出"
    exit 1
fi

# ===== 原子替换 =====
echo "===> 替换数据库文件..."
mv "$NEW_FILE" "${FINAL_FILE}.new"
mv "${FINAL_FILE}.new" "$FINAL_FILE"

# ===== 权限修复 (宝塔默认为 www) =====
chown www:www "$FINAL_FILE" 2>/dev/null || chown nginx:nginx "$FINAL_FILE" 2>/dev/null || true
chmod 644 "$FINAL_FILE"
chown www:www "$CF_CONF_PATH" 2>/dev/null || true

# ===== 重载 Nginx (宝塔面板环境) =====
echo "===> 检查并重载 Nginx..."
if /www/server/nginx/sbin/nginx -t; then
    if [ -x "/www/server/nginx/sbin/nginx" ]; then
        /www/server/nginx/sbin/nginx -s reload
    elif command -v systemctl >/dev/null 2>&1; then
        systemctl reload nginx
    else
        nginx -s reload
    fi
    echo "✅ Nginx 重载成功"
else
    echo "❌ Nginx 配置语法错误,请检查!"
    exit 1
fi

# ===== 清理 =====
rm -rf "$TMP_DIR"

echo "✅ 全部更新任务完成"

2、配置计划任务执行自动化脚本

原创文章,作者:Gary,如若转载,请注明出处:https://www.cpw5.top/1708.html

淘宝小店:陈皮王五工作室

公司网址:海灵德(六安)环境科技有限公司

(0)
GaryGary
上一篇 1天前
下一篇 2024-09-22 下午4:27

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注