سرورلینوکس

آموزش استفاده از آپاچی (Apache) به عنوان پروکسی معکوس با افزونه mod_proxy

مقدمه
سرور HTTP آپاچی شامل یک چارچوب قدرتمند پروکسی معکوس (Reverse Proxy) از طریق خانواده ماژول mod_proxy است. با پیکربندی صحیح، آپاچی می‌تواند در جلوی یک یا چند اپلیکیشن بک‌اند قرار گیرد، درخواست‌های کلاینت را فوروارد کند، اتصالات SSL را خاتمه دهد، ترافیک را بین چندین سرور توزیع کند و یک لایه امنیتی و کنترلی اضافی بین کاربران و زیرساخت اپلیکیشن شما ایجاد کند.

در این آموزش، شما آپاچی را به عنوان یک پروکسی معکوس روی اوبونتو با استفاده از خانواده ماژول mod_proxy پیکربندی خواهید کرد. شما آپاچی را نصب کرده، ماژول‌های پروکسی مورد نیاز را فعال می‌کنید، فورواردینگ پایه درخواست‌ها را با ProxyPass و ProxyPassReverse راه‌اندازی می‌کنید، اطلاعات کلاینت را از طریق هدرهای فوروارد شده حفظ می‌کنید، ترافیک را با mod_proxy_balancer بین چندین بک‌اند توزیع می‌کنید، خاتمه SSL (SSL Termination) را در لایه پروکسی پیکربندی می‌کنید و سخت‌گیری‌های امنیتی را اعمال می‌نمایید.

(نکته: این آموزش برای نسخه‌های مدرن اوبونتو مانند اوبونتو 24.04 به‌روزرسانی شده است. شما می‌توانید سرور مجازی خود را از پارمین کلود تهیه کنید.)

نکات کلیدی:

  • خانواده ماژول mod_proxy به سرور آپاچی اجازه می‌دهد تا به عنوان یک پروکسی معکوس عمل کند و درخواست‌ها را به اپلیکیشن‌های بک‌اند فوروارد کند.
  • پروکسی معکوس بین کلاینت‌ها و سرورهای بک‌اند قرار می‌گیرد و به آپاچی اجازه می‌دهد یک نقطه پایانی (Endpoint) عمومی را در دسترس قرار دهد، در حالی که سرویس‌های داخلی و پورت‌ها از دسترسی مستقیم اینترنت پنهان می‌مانند.
  • دستورات ProxyPass و ProxyPassReverse هسته اصلی پیکربندی پروکسی معکوس هستند.
  • هدرهای فوروارد شده مانند X-Forwarded-For به اپلیکیشن‌های بک‌اند اجازه می‌دهند آدرس IP واقعی کلاینت و پروتکل درخواست را حفظ کنند.
  • ماژول mod_proxy_balancer به آپاچی اجازه می‌دهد درخواست‌ها را بین چندین سرور بک‌اند توزیع کند (Load Balancing).

مرحله ۱ — نصب آپاچی و بررسی موجود بودن mod_proxy

ابتدا باید سرور HTTP آپاچی را نصب کنید. در اوبونتو، آپاچی به صورت بسته apache2 ارائه می‌شود.

ابتدا ایندکس بسته‌ها را به‌روزرسانی کنید:

sudo apt update

سپس آپاچی را نصب کنید:

sudo apt install apache2

پس از اتمام نصب، اوبونتو به طور خودکار سرویس آپاچی را استارت می‌کند. برای بررسی این موضوع:

sudo systemctl status apache2

خروجی باید نشان دهد که سرویس active (running) است.

درک ماژول‌های آپاچی در اوبونتو
آپاچی از معماری ماژولار استفاده می‌کند. در اوبونتو، ماژول‌ها در دو دایرکتوری مدیریت می‌شوند:

  • /etc/apache2/mods-available/: شامل تمام فایل‌های تعریف ماژول‌های نصب شده است.
  • /etc/apache2/mods-enabled/: شامل لینک‌های نمادین (Symlink) ماژول‌های فعال است.

برای بررسی اینکه ماژول‌های پروکسی روی سیستم موجود هستند:

ls /etc/apache2/mods-available/ | grep proxy

خروجی باید شامل مواردی مانند proxy.load و proxy_http.load باشد.


مرحله ۲ — فعال‌سازی mod_proxy و ماژول‌های زیرمجموعه مورد نیاز

برای فعال‌سازی قابلیت پروکسی معکوس، باید ماژول‌های مورد نیاز را با استفاده از ابزار a2enmod فعال کنید. برای یک پیکربندی استاندارد HTTP، حداقل به ماژول‌های mod_proxy و mod_proxy_http نیاز دارید.

فعال‌سازی ماژول‌های پایه پروکسی

sudo a2enmod proxy
sudo a2enmod proxy_http

فعال‌سازی ماژول‌های پرکاربرد دیگر
برای دستکاری هدرها (که در ادامه توضیح داده می‌شود):

sudo a2enmod headers

اگر قصد دارید بعداً توزیع بار (Load Balancing) را پیکربندی کنید:

sudo a2enmod proxy_balancer
sudo a2enmod lbmethod_byrequests

برای پشتیبانی از WebSocket:

sudo a2enmod proxy_wstunnel

پس از فعال‌سازی ماژول‌ها، آپاچی را ری‌استارت کنید تا تغییرات اعمال شوند:

sudo systemctl restart apache2

برای بررسی ماژول‌های بارگذاری شده:

apache2ctl -M | grep proxy

مرحله ۳ — پیکربندی پروکسی معکوس پایه با ProxyPass

در یک تنظیمات پایه، آپاچی درخواست‌های ورودی کلاینت را دریافت کرده و آن‌ها را به یک اپلیکیشن بک‌اند (مثلاً در حال اجرا روی پورت 3000) فوروارد می‌کند.

غیرفعال کردن پروکسی رو به جلو (Forward Proxy)
مهم‌ترین تنظیمات امنیتی، غیرفعال کردن قابلیت پروکسی رو به جلو است. برای این کار باید ProxyRequests Off را تنظیم کنید تا سرور شما به یک “پروکسی باز” (Open Proxy) تبدیل نشود.

درک ProxyPass و ProxyPassReverse

  • ProxyPass: مسیر URL ورودی را به یک URL بک‌اند نگاشت می‌کند. (مثلا ProxyPass / http://127.0.0.1:3000/)
  • ProxyPassReverse: هدرهای پاسخ بک‌اند (مانند ریدایرکت‌ها) را بازنویسی می‌کند تا آدرس عمومی پروکسی به جای آدرس داخلی بک‌اند به کلاینت نمایش داده شود.

ایجاد VirtualHost پروکسی معکوس
یک فایل پیکربندی جدید ایجاد کنید:

sudo nano /etc/apache2/sites-available/reverse-proxy.conf

تنظیمات زیر را در آن قرار دهید:

<VirtualHost *:80>
    ServerName example.com

    ProxyRequests Off

    ProxyPreserveHost On

    ProxyPass / http://127.0.0.1:3000/
    ProxyPassReverse / http://127.0.0.1:3000/

    ErrorLog ${APACHE_LOG_DIR}/reverse-proxy-error.log
    CustomLog ${APACHE_LOG_DIR}/reverse-proxy-access.log combined
</VirtualHost>
  • ProxyPreserveHost On: به آپاچی می‌گوید هدر اصلی Host کلاینت را به جای جایگزینی آن با هاست‌نیم بک‌اند، حفظ کند.

پیکربندی را فعال کنید:

sudo a2ensite reverse-proxy.conf
sudo a2dissite 000-default.conf

سینتکس را بررسی کرده و آپاچی را ری‌استارت کنید:

sudo apache2ctl configtest
sudo systemctl restart apache2

مرحله ۴ — فوروارد کردن اطلاعات کلاینت با هدرهای پروکسی

در استقرار پروکسی معکوس، اپلیکیشن بک‌اند ارتباط مستقیمی با کلاینت ندارد و درخواست‌ها از طریق آپاچی عبور می‌کنند. بدون فوروارد کردن هدرها، بک‌اند آدرس IP آپاچی را به عنوان IP کلاینت می‌بیند.

برای حفظ IP کلاینت و پروتکل، پیکربندی قبلی را به شکل زیر بهبود دهید:

<VirtualHost *:80>
    ServerName example.com

    ProxyRequests Off
    ProxyPreserveHost On
    ProxyAddHeaders On

    ProxyPass / http://127.0.0.1:3000/
    ProxyPassReverse / http://127.0.0.1:3000/

    RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}

    ErrorLog ${APACHE_LOG_DIR}/reverse-proxy-error.log
    CustomLog ${APACHE_LOG_DIR}/reverse-proxy-access.log combined
</VirtualHost>

این تنظیمات باعث می‌شوند هدرهای X-Forwarded-For (حاوی IP کلاینت) و X-Forwarded-Proto (حاوی http یا https) به بک‌اند ارسال شوند.

تغییرات را ذخیره کرده، سینتکس را بررسی کنید و آپاچی را ری‌لود کنید:

sudo apache2ctl configtest
sudo systemctl reload apache2

مرحله ۵ — پیکربندی توزیع بار (Load Balancing) با mod_proxy_balancer

آپاچی می‌تواند درخواست‌های ورودی را با استفاده از ماژول mod_proxy_balancer بین چندین سرور بک‌اند توزیع کند. این کار مقیاس‌پذیری و در دسترس بودن (Availability) را افزایش می‌دهد.

ابتدا مطمئن شوید ماژول‌های توزیع بار (که در مرحله ۲ فعال شدند) بارگذاری شده‌اند. سپس یک فایل پیکربندی جدید ایجاد کنید:

sudo nano /etc/apache2/sites-available/load-balancer.conf

تنظیمات زیر را اضافه کنید:

