راهنمای نصب (Nginx ،MySQL ،PHP (LEMP روی اوبونتو – به زبان ساده

آخرین به‌روزرسانی: ۹ آبان ۱۳۹۷
زمان مطالعه: ۱۰ دقیقه

مجموعه نرم‌افزاری LEMP که اختصاری برای نرم‌افزارهای لینوکس، انجین‌ایکس، مای‌اس‌کیوال و پی‌اچ‌پی است به منظور ارائه صفحه‌های وب پویا و وب اپلیکیشن‌ها مورد استفاده قرار می‌گیرد. این عبارت اختصاری برای توصیف سیستم عامل لینوکس، با وب‌سرور Nginx است. داده‌های بک‌اند در پایگاه داده MySQL ذخیره می‌شود و وظیفه پردازش پویای داده‌ها نیز بر عهده زبان برنامه‌نویسی PHP است.

در این راهنما شیوه نصب پشته LEMP را روی سرور اوبونتو نسخه 18.04 با هم مرور می‌کنیم. سیستم عامل لینوکس اوبونتو نخستین موردی است که باید نصب شود. در ادامه شیوه اجرا و راه‌اندازی باقی کامپوننت‌ها را نیز ارائه خواهیم کرد.

پیش‌نیازها

پیش از این که به مطالعه این راهنما بپردازید، باید یک حساب معمولی غیر root روی سرور با دسترسی‌های sudo داشته باشید. اگر می‌خواهید در این مورد بیشتر بدانید، می‌توانید از «آموزش نصب توزیع اوبونتو» و همچنین راهنمای «راه‌اندازی اولیه سرورهای اوبونتو» استفاده کنید.

زمانی که کاربر مورد نظر را ایجاد کردید، آماده هستید تا بقیه مراحل این راهنما را مطالعه کنید.

گام 1: نصب وب‌سرور Nginx

برای نمایش صفحه‌های وب به بازدیدکنندگان وب‌سایت باید از Nginx که یک وب‌سرور کارآمد و مدرن محسوب می‌شود استفاده کنیم.

همه نرم‌افزارهای مورد استفاده در این روال از ریپازیتوری های بسته پیش‌فرض اوبونتو تهیه می‌شوند. این بدان معنی است که ما باید از سیستم مدیریت بسته apt برای نصب موارد ضروری کمک بگیریم.

از آنجا که این اولین بار است که از apt استفاده می‌کنیم، باید ابتدا اندیس بسته سرور را به‌روزرسانی کنیم. پس از آن می‌توانیم وب‌سرور را نصب کنیم:

sudo apt update
sudo apt install nginx

Nginx روی اوبونتو 18.04 طوری پیکربندی می‌شود که به محض نصب، اجرا شود.

اگر فایروال ufw چنان که در راهنمای راه‌اندازی اولیه تأکید شده است، در حال اجرا باشد، باید امکان اتصال به Nginx را فراهم سازید. Nginx خودش را بر روی ufw ثبت می‌کند و از این رو روال کار نسبتاً سرراست است.

معمولاً توصیه می‌شود که محدودترین پروفایل فعال شود، چون در این حالت نیز ترافیک مورد نظر برقرار می‌شود. از آنجا که ما هنوز SSL را برای وب‌سرور خود پیکربندی نکرده‌ایم، تنها به عبور ترافیک روی پورت 80 نیاز داریم.

این وضعیت با دستور زیر فعال می‌شود:

sudo ufw allow 'Nginx HTTP'

این تغییر را با وارد کردن دستور زیر می‌توان تأیید کرد:

sudo ufw status

خروجی دستور فوق نشان می‌دهد که ترافیک HTTP مجاز است:

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
Nginx HTTP                 ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

با اضافه شدن قاعده جدید به فایروال، اینک می‌توانید با دسترسی به نام دامنه یا آدرس IP در مرورگر وب تست کنید که آیا سرور راه‌اندازی شده است یا نه.

اگر نام دامنه‌ای دارید که به سرور اشاره می‌کند و آدرس IP سرور را نمی‌دانید، می‌توانید با اجرای دستور زیر آن را بفهمید:

ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'

در خروجی دستور فوق چند آدرس IP نمایش می‌یابند که می‌توانید آن‌ها را یک به یک روی مرورگر وب بررسی کنید.

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

curl -4 icanhazip.com

آدرسی که می‌خواهید در مرورگر وب داشته باشید را وارد کنید تا به صفحه فرود پیش‌فرض Nginx هدایت شوید:

http://server_domain_or_IP

اگر صفحه فوق را مشاهده کردید، یعنی Nginx با موفقیت نصب شده است.

گام 2: نصب MySQL برای مدیریت داده‌های سایت

اینک که وب‌سرور را داریم، باید MySQL را به عنوان یک سیستم مدیریت پایگاه داده نصب کنیم تا بتوانیم داده‌های سایت خود را ذخیره و مدیریت نماییم.

با دستور زیر می‌توانید MySQL را نصب کنید:

sudo apt install mysql-server-5.7

نرم‌افزار پایگاه داده MySQL اینک نصب شده است؛ اما پیکربندی آن هنوز کامل نیست.

برای امن ساختن نصب، یک اسکریپت به همراه MySQL ارائه می‌شود که از شما می‌پرسد می‌خواهید برخی مقادیر پیش‌فرض ناامن را تغیر دهید یا نه. این اسکریپت با دستور زیر فعال می‌شود:

sudo mysql_secure_installation

این اسکریپت از شما می‌خواهد که رمز عبوری برای استفاده از سیستم MySQL وارد کنید. پس از آن می‌پرسد که آیا می‌خواهید VALIDATE PASSWORD PLUGIN را پیکربندی کنید یا نه.

دقت کنید که فعال‌سازی این ویژگی شاید در مواردی موجب بروز مشکل شود. چون در صورت فعال‌سازی رمز عبورهایی که با معیارهای خاصی منطبق نیستند از سوی MySQL رد می‌شوند. بدین ترتیب در صورتی که از رمز عبور ضعیف همراه با نرم‌افزاری که به طور خودکار اطلاعات احراز هویت کاربر MySQL را تولید می‌کند، مانند بسته‌های اوبونتو برای phpMyAdmin استفاده کنید، با مشکل مواجه خواهید شد. غیر فعال ماندن این افزونه خطر چندانی ندارد؛ اما باید همواره از رمزهای عبور قوی و منحصر به فرد برای احراز هویت پایگاه‌های داده استفاده کنید.

با وارد کردن Y به جای yes این افزونه فعال می‌شود و در غیر این صورت با وارد کردن هر حرف دیگری از فعال‌سازی افزونه جلوگیری می‌کنید.

VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?
Press y|Y for Yes, any other key for No:

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

There are three levels of password validation policy:
LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1

اگر تأیید اعتبار رمز عبور را فعال کنید میزان قدرت رمز عبور کاربر موجود root به شما نمایش داده می‌شود و از شما سؤال می‌شود که آیا می‌خواهید این رمز عبور را تغییر دهید یا نه. اگر از رمز عبور خود راضی هستید با وارد کردن حرف N یا «no» در اعلان فرمان از این مرحله رد شوید:

Using existing password for root.

Estimated strength of the password: 100
Change the password for root? ((Press y|Y for Yes, any other key for No): n

در مورد بقیه سؤال‌ها باید حرف Y را وارد کرده و اینتر را در هر اعلان بزنید. بدین ترتیب برخی از کاربران ناشناس و پایگاه‌های داده تست حذف می‌شوند و ورودهای root ریموت غیر فعال می‌شوند و همچنین قواعد جدیدی که تعیین شده بلافاصله بارگذاری می‌شوند تا همه تغییراتی که ایجاد کردیم فعال شوند.

توجه داشته باشید که روی سیستم‌های اوبونتو که از MySQL 5.7 (و بالاتر) استفاده می‌کنند، کاربر root MySQL طوری تنظیم شده است که به طور پیش‌فرض به جای رمز عبور به وسیله افزونه auth_socket احراز هویت شود. بدین ترتیب امنیت بالاتری ایجاد می‌شود و کاربردپذیری نیز در موقعیت‌های مختلف افزایش می‌یابد؛ اما زمانی که می‌خواهید به برنامه بیرونی (مانند phpMyAdmin) برای دسترسی به این کاربر اجازه دسترسی بدهید، ممکن است مشکلاتی پیش بیاید.

اگر ترجیح می‌دهید هنگام اتصال به MySQL به عنوان root از رمز عبور استفاده کنید، باید روش احراز هویت را از auth_socket به mysql_native_password تغییر دهید. بدین منظور اعلان MySQL را در پنجره ترمینال باز کنید:

sudo mysql

سپس روش احراز هویت هر یک از حساب‌های کاربری MySQL را با استفاده از اعلان زیر بررسی کنید:

SELECT user,authentication_string,plugin,host FROM mysql.user;

خروجی

+------------------+-------------------------------------------+-----------------------+-----------+
| user             | authentication_string                     | plugin                | host      |
+------------------+-------------------------------------------+-----------------------+-----------+
| root             |                                           | auth_socket           | localhost |
| mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)

در این مثال، می‌بینید که کاربر root در واقع با استفاده از افزونه auth_socket احراز هویت می‌شود. برای پیکربندی حساب root جهت احراز هویت با یک رمز عبور، دستور ALTER USER را اجرا کنید. مطمئن شوید که password را به صورت رمز عبور قوی‌تری تغییر می‌دهید:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

سپس دستور FLUSH PRIVILEGES را اجرا کنید تا سرور مجدداً جدول‌های grant را بارگذاری کند و تغییرات جدید اجرایی شوند:

FLUSH PRIVILEGES;

روش‌های احراز هویت مورد استفاده از سوی هر یک از کاربران را مجدداً بررسی کنید تا مطمئن شوید که کاربر root دیگر با استفاده از افزونه auth_socket احراز هویت نمی‌شود:

SELECT user,authentication_string,plugin,host FROM mysql.user;

خروجی

+------------------+-------------------------------------------+-----------------------+-----------+
| user | authentication_string | plugin | host |
+------------------+-------------------------------------------+-----------------------+-----------+
| root | *3636DACC8616D997782ADD0839F92C1571D6D78F | mysql_native_password | localhost |
| mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)

در خروجی این مثال مشاهده می‌کنید که کاربر root MySQL با استفاده از رمز عبور احراز هویت می‌شود. زمانی که این وضعیت را روی سرور خود تأیید کنید، می‌توانید از پوسته MySQL خارج شوید:

exit

در این زمان سیستم پایگاه داده راه‌اندازی شده و می‌تواند به نصب PHP بپردازید.

گام 3: نصب PHP و پیکربندی Nginx برای استفاده از پردازنده PHP

اینک که Nginx را برای ارائه صفحه‌های وب و MySQL را برای ذخیره‌سازی و مدیریت داده‌ها روی سرور خود نصب کرده‌ایم، به چیزی نیاز داریم که محتوای دینامیک برای ما تولید کند. این همان جایی است که به PHP نیاز پیدا می‌کنیم.

از آنجا که Nginx مانند برخی وب‌سرورهای دیگر، دارای پردازنده بومی PHP نیست، باید php-fpm را که اختصاری برای عبارت «fastCGI process manager» است نصب کنید. ما از Nginx برای ارسال درخواست‌های php به این نرم‌افزار برای پردازش استفاده می‌کنیم.

این ماژول را همراه با بسته کمکی اضافی که به PHP امکان ارتباط با بک‌اند پایگاه داده را می‌دهد، نصب کنید. در هنگام نصب، فایل‌های ضروری PHP دانلود می‌شوند. این کار از طریق اجرای دستور زیر میسر است:

sudo apt install php-fpm php-mysql

شما اکنون همه اجزای مجموعه LEMP را نصب کرده‌اید؛ اما همچنان نیاز دارید که چند تغییر در پیکربندی ایجاد کنید تا به Nginx بگویید که از پردازنده PHP برای محتوای دینامیک استفاده کند.

این کار روی سطح بلوک سرور انجام می‌گیرد. بلوک‌های سرور در Nginx مانند میزبان‌های مجازی در وب‌سرور آپاچی (Apache) هستند. بدین منظور باید یک فایل پیکربندی بلوک سرور جدید را درون دایرکتوری /etc/nginx/sites-available/ ایجاد کنید. در این مثال، فایل پیکربندی بلوک سرور جدید example.com نام دارد، ولی می‌توانید آن را به هر نامی که دوست دارید تغییر دهید.

sudo nano /etc/nginx/sites-available/example.com

با ویرایش کردن فایل پیکربندی بلوک سرور، به جای ویرایش فایل پیش‌فرض می‌توان پیکربندی پیش‌فرض را در مواقع نیاز به سادگی بازیابی نمود.

محتوای زیر را که از فایل پیکربندی بلوک پیش‌فرض انتخاب شده و اندکی تغییر یافته است در فایل پیکربندی بلوک سرور جدید اضافه کنید:

server {
        listen 80;
        root /var/www/html;
        index index.php index.html index.htm index.nginx-debian.html;
        server_name example.com;

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

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        }

        location ~ /\.ht {
                deny all;
        }
}

