Назад | Перейти на главную страницу

Nginx + Wordpress в подкаталоге

Недавно я переместил наш домашний сайт на ASP.NET Core 1.0. Это позволило мне перенести сайт в среду Linux. У нас также есть / blog на этом сайте, который является блогом wordpress. Все перенесено правильно, кроме W3 Total Cache. Вот что я сделал.

Установленные PHP-FPM и DNX находятся за обратным прокси-сервером на Nginx. Вот иерархия папок. / var / www / aspnet / var / www / wordpress

Вот все файлы конфигурации, связанные с Nginx

/etc/nginx/nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    log_format scripts '$document_root$fastcgi_script_name > $request';
    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;

}

/etc/nginx/sites-available/xyz.com

server {
    listen 443 ssl http2;
    server_name xyz.com www.xyz.com;
    ssl_certificate /etc/ssl/certs/cert_chain.crt;
    ssl_certificate_key /etc/ssl/private/xyz.private.txt;   
    access_log /var/log/nginx/scripts.log scripts;

    # Global restrictions configuration file.
    # Designed to be included in any server {} block.
    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

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

    # Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
    # Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban)
    location ~ /\. {
        deny all;
    }

    # Deny access to any files with a .php extension in the uploads directory
    # Works in sub-directory installs and also in multisite network
    # Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban)
    location ~* /blog/(?:uploads|files)/.*\.php$ {
        deny all;
    }

    gzip_types text/css text/x-component application/x-javascript application/javascript text/javascript text/x-js text/richtext image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon;
    location ~ ^/blog/\.(css|htc|less|js|js2|js3|js4)$ {
        expires 31536000s;
        add_header Pragma "public";
        add_header Cache-Control "max-age=31536000, public";
    }
    location ~ \.(html|htm|rtf|rtx|svg|svgz|txt|xsd|xsl|xml)$ {
        expires 3600s;
        add_header Pragma "public";
        add_header Cache-Control "max-age=3600, public";
    }
    location ~ \.(asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|eot|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|json|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|otf|odb|odc|odf|odg|odp|ods|odt|ogg|pdf|png|pot|pps|ppt|pptx|ra|ram|svg|svgz|swf|tar|tif|tiff|ttf|ttc|wav|wma|wri|woff|xla|xls|xlsx|xlt|xlw|zip)$ {
        expires 31536000s;
        add_header Pragma "public";
        add_header Cache-Control "max-age=31536000, public";
    }
    location / {
        proxy_pass http://unix:/var/www/aspnet/kestrel.sock;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection keep-alive;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_cache_bypass $http_upgrade;
    }
    location /phpmyadmin/ {
        alias /var/www/phpMyAdmin/;
        index index.php;
    }

    location ~ ^/phpmyadmin/(.+\.php)$ {

        alias /var/www/phpMyAdmin/$1;
        fastcgi_pass   unix:/run/php/phpmyadmin.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $request_filename;

        # From fastcgi_params
        fastcgi_param  QUERY_STRING       $query_string;
        fastcgi_param  REQUEST_METHOD     $request_method;
        fastcgi_param  CONTENT_TYPE       $content_type;
        fastcgi_param  CONTENT_LENGTH     $content_length;
        fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
        fastcgi_param  REQUEST_URI        $request_uri;
        fastcgi_param  DOCUMENT_URI       $document_uri;
        fastcgi_param  DOCUMENT_ROOT      /var/www/phpMyAdmin;
        fastcgi_param  SERVER_PROTOCOL    $server_protocol;
        fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
        fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;
        fastcgi_param  REMOTE_ADDR        $remote_addr;
        fastcgi_param  REMOTE_PORT        $remote_port;
        fastcgi_param  SERVER_ADDR        $server_addr;
        fastcgi_param  SERVER_PORT        $server_port;
        fastcgi_param  SERVER_NAME        $server_name;
        fastcgi_param  REDIRECT_STATUS    200;
    }

    location /blog/ {           
        try_files $uri $uri/ index.php?q=$request_uri;
        alias /var/www/wordpress/;
        index index.php;                        
    }   

    location ~ \.php$ {             
        include /var/www/wordpress/nginx.conf;
        try_files $uri $uri/ index.php?q=$request_uri =404;
        alias /var/www/wordpress/$1;
        fastcgi_pass   unix:/run/php/phpmyadmin.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;


        # From fastcgi_params
        fastcgi_param  QUERY_STRING       $query_string;
        fastcgi_param  REQUEST_METHOD     $request_method;
        fastcgi_param  CONTENT_TYPE       $content_type;
        fastcgi_param  CONTENT_LENGTH     $content_length;
        fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
        fastcgi_param  REQUEST_URI        $request_uri;
        fastcgi_param  DOCUMENT_URI       $document_uri;
        fastcgi_param  DOCUMENT_ROOT      /var/www/wordpress;
        fastcgi_param  SERVER_PROTOCOL    $server_protocol;
        fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
        fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;
        fastcgi_param  REMOTE_ADDR        $remote_addr;
        fastcgi_param  REMOTE_PORT        $remote_port;
        fastcgi_param  SERVER_ADDR        $server_addr;
        fastcgi_param  SERVER_PORT        $server_port;
        fastcgi_param  SERVER_NAME        $server_name;
        fastcgi_param  REDIRECT_STATUS    200;          
    }
}

