العودة إلى التحديثات
New releaseJul 15, 2026

reproxy v1.7.0

خادم HTTP(S) طرفي خفيف الوزن ووكيل عكسي مع SSL تلقائي، اكتشاف Docker/Consul، مصادقة لكل مسار، تحديد معدل الطلبات، وتحويل الفشل القائم على فحص الصحة.

مشاركة
Reproxy | Simple Reverse Proxy

Reproxy هو خادم HTTP(s) طرفي بسيط / وكيل عكسي يدعم مزوّدين متنوعين (docker، static، file، consul catalog). يقوم مزوّد واحد أو أكثر بتوفير معلومات حول الخادم المطلوب، وعنوان URL المطلوب، وعنوان URL الوجهة، وعنوان URL لفحص الحالة. يُوزَّع كملف ثنائي واحد أو كحاوية docker.

  • إنهاء SSL تلقائي باستخدام Let's Encrypt
  • دعم شهادات SSL المقدَّمة من المستخدم
  • قواعد وكيل بسيطة لكن مرنة
  • مزوّد قواعد وكيل ثابت عبر سطر الأوامر
  • مزوّد قواعد وكيل ديناميكي قائم على الملفات
  • مزوّد Docker مع اكتشاف تلقائي
  • مزوّد Consul Catalog مع الاكتشاف عبر وسوم الخدمة
  • دعم عدة مضيفات (افتراضية)
  • ضغط اختياري لحركة المرور
  • تحكم اختياري في الوصول قائم على IP
  • مصادقة أساسية لكل مسار
  • حدود حجم ومهلات زمنية يحددها المستخدم
  • توزيع كملف ثنائي واحد
  • توزيع كحاوية Docker
  • خادم أصول ثابتة مدمج مع وضع اختياري "متوافق مع SPA"
  • دعم قواعد إعادة التوجيه
  • محدِّد اختياري للنشاط الإجمالي وكذلك لنشاط المستخدم
  • فحص حالة مباشر وتجاوز الفشل/موازنة الحمل
  • خادم إدارة مع معلومات المسارات ومقاييس prometheus
  • دعم الإضافات عبر RPC لتنفيذ وظائف مخصصة
  • تسجيل اختياري بصيغة Apache Log Format وتقارير stdout مبسطة.

build Coverage Status Go Report Card Docker Hub

يمكن تعيين الخادم (المضيف) كـ FQDN، أي s.example.com، أو * (يلتقط الكل) أو كتعبير نمطي (regex). المطابقة التامة لها الأولوية، لذا إذا وُجدت قاعدتان بخادمين example.com وexample\.(com|org)، فإن الطلب إلى example.com/some/url سيطابق الأولى. يمكن أن يكون عنوان URL المطلوب تعبيرًا نمطيًا، على سبيل المثال ^/api/(.*)، ويمكن أن يحتوي عنوان URL الوجهة على مجموعات مطابقة للتعبير النمطي، أي http://d.example.com:8080/$1. في المثال أعلاه، سيُوكَّل http://s.example.com/api/something?foo=bar إلى http://d.example.com:8080/something?foo=bar.

للراحة، تُوسَّع الطلبات التي تنتهي بـ / وبدون مجموعات regex إلى /(.*)، وتُوسَّع الوجهات في تلك الحالات إلى /$1. أي أن /api/ -> http://127.0.0.1/service ستُترجم إلى ^/api/(.*) -> http://127.0.0.1/service/$1.

يُدعم استبدال المضيف في عنوان URL الوجهة. على سبيل المثال، سيُستبدل /files/${host} باسم المضيف المطابق. يمكن أيضًا استخدام $host (بدون الأقواس المعقوفة).