توضیح هر یک از بخش‌ها و بلوک‌های فوق به صورت زیر است:

  • Listen – تعیین می‌کند که Nginx باید به چه پورتی گوش کند. در این مثال ما به پورت 80 گوش می‌کنیم که پورت پیش‌فرض برای ترافیک HTTP است.
  • Root – ریشه سند که فایل‌های وب‌سایت برای ارائه در آنجا ذخیره مزی شوند را مشخص می‌سازد.
  • Index – تعیین می‌کند که Nginx در صورت تقاضا برای فایل index.php و وجود چنین فایلی ارائه آن را در اولویت قرار دهد.
  • Server_name – تعیین می‌کند که کدام بلوک سرور باید برای هر درخواست مفروض ارسالی به سرور مورد استفاده قرار گیرد. این دایرکتیو باید به نام دامنه سرور یا آدرس IP عمومی آن اشاره کند.
  • / Location  – نخستین بلوک مکان است که شامل دایرکتیو try_files است. این دایرکتیو وجود فایل‌هایی که با درخواست URI مطابقت داشته باشند را بررسی می‌کند. اگر Nginx نتواند فایل مناسب را بیابد، یک خطای 404 باز می‌گرداند.
  • $location ~ \.php – این بلوک مکان پردازش عملی PHP را با ارجاع Nginx به فایل پیکربندی fastcgi-php.conf و فایل php7.2-fpm.sock که سوکت مرتبط با php-fpm را اعلان می‌کند، مدیریت می‌نماید.
  • location ~ /\.ht – آخرین بلوک مکان که با فایل htaccess. سر و کار دارد و از سوی Nginx پردازش نمی‌شود. با افزودن دایرکتیو deny all اگر هر گونه فایل htaccess. در مسیر درخواست کاربر به ریشه سند پیدا شود به بازدیدکنندگان ارائه نمی‌شود.

