Как-то раз очень давно я уже писал о конфиге 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 дочерних сайтов.
Но хотя конфиг вполне годный и все работает устанавливать мультисайт лучше все же на поддомены, это будет сильно более эстетически приятнее и возможно часть криво написанных плагинов все же продолжат работать правильно именно в версии с отдельными поддоменами, если конечно у вас используются такие плагины