I have a little dilemma. I wrote a custom PHP MVC framework and built a CMS on top of it. I decided to give nginx+fpm a whirl too. Which is the root of my dilemma. I was asked to incorporate a wordpress blog into my website (yah.) It has much content and it's not feasible in the short amount of time I have to bring all the content into my CMS. Because of using Apache for years, I'm, admittedly, a little lost using nginx.
My website has the file path:
/opt/directories/mysite/public/
The wordpress files are located at:
/opt/directories/mysite/news/
I know I just need to setup location(s) that targets /news[/*] and then forces all matching URI's to the index.php within. Can someone point me in the right direction perhaps?
My configuration is below:
server {
listen 80;
server_name staging.mysite.com
index index.php;
root /opt/directories/mysite/public;
access_log /var/log/nginx/mysite/access.log;
error_log /var/log/nginx/mysite/error.log;
add_header X-NodeName directory01;
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location / {
try_files $uri $uri/ /index.php?route=$uri&$args;
}
location ~ /news {
try_files $uri $uri/ @news;
}
location @news {
fastcgi_pass unix:/tmp/php-fpm.sock;
fastcgi_split_path_info ^(/news)(/.*)$;
fastcgi_param SCRIPT_FILENAME /opt/directories/mysite/news/index.php;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
include fastcgi_params;
include php.conf;
location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml)$ {
access_log off;
expires 30d;
}
## Disable viewing .htaccess & .htpassword
location ~ /\.ht {
deny all;
}
}
My php.conf file:
location ~ \.php {
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 unix:/tmp/php-fpm.sock;
# If you must use PATH_INFO and PATH_TRANSLATED then add
# the following within your location block above
# (make sure $ does not exist after \.php or /index.php/some/path/ will not match):
#fastcgi_split_path_info ^(.+\.php)(/.+)$;
#fastcgi_param PATH_INFO $fastcgi_path_info;
#fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
}
fastcgi_params file:
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;
Thanks, in large part, to @Kromey, I have adjusted my location /news/ but I am still not getting the desired result.
I was able to learn to tack a ~ my /news location as I discovered that my php location was being matched first.
With this setup, I now get a 200 status, but the page is blank. Any ideas?
This is actually quite simple, and a heckuva lot more compact than the similar setup for Wordpress on Apache (I run 2 Wordpress blogs, both previously on Apache and both recently migrated to nginx+PHP (not FPM, although I did have that running for a time before deciding it was overkill for my low-traffic sites)).
As the comment implies, any static content (images, CSS, JavaScript, robots.txt, etc.) that lives inside your Wordpress path gets served directly, with no PHP involvement; everything else gets routed to index.php.
Note that the
try_files
directive is semi-new (0.8 I think?), so you may have to upgrade your nginx; when I installed from the Ubuntu apt repositories, it was too old a version to do this, and the configuration was so much more complex that Iapt-get remove
d it and installed nginx from source (a rather simple operation).