پس از افزودن محتوای فوق، فایل را ذخیره کرده و خارج شوید. سپس بلوک سرور حدید را با ایجاد یک پیوند نمادین (symbolic link) از فایل پیکربندی بلوک سرور جدید (در دایرکتوری /etc/nginx/sites-available/) به دایرکتوری /etc/nginx/sites-enabled/ فعال کنید:

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

خطاهای ساختاری فایل پیکربندی جدید خود را با وارد کردن دستور زیر بررسی کنید:

sudo nginx –t

اگر هر گونه خطایی گزارش شد، باید بازگردید و پیش از ادامه فایل خود را مورد بررسی مجدد قرار دهید. هنگامی که آماده بودید، nginx را مجدداً بارگذاری کنید تا تغییرات ضروری پیاده‌سازی شوند:

sudo systemctl reload nginx

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

گام 4: ایجاد یک فایل PHP برای تست پیکربندی

مجموعه LEMP اینک به طور کامل راه‌اندازی شده است. می‌توانید آن را تست کنید تا مطمئن شوید که Nginx به درستی فایل‌های php. را به پردازنده PHP ارسال می‌کند.

بدین منظور از یک ویرایشگر متنی برای ایجاد فایل تست PHP به نام info.php در ریشه سند استفاده می‌کنیم:

