Краткая инструкция по настройки конфигурации виртуального хоста nginx для работы CMS WordPress с использованием постоянных ссылок, а также некоторые настройки PHP для корректной работы WordPress.
Всё дело в том, что nginx, в отличие от Apache, не понимает файл .htaccess, и поэтому для работы WordPress необходимо внести некоторые изменения в настройки виртуальных хостов.
Данная инструкция была опробована на ОС Gentoo GNU/Linux, но подойдёт для любых операционных систем Linux и FreeBSD.
Перед тем, как выполнить все действия, которые описаны ниже, необходимо установить и настроить стек LEMP. Выберите ОС, в которой он будет (или уже) развёрнут и перейдите по ссылке:
- для Debian GNU/Linux: https://dondub.com/2021/07/zapusk-lemp-servera-na-debian-10/
- для Ubuntu Server: https://dondub.com/2021/07/zapusk-lemp-servera-na-ubuntu-server/
- для CentOS или CentOS Stream: https://dondub.com/2021/07/zapusk-lemp-servera-na-centos-stream-8/
- для Gentoo GNU/Linux: https://dondub.com/2021/07/zapusk-lemp-servera-v-gentoo/ и настройка виртуальных хостов: https://dondub.com/2021/07/nastroyka-virtualnyh-hostov-nginx-v-gentoo/
- для FreeBSD (FEMP): https://dondub.com/2021/07/zapusk-femp-servera/
Затем открываем файл php.ini и при необходимости исправляем в нём следующие параметры:
max_execution_time — параметр максимального времени выполнения скрипта (по умолчанию 30 секунд) — если у вас сервер достаточной мощности, можно оставить по умолчанию, если нет — увеличиваем время до 60 или даже до 120 секунд
max_execution_time = 60
memory_limit — ограничение оперативной памяти для выполнения скрипта (по умолчанию 128 MB) — если скрипты тяжёлые — лучше увеличить, например 256 или 512 MB
memory_limit = 256M
upload_max_filesize — максимальный размер файла, который может быть загружен с использованием PHP (по умолчанию 2 MB) — при использовании WordPress выставить значение хотя-бы 20 MB
upload_max_filesize = 20M
По окончании необходимо будет перезапустить службу php-fpm.
Теперь открываем файл конфигурации виртуального хоста nginx и дописываем и/или изменяем следующие параметры:
после строчки
root /var/www/yoursite.com/htdocs;
допишем
index index.php;
перед строчкой
location ~ .php$
вставим
location / {
try_files $uri $uri/ /index.php$args;
}
после строчки
location ~ \.php$ {
...
}
допишем
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
также и для SSL.
На выходе конфигурация виртуального хоста должна выглядеть примерно так:
server {
listen 192.168.1.45;
server_name yoursite.com;
access_log /var/log/nginx/yoursite.com.access_log main;
error_log /var/log/nginx/yoursite.com.error_log info;
root /var/www/yoursite.com/htdocs;
index index.php;
location / {
try_files $uri $uri/ /index.php$args;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_index index.php;
include fastcgi_params;
# для Gentoo
fastcgi_pass unix:/run/php-fpm.socket;
# для Debian, CentOS, Ubuntu Server и FreeBSD путь к fastcgi_pass будет другим, пройдите по указанным выше ссылкам
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
}
# SSL site
server {
listen 192.168.1.45:443;
server_name yoursite.com;
ssl on;
# проверьте пути к сертификатам, как они расположены у вас
ssl_certificate /etc/ssl/nginx/nginx.pem;
ssl_certificate_key /etc/ssl/nginx/nginx.key;
access_log /var/log/nginx/yoursite.com.ssl_access_log main;
error_log /var/log/nginx/yoursite.com.ssl_error_log info;
root /var/www/yoursite.com/htdocs;
index index.php;
location / {
try_files $uri $uri/ /index.php$args;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_index index.php;
include fastcgi_params;
# для Gentoo
fastcgi_pass unix:/run/php-fpm.socket;
# для Debian, CentOS, Ubuntu Server и FreeBSD путь к fastcgi_pass будет другим, пройдите по указанным выше ссылкам
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
}
Готово! Теперь WordPress должен работать без проблем.
Если не получилось — пишите в комментариях, разберёмся.
А как настроить некоторые опции, если на хостинге уже настроена связка nginx+apache? Нужно сделать что-то типа такого:
Allow from all
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} ^.*(mp3|m4a|jpeg|jpg|gif|png|bmp|pdf|doc|docx|ppt|pptx)$
RewriteCond %{REQUEST_FILENAME} !^.*(cropped-cropped-happy_logo-1-1.png)$
RewriteCond %{HTTP_COOKIE} !^.*wordpress_logged_in.*$ [NC]
RewriteRule . — [R=403,L]