/var/www/wordpress/nginx.conf - это файл, созданный плагином W3 Total Cache.

# BEGIN W3TC Page Cache core
set $w3tc_rewrite 1;
if ($request_method = POST) {
    set $w3tc_rewrite 0;
}
if ($query_string != "") {
    set $w3tc_rewrite 0;
}
if ($request_uri !~ \/$) {
    set $w3tc_rewrite 0;
}
if ($http_cookie ~* "(comment_author|wp\-postpass|w3tc_logged_out|wordpress_logged_in|wptouch_switch_toggle)") {
    set $w3tc_rewrite 0;
}
if ($http_cookie ~* "(w3tc_preview)") {
    set $w3tc_rewrite _preview;
}
set $w3tc_ssl "";
if ($scheme = https) {
    set $w3tc_ssl _ssl;
}
set $w3tc_enc "";
if ($http_accept_encoding ~ gzip) {
    set $w3tc_enc _gzip;
}
set $w3tc_ext "";
if (-f "$document_root/var/www/wordpress/wp-content/cache/page_enhanced/$http_host/$request_uri/_index$w3tc_ssl$w3tc_rewrite.html$w3tc_enc") {
    set $w3tc_ext .html;
}
if (-f "$document_root/var/www/wordpress/wp-content/cache/page_enhanced/$http_host/$request_uri/_index$w3tc_ssl$w3tc_rewrite.xml$w3tc_enc") {
    set $w3tc_ext .xml;
}
if ($w3tc_ext = "") {
  set $w3tc_rewrite 0;
}
if ($w3tc_rewrite = 1) {
    rewrite .* "/var/www/wordpress/wp-content/cache/page_enhanced/$http_host/$request_uri/_index$w3tc_ssl$w3tc_rewrite$w3tc_ext$w3tc_enc" last;
}
# END W3TC Page Cache core

Как только я выполнил вышеуказанную конфигурацию. Я могу запускать постоянные ссылки wordpress. Однако, когда я открываю / blog / или / blog / wp-admin /, он показывает, что он не найден. Для устранения неполадок я добавил несколько пользовательских журналов в nginx следующим образом.

log_format scripts '$document_root$fastcgi_script_name > $request';

Вот что показали логи

/var/www/wordpress//blog/wp-admin/index.php> GET /blog/wp-admin/index.php HTTP / 2.0 /var/www/wordpress//blog/index.php> GET / blog / HTTP / 2.0

Я пробовал много решений. Все они предполагают, что родительский сайт будет wordpress. В моем случае родительский сайт построен на DotNet Core 1. / blog - мой блог на wordpress. Проблема должна быть в одном из неправильных правил перезаписи.

