Недавно я переместил наш домашний сайт на 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
Переместить основные файлы 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
)
Копировать /var/www/wordpress/blog/index.php
в каталог /var/www/wordpress/
.
Отредактируйте /var/www/wordpress/index.php
файл и измените строку require( dirname( __FILE__ ) . '/wp-blog-header.php' );
к require( dirname( __FILE__ ) . '/blog/wp-blog-header.php' );
.
Теперь о 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
}
Есть два основных изменения:
alias
директива становится root
try_files
директива содержит /blog/
перед index.php
.Надеюсь, это поможет!