بررسی خودمونی روش های راه اندازی Node js در کنار Apache

قدیمیا می گفتن که دو پادشاه در یک اقلیم نمی گنجد...در دنیای سرور و اینا هم می گن که دو تا وب سرویس در یک سرور نگنجد!

البته اینقدر زود نتیجه گیری نمی کنم. اولا غیر ممکن نداریم و دوما ما با شرایطی روبرو هستیم که ناگزیر باید دوتا وب سرویس رو توی سرور مون بیاریم بالا. مثلا یک مورد متداول اینه که ما سایتمون Angular باشه و بخوایم وبلاگ رو با وردپرس داشته باشیم. خب Node js برای بالا آوردن وردپرس مناسب نیست! و تا جایی که من بلدم بهتره از Litespeed یا apache یا Nginx استفاده کنیم. روش هایی که می دونم می شه این دو تا پادشاه رو کنار هم داشت:

۱- پروکسی یا Reverse Proxy

در این مطلب با استفاده از همین روش من یک تست Benchmark ساده و مبتدیانه رو انجام دادم. این رو من خیلی توی سرچ های گوگلم دیدم. وقتی سرچ می کردم که چجوری می تونم Node js رو در کنار apache ستاپ کنم در بیشتر موارد همین کار توصیه شده بود. خب منم اول همین کارو انجام دادم ولی به مشکلات زیر برخورد کردم:

۱- بک اند Node js مون بی اندازه کند شده بود (از اونجایی که با ip:port سرعت ۳ تا ۴ برابر بیشتر از دامنه بود که از apache عبور می کرد)

۲- خود آپاچی کند تر از سایر وب سرویس هاست و این خودش تاثیر بالایی داشت روی کارایی فرانت

۳- کلا خیلی اعصاب خورد کن بود و request های متعددی پیش میومد که اررور timeout میداد

با کانفیگ apache زیر این کارو برای دامنه ی api.example.com انجام دادم (مثلا اگه Node js روی پورت ۳۰۰۰ ران باشه) و این در حالی بود که دامنه ی example.com میومد فایل index.php رو اجرا می کرد (همون وبلاگ وردپرسی که گفته بودم)

ProxyRequests off
<Proxy *>
        Order deny,allow
        Allow from all
 </Proxy>
 ProxyPass / https://localhost:3000/
 ProxyPassReverse / https://localhost:3000/

و با این کانفیگ یه همچین اتفاقی می افته (راستش من خودم اینطوری فهمیدم!)

۲- پورت فورواردینگ یا Port Forwarding

بعد از چند روز کلنجار رفتن و سرچ های وحشیانه و البته یک کلمه ی گهربار از یکی از دوستان سرور کار حرفه ای به این نتیجه رسیدیم که بایستی یه ip استاتیک دیگه بخریم و با استفاده از port forwarding که توسط firewall اجرا می شه بیایم پورت ۸۰ و ۴۴۳ اون ip تازه خریداری شده رو فوروارد کنیم به پورت های Node js Server مورد نظر. نتیجه باورنکردنی بود نسبت به روش قبلی. خیلی ساده و عالی و دوست داشتنی بعد از چند روز تلاش شبانه روزی و سردرد و قهوه خوردن!

توی cent os با استفاده از command زیر خیلی ساده این کارو کردم (توی توزیع های این خانواده می شه iptables)

iptables -t nat -A PREROUTING -d <ip> -p tcp --dport 80 -j REDIRECT --to-ports 3000
sudo service iptables save

و در نتیجه ی این کامند اتفاق زیر می افته:

این تجربه ای بود که من توی کار بهش برخورد کردم و نمی دونم شاید روش های دیگه ای هم هست برای حل این مشکل... من شما رو با سرور های زیر دستتون تنها می ذارم دیگه خودتون می دونید!