نود و آپاچی روی یک سرور!

11-مرداد     توسط ali     بازدیدها 191
 
تا حالا شده بخواید روی سرور خودتون همزمان هم NodeJS داشته باشید و هم PHP؟ خب امیدوارم هیچوقت نخواید.
داستان از اونجایی شروع شد که یه روز سرمایه‌گذار محترم تماس گرفت و من رو از خواب نازنین بیدار کرد که آقا روی سرورمون‌ می‌خوایم NodeJSبیاریم بالا. گفتم خب موفق باشید خوش به حالتون. بعد یچیزی گفت پشمام ریخت، کنار آپاچی! خب دوستان می‌دونناز مزایای خوب نود همون خاصیت نان‌بلاکینگش هست که باعث می‌شه منابع سیستمی کمتر مصرف بشن. حال نداشتم بحث کنم، به این بسنده کردم که دفعه بعد به خودم بگو قناری.
خب تا اینجای کار همه‌چیز اوکیه، یه سرور اوبونتویی (لابد بنده خدا نمی‌دونست من اوبونتو کار نمی‌کنم)، یه ip و یه PrivateKey داشتم. ایده اینه که شما می‌تونید باشرایط خاصی آپاچی رو پروکسی کنید تا آدرس خاصی روریدارکت کنه (البته ریدایرکت اصطلاح جالبی نیست) به یک پورت خاص بدون اینکه یوزر متوجه بشه. البته توی چنین سناریویی، یه برنامه‌نویس حرفه‌ای اول یکم می‌خنده بعد می‌گه حداقل انجین‌اکس نصب کن بنده خدا. اما خب من برنامه‌نویس واقعی نیستم و حالشو ندارم پس همون آپاچی رو کانفیگ می‌کنم.
فرآیند ازین قراره. من می‌خوام اگر یوزر آدرس ip یا دامین رو زد، localhost:3000 براش باز شه. (: واسه این کار شما باید چندتا ماژول رو اینیبل کنید و یکم کانفیگ آپاچی رو انگولک کنید، تا یادمه بگم، من چون خودم CentOS کار می‌کنم و اون رو بهترین دیسترو واسه وب‌سرور می‌دونم هم اوبونتوی مسخره و هم سنت‌اواس رو توضیح می‌دم:
:I) Ubuntu
$ sudo a2enmod proxy
$ sudo a2enmod proxy_http
$ sudo a2enmod proxy_balancer
$ sudo a2enmod lbmethod_byrequests
ما تا اینجای کار ماژول‌های لازم رو اینیبل کردیم، حالا باید به آپاچی بفهمونیم وقتی فلان چیز خواسته شد تو اینو ارائه بده، بخاطر این کار کانفیگ آپاچی رو باز می‌کنیم:
$ sudo vi /etc/apache2/apache.conf
# باید لاین زیر رو به ته آپاچی اضافه کنیم که ینی آدرس فلان رو به پورت چنان منتقل کنه
# ProxyPass /felan http://localhost:xxxx
# حالا کار تمومه و فقط لازمه آپاچی رو ریستارت کنید
$ sudo systemctl restart apache2.service
کار اوبونتو اینجا تموم می‌شه یا حداقل توی اون کیس تمام شد.

:II) CentOS
$ sudo vi /etc/httpd/conf/httpd.conf
# حالا دو خط زیر رو به فایل کانفیگ اضافه می‌کنیم
# LoadModule proxy_module modules/mod_proxy.so
# LoadModule proxy_http_module modules/mod_proxy_http.so

# حالا که ماژول‌های لازم رو اد کردیم، لازمه کانفیگ رو جوری تغییر بدیم که مثل بالا (اوبونتو) عمل کنه
# ینی باید لاین زیر رو به ته آپاچی اضافه کنیم که ینی آدرس فلان رو به پورت چنان منتقل کنه
# ProxyPass /felan http://localhost:xxxx
# حالا کار تمومه و فقط لازمه آپاچی رو ریستارت کنید
$ sudo systemctl restart httpd
اگر فکر می‌کنین کار همینجا تمومه کور خوندین. سنت‌اواس خسته‌تر ازین چیزاس. با توجه به تنظیمات خاص SELinux و داستانای کلا فایروال سنت‌اواس، کار ما ممکنه توش خللی ایجاد بشه، ینی ممکنه شما آدرس رو درست بزنید اما ارور ۵۰۳ ریترن بشه. این ینی فایروال سیک کانکشن رو زده. من واسه حل این مشکل یه بولین داینامیک ست کردم اول:
$ sudo /usr/sbin/setsebool httpd_can_network_connect 1
و دیدم هورا! جواب داد. اما نکته اینجاست که وقتی شما بصورت داینامیک سیو می‌کنید با هربار ریستارت سرور که ممکنه زیاد اتفاق بی‌افته مجبورید همون بولین رو دوباره ست کنید، پس بنظرم بهتره Permanantـش کنیم با دستور:
$ sudo  /usr/sbin/setsebool -P httpd_can_network_connect 1
و بله مشکل حل شد. حالا من هرچندبار که سرورم رو ریستارت کنم، بازم شما می‌تونید توی آدرس http://aliyoonesi.info/amin نودجی‌اس منو ببینید که البته با توجه به گشادی من، چیز خاصی نیست جز این تکه کد که روی پورت ۸۰۰۰ جا خوش کرده:
var http = require('http');
console.log('Server running on port 8000');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello form NodeJS in Apache!\nby Ali Yoonesi');
}).listen(8000, '127.0.0.1');

فارغ از بحث‌های تکنیکی، سوالی که پیش میاد اینه که واقعا استفاده از نود روی آپاچی کار درستیه؟ جواب کلی می‌گه بستگی داره. اگر بخوایم یک سیستم محدود با کار ساده بسازیم، مثلا فقط قسمت داشبورد ادمین نود باشه، اوکیه هرچند پیشنهاد نمی‌شه. اما اگر لازم باشه دو اپ سنگین در کنار هم باشن یکی مثلا لاراول و دیگری اکسپرس، بهتره آپاچی رو روی پورتی بجز ۸۰ ران کرد، نود رو هم همینطور. و با استفاده از چیزی مثل vanish یا HA proxy ترافیک رو روت کرد.