Como Michael Hampton diz, você tem uma configuração bastante complicada lá e pode ser melhor manter as coisas simples e fazer as coisas funcionarem primeiro. Aqui está minha configuração básica do WordPress para o nginx (que funciona com permalinks):
root /var/www/mydomain.com/prod;
index index.php;
location / {
# This is cool because no PHP is called for static content
# The key thing here is passing the $args to index.php
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
# Zero-day exploit defense
# http://forum.nginx.org/read.php?2,88845,page=3
# Won't work properly (404 error) if the file is not stored on this
#server, which is entirely possible with php-fpm/php-fcgi.
# Comment the 'try_files' line out if you set up php-fpm/php-fcgi on
#another machine. And then cross your fingers that you won't get hacked.
try_files $uri =404;
# For caching advice, see Mark Jaquith's superb post here:
# http://markjaquith.wordpress.com/2012/05/15/how-i-built-have-baby-need-stuff/
# To do some super-fancy rate limiting for the backend PHP requests,
# declare the following limit_req_zone in the http {} block of your nginx.conf e.g.
# limit_req_zone $binary_remote_addr zone=appserver:1m rate=2r/s;
# Then uncomment the below limit_req_zone line
## Set the request zone to limit backend DoSsing
# limit_req zone=appserver burst=6;
include /etc/nginx/proxy.conf;
proxy_pass http://backend;
}
É isso - legal e simples. Você não precisa mais fazer nada a partir da sua configuração antiga: (try_files irá obter nginx para tentar servi-lo diretamente, então tente a próxima opção de parâmetro, então a próxima, etc.)
# # Add trailing slash to */wp-admin requests.
# rewrite /wp-admin$ $scheme://$host$uri/ permanent;
# # All media (including uploaded) is under wp-content/ so
# # instead of caching the response from apache, we're just
# # going to use nginx to serve directly from there.
# location ~* ^/(wp-content|wp-includes)/(.*)\.(jpg|png|gif|jpeg|css|js|m$
# root /var/www/mydomain.com/prod;
# }
# # Don't cache these pages.
# location ~* ^/(wp-admin|wp-login.php)
# {
# proxy_pass http://backend;
# }
Para facilitar o teste, abra um terminal, o SSH no servidor e execute tail -f /var/log/nginx/*.log
(ou onde quer que seus logs estejam armazenados) e observe os erros. Não se esqueça de reiniciar ou recarregar o servidor depois de fazer alterações na configuração!
Além disso, dependendo de qual versão do nginx você está rodando, e em qual sistema operacional (eu estou supondo Debian ou Ubuntu do seu / var / www / path), você pode rodar /etc/init.d/nginx configtest
que irá testar seu arquivo de configuração e relatar mensagens de erro úteis sobre erros - isso tornará a vida muito mais fácil.
Assim que você tiver o trabalho acima e testado, aqui estão algumas dicas interessantes, como a adição de expires & cabeçalhos de cache para imagens carregadas; Restrições de IP, limite de taxa e log extra para acesso de administrador e tentativas de login; etc:
location ~ ^/wp-content/uploads/.+\.(jpe?g|gif|png|ico|bmp)$ {
# set a expires to max as per http://developer.yahoo.com/performance/rules.html/#expires
expires max;
add_header Cache-Control public;
}
# Make sure you avoid the static cache when logging in or doing admin
location /wp-admin {
# Restrict by IP for extra security (I'd also highly recommend the Login Lockdown plugin or the Duo Two-Factor Authentication plugin)
# allow 81.128.0.0/11; # BT Central Plus
# allow 86.128.0.0/10; # BT Central Plus
# deny all;
access_log /var/log/nginx/wp-admin.log;
error_log /var/log/nginx/wp-admin.error.log error;
include /etc/nginx/proxy.conf;
proxy_pass http://backend;
}
# Make sure you avoid the static cache when logging in or doing admin
location = /wp-login.php {
# Restrict by IP for extra security
# allow 81.128.0.0/11; # BT Central Plus
# allow 86.128.0.0/10; # BT Central Plus
# deny all;
# Declare the zone in the http {} block of your nginx.conf e.g.
# limit_req_zone $binary_remote_addr zone=appserver:1m rate=2r/s;
# Then uncomment the below line to limit hits to wp-login to 2 per second (plus a burst of 2 using the leaky bucket model)
# limit_req zone=appserver burst=2 nodelay;
access_log /var/log/nginx/login-attempts.log;
include /etc/nginx/proxy.conf;
proxy_pass http://backend;
}