پیش از اینکه پیکره بندی Nginx به عنوان reverse proxy را فرا بگیریم، ابتدا به این موضوع میپردازیم که این قابلیت چه چالشی را برطرف خواهد کرد. همانطور که میدانید Apache و Nginx دو وب سرور Open source محبوب هستند که اغلب با PHP استفاده می شوند. هنگام میزبانی از چندین وب سایت که نیازهای متنوعی دارند، اجرای هر دو وب سرور در یک ماشین مجازی سودمند است. مثلا فرض کنید یک سایت برای نمایش پنل کاربری مورد استفاده قرار گیرد و یک سایت برای وب سرویسها یا مثلا یک وب سایت مربوط به بخشهای کدنویسی شده پروژه باشد و یک وب سایت مختص وبلاگ که با وردپرس کار میکند. راه حل کلی برای اجرای دو وب سرور در یک سیستم واحد استفاده از چندین آدرس IP یا استفاده از شماره پورت های مختلف بر روی یک IP مشترک است.
اما همانطور که میدانید استفاده از آدرسهایی مانند http://example.com:8080 یا امثال آن غیر معمول است. به جای آن ترجیح میدهیم مثلا وبلاگ با آدرس http://example.com/blog و دیگر بخشهای سایت با آدرس http://example.com در دسترس قرار گیرد. در چنین وضعیتی استفاده از یک reverse proxy این امکان را به سهولت ایجاد خواهد کرد.
از آنجا که در این آموزش میخواهیم به مفهوم reverse proxy بپردازیم، نیاز است تا نصب و پیکره بندی Apache و Nginx را فراگرفته باشید.
مرحله ۱: تغییر پورت پیشفرض apache
از آنجا که هر دو وب سرور Apache و Nginx بصورت پیشفرض پورت ۸۰ را به خود اختصاص میدهند. پیش از آن که مشکلی رخ دهد، ابتدا پورت پیشفرض apache را تغییر میدهیم. برای اینکار فایل تنظیمات پورت apache را بازکنید.
sudo nano /etc/apache2/ports.conf
در این فایل پورت ۸۰ را به ۸۰۸۰ یا هر مقدار دلخواهی مطابق نمونه زیر تغییر دهید. همچنین اگر قصد استفاده از ssl داشته باشیم بهتر است پورت ۴۴۳ را نیز از دسترس apache خارج کنیم.
Listen 127.0.0.1:8080 <IfModule ssl_module> Listen 4403 </IfModule> <IfModule mod_gnutls.c> Listen 4403 </IfModule>
دقت نمایید که آدرس ۱۲۷٫۰٫۰٫۱ یک آدرس داخلی است و با اینکار اجازه دسترسی به virtualhostهای آپاچی از بیرون سرور را نیز قطع میکنیم. این اقدام از نظر امنیتی بسیار سودمند است. در ادامه باید virtualhost پیشفرض apache را نیز غیر فعال کنیم.
sudo a2dissite 000-default
سپس برای هر یک از وبسایتها یک virtualhost جدید ایجاد کنیم. البته اگر این virtualhost ها از قبل ساخته شدهاند، تنها کافیست تا پورت آنها را تغییر دهیم.
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/example.com.conf
پس از آن باید فایلهای ایجاد شده را باز کرده و تغییرات لازم را انجام دهیم.
sudo nano /etc/apache2/sites-available/001-default.conf
تنظیمات آپاچی برای یک virtualhost ممکن است بصورت زیر باشد.
<VirtualHost *:8080> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
در نمونه فایل تنظیمات بالا، مقدار VirtualHost *:8080 تعیین کننده پورت مورد استفاده برای virtualhost است. پس از اعمال تنظیمات باید فایل مربوطه را ذخیره کرده و VirtualHost را مجدد فعال کنیم.
sudo a2ensite 001-default
همچنین اگر در مورد ساخت virtualhost نیاز به آموزش بیشتری دارید، میتوانید به پست ساخت virtualhost در Apache مراجعه کنید.
سپس باید سرویس Apache را ریاستارت کنیم.
sudo systemctl reload apache2
مرحله ۲: پیکره بندی Nginx به عنوان reverse proxy
پیشتر در مطلبی جداگانه نصب و تنظیمات Nginx عنوان شده است. اما در این بخش تمرکز اصلی بر روی پیکره بندی Nginx به عنوان Reverse Proxy مورد بررسی قرار خواهد گرفت. جالب است بدانید که Nginx نیز مانند Apache پوشههایی برای سایتهای دردسترس(sites-available) و سایتهای فعال شده(sites-enabled) دارد و مانند Apache هر سایت یک فایل تنظیمات دارد. تفاوت از محتوای درون این فایلها نمایان میشود. وب سرور Apache از ساختاری شبیه XML و تگ معروف Virtualhost برای معرفی یک سایت استفاده میکند اما Nginx از ساختاری شبیه Json و کلید معروف server برای این منظور استفاده میکند. همچنین به هر server تعریف شده در تنظیمات Nginx یک سرور بلاک میگویند.
انتظاری که از یک Reverse Proxy داریم، این است که تحت شرایطی خاص، مثلا بر اساس الگوی URL، درخواستها را به سرورهای مختلف ارجاع دهد. به عنوان یک مثال ساده، درخواستهای بخش بلاگ سایت و دیگر بخشها از هم تفکیک شوند. به عبارت دیگر:
http://example.com/blog/* => server 1
http://example.com/* => server2
برای انجام این کار باید از کلیدواژهی location در تنظیمات سرور استفاده کنیم. در مسیر زیر یک فایل تنظیمات برای سرور nginx که وظیفه reverse-proxy را به عهده دارد، ایجاد کنید.
sudo nano /etc/nginx/sites-available/reverse
درون این فایل باید تنظیماتی مانند مثال زیر قرار دهید.
server { listen 80; server_name example.com www.example.com; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location /blog { proxy_pass http://127.0.0.2:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
پس از اعمال تنظیمات بالا، نیاز است تا سرور بلاک خود را فعال کنید(ایجاد symbolink در پوشه sites-enabled). این کار به کمک دستور زیر قایل انجام است.
sudo ln -s /etc/nginx/sites-available/reverse /etc/nginx/sites-enabled/reverse
در ادامه باید تنظیمات Nginx را تست کنیم تا مطمئن شویم خطایی در تنظیمات وجود ندارد. برای این منظور از دستور زیر استفاده میکنیم.
sudo nginx -t
چنانچه خطایی وجود نداشته باشد، میتوانیم به کمک دستور زیر nginx را reload کنیم تا تنظیمات جدید بر روی nginx فعال شود.
sudo systemctl reload nginx
موفق و پیروز باشید.