Ngnix мультисайтовой установки WordPress с дочерними сайтами в каталогах родительского домена

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *