مقدمه

زمانی که قصد راه اندازی یک سایت و یا یک برنامه دارید باید در یک سری از موارد تصمیم گیری کنید. گاهی اوقات نیازمندیهای شما تغییر می کند، فناوریهای جدیدی شکل می گیرند، یا پایگاه کاربران شما به شکل غیرمنتظره افزایش می یابد. صرفنظر از دلایل شما، یکی از اجزای سازنده برنامه شما که می توانید در نظر بگیرید، تغییر وب سرور سرور مجازی تان است.
اگرچه وب سرور آپاچی در حال حاضر محبوبترین و رایجترین وب سرور در جهان است، Nginx به سرعت در حال افزایش سهم خود است. این تعجب آور نیست چرا که Nginx می تواند با استفاده از منابع کمی عملکرد خوبی داشته باشد. در بسیاری از وبسایتها مهاجرت به Nginx می تواند باعث بهبود عملکرد و کارآیی شود.
در این راهنما، ما در مورد چگونگی انتقال یک وبسایت از آپاچی به روی VPS Ubuntu 12.04 توضیح خواهیم داد. ما سعی می کنیم که پیشنهادات و توصیه های کلی را ارائه دهیم، اما به شما نکاتی را نیز می گوییم که ممکن است برای رسیدن به اهداف خاص خود به آنهانیاز داشته باشید.
در این راهنما فرض می شود که شما یک بسته LAMP (لینوکس، آپاچی، MySQL, PHP) با استفاده از این این آموزش را نصب کرده اید. اگر هنگام نصب به سادگی تصویر one-click LAMP را انتخاب کرده باشید، سرور مجازی شما این پیکربندیها را خواهد داشت.

نصب Nginx در سرور مجازی:

اولین کاری که برای انتقال وبسایتمان انجام می دهیم نصب نرم افزار سرور مجازی جدید ما است. این کار به امکان می دهد تا سرور مجازی جدیدمان را با توجه به فایلهای پیکربندی آپاچی جاری به عنوان یک راهنما، تنظیم و پیکربندی کنیم.
خوشبختان Nginx در مخازن توزیعات اوبونتو به صورت پیش فرض وجود دارد. بیایید آن را نصب کنیم:

sudo apt-get update
sudo apt-get install nginx

یک نکته مهم اجرایی که در زمینه کاربرد ما بسیار اهمیت دارد این است که Nginx هر پردازش پویا را به صورت یک پروسه جداگانه پیاده سازی می کند. این کار به Nginx اجازه می دهد تا سبک و سریع باقی بماند. می تواند بر روی عملکرد اصلی خود تمرکز کند بدون اینکه مجبور باشد تا برای اضافه کردن پشتیبانی PHP از طریق ماژول تلاش کند. بجای آن، فقط آن به برنامه ای واگذار می کند که به برای همین مقصود ساخته شده است.
در اینجا باید به این نکته اشاره کنیم که ما همچنین نیاز به نصب یک کنترل PHP به منظور پردازش اسکریپتهای PHP داریم. گزینه استاندارد PHP5-fpm است که به خوبی با Nginx کار می کند:

sudo apt-get install php5-fpm

شما باید تمام نرم افزارهای مورد نیاز برای انتقال وبسایت خودتان بر روی Nginx را داشته باشید. ما هنوز نیاز داریم تا نرم افزارمان را پیکربندی کنیم تا پیکربندی که آپاچی تحت آن در حال اجرا بود را تقلید کنیم.

راه اندازی پیکربندی تست Nginx در سرور مجازی

از آنجا که در حال حاضر آپاچی در حال اجرا است، اگر بتوانیم تمایل داریم که سرور مجازی Nginx خود را به شکل مستقل از آپاچی پیکریندی کنیم تا اینکه وبسایت ما در حین انتقال فعال و عملیاتی باقی بماند.
این به سادگی تست Nginx بر روی یک پورت جایگزین است تا زمانی که آماده تغییرات نهایی بشویم. از این طریق ما می توانیم به طور همزمان دو سرور مجازی را اجرا کنیم.
با باز کردن فایل پیکربندی پیش فرض سایت Nginx شروع کنید:

sudo nano /etc/nginx/sites-available/default

