Nginx + Wordpress no subdiretório

5

Eu migrei recentemente nosso site para o ASP.NET Core 1.0. Isso me permitiu mover site em ambiente linux. Nós também temos / blog sob este site que é um blog wordpress. Todos migraram corretamente, exceto o W3 Total Cache. Aqui está o que eu fiz.

O PHP-FPM e o DNX instalados estão por trás do proxy reverso no Nginx. Aqui está a hierarquia de pastas. / var / www / aspnet / var / www / wordpress

Aqui estão todos os arquivos de configuração relacionados ao 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 - Este é o arquivo gerado pelo plugin 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

Depois de ter feito a configuração acima. Eu sou capaz de executar permalinks do wordpress. No entanto, quando eu abro / blog / ou / blog / wp-admin / mostra não encontrado. Para fins de solução de problemas, adicionei alguns registros personalizados no nginx da seguinte forma.

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

Aqui está o que os registros mostraram

/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

Eu tentei muitas soluções. Todos eles assumem que o site pai seria wordpress. No meu caso, o site pai é construído no DotNet Core 1. / blog é o meu blog wordpress. A questão deve ser uma das regras de reescrita erradas.

Para resumir o problema, o W3 Total Cache não é um problema. Eu posso viver sem isso. O problema em questão é sobre regras de reescrita quando você hospeda um site wordpress como um subdomínio para um site estático. Pode-se ignorar a parte de configuração de cache total do W3. Hospedei sites como mydomain.com/blog e as regras de reescrita não estão sendo aplicadas. Eu tentei muitas alternativas a partir de agora. Se alguém implementou o Wordpress como um subdiretório puro e não como subdiretório multisite. Eles podem fornecer sua configuração bem-sucedida.

    
por Chintan Shah 11.04.2016 / 12:44

2 respostas

1

Isso não responde diretamente à sua pergunta, mas provavelmente é uma opção melhor que talvez você não tenha considerado. Em vez de usar um plug-in para fazer cache, use o cache de páginas Nginx. É muito mais rápido porque você não precisa fazer uma chamada para o PHP, o que elimina muita sobrecarga.

A desvantagem é que é complicado invalidar o cache Nginx, a menos que você pague pela versão comercial do Nginx. Você pode construir o Nginx com plugins que fazem o trabalho, mas a integração de cache do Wordpress / Nginx não é grande. Nenhum eu encontrei trabalho bem. Então você precisa definir com cuidado a vida máxima do seu cache. Curiosamente, em um site movimentado caching por até alguns segundos pode ter benefícios. Meus sites mudam raramente, e se eu precisar, posso apenas rm -rf os diretórios corretos onde o cache de páginas nginx mora - o que na verdade está na memória.

Eu tenho um tutorial sobre este aqui , e haverá muitos outros por aí. Há um ótimo artigo sobre microcache Nginx aqui .

O SF gosta de dados reais na página caso os sites desapareçam.

No seu nginx.conf

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

Na parte superior do arquivo do seu site ou na configuração do 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

No seu bloco de localização que chama 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;

Esse tutorial que eu criei tem muito mais informações e explicações.

    
por 14.04.2016 / 05:16
0

Você precisa de alguns passos ao longo do caminho para corrigir o problema (da situação atual) ...

No sistema de arquivos ...

Veja: link

  1. Mova os arquivos principais do WordPress de /var/www/wordpress para /var/www/wordpress/blog . (Dica: mv /var/www/wordpress /var/www/blog && mkdir /var/www/wordpress && mv /var/www/blog /var/www/wordpress )

  2. Copie /var/www/wordpress/blog/index.php para o diretório /var/www/wordpress/ .

  3. Edite o arquivo /var/www/wordpress/index.php e altere a linha require( dirname( __FILE__ ) . '/wp-blog-header.php' ); para require( dirname( __FILE__ ) . '/blog/wp-blog-header.php' ); .

Nginx:

Agora, a parte Nginx. Aqui estão as mudanças na parte relevante ...

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
}

Existem duas alterações principais:

  1. A diretiva alias torna-se root
  2. A diretiva try_files contém /blog/ antes de index.php .

Espero que isso ajude!

    
por 18.04.2016 / 04:02