
مقدمه
سرور 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 را در لایه پروکسی خاتمه دهید. با این پایه، اکنون میتوانید زیرساخت خود را با ایمنی و مقیاسپذیری بیشتری مدیریت کنید.




