نصب LAMP روی AlmaLinux 9 (جایگزین CentOS 7) در سرور مجازی و اختصاصی
مهم و پیش از هر چیز: اگر با جستوجوی «نصب LAMP روی CentOS 7» به این صفحه رسیدهاید، باید یک واقعیت را بدانید. CentOS 7 در تاریخ ۳۰ ژوئن ۲۰۲۴ به پایان عمر پشتیبانی (EOL) رسید و مخازن آن از آینههای اصلی به بایگانی (vault) منتقل شدند. نتیجهی عملی این اتفاق ساده است: روی یک نصب تازهی CentOS 7 حتی دستور بهروزرسانی سیستم هم با خطا متوقف میشود، چه رسد به نصب Apache و PHP. خط تولید CentOS Linux دیگر وجود ندارد و جایگزین آن، توزیعهای سازگار با Red Hat مانند AlmaLinux است.
به همین دلیل این آموزش به طور کامل بازنویسی شده و هدف آن AlmaLinux 9 است؛ توزیعی رایگان، متنباز و کاملاً سازگار با Red Hat Enterprise Linux که مسیر مهاجرت طبیعی کاربران CentOS به حساب میآید. تمام دستورها با مدیر بستهی dnf نوشته شدهاند، نه yum. اگر ترجیح میدهید روی Rocky Linux 9 کار کنید، عملاً همهی دستورهای این مقاله بدون تغییر کار میکنند؛ و اگر کاربر Ubuntu هستید، مفاهیم یکساناند ولی نام بستهها و مدیر بسته فرق میکند. هر جا که تفاوت اوبونتو و دبیان مهم باشد، معادل آن را جداگانه آوردهایم.
LAMP چیست و چرا هنوز اهمیت دارد؟
LAMP مجموعهای از برنامههاست که در کنار هم زیرساخت راهاندازی یک سایت داینامیک را فراهم میکند. این حروف سرنام چهار جزء هستند: Linux به عنوان سیستم عامل، Apache به عنوان وب سرور، MySQL یا MariaDB به عنوان پایگاه داده، و PHP به عنوان زبان برنامهنویسی سمت سرور.
لینوکس یک سیستم عامل متنباز است و Apache یکی از پرکاربردترین وب سرورهای رایگان دنیا؛ وظیفهی آن پاسخ دادن به درخواست مرورگر و تحویل محتوای وب است. MariaDB یک سیستم مدیریت پایگاه داده است که از MySQL منشعب شده و PHP زبانی است که کد سمت سرور شما را اجرا میکند. اگر میخواهید وبسایتهای داینامیک مانند وردپرس را اجرا کنید، همهی این اجزا باید روی سرور اختصاصی ایران یا سرور مجازی ایران شما نصب و به هم متصل شوند.

چرا دستورهای قدیمی CentOS 7 امروز شکست میخورند؟
آموزشهای قدیمی با sudo yum update -y شروع میشدند. امروز اجرای همین دستور روی یک سرور CentOS 7 معمولاً به خطای دسترسی به مخزن ختم میشود، چون نشانیهایی که در فایلهای مخزن ثبت شدهاند دیگر پاسخ نمیدهند. مهمتر از آن، حتی اگر با دستکاری دستی مخزنها را به بایگانی وصل کنید، هیچ بهروزرسانی امنیتی تازهای دریافت نخواهید کرد. یعنی سروری میسازید که از روز اول آسیبپذیر است.
نکتهی دوم مربوط به خود نرمافزارهاست. نسخههای PHP و MariaDB که در مخازن CentOS 7 بودند، سالهاست پشتیبانی نمیشوند و بسیاری از افزونهها و قالبهای امروزی روی آنها اجرا نمیشوند. بنابراین راهحل درست، وصلهکردن یک سیستم مرده نیست؛ راهحل، شروع روی یک سیستم عامل پشتیبانیشده است.
پیشنیازهای نصب LAMP
- یک سرور مجازی یا اختصاصی که روی آن AlmaLinux 9 (یا Rocky Linux 9) نصب شده باشد.
- دسترسی SSH با کاربر
rootیا کاربری که اجازهیsudoداشته باشد. دستورهای این مقاله طوری نوشته شدهاند که برای هر دو حالت کار کنند. - اگر میخواهید بعداً روی همین سرور دامنه بالا بیاورید، بهتر است از همین ابتدا رکورد A دامنه را به آیپی سرور اشاره دهید تا در مرحلهی گواهی SSL معطل نشوید.
مرحلهی اول: سیستم را بهروزرسانی کنید
پیش از نصب هر بستهای، مطمئن شوید سیستم عامل بهروز است. روی AlmaLinux 9 از dnf استفاده میکنیم:
sudo dnf update -y
اگر میخواهید مطمئن شوید روی چه نسخهای هستید، این دستور را اجرا کنید:
cat /etc/os-release