sudo nano /var/www/html/info.php

خطوط زیر را درون این فایل جدید وارد کنید. این کد PHP معتبری است که اطلاعاتی در مورد سرور باز می‌گرداند:

<?php
phpinfo();

در انتها فایل را ذخیره کرده و خارج شوید.

اینک می‌توانید این صفحه را روی مرورگر وب با مراجعه به نام دامنه سرور یا آدرس عمومی آن به همراه آدرس صفحه info.php/ مشاهده کنید:

http://your_server_domain_or_IP/info.php

در این زمان شما باید صفحه وبی را مشاهده کنید که از سوی PHP برای ارائه اطلاعاتی در مورد سرور تولید شده است:

اگر صفحه‌ای مانند تصویر فوق دیدید، به این معنی است که پردازش PHP را روی Nginx به درستی نصب کرده‌اید. پس از تأیید این که Nginx صفحه‌ها را به طرز درستی رندر می‌گیرد، بهتر است فایلی که ایجاد کردید را حذف کنید، چون باعث می‌شود که افراد غیرمجاز اطلاعاتی را در مورد پیکربندی سرور شما به دست آورند و احیاناً از آن برای نفوذ به سرور استفاده کنند. شما می‌توانید هر زمان که می‌خواهید این فایل را مجدداً ایجاد کنید.

