Краткая инструкция по настройки конфигурации виртуального хоста 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]