From 011046f52cb74c5167f804085316505e30afe587 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 31 Mar 2026 10:59:02 +0000 Subject: [PATCH 1/3] Initial plan From f91bd5bc8d18765d83cb418a846c5cd0e0adfc9f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 31 Mar 2026 11:02:44 +0000 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20setup-cn-relay.sh=20Nginx=20stream?= =?UTF-8?q?=20module=20loading=20-=20install=20libnginx-mod-stream=20packa?= =?UTF-8?q?ge,=20expand=20.so=20search=20paths,=20add=20modules-enabled=20?= =?UTF-8?q?check,=20add=20recovery=20logic=20in=20=C2=A75?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Agent-Logs-Url: https://github.com/qinfendebingshuo/guanghulab/sessions/9bb46eed-d7d9-4fa9-a557-18abe41a60f1 Co-authored-by: qinfendebingshuo <207279273+qinfendebingshuo@users.noreply.github.com> --- server/proxy/setup/setup-cn-relay.sh | 131 ++++++++++++++++++++++----- 1 file changed, 110 insertions(+), 21 deletions(-) diff --git a/server/proxy/setup/setup-cn-relay.sh b/server/proxy/setup/setup-cn-relay.sh index 7dd034d8..54208e26 100644 --- a/server/proxy/setup/setup-cn-relay.sh +++ b/server/proxy/setup/setup-cn-relay.sh @@ -68,7 +68,12 @@ if ! command -v nginx &>/dev/null; then apt-get install -y -qq nginx fi -# 检查stream模块是否可用 +# Ubuntu/Debian: stream模块通常是独立的动态模块包 (libnginx-mod-stream) +# 必须显式安装,即使nginx -V显示--with-stream也只表示编译支持,不代表模块已安装 +log_info "确保stream动态模块包已安装..." +apt-get install -y -qq libnginx-mod-stream 2>/dev/null || true + +# 验证stream模块是否可用 if nginx -V 2>&1 | grep -q "with-stream"; then log_info "✅ Nginx stream模块已可用" else @@ -86,30 +91,67 @@ fi # 检查是否需要动态加载stream模块 # Ubuntu/Debian的Nginx通常将stream编译为动态模块(.so),需要用load_module显式加载 +# 有两种加载机制: +# 1. modules-enabled目录: /etc/nginx/modules-enabled/ (Debian/Ubuntu自动加载) +# 2. 手动load_module: 在nginx.conf顶部显式加载.so文件 NGINX_MAIN="/etc/nginx/nginx.conf" -STREAM_MODULE_PATH="" -for mod_path in \ - /usr/lib/nginx/modules/ngx_stream_module.so \ - /usr/lib64/nginx/modules/ngx_stream_module.so \ - /etc/nginx/modules/ngx_stream_module.so; do - if [ -f "$mod_path" ]; then - STREAM_MODULE_PATH="$mod_path" - break - fi -done -if [ -n "$STREAM_MODULE_PATH" ]; then - if ! grep -q "ngx_stream_module" "$NGINX_MAIN" 2>/dev/null; then +# 检查modules-enabled是否已自动加载stream模块 +# (libnginx-mod-stream安装时通常会在modules-enabled/创建符号链接) +STREAM_ALREADY_LOADED=false +if [ -d /etc/nginx/modules-enabled ]; then + if grep -rq "ngx_stream_module" /etc/nginx/modules-enabled/ 2>/dev/null; then + log_info "✅ stream模块已通过modules-enabled自动加载" + STREAM_ALREADY_LOADED=true + fi +fi + +# 如果modules-enabled没有自动加载,手动查找并加载.so文件 +if [ "$STREAM_ALREADY_LOADED" = false ]; then + # 检查nginx.conf是否已包含load_module指令 + if grep -q "ngx_stream_module" "$NGINX_MAIN" 2>/dev/null; then + log_info "✅ stream动态模块已在nginx.conf中加载" + STREAM_ALREADY_LOADED=true + fi +fi + +if [ "$STREAM_ALREADY_LOADED" = false ]; then + STREAM_MODULE_PATH="" + for mod_path in \ + /usr/lib/nginx/modules/ngx_stream_module.so \ + /usr/lib64/nginx/modules/ngx_stream_module.so \ + /etc/nginx/modules/ngx_stream_module.so \ + /usr/share/nginx/modules/ngx_stream_module.so; do + if [ -f "$mod_path" ]; then + STREAM_MODULE_PATH="$mod_path" + break + fi + done + + # 使用find作为最后回退手段 + if [ -z "$STREAM_MODULE_PATH" ]; then + STREAM_MODULE_PATH=$(find /usr/lib /usr/lib64 /usr/share /etc/nginx -name "ngx_stream_module.so" 2>/dev/null | head -1) + fi + + if [ -n "$STREAM_MODULE_PATH" ]; then log_info "加载stream动态模块: $STREAM_MODULE_PATH" # load_module必须在nginx.conf最顶部(events块之前) sed -i "1i load_module $STREAM_MODULE_PATH;" "$NGINX_MAIN" log_info "✅ stream动态模块已加载" else - log_info "✅ stream动态模块已在配置中" + log_warn "未找到ngx_stream_module.so文件" + log_warn "尝试启用modules-available中的stream配置..." + # 某些系统在modules-available但未启用 + if [ -f /usr/share/nginx/modules-available/mod-stream.conf ]; then + ln -sf /usr/share/nginx/modules-available/mod-stream.conf /etc/nginx/modules-enabled/ + log_info "✅ 已从modules-available启用stream模块" + elif [ -f /etc/nginx/modules-available/mod-stream.conf ]; then + ln -sf /etc/nginx/modules-available/mod-stream.conf /etc/nginx/modules-enabled/ + log_info "✅ 已从modules-available启用stream模块" + else + log_warn "stream模块可能为静态编译,继续配置..." + fi fi -else - # 没有找到.so文件,可能是静态编译的,继续 - log_info "stream模块为静态编译或路径非标准,跳过load_module" fi # ── §2 配置Nginx stream中转 ────────────────── @@ -222,13 +264,60 @@ log_info "✅ 防火墙已开放: 80(HTTP) + ${RELAY_PORT}(VPN中转)" # ── §5 测试配置并重载 ──────────────────────── log_step "§5 测试并应用配置" -if nginx -t 2>&1; then +NGINX_TEST_OUTPUT=$(nginx -t 2>&1) +if echo "$NGINX_TEST_OUTPUT" | grep -q "test is successful"; then systemctl reload nginx log_info "✅ Nginx配置测试通过 · 已重载" else - log_error "Nginx配置测试失败" - nginx -t 2>&1 - exit 1 + log_warn "Nginx配置测试未通过,尝试自动修复..." + echo "$NGINX_TEST_OUTPUT" + + # 修复: 如果stream指令未知,说明load_module缺失 + if echo "$NGINX_TEST_OUTPUT" | grep -q 'unknown directive "stream"'; then + log_info "检测到stream指令未识别,尝试修复模块加载..." + + # 强制安装stream模块包 + apt-get update -qq + apt-get install -y -qq libnginx-mod-stream 2>/dev/null || true + + # 再次搜索.so文件 + RETRY_MODULE_PATH=$(find /usr/lib /usr/lib64 /usr/share /etc/nginx -name "ngx_stream_module.so" 2>/dev/null | head -1) + + if [ -n "$RETRY_MODULE_PATH" ]; then + if ! grep -q "ngx_stream_module" "$NGINX_MAIN" 2>/dev/null; then + sed -i "1i load_module $RETRY_MODULE_PATH;" "$NGINX_MAIN" + log_info "已添加load_module: $RETRY_MODULE_PATH" + fi + fi + + # 检查modules-enabled + if [ -d /etc/nginx/modules-enabled ]; then + for avail in /usr/share/nginx/modules-available/mod-stream.conf \ + /etc/nginx/modules-available/mod-stream.conf; do + if [ -f "$avail" ]; then + ln -sf "$avail" /etc/nginx/modules-enabled/ + log_info "已启用: $avail" + break + fi + done + fi + fi + + # 重新测试 + if nginx -t 2>&1; then + systemctl reload nginx + log_info "✅ 自动修复成功 · Nginx已重载" + else + log_error "Nginx配置测试失败 (自动修复未能解决)" + nginx -t 2>&1 + echo "" + log_error "请检查以下可能原因:" + echo " 1. libnginx-mod-stream 包是否可用: dpkg -l | grep libnginx" + echo " 2. 模块文件是否存在: find / -name 'ngx_stream_module.so' 2>/dev/null" + echo " 3. nginx.conf内容: cat /etc/nginx/nginx.conf" + echo " 4. modules-enabled目录: ls -la /etc/nginx/modules-enabled/" + exit 1 + fi fi # ── §6 保存中转状态 ────────────────────────── From 83d23e16112f0b93eeac2b2f0fd1275c7af65c75 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 31 Mar 2026 11:04:33 +0000 Subject: [PATCH 3/3] refactor: extract shared stream module functions to reduce duplication, add find -maxdepth limit Agent-Logs-Url: https://github.com/qinfendebingshuo/guanghulab/sessions/9bb46eed-d7d9-4fa9-a557-18abe41a60f1 Co-authored-by: qinfendebingshuo <207279273+qinfendebingshuo@users.noreply.github.com> --- server/proxy/setup/setup-cn-relay.sh | 150 +++++++++++++-------------- 1 file changed, 72 insertions(+), 78 deletions(-) diff --git a/server/proxy/setup/setup-cn-relay.sh b/server/proxy/setup/setup-cn-relay.sh index 54208e26..a0edeb95 100644 --- a/server/proxy/setup/setup-cn-relay.sh +++ b/server/proxy/setup/setup-cn-relay.sh @@ -37,6 +37,75 @@ log_warn() { echo -e "${YELLOW}[CN中转]${NC} ⚠️ $1"; } log_error() { echo -e "${RED}[CN中转]${NC} ❌ $1"; } log_step() { echo -e "${BLUE}[CN中转]${NC} 📌 $1"; } +# 查找ngx_stream_module.so文件路径 +find_stream_module_so() { + for mod_path in \ + /usr/lib/nginx/modules/ngx_stream_module.so \ + /usr/lib64/nginx/modules/ngx_stream_module.so \ + /etc/nginx/modules/ngx_stream_module.so \ + /usr/share/nginx/modules/ngx_stream_module.so; do + if [ -f "$mod_path" ]; then + echo "$mod_path" + return + fi + done + # 使用find作为最后回退手段 (限制深度避免扫描过慢) + find /usr/lib /usr/lib64 /usr/share /etc/nginx -maxdepth 3 -name "ngx_stream_module.so" -print -quit 2>/dev/null +} + +# 尝试从modules-available启用stream模块 +enable_stream_from_modules_available() { + for avail in /usr/share/nginx/modules-available/mod-stream.conf \ + /etc/nginx/modules-available/mod-stream.conf; do + if [ -f "$avail" ]; then + ln -sf "$avail" /etc/nginx/modules-enabled/ + log_info "✅ 已从modules-available启用stream模块" + return 0 + fi + done + return 1 +} + +# 确保stream模块已加载到nginx配置中 +ensure_stream_module_loaded() { + local nginx_conf="$1" + + # 检查modules-enabled是否已自动加载 + if [ -d /etc/nginx/modules-enabled ]; then + if grep -q "ngx_stream_module" /etc/nginx/modules-enabled/* 2>/dev/null; then + log_info "✅ stream模块已通过modules-enabled自动加载" + return 0 + fi + fi + + # 检查nginx.conf是否已包含load_module指令 + if grep -q "ngx_stream_module" "$nginx_conf" 2>/dev/null; then + log_info "✅ stream动态模块已在nginx.conf中加载" + return 0 + fi + + # 查找并加载.so文件 + local module_path + module_path=$(find_stream_module_so) + + if [ -n "$module_path" ]; then + log_info "加载stream动态模块: $module_path" + sed -i "1i load_module $module_path;" "$nginx_conf" + log_info "✅ stream动态模块已加载" + return 0 + fi + + # 尝试从modules-available启用 + log_warn "未找到ngx_stream_module.so文件" + log_warn "尝试启用modules-available中的stream配置..." + if enable_stream_from_modules_available; then + return 0 + fi + + log_warn "stream模块可能为静态编译,继续配置..." + return 1 +} + # ── 参数 ────────────────────────────────────── SG_HOST="${ZY_SG_SERVER_HOST:-${1:-}}" RELAY_PORT="${ZY_CN_RELAY_PORT:-2053}" @@ -96,63 +165,7 @@ fi # 2. 手动load_module: 在nginx.conf顶部显式加载.so文件 NGINX_MAIN="/etc/nginx/nginx.conf" -# 检查modules-enabled是否已自动加载stream模块 -# (libnginx-mod-stream安装时通常会在modules-enabled/创建符号链接) -STREAM_ALREADY_LOADED=false -if [ -d /etc/nginx/modules-enabled ]; then - if grep -rq "ngx_stream_module" /etc/nginx/modules-enabled/ 2>/dev/null; then - log_info "✅ stream模块已通过modules-enabled自动加载" - STREAM_ALREADY_LOADED=true - fi -fi - -# 如果modules-enabled没有自动加载,手动查找并加载.so文件 -if [ "$STREAM_ALREADY_LOADED" = false ]; then - # 检查nginx.conf是否已包含load_module指令 - if grep -q "ngx_stream_module" "$NGINX_MAIN" 2>/dev/null; then - log_info "✅ stream动态模块已在nginx.conf中加载" - STREAM_ALREADY_LOADED=true - fi -fi - -if [ "$STREAM_ALREADY_LOADED" = false ]; then - STREAM_MODULE_PATH="" - for mod_path in \ - /usr/lib/nginx/modules/ngx_stream_module.so \ - /usr/lib64/nginx/modules/ngx_stream_module.so \ - /etc/nginx/modules/ngx_stream_module.so \ - /usr/share/nginx/modules/ngx_stream_module.so; do - if [ -f "$mod_path" ]; then - STREAM_MODULE_PATH="$mod_path" - break - fi - done - - # 使用find作为最后回退手段 - if [ -z "$STREAM_MODULE_PATH" ]; then - STREAM_MODULE_PATH=$(find /usr/lib /usr/lib64 /usr/share /etc/nginx -name "ngx_stream_module.so" 2>/dev/null | head -1) - fi - - if [ -n "$STREAM_MODULE_PATH" ]; then - log_info "加载stream动态模块: $STREAM_MODULE_PATH" - # load_module必须在nginx.conf最顶部(events块之前) - sed -i "1i load_module $STREAM_MODULE_PATH;" "$NGINX_MAIN" - log_info "✅ stream动态模块已加载" - else - log_warn "未找到ngx_stream_module.so文件" - log_warn "尝试启用modules-available中的stream配置..." - # 某些系统在modules-available但未启用 - if [ -f /usr/share/nginx/modules-available/mod-stream.conf ]; then - ln -sf /usr/share/nginx/modules-available/mod-stream.conf /etc/nginx/modules-enabled/ - log_info "✅ 已从modules-available启用stream模块" - elif [ -f /etc/nginx/modules-available/mod-stream.conf ]; then - ln -sf /etc/nginx/modules-available/mod-stream.conf /etc/nginx/modules-enabled/ - log_info "✅ 已从modules-available启用stream模块" - else - log_warn "stream模块可能为静态编译,继续配置..." - fi - fi -fi +ensure_stream_module_loaded "$NGINX_MAIN" # ── §2 配置Nginx stream中转 ────────────────── log_step "§2 配置TCP中转 (端口$RELAY_PORT → $SG_HOST:443)" @@ -280,27 +293,8 @@ else apt-get update -qq apt-get install -y -qq libnginx-mod-stream 2>/dev/null || true - # 再次搜索.so文件 - RETRY_MODULE_PATH=$(find /usr/lib /usr/lib64 /usr/share /etc/nginx -name "ngx_stream_module.so" 2>/dev/null | head -1) - - if [ -n "$RETRY_MODULE_PATH" ]; then - if ! grep -q "ngx_stream_module" "$NGINX_MAIN" 2>/dev/null; then - sed -i "1i load_module $RETRY_MODULE_PATH;" "$NGINX_MAIN" - log_info "已添加load_module: $RETRY_MODULE_PATH" - fi - fi - - # 检查modules-enabled - if [ -d /etc/nginx/modules-enabled ]; then - for avail in /usr/share/nginx/modules-available/mod-stream.conf \ - /etc/nginx/modules-available/mod-stream.conf; do - if [ -f "$avail" ]; then - ln -sf "$avail" /etc/nginx/modules-enabled/ - log_info "已启用: $avail" - break - fi - done - fi + # 使用共享函数确保模块已加载 + ensure_stream_module_loaded "$NGINX_MAIN" fi # 重新测试