مرحلهی دوم: Apache را نصب کنید
وب سرور Apache در AlmaLinux با نام بستهی httpd شناخته میشود. برای نصب آن بنویسید:
sudo dnf install httpd -y
در نسخههای قدیمی، سرویس را جداگانه استارت و سپس فعال میکردیم. امروز میتوانید هر دو کار را با یک دستور انجام دهید. سوییچ --now سرویس را همین حالا اجرا میکند و همزمان آن را برای اجرای خودکار پس از ریستارت سرور فعال میسازد:
sudo systemctl enable --now httpd
برای دیدن وضعیت سرویس:
sudo systemctl status httpd
توجه: نام بسته و نام سرویس در خانوادهی دبیان فرق میکند. روی Ubuntu و Debian بسته و سرویس هر دو apache2 نام دارند و نصب با sudo apt install apache2 انجام میشود. هر جا در این مقاله httpd دیدید، معادل اوبونتویی آن apache2 است.
مرحلهی سوم: فایروال را تنظیم کنید
به طور پیشفرض firewalld روی AlmaLinux فعال است و پورتهای ۸۰ و ۴۴۳ بستهاند، پس بدون باز کردن آنها به Apache دسترسی نخواهید داشت. ابتدا سرویس HTTP را اضافه کنید:
sudo firewall-cmd --add-service=http --permanent
سپس سرویس HTTPS را:
sudo firewall-cmd --add-service=https --permanent
سوییچ --permanent تغییر را ماندگار میکند اما بلافاصله اعمال نمیشود؛ برای اعمال آن فایروال را بازخوانی کنید:
sudo firewall-cmd --reload
برای اطمینان از اینکه قوانین ثبت شدهاند:
sudo firewall-cmd --list-services
در خروجی باید در کنار ssh نامهای http و https را ببینید. دقت کنید که سرویس ssh را از فایروال حذف نکنید؛ حذف آن ارتباط شما با سرور را قطع میکند.
حالا آدرس IP سرور را در مرورگر وارد کنید. باید صفحهی پیشفرض وب سرور را ببینید؛ این یعنی Apache درست نصب و اجرا شده است.

مرحلهی چهارم: پایگاه داده MariaDB را نصب کنید
MariaDB انشعابی از MySQL است که به صورت متنباز توسعه داده میشود و در مخازن رسمی AlmaLinux در دسترس است. نسخهی پایهی AppStream در AlmaLinux 9 برابر MariaDB 10.5 است، ولی در نسخههای جدیدتر توزیع، استریمهای تازهتری هم به صورت ماژول عرضه شدهاند. پیش از نصب ببینید روی سرور شما چه چیزی در دسترس است:
dnf list mariadb-server sudo dnf module list mariadb
اگر به همان نسخهی پایه راضی هستید، مستقیم سرور و ابزارهای کلاینت را نصب کنید:
sudo dnf install mariadb-server mariadb -y
و اگر میخواهید استریم تازهتری را بگیرید، پیش از نصب آن را فعال کنید و بعد دستور نصب بالا را بزنید. به جای عدد نمونه، همان استریمی را بگذارید که در خروجی بالا دیدید (فعال کردن استریم پس از نصب، به تعارض بسته میانجامد):
sudo dnf module enable mariadb:11.8 -y

سپس سرویس را اجرا و فعال کنید:
sudo systemctl enable --now mariadb
مرحلهی پنجم: امنسازی MariaDB
MariaDB با تنظیمات پیشفرض برای محیط عملیاتی امن نیست. باید کاربر ناشناس و پایگاه دادهی آزمایشی را حذف و ورود از راه دور با کاربر root را ببندید. اسکریپت رسمی این کار امروز mariadb-secure-installation نام دارد. نام قدیمی یعنی mysql_secure_installation هنوز به عنوان پیوند کار میکند، ولی نام تازه را به کار ببرید:
sudo mariadb-secure-installation
یک تفاوت مهم با آموزشهای قدیمی: در نسخههای امروزی MariaDB، کاربر root پایگاه داده به صورت پیشفرض با روش unix_socket احراز هویت میشود، نه با رمز عبور. یعنی کاربر root سیستم عامل بدون رمز وارد پایگاه داده میشود و کاربر دیگری نمیتواند. به همین دلیل وقتی اسکریپت رمز فعلی را میپرسد، کافی است کلید Enter را بزنید؛ و اگر پرسید که آیا میخواهید احراز هویت سوکتی فعال بماند، پاسخ مثبت انتخاب امنتری است.

پاسخ پیشنهادی به بقیهی پرسشها به این شکل است. توجه کنید که عبارت دقیق پرسشها بسته به نسخه کمی فرق میکند:
Remove anonymous users? [Y/n] Y Disallow root login remotely? [Y/n] Y Remove test database and access to it? [Y/n] Y Reload privilege tables now? [Y/n] Y
برای ورود به کنسول پایگاه داده از این پس از دستور زیر استفاده کنید:
sudo mariadb
مرحلهی ششم: PHP را نصب کنید
اینجا بزرگترین تفاوت با آموزشهای دوران CentOS 7 را داریم و اگر از آن بیخبر باشید، ساعتها وقت تلف میکنید. در CentOS 7 وب سرور با ماژول mod_php کد PHP را داخل خود پردازش میکرد. در نسل جدید یعنی AlmaLinux 8 و ۹، ماژول mod_php حذف شده است و PHP به صورت یک سرویس مستقل به نام php-fpm اجرا میشود که Apache درخواستها را به آن میسپارد. این اتصال را فایل آمادهی /etc/httpd/conf.d/php.conf برقرار میکند؛ بنابراین اگر سرویس php-fpm در حال اجرا نباشد، مرورگر به جای صفحهی سایت خطای ۵۰۳ Service Unavailable نشان میدهد.
ابتدا ببینید چه نسخههایی از PHP در دسترس شماست:
sudo dnf module list php
سپس نسخهی دلخواه را فعال کنید. نمونهی زیر PHP 8.3 را فعال میکند؛ اگر در خروجی بالا نسخهی جدیدتری دیدید همان را بگذارید. استریمهای قدیمیتر مثل php:8.0 و php:8.1 به پایان پشتیبانی نزدیک شدهاند و برای یک سرور تازه انتخاب خوبی نیستند:
sudo dnf module enable php:8.3 -y
اگر پیشتر روی همین سرور استریم دیگری از PHP فعال شده باشد، این دستور با خطای تعارض استریم متوقف میشود. در آن صورت ابتدا وضعیت ماژول را صفر کنید و دوباره تلاش کنید:
sudo dnf module reset php -y
و حالا PHP را به همراه افزونههای پرکاربرد نصب کنید. دقت کنید که بستهی قدیمی php-mysql در این نسل وجود ندارد و جای آن را php-mysqlnd گرفته است. افزونهی zip هم روی خانوادهی Red Hat در بستهی php-pecl-zip بستهبندی شده است (نام php-zip هم به همان بسته اشاره میکند):
sudo dnf install php php-cli php-fpm php-mysqlnd php-gd php-mbstring php-xml php-intl php-opcache php-pecl-zip -y

حالا سرویس PHP-FPM را اجرا و فعال کنید و سپس Apache را ریاستارت کنید تا پیکربندی تازه را بخواند:
sudo systemctl enable --now php-fpm sudo systemctl restart httpd
برای دیدن نسخهی نصبشده:
php -v
آزمایش PHP
Apache مسیر پیشفرض سایت را در /var/www/html قرار میدهد. برای آزمایش، یک فایل کوچک میسازیم. اگر ویرایشگر nano را ندارید، ابتدا آن را نصب کنید:
sudo dnf install nano -y
سپس فایل آزمایشی را بسازید:
sudo nano /var/www/html/info.php
و این محتوا را داخل آن بگذارید:
<?php phpinfo(); ?>
برای ذخیره، کلیدهای Ctrl+X سپس Y و در نهایت Enter را بزنید. حالا در مرورگر این نشانی را باز کنید و به جای بخش نمونه، آیپی سرور خودتان را بگذارید:
http://SERVER_IP/info.php

اگر جدول اطلاعات PHP نمایش داده شد، کار درست انجام شده است.
بلافاصله این فایل را پاک کنید. خروجی phpinfo() جزئیات کاملی از نسخهها، مسیرها و ماژولهای سرور شما را در اختیار هر بازدیدکنندهای میگذارد و یکی از رایجترین نقطههای شروع برای شناسایی سرور توسط مهاجمان است:
sudo rm /var/www/html/info.php

