↓ До тексту
  1. Статті/

WordPress на nginx замість Apache: що міняється

·3 хвилини
cat /etc/passwd
Автор
cat /etc/passwd
Технічний блог про Linux, DevOps та Open Source технології.
Зміст
WordPress по-дорослому - частина серії статей.
Частина 3: ця стаття (ти тут)

Ми вже зібрали WordPress руками на Apache - з PHP-FPM, MariaDB і Redis. Але половина інтернету сидить на nginx, і резонне питання: а що як замість Apache хочу nginx? Відповідь коротка - міняється рівно одна річ: вебсервер. PHP-FPM, база, Redis, сам WordPress - усе лишається тим самим. Тому й пост короткий: дивимось тільки дельту.

Що потрібно зробити?
#

Узяти вже готовий WordPress-стек на PHP-FPM і поставити перед ним nginx замість Apache. Весь фокус - в одному server-блоці: віддати статику напряму, а .php прокинути в сокет PHP-FPM. Жодного mod_php, жодного .htaccess - у nginx їх і нема.

З чим працюю?
#

1
2
3
root@wpnx:~# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 13 (trixie)"
VERSION_CODENAME=trixie

Debian 13, PHP тут - 8.4. Решту стека - MariaDB з окремим юзером, PHP-FPM з розширеннями, Redis object cache і сам WordPress через WP-CLI - ставимо точно так, як у пості про Apache. Тут не повторюю: єдина відмінність - замість apache2 ставимо nginx і описуємо сайт по-своєму. Від root.

WordPress · nginx + PHP-FPM linuxway.com.ua

Крок 1. nginx
#

Ставимо вебсервер. Apache при цьому бути не повинно - обидва слухають порт 80 і просто поб’ються за нього:

1
apt install -y nginx

Крок 2. Server block
#

Ось вона, вся різниця між Apache і nginx. Замість <VirtualHost> - server-блок. Створюємо конфіг сайту:

1
nano /etc/nginx/sites-available/wordpress
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name wordpress.example.com;
    root /var/www/wordpress;
    index index.php index.html;

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

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php8.4-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

Два рядки, де вся суть:

  • try_files $uri $uri/ /index.php?$args; - це nginx-аналог «гарних посилань». У Apache за них відповідав .htaccess з mod_rewrite; у nginx .htaccess нема взагалі, і цей рядок робить те саме: якщо файлу нема - віддай запит у index.php, хай WordPress сам розрулить маршрут.
  • fastcgi_pass unix:/run/php/php8.4-fpm.sock; - це прямий аналог того SetHandler "proxy:unix:...php-fpm.sock" з Apache. Саме він відправляє всі .php у сокет PHP-FPM. Шлях до сокета - той самий, що й у конфізі Apache (під свою версію PHP підстав свою: ls /etc/php/).

Вмикаємо наш сайт і прибираємо дефолтний (щоб не віддавав сторінку-привітання nginx):

1
2
rm -f /etc/nginx/sites-enabled/default
ln -sf /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/wordpress

Крок 3. Перевірка конфігу і перезапуск
#

Спочатку синтаксис, потім перечитуємо:

1
2
nginx -t
systemctl reload nginx

nginx -t - звичка, яку варто мати: він скаже syntax is ok / test is successful ще до того, як ти щось зламаєш наживо.

Дивимось
#

1
2
curl -s http://localhost/ | head
curl -sI http://localhost/

У першому виводі видно <title>Мій блог</title> - це вже WordPress, а не сторінка-привітання nginx. У другому - Server: nginx і заголовок Link: ...rel="https://api.w.org/": тобто фронт тепер nginx, а WordPress живий і відповідає через PHP-FPM. Усе, як у записі вище.

Різниця між Apache і nginx для WordPress - це один server-блок: try_files замість .htaccess і fastcgi_pass замість SetHandler. PHP-FPM, MariaDB і Redis навіть не помітять, що фронт змінився. А як зібрати весь стек з нуля - у пості про Apache.

WordPress по-дорослому - частина серії статей.
Частина 3: ця стаття (ти тут)

Related