بهزاد شعبانی

توسعه دهنده پی‌اچ‌پی و لاراول

راه‌اندازی سرور با Nginx برای لاراول

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

ابزارهای مورد نیاز

اولین چیزی که نیاز دارید، یک سرور هست. این سرور می‌تونه سرور اختصاصی باشه، سرور مجازی باشه، یا حتی هاست با دسترسی ssh و سطح دسترسی root باشه (نمی‌دونم جایی اصلا همچین سرویسی ارائه میده یا نه). پس فرقی نداره سرورتون از چه نوعیه، تنها چیزی که نیاز داریم ssh و سطح دسترسی root برای نصب ابزارهای مورد نیاز هست.

امکان راه‌اندازی لاراول در سرویس‌های هاستینگ، بدون ssh هم وجود داره، اما خارج از مبحث فعلی هست و در موردش صحبت نمی‌کنم.

این نکته رو هم در نظر داشته باشید که در استفاده از سرویس‌های هاستینگ با مشکلاتی از قبیل قدیمی بودن ورژن php و نصب نبودن Extensionهای php مورد نیاز لاراول، مواجه خواهید شد.

برای اتصال به سرور اگر از سیستم‌عامل ویندوز استفاده می‌کند از طریق برنامه PuTTY یا برنامه‌های مشابه و اگر از سیستم‌عامل‌های Mac و یا لینوکس استفاده می‌کنید، از طریق ترمینال، استفاده می‌کنیم.

$ ssh username@server_ip_address

در این مطلب، سیستم‌عامل سرور ubuntu 14.04 در نظر گرفته شده. دستورات در سایر سیستم‌عامل‌ها تفاوت چندانی جز دستورات مربوط به Package Manager سیستم‌عامل ندارد.

نصب برنامه‌های مورد نیاز

حالا که به سرور متصل شدیم، شروع می‌کنیم به نصب برنامه‌هایی که بهش نیاز داریم. قبل از هرکاری اول ریپازیتوری اوبونتو رو به روزرسانی می‌کنیم

$ sudo apt-get update

در صورتی که با یوزر root به سرور متصل شدید نیاز به نوشتن sudo ابتدای دستورات نیست.

بعد از به روزرسانی ریپازیتوری اوبونتو نوبت به نصب برنامه‌های مورد نیاز، php و nginx می‌رسه.

$ sudo apt-get install curl git nginx php5-fpm php5-cli php5-mcrypt

به curl برای نصب composer و به git برای دریافت فایل‌هامون نیاز داریم. اگه مایل به استفاده از git نیستید، می‌تونید FTP Server رو بر روی سرورتون نصب و راه اندازی کنید و از طریق FTP فایل‌هاتون رو به سرور منتقل کنید. اما پیش‌نهاد من بهتون استفاده از git به دلیل سادگی در استفاده هست.

پیکربندی و راه‌اندازی php

بعد از نصب برنامه‌های مورد نیاز، باید اون‌ها رو پیکربندی بکنیم.از پیکربندی php شروع می‌کنیم. اولین قدم، باز کردن فایل تنظیمات php-fpm که nginx از اون استفاده می‌کنه هست. فایل php.ini زیر رو با vim و یا nano باز کنید.

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

دنبال عبارت cgi.fix_pathinfo بگردید. از حالت کامنت درش بیارید و مقدارش رو برابر با 0 قرار بدید و فایل رو ذخیره کنید.

cgi.fix_pathinfo=0

این دستور به php میگه، در صورتیکه اسکریپت درخواستی وجود نداشت، برای اجرای اسکریپت با نام مشابه تلاش نکنه. این تنظیم از اهمیت بالایی برخورداره چرا که اینگونه رفتارها از سمت php به اتکرها و هکرها این اجازه رو می‌ده که درخواستی رو طراحی کنند که php رو وادار به اجرای اسکریپتی کنه که نباید اجرا بشه.

مرحله بعدی فعال کردن اکستنشن MCrypt هست که لاراول به اون وابسته‌ست. با استفاده از دستور php5enmod می‌تونیم به راحتی این کار رو انجام بدیم.

$ sudo php5enmod mcrypt

بعد از این کار، برای اعمال شدن تغییراتی که انجام دادیم، سرویس php-fpm رو ریستارت می‌کنیم.

$ sudo service php5-fpm restart

انتقال فایل‌های پروژه روی سرور

من معمولا برای انتقال فایل‌های پروژه به سرورم از git استفاده می کنم. اگه پروژه‌تون closed source هست و یا فعلا قصد عمومی کردن سورس کد رو ندارید، می‌تونید از سایت‌های bitbucket و gitlab برای هاست ریپازیتوری git استفاده کنید. این دو سایت ریپازیتوری خصوصی رایگان در اختیارتون قرار میدن.

بعد از اینکه فایل‌های پروژه رو به ریپازیتوری git انتقال دادید (اصطلاحا push کردید)، روی سرور به مسیر دلخواهتون، مثلا /var/www/ برید و پروژه رو در اون مسیر clone کنید.

پیکربندی nginx