بنابراین در حال حاضر با دستور زیر فایل را حذف می‌کنیم:

sudo rm /var/www/html/info.php

بدین ترتیب اینک یک مجموعه LEMP کاملاً پیکربندی‌شده و عملیاتی روی سرور اوبونتو 18.04 خود داریم.

سخن پایانی

مجموعه LEMP پلتفرم قدرتمندی است که امکان راه‌اندازی و ارائه هر گونه وب‌سایت یا اپلیکیشن را روی سرور فراهم می‌سازد.

چند گام دیگر هستند که باید در ادامه طی کنید. برای نمونه باید مطمئن شوید که اتصال‌ها به سرور امن هستند. بدین منظور می‌توانید از راهنمای «تنظیم و راه‌اندازی SSL روی یک وب‌سایت — به زبان ساده» استفاده کنید. با بهره‌گیری از این راهنما شما یک گواهی رایگان TLS/SSL برای سرور خود به دست می‌آورید که امکان ارائه محتوا روی پروتکل HTTPS را ایجاد می‌کند.

اگر این مطلب برایتان مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۱ نفر
آیا این مطلب برای شما مفید بود؟
شما قبلا رای داده‌اید!
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
digitalocean
۲ thoughts on “راهنمای نصب (Nginx ،MySQL ،PHP (LEMP روی اوبونتو – به زبان ساده

سلام وقت بخیر
من همه این راه ها رو میرم و حتی همون صحفه welcome to nginx هم میاد و هر فایل html که میخوام میزنم ولی برای فایل php ارور ۵۰۲ میده! چیکار کنم ؟

سلام و وقت بخیر دوست عزیز؛
با فرض‌های ذکر شده، مشکل شما در نصب یا دسترسی‌های PHP است. لطفاً مراحل بعد از گام 4 این مطلب را مجدد یک به یک انجام داده و پس از هر مرحله تست بگیرید.
از همراهی شما با مجله فرادرس سپاسگزاریم.

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *