Как-то раз очень давно я уже писал о конфиге Nginx для мультисайтовой установки WordPress, но в прошлый раз это была ‘правильная’ установка с дочерними блогами на отдельных поддоменах.
Но в тот прошлый раз задача постановка задачи была сильно менее сложной и сделать тоже самое в субдиректориях не так просто как кажется хотя все еще не сложно.
Так же в прошлый раз речь шла о утилите для Windows которая называлась Winginx, сейчас я опишу немного другой сценарий в качестве ОС будет Ubuntu 16.04 ( кстати говоря новый LTS релиз ), php в этот раз будет версии 7 что не очень критично, но возможно кому то не подойдет в этом случае рекомендую заменить нужные строки.
Да WordPress уже умеет работать на php 7 как и большинство популярных плагинов.
map $uri $blogname{
~^(?P<blogpath>/[^/]+/)files/(.*) $blogpath;
}
map $blogname $blogid{
default -999;
}
server {
server_name www.test-site.local test-site.local;
root /var/www/test-site.local/public_html;
index index.php;
access_log /var/log/nginx/test-site.local-access.log;
error_log /var/log/nginx/test-site.local-error.log;
location ~ ^(/[^/]+/)?files/(.+) {
try_files /wp-content/uploads/sites/$blogid/files/$2 /wp-includes/ms-files.php?file=$2 ;
access_log off;
log_not_found off;
expires max;
}
#avoid php readfile()
location ^~ /blogs.dir {
internal;
alias /var/www/test-site.local/public_html/wp-content/uploads/sites ;
access_log off;
log_not_found off; expires max;
}
if (!-e $request_filename) {
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
rewrite ^(/[^/]+)?(/wp-.*) $2 last;
rewrite ^(/[^/]+)?(/.*\.php) $2 last;
}
location / {
try_files $uri $uri/ /index.php?$args ;
}
location ~ .php$ {
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
try_files $uri =404;
fastcgi_split_path_info ^(.+.php)(/.+)$;
include fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PHP_VALUE "sendmail_path=/usr/sbin/sendmail -t -i -fmail@alkoweb.ru";
fastcgi_intercept_errors on;
fastcgi_ignore_client_abort on;
fastcgi_keep_conn on;
fastcgi_read_timeout 300;
}
}
И так как видно из кода вся ‘магия’ происходит еще до начала блока server {}, заключается в определении одной переменной которая уже в свою очередь красной нитью проходит через весь конфиг и определяет все url дочерних сайтов.
Но хотя конфиг вполне годный и все работает устанавливать мультисайт лучше все же на поддомены, это будет сильно более эстетически приятнее и возможно часть криво написанных плагинов все же продолжат работать правильно именно в версии с отдельными поддоменами, если конечно у вас используются такие плагины



