Я вже розповідав, як підняти локальний сервер LAMP у Linux Mint та Ubuntu і у Fedora. Сьогодні зробимо те саме в Arch Linux: Apache, PHP, MariaDB і phpMyAdmin, сайти лежатимуть у домашній теці, кожен зі своєю адресою, а за бажанням – ще й із HTTPS без попереджень браузера.

В Arch усе налаштовується трохи більше вручну, ніж в Ubuntu, зате ти точно знатимеш, що де лежить 😉 Поїхали!

1. Apache

sudo pacman -S apache

Головний файл налаштувань – /etc/httpd/conf/httpd.conf, до нього ми ще не раз повернемося. Відкрий його:

sudo nano /etc/httpd/conf/httpd.conf

і зроби дві речі:

  • розкоментуй рядок LoadModule rewrite_module modules/mod_rewrite.so – без нього не працюватимуть «красиві» адреси в більшості CMS;
  • за бажанням зміни ServerAdmin you@example.com на свою пошту.

Сайти я тримаю в домашній теці, у папці LocalServer, – так зручніше працювати з файлами без sudo. Створимо її і дамо Apache право її читати:

mkdir -p ~/LocalServer
chmod o+x ~ ~/LocalServer

Але є нюанс, на якому легко спіткнутися: сервіс Apache в Arch за замовчуванням узагалі не має доступу до домашніх тек (ProtectHome). Щоб це змінити, створюємо для нього доповнення:

sudo systemctl edit httpd

У редакторі, що відкриється, впиши між коментарями:

[Service]
ProtectHome=read-only

Збережи й закрий. Тепер Apache бачить домашню теку, але нічого в ній змінити не може – для локального сервера саме те.

2. PHP через PHP-FPM

Колись PHP підключали до Apache модулем mod_php, і заради нього доводилося перемикати Apache в повільніший режим prefork. Сучасний спосіб – PHP-FPM: PHP працює окремим сервісом, а Apache лише передає йому запити. Режим Apache при цьому не чіпаємо.

sudo pacman -S php php-fpm php-gd

У файлі httpd.conf розкоментуй два модулі:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

Створи файл /etc/httpd/conf/extra/php-fpm.conf:

sudo nano /etc/httpd/conf/extra/php-fpm.conf

з таким вмістом:

DirectoryIndex index.php index.html
<FilesMatch \.php$>
    SetHandler "proxy:unix:/run/php-fpm/php-fpm.sock|fcgi://localhost/"
</FilesMatch>

І підключи його в кінці httpd.conf:

Include conf/extra/php-fpm.conf

Тепер увімкнемо потрібні розширення PHP. У файлі /etc/php/php.ini прибери крапку з комою на початку рядків:

extension=gd
extension=iconv
extension=intl
extension=mysqli
extension=pdo_mysql

Розширення zip там уже увімкнене. Запускаємо PHP-FPM і Apache:

sudo systemctl enable --now php-fpm httpd

3. MariaDB

В Arch Linux замість MySQL використовують MariaDB – це його повністю сумісне відгалуження, тож різниці ти не відчуєш, а команди mysql теж працюють.

sudo pacman -S mariadb
sudo mariadb-install-db --user=mysql --basedir=/usr --datadir=/var/lib/mysql
sudo systemctl enable --now mariadb

Друга команда створює початкову базу даних – її потрібно виконати один раз перед першим запуском. Тепер задаємо пароль для користувача root і прибираємо тестові дані:

sudo mariadb-secure-installation

Увійти в консоль бази даних можна так:

sudo mariadb -u root -p

4. Віртуальні хости

Щоб кожен сайт мав свою адресу, налаштуємо віртуальні хости. У httpd.conf розкоментуй рядок Include conf/extra/httpd-vhosts.conf. Сам файл /etc/httpd/conf/extra/httpd-vhosts.conf за замовчуванням містить два приклади з dummy-host.example.com – видали їх, вони лише засмічуватимуть журнали попередженнями. Натомість для кожного сайту додай такий блок (моє ім'я користувача ivaniura зміни на своє):

<VirtualHost *:80>
    ServerName mysite.localhost
    DocumentRoot "/home/ivaniura/LocalServer/mysite"
    <Directory "/home/ivaniura/LocalServer/mysite">
        AllowOverride All
        Require all granted
    </Directory>
    ErrorLog "/var/log/httpd/mysite-error_log"
    CustomLog "/var/log/httpd/mysite-access_log" common
</VirtualHost>

Створи папку сайту, поклади туди тестовий файл і перезапусти Apache:

mkdir ~/LocalServer/mysite
echo "<?php phpinfo();" > ~/LocalServer/mysite/index.php
chmod -R o+rX ~/LocalServer
sudo systemctl restart httpd

Відкрий у браузері http://mysite.localhost – має з'явитися сторінка з інформацією про PHP. Адреси на .localhost система й браузери самі ведуть на твій комп'ютер, тож редагувати /etc/hosts не потрібно. Якщо хочеш іншу назву, наприклад mysite.test, додай у /etc/hosts рядок 127.0.0.1 mysite.test і вкажи ту саму назву в ServerName.

Кожен наступний сайт додається так само: нова папка, новий блок у httpd-vhosts.conf і перезапуск Apache.

5. HTTPS без попереджень браузера

Звичайний самопідписаний сертифікат браузер зустріне червоним попередженням. Набагато зручніше утиліта mkcert: вона створює власний локальний центр сертифікації і додає його в систему й браузери, тож локальні сайти відкриваються із зеленим замочком.

sudo pacman -S mkcert nss
mkcert -install
mkcert -cert-file server.crt -key-file server.key mysite.localhost
sudo mv server.crt server.key /etc/httpd/conf/

У третій команді через пробіл можна перелічити всі свої локальні сайти – один сертифікат підійде для всіх. Тепер у httpd.conf розкоментуй рядки:

LoadModule ssl_module modules/mod_ssl.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
Include conf/extra/httpd-ssl.conf

А в httpd-vhosts.conf додай для сайту ще один блок, уже для порту 443:

<VirtualHost *:443>
    ServerName mysite.localhost
    DocumentRoot "/home/ivaniura/LocalServer/mysite"
    <Directory "/home/ivaniura/LocalServer/mysite">
        AllowOverride All
        Require all granted
    </Directory>
    SSLEngine on
    SSLCertificateFile "/etc/httpd/conf/server.crt"
    SSLCertificateKeyFile "/etc/httpd/conf/server.key"
</VirtualHost>

Перезапусти Apache – і https://mysite.localhost відкриється без жодних попереджень. Якщо браузер був відкритий під час mkcert -install, перезапусти і його.

6. phpMyAdmin

sudo pacman -S phpmyadmin

Створи файл /etc/httpd/conf/extra/phpmyadmin.conf:

Alias /phpmyadmin "/usr/share/webapps/phpMyAdmin"
<Directory "/usr/share/webapps/phpMyAdmin">
    DirectoryIndex index.php
    AllowOverride All
    Options FollowSymlinks
    Require local
</Directory>

Require local означає, що phpMyAdmin відкриватиметься лише з твого комп'ютера, а не з усієї локальної мережі. Підключи файл у кінці httpd.conf:

Include conf/extra/phpmyadmin.conf

Далі відкрий /etc/webapps/phpmyadmin/config.inc.php. У рядку з $cfg['blowfish_secret'] між лапками потрібен випадковий рядок рівно з 32 символів – його зручно згенерувати командою:

openssl rand -base64 24

А в кінець того ж файлу додай теку для тимчасових файлів, інакше phpMyAdmin виводитиме попередження:

$cfg['TempDir'] = '/tmp/phpmyadmin';

Колись цю теку створювали прямо в каталозі phpMyAdmin і давали їй права 777, але сучасний сервіс PHP-FPM не може писати в системні теки, та й права 777 – погана звичка. А в /tmp phpMyAdmin сам створить потрібну папку.

Перезапусти Apache і відкрий http://localhost/phpmyadmin – входь як root із паролем, який задав у MariaDB.

Якщо щось не працює

# перевірити конфігурацію Apache на помилки
sudo apachectl configtest

# подивитися, чому не запускається сервіс
systemctl status httpd php-fpm mariadb

# журнал помилок сайту
sudo tail /var/log/httpd/mysite-error_log

Повідомлення AH00558: Could not reliably determine the server's fully qualified domain name – лише попередження, сервер працює. Щоб воно зникло, у httpd.conf розкоментуй рядок #ServerName www.example.com:80 і заміни його на ServerName localhost.

Найчастіші причини: помилка в конфігурації (команда configtest покаже, де саме), забуте доповнення з ProtectHome – тоді Apache повертає помилку 403 для сайтів у домашній теці.

Готово! Якщо ти ще не встановив/ла саму систему, допоможе стаття як просто встановити Arch Linux. Більше про веб-розробку – за позначками Веб-розробка та Arch Linux та Manjaro.

Залишилися питання? Пиши в коментарях, розберемося 🙂