Настройка Nginx для WordPress-сайта.

В этой статье мы продолжим настраивать Nginx и напишем конфигурацию для сайта на основе WordPress. С предыдущей статьей можно ознакомиться здесь.

Во время установки Nginx был создан набор каталогов для конфигурационных файлов. Сейчас нас интересуют следующие каталоги: /etc/nginx/sites-enabled и /etc/nginx/sites-available.

В каталоге /etc/nginx/sites-available создадим файл test, в котором будет конфигурация будущего сайта.

touch /etc/nginx/sites-available/test

Создадим символическую ссылку на файл test в каталоге /etc/nginx/sites-enabled, таким образом мы включим файл в конфигурацию сервера.

ln -s /etc/nginx/sites-available/test /etc/nginx/sites-enabled/test

Откроем файл test в редакторе и начнем писать конфигурацию сайта.

nano /etc/nginx/sites-available/test

Пропишем первый блок server {}, в который добавим запрет на обращение к серверу по ip-адресу.

# Запрет на обращение к серверу по ip-адресу
server {
    listen 80 default_server;
    server_name _;
    return 444;
}

Теперь все попытки вызова сервера по ip-адресу на 80-м порту будут пресекаться, сервер будет возвращать таким клиентам ошибку 444 и разрывать с ними соединение.

Во втором блоке server {} пропишем редирект с www на основной домен. Если у вас есть доменное имя вида test.com, то будьте уверены что всегда найдется какой-нибудь умник, который добавит к нему в начало www. Если не добавить редирект в конфигурацию сайта, то такие люди не смогут попасть на него.

# Редирект с www на основное доменное имя
server {
    listen 80; 
    server_name www.test.com;
    return 301 $scheme://test.com$request_uri;
}

При обращении к серверу по имени вида www.test.com, клиенту будет возвращен 301-ый ответ с указанием перейти по адресу test.com.

return 301 $scheme://test.com$request_uri;

Здесь можно использовать два варианта ответов - 301 и 302, они имеют существенное различие.

Ответ 301 (Moved Permanently - Перемещено навсегда) кэшируется браузером клиента и в следующий раз браузер пойдет по адресу из кэша и так будет происходить все время, пока кэш не будет очищен. Ответ 302 (Moved Temporarily - Перемещено временно) не кэшируется браузером клиента и в следующий раз запрос к серверу будет послан заново.

Добавим третий блок server {}, в котором будет находиться все оставшееся.

Начнем с указания порта, который будет слушать сервер. По умолчанию это 80-й порт.

listen 80;

Укажем доменное имя сайта, для примера я использую test.com.

server_name test.com;

Добавим корневую директорию сайта и тип индексного файла.

root /var/www/test/public;
index index.php;

Укажем местонахождение лог-файлов доступа (access) и ошибок (error).

access_log /var/www/test/logs/access.log;
error_log /var/www/test/logs/error.log;

Основная часть почти готова, уже в таком виде сервер может обслуживать простенькие сайты на html, только тогда index.php нужно будет заменить на index.html.

Но поскольку сайт будет работать на WordPress, то необходимо добавить набор некоторых опций и правил, согласно WordPress-документации для Nginx.

Поскольку я не люблю кашу в конфигурационных файлах и мне нравится когда все разложено по своим местам, то следующие опции я буду подключать дополнительными файлами, через include. Такой способ удобен и практичен, однажды написанный файл может включаться в другие сайты, существенно экономя время написания конфигов.

Создадим два дополнительных файла в каталоге /etc/nginx/conf.

touch /etc/nginx/conf/restrictions.conf
touch /etc/nginx/conf/wordpress.conf

Подключим созданные файлы внутри третьего блока server {}, сразу после лог-файлов. Подобное подключение выполняется там где оно прописано и равносильно записи внутри самого блока. Файлы должны включаться в такой последовательности.

# Подключение restrictions.conf
include /etc/nginx/conf/restrictions.conf;
# Подключение wordpress.conf
include /etc/nginx/conf/wordpress.conf;

Готовый файл test выглядит так.

### хост-файл test ###
### Включается в контекст http {}, файла nginx.conf
### Располагается в /etc/nginx/sites-available

# Запрет на обращение к серверу по ip-адресу
server {
    listen 80 default_server;
    server_name _;
    return 444;
}

# Редирект с www на основное доменное имя
server {
    listen 80; 
    server_name www.test.com;
    return 301 $scheme://test.com$request_uri;
}