نکتهای که در آموزشهای قدیمی نبود: SELinux
روی AlmaLinux 9 سازوکار امنیتی SELinux به صورت پیشفرض در حالت اجباری فعال است. مسیر /var/www/html از پیش برچسب درست را دارد، اما اگر فایلها را از جای دیگری کپی کنید یا پوشهای بسازید که وب سرور باید در آن بنویسد (مثل پوشهی آپلود)، باید برچسبها را اصلاح کنید. برای بازگرداندن برچسب استاندارد:
sudo restorecon -Rv /var/www/html
و برای پوشهای که وب سرور باید در آن بنویسد:
sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/uploads(/.*)?" sudo restorecon -Rv /var/www/html/uploads
اگر دستور semanage را روی سرور نداشتید، بستهی مربوط به آن را نصب کنید:
sudo dnf install policycoreutils-python-utils -y
راهحلی که در بسیاری از انجمنها پیشنهاد میشود یعنی خاموش کردن کامل SELinux را انتخاب نکنید؛ این کار یک لایهی دفاعی مهم را حذف میکند. اگر مدیریت این جزئیات برایتان زمانبر است، سرویسهای سرور مجازی مدیریتشده همین پیکربندیها را بر عهدهی تیم پشتیبانی میگذارند.
تغییر مسیر DocumentRoot: وقتی نمیخواهید سایت در /var/www/html باشد
تا اینجا هر فایلی که در /var/www/html بگذارید از طریق مرورگر سرو میشود. این پوشه همان چیزی است که در پیکربندی Apache با نام DocumentRoot شناخته میشود: شاخهای که وب سرور محتوای سایت را از آن برمیدارد. مقدار پیشفرض آن روی بیشتر توزیعها یکی از این دو مسیر است:
/var/www/html or /var/www/
خیلی وقتها میخواهید این مسیر را عوض کنید؛ مثلاً وقتی دادههای سایت را روی یک دیسک یا پارتیشن جداگانه نگه میدارید، وقتی میخواهید هر سایت پوشهی مستقل خودش را داشته باشد، یا وقتی فریمورکی مثل لاراول استفاده میکنید که فقط پوشهی public آن باید در دسترس عموم باشد.
فایل پیکربندی کجاست؟
محل تعریف DocumentRoot به توزیع بستگی دارد. روی خانوادهی Red Hat یعنی AlmaLinux، Rocky Linux، RHEL، CentOS و Fedora:
/etc/httpd/conf/httpd.conf
و روی Ubuntu و Debian:
/etc/apache2/apache2.conf /etc/apache2/sites-available/000-default.conf
در آموزشهای قدیمی گاهی نشانیهایی مثل /etc/apache/apache2.conf یا /etc/apache2/sites-enabled/000-default (بدون پسوند) نوشته شده است. پوشهی درست /etc/apache2/ است و از Apache 2.4 به بعد در دبیان و اوبونتو فقط فایلهایی فعال میشوند که به .conf ختم شوند. ضمناً فایل اصلی را در sites-available ویرایش میکنید؛ sites-enabled فقط پیوند نمادین به آن است که با a2ensite ساخته میشود.
فایل مربوط به توزیع خودتان را با nano یا vi باز کنید. پیش از هر ویرایشی یک نسخهی پشتیبان بگیرید تا در صورت اشتباه بتوانید برگردید:
sudo cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.bak sudo nano /etc/httpd/conf/httpd.conf
داخل فایل به دنبال بخش زیر بگردید:
# # DocumentRoot: The directory out of which you will serve your # documents. By default, all requests are taken from this directory, but # symbolic links and aliases may be used to point to other locations. # DocumentRoot "/var/www/html"
مقدار جلوی DocumentRoot را به مسیر تازهای که میخواهید تغییر دهید.
فقط عوض کردن DocumentRoot کافی نیست
این همان جایی است که آموزشهای قدیمی ناقصاند و کاربر بعد از ریاستارت با خطای ۴۰۳ Forbidden روبهرو میشود. Apache علاوه بر دانستن مسیر، باید اجازهی خواندن آن مسیر را هم داشته باشد. پس برای مسیر جدید یک بلوک <Directory> اضافه کنید. روی خانوادهی Red Hat بهتر است به جای دست بردن در httpd.conf، فایل تازهای مثل /etc/httpd/conf.d/mysite.conf بسازید و پیکربندی را به شکل یک VirtualHost بنویسید:
<VirtualHost *:80>
ServerName example.com
DocumentRoot /srv/www/example
<Directory /srv/www/example>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
یک اشتباه رایج در نمونههای قدیمی: در Apache 2.2 دسترسی با دستورهای Order allow,deny و Allow from all تنظیم میشد:
<Directory /srv/www/example>
Order allow,deny
Allow from all
</Directory>
این نحو از Apache 2.4 منسوخ شده و فقط تا زمانی کار میکند که ماژول سازگاری mod_access_compat بارگذاری شده باشد. نحو درست امروزی Require all granted است؛ اگر جایی به نمونهی قدیمی برخوردید، معادل جدید را بنویسید.
دو نکتهی دیگر هم مسیر جدید را از کار میاندازد:
- دسترسی فایلسیستمی: کاربری که Apache با آن اجرا میشود (
apacheروی AlmaLinux وwww-dataروی اوبونتو و دبیان) باید بتواند فایلها را بخواند و روی تکتک پوشههای والدِ مسیر، اجازهی اجرا (x) داشته باشد. به همین دلیل انتخاب مسیری زیر/home/usernameمعمولاً به ۴۰۳ ختم میشود، چون پوشهی خانگی کاربر روی توزیعهای Red Hat با مجوز ۰۷۰۰ ساخته میشود و کاربر وب سرور اجازهی عبور از آن را ندارد. مسیرهایی مثل/srv/www/exampleیا/var/www/exampleدردسر کمتری دارند. - برچسب SELinux: روی AlmaLinux و Rocky هر مسیری خارج از
/var/wwwبرچسب مناسب وب سرور را ندارد و حتی با مجوزهای درست هم خوانده نمیشود. برچسب را دستی اضافه کنید:
sudo semanage fcontext -a -t httpd_sys_content_t "/srv/www/example(/.*)?" sudo restorecon -Rv /srv/www/example
تست پیکربندی و ریاستارت
پیش از ریاستارت، همیشه نحو فایلهای پیکربندی را بررسی کنید تا یک تایپ اشتباه، وب سرور را بالا نیاورد. روی AlmaLinux و Rocky و RHEL:
sudo apachectl configtest
و روی Ubuntu و Debian:
sudo apache2ctl configtest
اگر پیام Syntax OK گرفتید، تغییرات را اعمال کنید. روی خانوادهی Red Hat:
sudo systemctl restart httpd
و روی Ubuntu و Debian:
sudo systemctl restart apache2
در آموزشهای قدیمی برای این کار service httpd restart یا /etc/init.d/httpd restart نوشته میشد. روی توزیعهای امروزی که همگی systemd دارند، فرم درست systemctl است. همچنین دقت کنید نام سرویس روی اوبونتو و دبیان apache2 است، نه apache؛ دستور systemctl restart apache با خطای «واحد پیدا نشد» متوقف میشود. اگر نمیخواهید اتصالهای باز قطع شوند، به جای restart میتوانید از بازخوانی نرم استفاده کنید:
sudo systemctl reload httpd
گام بعدی: HTTPS را فراموش نکنید
یک سرور LAMP که فقط روی پورت ۸۰ سرویس میدهد امروز ناقص است. مرورگرها سایت بدون گواهی را ناامن نشان میدهند و موتورهای جستوجو هم HTTPS را انتظار دارند. سادهترین راه، استفاده از گواهی رایگان Let's Encrypt است. پیش از شروع مطمئن شوید که رکورد A دامنه به آیپی همین سرور اشاره میکند، پورت ۴۴۳ در فایروال باز است و برای دامنه یک VirtualHost با ServerName درست تعریف کردهاید؛ در غیر این صورت اعتبارسنجی Let's Encrypt شکست میخورد.
بستهی certbot در مخازن پایهی AlmaLinux نیست و از مخزن EPEL میآید، پس ابتدا EPEL و ماژول SSL آپاچی را نصب کنید:
sudo dnf install epel-release -y sudo dnf install mod_ssl -y
سپس certbot و افزونهی آپاچی آن را نصب و اجرا کنید:
sudo dnf install certbot python3-certbot-apache -y sudo certbot --apache
روی Ubuntu و Debian نام افزونه python3-certbot-apache است و نصب با sudo apt install certbot python3-certbot-apache انجام میشود.
برای دامنههای تجاری یا مواردی که به گواهی با اعتبارسنجی سازمانی نیاز دارید، میتوانید سراغ گواهی SSL بروید.
معادل دستورهای قدیمی در نسل جدید
| دستور یا مسیر قدیمی | معادل امروزی روی AlmaLinux 9 |
yum update |
dnf update |
yum install php php-mysql |
dnf install php php-mysqlnd |
اتکا به mod_php |
سرویس مستقل php-fpm |
service httpd restart یا /etc/init.d/httpd restart |
systemctl restart httpd |
systemctl restart apache (اوبونتو) |
systemctl restart apache2 |
/etc/apache2/sites-enabled/000-default |
/etc/apache2/sites-available/000-default.conf |
/etc/apache/apache2.conf |
/etc/apache2/apache2.conf |
Order allow,deny و Allow from all |
Require all granted |
mysql_secure_installation |
mariadb-secure-installation |
| رمز عبور برای root پایگاه داده | احراز هویت unix_socket |
جمعبندی
بستهی LAMP شما اکنون روی یک سیستم عامل پشتیبانیشده کامل است و میتوانید هر وبسایت یا نرمافزار مبتنی بر Apache، MariaDB و PHP را روی آن اجرا کنید. بسته به نرمافزاری که نصب میکنید، ممکن است به افزونههای بیشتری از PHP یا ماژولهای اضافی Apache نیاز داشته باشید. اگر پیش از راهاندازی میخواهید بدانید سایت فعلیتان چه وضعیتی دارد، ابزار بررسی سلامت سایت میتواند نقطهی شروع خوبی باشد. برای پروژههای کوچکتر هم که نمیخواهید درگیر مدیریت سرور شوید، هاست لینوکس ایران همین پشته را به صورت آماده در اختیارتان میگذارد.
نسخهی اصلی و انگلیسی این آموزش که مبنای اولیهی این مطلب بود را میتوانید در این مقاله ببینید؛ توجه داشته باشید که آن نسخه هنوز بر پایهی CentOS 7 نوشته شده است.
قدم بعدی شما در مدیریت پایگاههای داده، نصب ابزار phpMyAdmin است. برای دیدن آموزش بهروز نصب phpMyAdmin اینجا کلیک کنید. اگر هم میخواهید مستقیم سراغ راهاندازی سایت بروید، آموزش نصب وردپرس ادامهی طبیعی همین مسیر است.
روی کمک ما حساب کنید
در هر مرحله از نصب بستهی LAMP با هر مشکلی برخورد کردید، هر تلاش ناموفقی داشتید یا هر جا نیاز به کمک داشتید، آنلاین سرور پشتیبان شماست و میتوانید از اینجا کمک بگیرید.
ارسال نظر