در بخش server { یک دستور listen اضافه کنید تا به Nginx بگوید بر روی یک پورت به غیر از پورت ۸۰ گوش دهد(که آپاچی هنوز از آن برای درخواستها استفاده می کند). ما در این آموزش از پورت ۸۰۰۰ استفاده می کنیم.

server {

listen 8000;
. . .
. . .

 

فایل بالا را دخیره کرده و آن را ببندید. زمانی مناسبی است تا بررسی کنیم که آیا می توانیم به سرور مجازی Nginx دسترسی داشته باشیم یا خیر. تست Nginx را به صورت زیر آغاز کنید:

sudo service nginx start

از شماره پورتی که برای دسترسی به پیکربندی پیش فرض Nginx تنظیم کردیم استفاده کنید. آدرس زیر را در مرورگر خود وارد کنید:

http://your_ip_or_domain:8000

نسخه آپاچی شما باید هنوز بر روی پورت پیش فرض ۸۰ کار کند. می توانید این مورد را بازدید از وبسایت خود بدون :۸۰۰۰ در پایان آدرس امتحان کنید (در مثال ما صفحه پیش فرض آپاچی نمایش داده می شود. اگر شما وبسایت خود را پیکربندی کرده باشید، آن را مشاهده خواهید کرد):

http://your_ip_or_domain

 

 

ترجمه پیکربندی آپاچی

حال که سرور مجازی شما راه اندازی شده و در حال اجرا است، می توانید انتقال و ترجمه پیکربندی آپاچی خود را برای استفاده با Nginx شروع کنید. این کار باید به صورت دستی انجام شود، پس بسیار مهم است که شما بدانید که Nginx چگونه پیکربندی می شود.
این کار بطور عمده مربوط به نوشتن بلوکهای سرور Nginx می باشد که به مثابه سرورهای اختصاصی آپاچی می باشند. آپاچی این فایلها را در مسیر /etc/apache2/sites-available/ نگه می دارد و Nginx بلوکهای سرور خود را در مسیر /etc/nginx/sites-available/ در اوبونتو نگه می دارد.
برای هر اعلانی از سرور مجازی شما یک بلوک سرور خواهید ساخت. اگر نگاهی به فایلهای آپاچی بیندازید، احتمالا هاستهای اختصاصی شبیه زیر را پیدا خواهید کرد:

ServerAdmin webmaster@your_site.com
ServerName your_site.com
ServerAlias www.your_site.com

DocumentRoot /var/www
Options FollowSymLinks
AllowOverride None
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all

ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined

Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128

 

ما می توانیم با استفاده از این تنظیمات نوشتن بلوک سرور Nginx را شروع کنیم. در مسیر /etc/nginx/sites-available/ ، فایلی که قبل از اعلان پورت Nginx ویرایش کردیم را باز کنید:

sudo nano /etc/nginx/sites-available/default

فعلا به خطوط کامنت شده توجه نکنید، باید چیزی شبیه این باشد:

server {
listen 8000;

root /usr/share/nginx/www;
index index.html index.htm;

server_name localhost;

location / {
try_files $uri $uri/ /index.html;
}

location /doc/ {
alias /usr/share/doc/;
autoindex on;
allow 127.0.0.1;
deny all;
}
}

 

شما احتمالا باید تعدادی آیتم ببینید که متناظر با پیکربندی آپاچی هستند. در حالت کلی، ترجمه دستورات اصلی به شکل زیر است:

Apache Nginx
------ ------

server {
listen 80;

ServerName yoursite.com
ServerAlias www.yoursite.com server_name yoursite.com www.yoursite.com;

DocumentRoot /path/to/root root /path/to/root;

AllowOverride All (No Available Alternative)

DirectoryIndex index.php index index.php;

ErrorLog /path/to/log error_log /path/to/log error;

CustomLog /path/to/log combined access_log /path/to/log main;

Alias /url/ "/path/to/files" location /url/ {
<Directory "/path/to/files"> alias /path/to/files;

 

اگر ما بخواهیم یک بلوک سرور را ایجاد کنیم که از قابلیتهای فایل میزبان مجازی بالا تبعیت کند، چیزی شبیه کد زیر خواهد بود:

server {
listen 8000; # We're deliberately leaving this as-is to avoid conflict at the moment

root /var/www;
server_name your_site.com www.your_site.com;

location / {
try_files $uri $uri/ /index.html;
}

location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}

location /doc/ {
alias /usr/share/doc/;
autoindex on;
allow 127.0.0.1;
deny all;
}

location ~/\.ht {
deny all;
}

}

 

ما بعضی از آیتمها را حذف کردیم و همچنین خطوطی به کد اضافه کردیم که باید در مورد آنهاتوضیح دهیم.
اول اینکه، خطوط ثبت گزارش خطاها از پیکربندی حذف شده است. اینکار بخاطر این است که آنها قبلا در فایل /etc/nginx/nginx.conf تعریف شده اند. این کار یک پیش فرض برای ما فراهم می کند که از آن استفاده خواهیم کرد.
ما همچنین دستور ServerAdmin را حذف کردیم زیرا Nginx این اطلاعات را صفحات خطای خود نگنجانده است.
کنترلر PHP مقدار تغییر کرده است. با توجه به این واقعیت که PHP به صورت جداگانه در Nginx کنترل می شود، ما این فایلها را به برنامهphp-fpm که قبلا آن را نصب کرده ایم ارجاع داده ایم. این کار به وسیله یک سوکت انجام شده است (که لازم است به صورت لحظه ای پیکربندی شود).
بخش مستندات تغییر کرده تا مستندات مربوط به  Nginxرا نشان دهد. در غیر اینصورت به صورت کاملا مشابهی عمل خواهد کرد. .htaccess
نهایتا اینکه، ما Nginx را تنظیم کردیم که دسترسی به هر فایل .htaccess و یا هر فایلی که با .ht شروع می شود در مسیر دایرکتوری را رد کند. این فایلها مخصوص پیکربندی آپاچی هستند، و با Nginx کار نخواهند کرد. بهتر است که برای حفظ امنیت این فایلهای پیکربندی افشا نشوند.
پس از انجام تغییرات فایل را ذخیره کرده و ببندید.
باید سرور Nginx  را مجددا راه اندازی کنیم تا این تغییرات صورت پذیرد:
sudo service nginx restart
پیکربندی و تنظیم PHP-FPM
حال که اکثر تنظیمات مربوط به Nginx  را انجام دادیم، باید تنظیمات php-fpm را تغییر دهیم تا با استفاده از کانالهایی که ما تعیین کردیم، ارتباط برقرار کند.
برای شروع این کار، باید ابتدا فایل php.ini را طوری تغییر دهیم که فایلها را به صورت ناامن اجرا نکند.

sudo nano /etc/php5/fpm/php.ini

خطی که ما نیاز داریم آن را تغییر دهیم PHP را ملزم می سازد تا دقیقا فایل درخواست شده را اجرا کند، بجای اینکه حدس بزند که آیا یک تطابق ناکامل وجود دارد یا خیر. این کار باعث می شود تا php اطلاعات و داده های حساس را به شخصی که احتمالا از نقطه ضعفهای کنترلر php سوءاستفاده می کند، نشان داده نشود.
خطی که دستور cgi.fix_pathinfo در آن قرار دارد را پیدا کرده آن را به شکل زیر اصلاح کنید:

cgi.fix_pathinfo=0

این فایل را ذخیره کرده و ببندید.
در ادامه ما نحوه اتصال php-fpm به سرور مجازی را تغییر خواهیم داد. فایل زیر را در ویرایشگر خود باز کنید:

sudo nano /etc/php5/fpm/pool.d/www.conf

دستور listen را پیدا کرده و آن را تغییر دهید تا با مقادیری که در فایل پیکربندی بلوک سرور مجازی قرار دادیم مطابقت داشته باشد:

listen = /var/run/php5-fpm.sock

اگر در رسیدگی به درخواستهای php زیادی به مشکل بر خورد کردید، احتمالا باید به این فایل برگشته و تعداد پروسه های فرزند ممکن را افزایش دهید. خطی که باید تغییر دهید خط زیر است:
pm.max_children = Num_of_children ->تعداد فرزند
فایل را ذخیره کرده و ببندید.
اکنون برنامه php-fpm باید به درستی پیکربندی و تنظیم شده باشد. باید مجددا آن را راه اندازی کنیم تا تغییرات اعمال شوند.

sudo service php5-fpm restart

بهتر است که نگین را نیز مجددا راه اندازی کنیم:

sudo service nginx restart

امتحان کنید تا ببینید که آیا تمام فایلهای PHP که در مسیر ریشه (root) دارید به درستی عمل می کنند یا خیر. شما باید قادر باشید تا فایلهای PHP را به همان شکلی که در آپاچی بودند اجرا کنید.
اگر ما به فایل info.php که در آموزش LAMPاوبونتو ساختیم دسترسی ایجادکنیم؛ آنگاه به شکل زیر خواهد بود:

http://your_ip_or_domain:8000/info.php

 

در بخش متغیرهای PHP(PHP Variables )، شما باید ببینید که Nginx  به عنوان یک متغیر “” در لیست قرار گرفته است:

 

انتقال سایت به Nginx

پس از اینکه آزمایشهای گسترده ای انجام دادید، می توانید سعی کنید تا سایت خودتان را به صورت یکپارچه از آپاچی به  Nginx منتقل کنید. این کار ممکن است چرا که هیچ یک از این سرورهای مجازی تا قبل از راه اندازی مجدد تغییرات را اعمال نخواهند کرد. این موضوع به ما این امکان را می دهد تا همه چیز را تنظیم کنیم، و سپس در یک لحظه آنها را اعمال کنیم.
تنها چیزی که لازم است تغییر دهیم پورت بلاک سرور Nginx است. فایل زیر را باز کنید:

sudo nano /etc/nginx/sites-available/default

پورت را به مقدار پیش فرض ۸۰ تغییر دهید. این کار این امکان را فراهم می کند که پس از راه اندازی مجدد ترافیک HTTP معمولی را بپذیرد.

server {
# listen 8000;
listen 80;
. . .

فایل را ذخیره کرده و آن را ببندید.
اگر شما فقط تعدادی از سایتهای خود را به Nginx منتقل می کنید و به اجرای بعضی از محتویات در آپاچی ادامه می دهید، لازم است که سرور مجازی های آپاچی را که بر روی پورت ۸۰ کار می کنند را غیرفعال کنید. این کار برای جلوگیری از اجتناب و تضاد ضروری است. اگر این کار به شکل صحیح انجام نشود، آنگاه  Nginx شروع نخواهد شد، چرا که پورت قبلا اشغال شده است.
اگر شما تصمیم دارید که همچنان به اجرای آپاچی ادامه دهید، فایلها و مکانهای زیر را برای استفاده پورت ۸۰ بررسی کنید:

/etc/apache2/ports.conf
/etc/apache2/apache2.conf
/etc/apache2/httpd.conf

/etc/apache2/sites-enabled/ ## تمام سایتهای این مسیر را جست و جو کنید
پس از اینکه مطمئن شدید که تمام پورتهای لازم را تغییر داده اید، می توانید هر دو سرویس را به شکل زیر مجددا راه اندازی کنید:
sudo service apache2 reload && sudo service nginx reload
آپاچی باید مجددا بارگذاری شده و پورت ۸۰ را آزاد می کند. بلافاصله پس از آن، Nginx بارگذاری شده و اتصالات از آن پورت را می پذیرد. اگر همه چیز به خوبی پیش برود، سایت شما باید اکنون توسط Nginx سرویس دهی شود.
اگر شما قصد ندارید که دیگر از آپاچی برای سرویس دهی به هیچ قسمتی از سایت خود استفاده کنید، می توانید کلا پروسه وب آن را متوقف کنید:

sudo service apache2 stop && sudo service nginx reload

 

اگر شما دیگر از آپاچی استفاده نمی کنید، می توانید آن را حذف کنید. شما به راحتی می توانید با نوشتن دستور زیر به فایلهای مرتبط با آپاچی دست پیدا کنید:

dpkg --get-selections | grep apache
apache2 install
apache2-mpm-prefork install
apache2-utils install
apache2.2-bin install
apache2.2-common install
libapache2-mod-auth-mysql install
libapache2-mod-php5 install

سپس می توانید آنها را با دستور apt-get حذف کنید. به عنوان مثال:

sudo apt-get remove apache2 apache2-mpm-prefork apache2-utils apache2.2-bin apache2.2-common libapache2-mod-auth-mysql libapache2-mod-php5

همچنین می توانید تمام بسته های وابسته که دیگر نیازی به آنها نیست را حذف کنید.
sudo apt-get autoremove

عوارض انتقال

چیزهای کمی در دنیای آپاچی وجود دارد که ممکن است هنگامی که می خواهید به Nginxمهاجرت کنید شما را سردرگم می سازد.

بازنویسی ترجمه ها و فایلهای .htaccess

یکی از تفاوتهای اساسی این است که Nginx اهمیتی به اورراید دایرکتوریها نمی دهد. آپاچی از فایلهای .htaccess همراه با یک دستور AllowOverride All در بلوک مکان استفاده می کند. این کار به شما این امکان را می دهد تا پیکربندیهای مخصوص هر دایرکتوری را در درون دایرکتوری نگه دارنده فایلها قرار بدهید.
Nginx این فایلها را ندارد. نگهداری تنظیمات با فایلها اگر به خوبی پیکربندی نشود یک مشکل امنیتی بالقوه است ، و به سادگی می توان به فایلهای پیکربندی متمرکز دسترسی داشت و نمی توان تشخیص داد که تنظیمات از طریق یک فایل .htaccess بازنویسی شده است یا خیر.
در نتیجه تمام پیکربندیهایی که شما در یک فایل .htaccess فعال لیست کرده اید، باید در بلوک مکان در بلوک سرور برای آن هاست قرار داده شود. این کار به طور کلی زیاد پیچیده نیست، اما باید تمام این قوانین را همانند آنچه که برای تعریف هاستهای مجازی انجام دادید، ترجمه کنید.
یک چیز رایجی که در فایلهای .htaccess نگهداری می شود قوانین ماژول مدبازنویسی آپاچی است، که باعث می شود آدرسهای URLها کاربرپسندانه تر باشند. Nginx نیز یک ماژول بازنویسی مشابه دارد اما از ترکیب و ساختار متفاوتی بهره میگیرد. متاسفانه بازنویسی URLها در nginx خارج از حوزه و دامنه این راهنما است.

عوارض پیکربندی خارجی و ماژول

نکته دیگری که باید به آن توجه داشت این است که شما نیاز دارید تا از قابلیتهایی که ماژولهای آپاچی که فعال کرده اید برای شما فراهم می کردند آگاه باشید.
یک مثال ساده ماژول dir است. هنگامی که این ماژول فعال شود، می توانید ترتیب فایلهایی که آپاچی تلاش می کند به آنها سرویس دهد را به عنوان یک شاخص مسیر از طریق قرار دادن یک خط شبیه خط زیر در فایل هاست مجازی تعیین کنید:

DirectoryIndex index.html index.htm

این خط رسیدگی به هاست مجازی را تعیین می کند. اگرچه، اگر این خط وجود نداشته باشد، و ماژول dir فعال باشد، آنگاه ترتیب سرویس دهی به فایلها توسط فایل زیر تعیین خواهد شد:

sudo nano /etc/apache2/mods-enabled/dir.conf

 

DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm

نکته مهم در اینجا این است که باید آگاه باشید که ممکن است یک ماژول یا یک منبع پیکربندی خارجی از هر نوع، ممکن است چیزی در پشت صحنه انجام دهد که شما باید در Nginx آن را به صراحت انجام دهید.
در این مثال، شما می توانید ترتیب مسیر index را در Nginx با اضافه کردن کد زیر به بلوک سرور تعیین کنید:

server {
. . .
index index.php index.html index.htm;
. . .

بسیار مهم است که این موضوع را در ذهن داشته باشید.
اگر شما درحال انتقال از یک پیکربندی سایت پیچیده هستید، نکته ای که می تواند مفید باشد این است که فایلهای پیکربندی جداگانه را کپی کرده و در یک فایل یکپارچه بچسبانید(paste) و به شکل سیستماتیک عمل کرده و هر خط را ترجمه کنید.
این کار ممکن است سردردآور باشد، اما برای ایجاد سرور مجازی، می تواند باعث صرفه جویی زیادی در وقت برای ردیابی آنچه که موجب بروز رفتار عجیب شد است که قادر به حل آن نیستید، باشد.

نتیجه گیری

پیچیدگی انتقال از آپاچی به Nginx تقریبا به طور کامل وابسته به میزان پیچیدگی پیکربندی خاص شما است. Nginx می تواند با منابع کمتری اکثر کارهایی که آپاچی انجام می دهد را انجام دهد. این بدین معنی است که سایت شما می تواند به راحتی به تعداد بیشتری از کاربران سرویس دهی کند.

اگرچه انتقال برای تمام سایتها معنی ندارد، و در حالیکه آپاچی یک سرور فوق العاده است که به اندازه کافی نیازهای بسیاری از پروژه ها را برآورده می سازد، اما شما با Nginx شاهد افزایش عملکرد یا افزایش مقیاس پذیری باشید. اگر  هنوز به آپاچی نیاز دارید، یک جایگزین است که از Nginx به عنوان یک پروکسی معکوس(reverse-proxy) برای سرور آپاچی استفاده کنید. این رویکرد می تواند نقاط قوت هر دو سرور مجازی را به شکل قدرتمندی با هم ترکیب کند.

 

 

منبع

ترجمه شده توسط : بابک طهماسبی

لینک کوتاه مقاله :