What is the difference between using upstream and location for php-fpm?
I've been searching around but couldn't find a straight answer, if someone could please clarify this, would be greatly appreciated, thanks!
location ~ \.php$ {
try_files $uri = 404;
fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
OR/AND?
upstream php {
server unix:/run/php-fpm/php-fpm.sock;
}
Thanks!
Solution 1:
I have found that, as of nginx
1.6.2 at least, the working syntax for me for the location block is:
location ~ \.php$ {
try_files $uri = 404;
fastcgi_pass php;
fastcgi_index index.php;
include fastcgi.conf;
}
that is: one should not specify the http://
protocol before referencing the php backend.
The http://php
syntax is to be used with the proxy_pass
instruction, not fastcgi_pass
.
Solution 2:
location
is used to match expressions and create rules for them.
upstream
defines servers that can be referenced to.
In your example this means if you want to get an equivalent for
location ~ \.php$ {
try_files $uri = 404;
fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
, you would need
upstream php {
server unix:/run/php-fpm/php-fpm.sock;
}
location ~ \.php$ {
try_files $uri = 404;
fastcgi_pass php;
fastcgi_index index.php;
include fastcgi.conf;
}
The benefit of the upstream block is that you can configure more than one server/port/service as upstream and distribute the traffic on them, for example like this:
upstream php {
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server 192.68.1.2 weight=5;
server unix:/run/php-fpm/php-fpm.sock;
}
You can find more information about this in the nginx documentation:
http://nginx.org/en/docs/http/ngx_http_upstream_module.html