يُدعم كل من HTTP وHTTPS. بالنسبة لـ HTTPS، يمكن استخدام شهادة ثابتة وكذلك شهادات ACME الآلية (Let's Encrypt). يمكن استخدام خادم أصول اختياري لتقديم الملفات الثابتة. يتطلب تشغيل reproxy تعريف مزوّد واحد على الأقل. بقية المعاملات اختيارية تمامًا ولها قيم افتراضية معقولة.

أمثلة:

  • مع مزوّد ثابت: reproxy --static.enabled --static.rule="*,example.com/api/(.*),https://api.example.com/$1"
  • مع اكتشاف تلقائي عبر docker: reproxy --docker.enabled --docker.auto
  • كحاوية docker: docker up -p 80:8080 umputun/reproxy --docker.enabled --docker.auto
  • مع SSL تلقائي: docker up -p 80:8080 -p 443:8443 umputun/reproxy --docker.enabled --docker.auto --ssl.type=auto --ssl.fqdn=example.com

التثبيت

يتم توزيع Reproxy كملف ثنائي صغير مكتفٍ ذاتيًا بالإضافة إلى صورة docker. يدعم كل من الملف الثنائي والصورة معماريات متعددة وأنظمة تشغيل متعددة، بما في ذلك linux_x86_64 وlinux_arm64 وlinux_arm وmacos_x86_64 وmacos_arm64 وwindows_x86_64 وwindows_arm. كما نوفر حزم deb وrpm لكل من arm64 وx86.

  • للحصول على توزيع ثنائي، نزّل الملف المناسب من قسم الإصدارات
  • لمستخدمي Homebrew: brew install umputun/apps/reproxy
  • حاوية docker متاحة على Docker Hub وكذلك على Github Container Registry. أي docker pull umputun/reproxy أو docker pull ghcr.io/umputun/reproxy.

أحدث إصدار مستقر يحمل وسم docker :vX.Y.Z (مع الاسم البديل :latest) والفرع الرئيسي الحالي يحمل وسم :master.

المزوّدون

قواعد الوكيل (proxy) تُوفَّر بواسطة مزوّدين متنوعين. المضمّن حاليًا - file وdocker وstatic وconsul-catalog. يمكن لكل مزوّد تعريف قواعد توجيه متعددة لكل من الطلبات الممرَّرة عبر الوكيل والملفات الثابتة (assets). يمكن للمستخدم تعيين عدة مزوّدين في الوقت نفسه.

اطّلع على أمثلة لمزوّدين متنوعين في examples

المزوّد الثابت (Static)

هذا أبسط مزوّد، إذ يعرّف جميع قواعد التعيين مباشرةً في سطر الأوامر (أو البيئة). تدعم قواعد متعددة. كل قاعدة تتكون من 3 إلى 7 عناصر مفصولة بفواصل server,sourceurl,destination[,ping-url[,forward-health-checks[,timeout[,throttle]]]]. على سبيل المثال:

  • *,^/api/(.*),https://api.example.com/$1 - تمرير جميع الطلبات إلى أي مضيف/خادم ببادئة /api إلى https://api.example.com
  • example.com,/foo/bar,https://api.example.com/zzz,https://api.example.com/ping - تمرير جميع الطلبات إلى example.com ومع مسار /foo/bar إلى https://api.example.com/zzz ويستخدم https://api.example.com/ping لفحص الحالة.
  • example.com,/foo/bar,https://api.example.com/zzz,https://api.example.com/ping,true - كما سبق ولكن يمرّر أيضًا طلبات /ping و/health إلى الخادم الخلفي.
  • example.com,^/upload/(.*),https://api.example.com/$1,,,5m - مهلة طلب لكل مسار مدتها 5 دقائق (تُركت الحقول الرابع والخامس فارغة لتخطي ping-url وforward-health-checks).
  • example.com,^/login,https://api.example.com/login,,,,2 - حدّ معدّل (throttle) لكل مسار بمقدار 2 طلب/ثانية لكل مستخدم (تُركت الحقول الموضعية السابقة فارغة).

يحدد العنصر الرابع رابط ping اختياريًا يُستخدم للإبلاغ عن الحالة. ويُمكّن العنصر الخامس اختياريًا تمرير طلبات فحص الحالة إلى الخادم الخلفي (true، yes، 1). راجع قسم فحص الحالة لمزيد من التفاصيل. العنصر السادس هو مهلة طلب اختيارية لكل مسار (مدة Go، مثل 5m، 30s)؛ القيمة 0 أو الفارغ يرث إعداد --timeout.write العام. العنصر السابع هو حدّ اختياري لعدد الطلبات في الثانية لكل مستخدم لكل مسار؛ القيمة 0 أو الفارغ يرث --throttle.user. الحقول الموضعية الفارغة مسموح بها (مثل ,, للحقول الوسطى غير المستخدمة).

مزوّد الملف (File)

يستخدم هذا المزوّد ملف yaml يحتوي على قواعد التوجيه.

reproxy --file.enabled --file.name=config.yml

مثال على config.yml:

default: # the same as * (catch-all) server
  - { route: "^/api/svc1/(.*)", dest: "http://127.0.0.1:8080/blah1/$1" }
  - {
      route: "/api/svc3/xyz",
      dest: "http://127.0.0.3:8080/blah3/xyz",
      ping: "http://127.0.0.3:8080/ping",
      remote: "192.168.1.0/24, 127.0.0.1", # optional, restrict access to the route
      forward-health-checks: true # optional, forward /ping and /health to backend
    }
  - {
      route: "^/admin/(.*)",
      dest: "http://127.0.0.4:8080/$1",
      auth: "admin:$2y$05$..." # optional, per-route basic auth (htpasswd bcrypt format)
    }
  - {
      route: "^/upload/(.*)",
      dest: "http://127.0.0.5:8080/$1",
      timeout: 5m # optional, per-route request timeout (Go duration). 0 or omitted inherits --timeout.write
    }
  - {
      route: "^/login",
      dest: "http://127.0.0.6:8080/login",
      throttle: 2 # optional, per-route req/sec per user. 0 or omitted inherits --throttle.user
    }
srv.example.com:
  - { route: "^/api/svc2/(.*)", dest: "http://127.0.0.2:8080/blah2/$1/abc" }
  - { route: "/web/", dest: "/var/www", "assets": true }
"*.files.example.com":
  - { route: "^/files/(.*)", dest: "http://123.123.200.200:8080/$host/$1" }

هذا مزوّد ديناميكي وسيتم تطبيق تغيير الملف تلقائيًا.

الفئات