server {

    # Порт который будет слушать nginx
    listen      80;
	
    # Имя сайта
    server_name test.com;
	
    # Корневая директория и индексный файл
    root        /var/www/test/public;
    index       index.php;
	
    # Лог-файлы
    access_log  /var/www/test/logs/access.log;
    error_log   /var/www/test/logs/error.log;
		
    # Подключение restrictions.conf
    include /etc/nginx/conf/restrictions.conf;
    # Подключение wordpress.conf
    include /etc/nginx/conf/wordpress.conf;

}

restrictions.conf

Добавляем содержимое в restrictions.conf.

nano /etc/nginx/conf/restrictions.conf

Немного облегчим работу сервера снизив на него нагрузку. Не будем отмечать в логах доступа запросы к файлам favicon.ico и robots.txt. Также не станем фиксировать 404-ю ошибку в случае их отсутствия.

location = /favicon.ico {
    log_not_found off;
    access_log off;
}

location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
}

Немного обезопасим работу сервера путем запрета доступа к скрытым файлам и запрета выполнения php-файлов в директории uploads.

# Запрещаем доступ к скрытым файлам
location ~ /\. {
    deny all;
}

# Запрещаем доступ к файлам .php в директории uploads
location ~* /(?:uploads|files)/.*\.php$ {
    deny all;
}

Готовый файл restrictions.conf выглядит так.

### restrictions.conf ###
### Включается в контекст server {}
### Располагается в /etc/nginx/conf

location = /favicon.ico {
    log_not_found off;
    access_log off;
}

location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
}

# Запрещаем доступ к скрытым файлам
location ~ /\. {
    deny all;
}

# Запрещаем доступ к файлам .php в директории uploads
location ~* /(?:uploads|files)/.*\.php$ {
    deny all;
}

wordpress.conf

Добавляем содержимое в wordpress.conf.

nano /etc/nginx/conf/wordpress.conf

Первым делом установим правило обработки входящих запросов и дальнейшей их передачи на обработку PHP. Работает оно примерно так. Все запросы поступающие к серверу должны передаваться на обработку PHP/Wordpress, но если запрос обращен к конкретному файлу существующему на сервере, то такой файл следует отдать самостоятельно, не прибегая к помощи PHP.

Правило задается директивой try_files, сначала проверяется существование нужного файла $uri, потом на его наличие проверяются директории $uri/, а если запрос не является запросом конкретного файла, то он передается на index.php, для обработки силами WordPress. Правило задается внутри контекста "location/".

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

Следующее выражение добавляет конечный слэш "/" к запросам содержащим "/wp-admin".

rewrite /wp-admin$ $scheme://$host$uri/ permanent;

Настроим передачу запросов к FastCGI-серверу.

location ~ \.php$ {

    try_files $uri =404;
    
    include       fastcgi_params;
    fastcgi_index index.php;
    fastcgi_pass  unix:/var/run/php-fpm.sock;
    fastcgi_param SCRIPT_FILENAME 
                  $document_root$fastcgi_script_name;
}

Теперь запросу "index.php" будет соответствовать не только префиксный location "/", а еще и регулярное выражение "\.php$". Следовательно запрос будет обработан в контексте регулярного выражения и передан FastCGI-серверу через UNIX-сокет - /var/run/php-fpm.sock. Сокет задается в значении директивы fastcgi_pass.

В fastcgi_param SCRIPT_FILENAME задается значение двух переменных: $document_root и $fastcgi_script_name. Переменная $document_root задает директорию /var/www/test/public, переменная $fastcgi_script_name задает значение "/index.php". Теперь FastCGI-сервер знает местонахождение файла для выполнения.

Готовый файл wordpress.conf выглядит так.

### wordpress.conf ###
### Включается в контекст server {}
### Располагается в /etc/nginx/conf 

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

rewrite /wp-admin$ $scheme://$host$uri/ permanent;

location ~ \.php$ {

    try_files $uri =404;

    include       fastcgi_params;
    fastcgi_index index.php;
    fastcgi_pass  unix:/var/run/php-fpm.sock;
    fastcgi_param SCRIPT_FILENAME
                  $document_root$fastcgi_script_name;
}

Написанную конфигурацию можно проверить. Ответ должен быть таким как у меня.

nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Если все в порядке, то можно перезапустить сервер и переходить к установке WordPress.

systemctl restart nginx

Описание установки WordPress в следующей статье.

Ответить:

Please enter your comment!
Please enter your name here