<VirtualHost *:80>
    ServerName example.com

    ProxyRequests Off
    ProxyPreserveHost On

    <Proxy "balancer://mycluster">
        BalancerMember http://127.0.0.1:3001
        BalancerMember http://127.0.0.1:3002

        ProxySet lbmethod=byrequests
    </Proxy>

    ProxyPass / balancer://mycluster/
    ProxyPassReverse / balancer://mycluster/

    ErrorLog ${APACHE_LOG_DIR}/balancer-error.log
    CustomLog ${APACHE_LOG_DIR}/balancer-access.log combined
</VirtualHost>

در این پیکربندی، آپاچی ترافیک را به طور مساوی (بر اساس تعداد درخواست‌ها – byrequests) بین پورت‌های 3001 و 3002 توزیع می‌کند.

سایت را فعال کرده و آپاچی را ری‌لود کنید:

sudo a2ensite load-balancer.conf
sudo apache2ctl configtest
sudo systemctl reload apache2

مرحله ۶ — فعال‌سازی خاتمه SSL (SSL Termination) در لایه پروکسی

در بسیاری از استقرارهای پروداکشن، آپاچی اتصالات HTTPS را مدیریت کرده و ترافیک رمزگشایی شده را از طریق HTTP داخلی به بک‌اند می‌فرستد.

ابتدا ماژول SSL را فعال کنید:

sudo a2enmod ssl
sudo systemctl reload apache2

یک فایل پیکربندی HTTPS ایجاد کنید:

sudo nano /etc/apache2/sites-available/reverse-proxy-ssl.conf

تنظیمات زیر را اضافه کنید (مسیر گواهینامه‌ها را با مسیرهای واقعی خود جایگزین کنید. برای گواهینامه رایگان می‌توانید از Let’s Encrypt استفاده کنید):

<VirtualHost *:443>
    ServerName example.com

    SSLEngine On
    SSLCertificateFile /etc/ssl/certs/example.com.crt
    SSLCertificateKeyFile /etc/ssl/private/example.com.key

    ProxyRequests Off
    ProxyPreserveHost On
    ProxyAddHeaders On

    ProxyPass / http://127.0.0.1:3000/
    ProxyPassReverse / http://127.0.0.1:3000/

    RequestHeader set X-Forwarded-Proto "https"

    ErrorLog ${APACHE_LOG_DIR}/ssl-proxy-error.log
    CustomLog ${APACHE_LOG_DIR}/ssl-proxy-access.log combined
</VirtualHost>

برای ریدایرکت کردن تمام ترافیک HTTP به HTTPS، می‌توانید در فایل پیکربندی پورت 80 خود این را اضافه کنید:

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / https://example.com/
</VirtualHost>

سایت SSL را فعال کرده و آپاچی را ری‌لود کنید:

sudo a2ensite reverse-proxy-ssl.conf
sudo apache2ctl configtest
sudo systemctl reload apache2

مرحله ۷ — سخت‌گیری‌های امنیتی برای پیکربندی پروکسی

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

۱. غیرفعال بودن پروکسی رو به جلو: همیشه مطمئن شوید ProxyRequests Off تنظیم شده است.
۲. محدود کردن دسترسی‌ها: می‌توانید با استفاده از بلوک‌های <Proxy> دسترسی به مسیرهای خاص را محدود کنید:

<Proxy "http://127.0.0.1:3000/admin">
    Require ip 192.168.1.0/24
</Proxy>

۳. پنهان کردن اطلاعات سرور: برای کاهش افشای اطلاعات در هدرهای پاسخ، در فایل پیکربندی глобال (مثل security.conf):

ServerTokens Prod
ServerSignature Off
Header unset X-Powered-By

۴. تنظیم Timeoutها: برای جلوگیری از اتلاف منابع روی اتصالات معلق:

ProxyTimeout 30
Timeout 60

رفع اشکالات رایج mod_proxy

برای عیب‌یابی، اولین مکان برای بررسی، لاگ خطای آپاچی است:

sudo tail -f /var/log/apache2/error.log
  • خطای 502 Bad Gateway: آپاچی نتوانسته با اپلیکیشن بک‌اند ارتباط برقرار کند. بررسی کنید که بک‌اند در حال اجرا باشد (sudo ss -tulpn | grep 3000) و با curl http://127.0.0.1:3000 تستش کنید.
  • خطای 503 Service Unavailable: در محیط‌های توزیع بار رخ می‌دهد و نشان می‌دهد تمام سرورهای بک‌اند از دسترس خارج شده‌اند.
  • خطای Invalid command ‘ProxyPass’: نشان می‌دهد ماژول mod_proxy یا mod_proxy_http فعال نشده است. آن‌ها را با a2enmod فعال کنید.

نتیجه‌گیری

در این آموزش، شما آپاچی را به عنوان یک پروکسی معکوس با استفاده از خانواده ماژول mod_proxy پیکربندی کردید. شما یاد گرفتید چگونه درخواست‌ها را فوروارد کنید، هدرهای کلاینت را حفظ کنید، ترافیک را بین چندین سرور توزیع کنید و SSL را در لایه پروکسی خاتمه دهید. با این پایه، اکنون می‌توانید زیرساخت خود را با ایمنی و مقیاس‌پذیری بیشتری مدیریت کنید.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

همچنین ببینید
بستن
دکمه بازگشت به بالا