قدرت کلاسیک CGI را در سرورهای مدرن Nginx و Angie آزاد کنید


آیا تا به حال به اجرای اسکریپت‌های کلاسیک CGI روی یک سرور قدرتمند مانند Nginx فکر کرده‌اید؟ در حالی که فریم‌ورک‌های مدرن جایگاه خود را دارند، رابط دروازه مشترک (CGI) همچنان ابزاری قدرتمند و ساده برای سناریوهای خاص باقی مانده است. معرفی می‌کنیم: nginx-cgi، یک ماژول داینامیک که پشتیبانی قوی از CGI را به هر دو وب سرور Nginx و انشعاب آن، Angie، می‌آورد.

درک نقش CGI

فناوری CGI یک فناوری منسوخ شده نیست؛ بلکه ابزاری تخصصی است. مانند هر ابزار دیگری، در زمینه مناسب خود بهترین عملکرد را دارد. شما از شمشیر برای آشپزی استفاده نمی‌کنید و چاقوی سرآشپز را به میدان جنگ نمی‌برید. به همین ترتیب، CGI موارد استفاده ایده‌آل خود را دارد:

  • برنامه‌های با فرکانس پایین: عالی برای وظایفی مانند پنل‌های مدیریت سیستم یا ابزارهای داخلی که به طور مداوم مورد استفاده قرار نمی‌گیرند.
  • سیستم‌های با منابع محدود: یک انتخاب فوق‌العاده برای سیستم‌های تعبیه‌شده (embedded) یا دستگاه‌های اینترنت اشیاء (IoT) که هر مگابایت از حافظه RAM در آن‌ها اهمیت دارد.
  • پروژه‌های کم‌هزینه: ایده‌آل برای وب‌سایت‌های شخصی یا پروژه‌های کوچکی که سادگی و حداقل سربار در آن‌ها کلیدی است.
  • نمونه‌سازی سریع: امکان تکرار و آزمایش سریع ایده‌ها را بدون پیچیدگی یک سرور برنامه کامل فراهم می‌کند.

در مقابل، برای محیط‌های با ترافیک بالا و همزمانی زیاد که عملکرد در آن‌ها حیاتی است، کمتر مناسب است.

راه‌اندازی در چند دقیقه (برای Debian/Ubuntu)

شما می‌توانید به سرعت روی Debian 12+ یا Ubuntu 24.04+ این ماژول را راه‌اندازی کنید.

۱. ساخت و نصب ماژول:

# کلون کردن کد منبع
git clone https://github.com/pjincz/nginx-cgi
cd nginx-cgi

# ساخت بسته دبیان
./build-deb-package.sh

# نصب بسته تولید شده
sudo dpkg -i ../libnginx-mod-http-cgi_*_amd64.deb

۲. پیکربندی Nginx:

فایل پیکربندی سایت خود را (مثلاً /etc/nginx/sites-enabled/default) باز کرده و یک بلوک location برای فعال‌سازی CGI در یک دایرکتوری خاص اضافه کنید:

server {
    # ... سایر تنظیمات سرور شما ...
    root /var/www/html;

    location / {
        try_files $uri $uri/ =404;
    }

    # این بلوک را برای فعال‌سازی CGI اضافه کنید
    location /cgi-bin {
        cgi on;
    }
}

سپس، Nginx را مجدداً راه‌اندازی کنید: sudo systemctl restart nginx

۳. ایجاد اولین اسکریپت CGI:

این اسکریپت ساده شل را در مسیر /var/www/html/cgi-bin/hello.sh ذخیره کنید:

#!/bin/bash

echo "Content-Type: text/plain"
echo

echo "Hello from nginx-cgi!"

خروجی یک اسکریپت CGI دو بخش دارد: هدرها (مانند Content-Type) و بدنه، که با یک خط خالی از هم جدا می‌شوند.

۴. قابل اجرا کردن اسکریپت:

اسکریپت‌ها برای اجرا باید مجوز اجرایی داشته باشند.

sudo chmod +x /var/www/html/cgi-bin/hello.sh

۵. آزمایش کنید!

از curl برای دیدن عملکرد اسکریپت خود استفاده کنید:

curl http://127.0.0.1/cgi-bin/hello.sh

شما باید خروجی «Hello from nginx-cgi!» را مشاهده کنید.

ویژگی‌های پیشرفته و سندباکسینگ

ماژول nginx-cgi چیزی فراتر از یک اجراکننده ساده اسکریپت است. این ماژول ویژگی‌های قدرتمندی برای امنیت و انعطاف‌پذیری ارائه می‌دهد.

  • پردازش درخواست‌ها: از طریق متغیرهای محیطی به هدرهای درخواست دسترسی پیدا کنید (مانند $QUERY_STRING، $HTTP_USER_AGENT) و بدنه درخواست را از ورودی استاندارد (stdin) بخوانید.
  • پشتیبانی از استریمینگ: هم بدنه درخواست و هم پاسخ می‌توانند به صورت استریم پردازش شوند، که برای اسکریپت‌های تعاملی یا انتقال داده‌های حجیم عالی است.
  • اجرای سندباکس‌شده: برای امنیت بیشتر، می‌توانید اسکریپت‌های CGI را در محیط‌های ایزوله اجرا کنید. این ماژول راهنماهای دقیقی برای استفاده از دستور cgi_interpreter برای اجرای اسکریپت‌ها در محیط‌های زیر ارائه می‌دهد:
    • chroot: یک ابزار سنتی یونیکس برای تغییر دایرکتوری ریشه.
    • Docker: یک پلتفرم کانتینرسازی مدرن برای ایزوله‌سازی کامل محیط.
    • FreeBSD Jails: یک ویژگی قدرتمند مجازی‌سازی در سطح سیستم‌عامل در FreeBSD.

پیکربندی قدرتمند

این ماژول مجموعه‌ای غنی از دستورات را برای کنترل دقیق فراهم می‌کند:

  • cgi_pass: درخواست‌ها برای انواع فایل خاص (مثلاً .md) را به یک اسکریپت برای رندر پویا ارسال کنید، که از قوانین پیچیده بازنویسی (rewrite) جلوگیری می‌کند.
  • cgi_interpreter: یک مفسر (مانند /usr/bin/python3) برای اجرای اسکریپت‌ها مشخص کنید، یا حتی دستورات را برای سندباکسینگ زنجیره‌ای کنید (مثلاً /usr/bin/sudo /usr/bin/docker exec ...).
  • cgi_timeout: زمان‌بندی‌هایی برای ارسال خودکار سیگنال‌های TERM و KILL به اسکریپت‌های طولانی‌مدت تنظیم کنید تا از مصرف بی‌رویه منابع جلوگیری شود.
  • cgi_set_var: متغیرهای محیطی سفارشی برای ارسال به اسکریپت‌های خود تعریف کنید.

این پلاگین سادگی و قدرت CGI را برای وب سرور مدرن احیا می‌کند و آن را به ابزاری ارزشمند برای توسعه‌دهندگان و مدیران سیستم تبدیل می‌کند.

برای مشاهده راهنمای کامل، ترفندهای پیشرفته و مستندات جامع، مخزن منبع را بررسی کنید.

منبع: https://github.com/pjincz/nginx-cgi

Leave a Comment