در این مرحله باید مسیر ریشه پروژه رو به nginx بدیم تا بدونه اسکریپت‌ها رو از کجا بخونه و اجرا کنه. (منظور از ریشه پروژه جایی هست که فایل index در اون قرار داره. در لاراول فایل index.php در فولدر public قرار داره). برای این کار باید یک Server Block داشته باشیم. وب سرور nginx به طور پیش‌فرض یک Server Block به نام default داره، که ما در اینجا می خوایم، اون فایل رو ویرایش کنیم. فایل رو با ادیتور باز کنید.

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

محتوای فایل بدون درنظر گرفتن کامنت‌ها به شکل زیره.

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

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

    server_name localhost;

    location / {
            try_files $uri $uri/ =404;
    }
}

اولین چیزی که در این فایل باید تغییر بدیم مسیر ریشه پروژه هست. با فرض اینکه پروژه در مسیر /var/www/laravel/ باشه، پارامتر root رو به این شکل تغییر بدید.

root /var/www/laravel/public;

در خط بعد لیست فایل‌های index قرار گرفته، index.php رو قبل از بقیه فایل‌ها قرار بدید.

index index.php index.html index.htm;

ترتیب قرار گیری indexها مهم هست، در صورتیکه وب سرور index اول رو در مسیر مشخص شده پیدا نکنه، به سراغ بعدی می‌ره. ولی اگر اولین index وجود داشته باشه بقیه indexها رو نادیده می‌گیره.

در خط بعد server_name رو به دامنه خودتون تغییر بدید.

server_name www.domain.com domain.com;

همچنین باید نحوه هندل کردن درخواست‌ها رو توسط nginx تغییر بدیم. این کار از طریق دستور try_files انجام می‌گیره. ما می‌خوایم که nginx ابتدا درخواست رو به شکل فایل فرض کنه و اگر فایل پیدا نشد، درخواست رو یک directory فرض کنه و سعی کنه فایل index در اون directory رو اجرا کنه و در نهایت اگر همچین مسیری رو هم پیدا نکرد، درخواست رو به عنوان query string به فایل index.php پاس بده. برای پیاده سازی این روند تغییرات زیر رو اعمال کنید.

location / {
    try_files $uri $uri/ /index.php?$query_string;
}

در نهایت برای اجرای فایل‌های php، باید یک Location Block جداگانه به شکل زیر بنویسیم.

location ~ \.php$ {
    try_files $uri /index.php =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

با استفاده از دستورات fastcgi ابتدا مشخص کردیم که مسیر درخواست به چه شکل به اسکریپت مربوطش متصل بشه و اجرا بشه، در ادامه مشخص کردیم که nginx از سوکت php-fpm برای اجرای اسکریپت‌های php استفاده کنه و اینکه از فایل index.php به عنوان فایل index برای انجام عملیات استفاده کنه.

در نهایت محتوای فایل به شکل زیر خواهد بود:

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /var/www/laravel/public;
    index index.php index.html index.htm;

    server_name server_domain_or_IP;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}    

بعد از ذخیره کردن فایل، nginx رو باید ریستارت کنیم.

$ sudo service nginx restart

در صورتی که بیشتر از یک پروژه روی سرورتون دارید، باید Server Block جداگانه برای هر پروژه بسازید.

نصب Composer

تقریبا تنظیمات اصلی سرور تموم شد. حالا باید کامپوزر رو نصب کنیم و بعد از اون بریم سراغ لاراول. به ریشه سرور برید و برای نصب کامپوزر دستور زیر رو بزنید.

$ cd ~
$ curl -sS https://getcomposer.org/installer | php

برای اینکه دسترسی سریع‌تر و راحت‌تر به دستور composer داشته باشید، فایل composer.phar رو به مسیر /usr/local/bin/ منتقل کنید.

$ sudo mv composer.phar /usr/local/bin/composer

نصب وابستگی‌های لاراول

به پوشه‌ای که پروژه در اون قرار داره برید و دستور composer install رو بزنید.

$ cd /var/www/laravel
$ composer install

وقتی روی سیستم شخصی خودتون دستور composer update رو می‌زنید، فایلی به نام composer.lock تولید میشه. در این فایل نسخه و مسیر دانلود پکیج‌هایی که در پروژه از اون‌ها استفاده کردید ذخیره میشه. بعد از هر بار اجرای composer update این فایل رو در گیت commit کنید. وقتی روی سرور دستور composer install رو بزنید، این فایل خونده می‌شه و عملیات دانلود کردن پکیج‌ها و وابستگی‌ها سریع‌تر انجام می‌گیره.

تنها نکته‌ای که باقی مونده، تغییر سطح دسترسی فولدر storage هست.

اگه از لاراول ۴ استفاده می‌کنید، دستور زیر:

$ sudo chmod -R o+w app/storage

و اگه از لاراول ۵ استفاده می‌کنید، دستور زیر:

$ sudo chmod -R o+w storage

خب همه چی آماده‌ست، مرورگرتون رو باز کنید، دامنه‌تون رو وارد کنید. اگر همه مراحل رو به درستی انجام داده باشید، وبسایت براتون باز می‌شه.

امیدوارم تونسته باشم کمکتون کنم :)

comments powered by Disqus