The main problem I see is the WordPress rewrite.
In this section remove the root and index directives and put them right under listen 80 then change the if rewrite to try files.
To help keep things organized I would move the W3 Total Cache config to a separate file and use an include to add it.
Here is an example:
server {
listen 80;
server_name domain.com www.domain.com;
root /srv/www/domain/public;
access_log /var/log/nginx/example.access.log;
error_log /var/log/nginx/example.error.log;
client_max_body_size 8M;
client_body_buffer_size 128k;
location / {
#try_files $uri $uri/ /index.php;
try_files $uri $uri/ /index.php?q=$uri&$args;
}
location /search { limit_req zone=one burst=3 nodelay; rewrite ^ /index.php; }
fastcgi_intercept_errors off;
location ~ \.php {
try_files $uri =404;
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 SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;
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_pass 127.0.0.1:9000;
}
include w3-total-cache-config.conf;
}
I recently wrote a blog post on setting up Nginx with W3 Total Cache that you might also find helpful.