نصب Apache روی اوبونتو و ساخت Virtual Host

برای نصب Apache روی اوبونتو بسته apache2 را با apt نصب کنید، پورت‌های ۸۰ و ۴۴۳ را در فایروال باز کنید و برای هر دامنه یک Virtual Host بسازید. Virtual Host فایل کانفیگی است که مشخص می‌کند درخواست‌های هر دامنه از کدام پوشه سرو شود. فعال کردن آن با a2ensite و اعمال تغییر با reload انجام می‌شود، بدون اینکه اتصال‌های جاری قطع شوند.

دستورها برای Ubuntu 22.04 و 24.04 نوشته شده‌اند. اگر Nginx را ترجیح می‌دهید، نصب Nginx روی اوبونتو همین مسیر را برای آن توضیح داده است. مقایسه ویژگی‌های دو وب‌سرور و تنظیمات پیشرفته‌تر در وب سرور لینوکس: نصب و پیکربندی پیشرفته آمده است.

مرحله اول: نصب Apache روی اوبونتو

sudo apt update
sudo apt install apache2

بعد از نصب، سرویس خودکار روشن می‌شود. وضعیت و نسخه را ببینید:

systemctl status apache2
apache2 -v

اگر Nginx یا سرویس دیگری پورت ۸۰ را گرفته باشد، Apache بالا نمی‌آید. با sudo ss -ltnp | grep ':80' ببینید چه چیزی روی آن گوش می‌دهد.

مرحله دوم: باز کردن پورت‌ها بعد از نصب Apache روی اوبونتو

اگر UFW فعال است، پروفایل Apache Full هر دو پورت را باز می‌کند. پیش از فعال کردن فایروال، پورت SSH را مجاز کنید تا از سرور بیرون نمانید:

sudo ufw allow OpenSSH
sudo ufw allow 'Apache Full'
sudo ufw status

حالا آدرس IP سرور را در مرورگر باز کنید. صفحه Apache2 Ubuntu Default Page یعنی نصب درست انجام شده است.

ساختار فایل‌های Apache در اوبونتو

مسیرکاربرد
/etc/apache2/apache2.confکانفیگ اصلی
/etc/apache2/sites-available/فایل Virtual Host هر سایت
/etc/apache2/sites-enabled/لینک نمادین سایت‌های فعال
/etc/apache2/mods-available/ و mods-enabled/ماژول‌های موجود و فعال
/var/www/محل پیشنهادی فایل‌های سایت
/var/log/apache2/لاگ دسترسی و خطا

در Ubuntu برای فعال و غیرفعال کردن سایت‌ها و ماژول‌ها ابزارهای a2ensite، a2dissite، a2enmod و a2dismod وجود دارد و لازم نیست لینک‌ها را دستی بسازید.

مرحله سوم: ساخت Virtual Host

فرض کنید دامنه example.com است. پوشه سایت و یک صفحه آزمایشی بسازید:

sudo mkdir -p /var/www/example.com/public_html
echo '<h1>example.com works</h1>' | sudo tee /var/www/example.com/public_html/index.html
sudo chown -R www-data:www-data /var/www/example.com

فایل /etc/apache2/sites-available/example.com.conf را با این محتوا بسازید:

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example.com/public_html

    <Directory /var/www/example.com/public_html>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/example.com-error.log
    CustomLog ${APACHE_LOG_DIR}/example.com-access.log combined
</VirtualHost>

گزینه AllowOverride All اجازه می‌دهد فایل .htaccess کار کند، که وردپرس و بسیاری از برنامه‌ها به آن نیاز دارند. گزینه -Indexes نمایش فهرست فایل‌ها را در پوشه‌های بدون index می‌بندد. حالا سایت را فعال و کانفیگ را تست کنید:

sudo a2ensite example.com.conf
sudo apache2ctl configtest
sudo systemctl reload apache2

دستور configtest باید Syntax OK بنویسد. اگر هشدار درباره ServerName دیدید، یک خط ServerName سراسری در /etc/apache2/conf-available/ بنویسید و با a2enconf فعالش کنید. سایت پیش‌فرض را هم اگر لازم ندارید با sudo a2dissite 000-default.conf غیرفعال کنید.

ماژول‌های رایج

ماژول rewrite برای لینک‌های یکتای وردپرس و بیشتر برنامه‌های PHP لازم است، و headers برای افزودن هدرهای امنیتی:

sudo a2enmod rewrite headers
sudo systemctl restart apache2

فهرست ماژول‌های فعال را apache2ctl -M نشان می‌دهد. ماژول‌هایی را که نیاز ندارید فعال نگذارید، چون هر ماژول مصرف حافظه و سطح حمله را بیشتر می‌کند.

اجرای PHP با Apache

دو روش رایج وجود دارد. در روش قدیمی ماژول mod_php داخل Apache اجرا می‌شود. در روش جدیدتر، Apache با MPM event کار می‌کند و درخواست‌های PHP را به PHP-FPM می‌فرستد که مصرف حافظه کمتر و کنترل بهتری روی منابع دارد:

sudo apt install php-fpm libapache2-mod-fcgid
sudo a2enmod proxy_fcgi setenvif
sudo a2enmod mpm_event
sudo a2enconf php8.3-fpm
sudo systemctl restart apache2

شماره نسخه را با نسخه PHP نصب‌شده تطبیق دهید؛ php -v آن را نشان می‌دهد. اگر قبلاً mod_php نصب بوده، باید ماژول php و mpm_prefork را غیرفعال کنید تا با MPM event تداخل نداشته باشند.

فعال کردن HTTPS

گواهی رایگان Let’s Encrypt با Certbot گرفته و در Virtual Host تنظیم می‌شود:

sudo apt install certbot python3-certbot-apache
sudo certbot --apache -d example.com -d www.example.com

Certbot بلوک 443 را می‌سازد و تمدید خودکار را فعال می‌کند. مراحل کامل و حالت‌های دیگر در نصب SSL رایگان آمده است.

دسترسی فایل‌ها و مالکیت

فایل‌های سایت باید برای کاربری که Apache با آن اجرا می‌شود، یعنی www-data، خواندنی باشند. مقدار معمول 644 برای فایل‌ها و 755 برای پوشه‌هاست:

sudo find /var/www/example.com -type d -exec chmod 755 {} \;
sudo find /var/www/example.com -type f -exec chmod 644 {} \;

پوشه‌هایی که برنامه در آن‌ها می‌نویسد، مثل uploads، باید برای www-data قابل نوشتن باشند. سایت یا پوشه‌ای را با دسترسی 777 رها نکنید.

بررسی لاگ‌ها

sudo tail -f /var/log/apache2/example.com-error.log

لاگ خطا اولین جایی است که برای خطاهایی مثل 403 و 500 باید نگاه کنید. عیب‌یابی خطای 500 در خطای 500 Internal Server Error آمده است.

خطاهای رایج

نشانهعلت و راه حل
Address already in useپورت ۸۰ یا ۴۴۳ را سرویس دیگری گرفته
403 Forbiddenدسترسی پوشه، Require all granted نبودن یا نبودن فایل index
صفحه پیش‌فرض Apache باز می‌شودVirtual Host فعال نشده یا ServerName با دامنه نمی‌خواند
فایل .htaccess اثر نداردAllowOverride روی None است یا ماژول rewrite فعال نیست
AH00558: Could not reliably determine the server's fully qualified domain nameیک ServerName سراسری تعریف کنید
تغییر کانفیگ اعمال نمی‌شودreload یا restart انجام نشده یا configtest خطا داده است

سوالات متداول

فرق apache2 و httpd چیست؟

هر دو همان Apache HTTP Server هستند. نام بسته و سرویس در Debian و Ubuntu apache2 و در AlmaLinux و Rocky httpd است و مسیر فایل‌ها هم فرق می‌کند.

برای وردپرس Apache بهتر است یا Nginx؟

هر دو با PHP-FPM خوب کار می‌کنند. Apache از .htaccess پشتیبانی می‌کند که بیشتر افزونه‌ها و ریدایرکت‌های وردپرس به آن تکیه دارند. در Nginx همین قوانین باید در کانفیگ نوشته شوند.

reload یا restart؟

reload کانفیگ جدید را بدون قطع اتصال‌های جاری می‌خواند و بعد از apache2ctl configtest موفق، معمولاً کافی است. restart برای نصب یا فعال کردن ماژول جدید لازم است.

چطور چند سایت را روی یک Apache اجرا کنم؟

برای هر دامنه یک Virtual Host جدا با ServerName خودش بسازید و با a2ensite فعالش کنید. Apache بر اساس هدر Host درخواست، بلوک مناسب را انتخاب می‌کند.

منابع

پاسخی بگذارید

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