Подводя итог, я могу сказать, что общий кэш I W3 не является проблемой. Я могу жить без этого. Проблема связана с правилами переписывания, когда вы размещаете сайт WordPress в качестве поддомена статического сайта. Часть конфигурации общего кеша W3 можно игнорировать. Я разместил такой сайт, как mydomain.com/blog, и правила перезаписи не применяются. На данный момент я перепробовал много альтернатив. Если кто-то реализовал Wordpress как чистый подкаталог, а не подкаталог с несколькими сайтами. Они могут предоставить свою успешную конфигурацию.

Это не дает прямого ответа на ваш вопрос, но, вероятно, это лучший вариант, о котором вы, возможно, не думали. Вместо того, чтобы использовать плагин для кеширования, используйте кеширование страниц Nginx. Это намного быстрее, потому что вам не нужно вызывать PHP, что избавляет от множества накладных расходов.

Обратной стороной является сложность аннулирования кеша Nginx, если вы не платите за коммерческую версию Nginx. Вы можете собрать Nginx с плагинами, которые выполняют эту работу, но интеграция кеширования Wordpress / Nginx не очень хороша. Я не нашел подходящей работы. Поэтому вам нужно тщательно установить максимальный срок службы кеша. Интересно, что на загруженном сайте кеширование даже на несколько секунд может иметь преимущества. Мои сайты меняются редко, и если мне нужно, я могу просто rm -rf указать правильные каталоги, в которых находится кеш страниц nginx, который на самом деле находится в памяти.

У меня есть руководство по этому поводу Вот, и вокруг будет много других. Есть отличная статья о Микрокеширование Nginx здесь.

SF любит актуальные данные на странице на случай, если сайты исчезнут.

В вашем nginx.conf

fastcgi_cache_key "$scheme$request_method$host$request_uri";

В верхней части файла сайта или в конфигурации nginx

fastcgi_cache_path /dev/shm/nginxcache levels=1:2 keys_zone=CACHENAME:10m inactive=1440m; # Centos / Amazon Linux in RAM, 1440 minutes = 24 hours

В вашем блоке местоположения, который вызывает PHP

fastcgi_pass php56-fpm;
include        fastcgi_params;
fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;

fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
fastcgi_cache CACHENAME;
fastcgi_cache_valid 200 1440m;
fastcgi_cache_valid 403 404 405 410 414 301 302 307 60m;
add_header X-Cache $upstream_cache_status; # This can be removed if desired

fastcgi_cache_methods GET HEAD;
fastcgi_keep_conn on;

В этом руководстве, на которое я ссылался, есть гораздо больше информации и объяснений.

Вам нужно выполнить несколько шагов, чтобы исправить проблему (из текущей ситуации) ...

В файловой системе ...

Видеть: https://codex.wordpress.org/Giving_WordPress_Its_Own_Directory

  1. Переместить основные файлы WordPress из /var/www/wordpress к /var/www/wordpress/blog. (Подсказка: mv /var/www/wordpress /var/www/blog && mkdir /var/www/wordpress && mv /var/www/blog /var/www/wordpress)

  2. Копировать /var/www/wordpress/blog/index.php в каталог /var/www/wordpress/.

  3. Отредактируйте /var/www/wordpress/index.php файл и измените строку require( dirname( __FILE__ ) . '/wp-blog-header.php' ); к require( dirname( __FILE__ ) . '/blog/wp-blog-header.php' );.

Nginx:

Теперь о Nginx. Вот изменения в соответствующих частях ...

location /blog {           
    root /var/www/wordpress;
    index index.php;
    try_files $uri $uri/ /blog/index.php?q=$request_uri;                        
}   

location ~ \.php$ {             
    root /var/www/wordpress;
    index index.php;
    try_files $uri $uri/ /blog/index.php?q=$request_uri =404;

    # other configuration directives
}

Есть два основных изменения:

  1. В alias директива становится root
  2. В try_files директива содержит /blog/ перед index.php.

Надеюсь, это поможет!