fastcgi, try_files, problems

Maxim Dounin mdounin at mdounin.ru
Thu Jul 16 21:58:56 MSD 2009


Hello!

On Thu, Jul 16, 2009 at 03:07:29PM +0200, Tomasz Pajor wrote:

> Maxim Dounin wrote:
>> Hello!
>>
>> On Thu, Jul 16, 2009 at 02:06:34PM +0200, Tomasz Pajor wrote:
>>
>>   
>>> Hello all,
>>>
>>> I have a problem with proper configuration of my page.
>>>
>>> What I want to achieve is that:
>>> - http://domain.com/ should point to an upstream bucket of fastcgi apps.
>>> - http://domain.com/administrator should be served by a fastcgi 
>>> server  on the same machine as balancer, so it should point to 
>>> 127.0.0.1:3000 in  this case
>>> - i think there is a way to simplify the two backend.php entries
>>> - all /js/ entries for domain.com should be served staticly
>>> - static.domain.com should be served staticly
>>>
>>> Don't know what am I doing wrong, but the debug says that when i go 
>>> to  http://domain.com/administrator it uses the location 
>>> /administrator but  then it's redirected to /index.php and it uses 
>>> location /, so not as I  intended.
>>>
>>> Can You guys help me sort this out?
>>>
>>> Configuration is as follows:
>>>
>>> upstream apps {
>>>    server 10.0.1.50:3000;
>>> }
>>>
>>> server {
>>>    listen 80;
>>>    server_name domain.com;
>>>    error_log /var/log/nginx/domain-error.log debug;
>>>
>>>    location / {
>>>        root /disk0/vhosts/domain/public;
>>>        try_files $uri $uri /index.php;
>>>     
>>
>> See no reasons to test $uri twice.
>>
>>   
>>>        fastcgi_pass apps;
>>>        #fastcgi_index index.php;
>>>        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
>>>        include fastcgi_params;
>>>    }
>>>
>>>    location /administrator {
>>>        root /disk0/vhosts/domain/public;
>>>        try_files $uri $uri index.php;
>>>     
>>
>> You fallback to 'index.php' which is wrong as far as I see (it  
>> produces redirect to 'index.php' in case of no file found - it's  
>> simply invalid since has no leading '/').  Probably you mean to use 
>>
>>          try_files $uri /administrator/index.php;
>>
>> instead, and probably it's a good idea to specify separate location for 
>> /administrator/index.php to avoid internal redirection loop in case 
>> there will be no /administrator/index.php file.
>>   
> There is no /administrator/index.php file.
> I want to simply separate the administrator backend, and serve it from  
> the same machine as balancer, because i've got all the gallery photos on  
> this machine.

So there is no /disk0/vhosts/domain/public/administrator directory 
at all, am I right?

> I'm migrating this from apache.
>
> .htaccess says:
> RewriteEngine On
> RewriteCond %{REQUEST_FILENAME} -s [OR]
> RewriteCond %{REQUEST_FILENAME} -l [OR]
> RewriteCond %{REQUEST_FILENAME} -d
> RewriteRule ^.*$ - [NC,L]
> RewriteRule ^.*$ index.php [NC,L]

As far as I understand you basically need to pass everything to 
fastcgi while rewriting everything that doesn't exist to 
index.php?  Try something like this:

    root /disk0/vhosts/domain/public;

    fastcgi_index index.php;

    location / {
        try_files $uri $uri/ @fallback;
        fastcgi_pass apps;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        ...
    }

    location @fallback {
        fastcgi_pass apps;
        fastcgi_param SCRIPT_FILENAME $document_root/index.php;
        ...
    }

    location /administrator/ {
        rewrite ^/administrator(.*) $1 break;
        try_files $uri $uri/ @adminfallback;
        fastcgi_pass 127.0.0.1:3000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        ...
    }

    location @adminfallback {
        fastcgi_pass 127.0.0.1:3000;
        fastcgi_param SCRIPT_FILENAME $document_root/index.php;
        ...
    }

>>>        fastcgi_pass 127.0.0.1:3000;
>>>        #fastcgi_index index.php;
>>>        #fastcgi_param SCRIPT_FILENAME    
>>> /disk0/vhosts/domain/public/index.php;
>>>        fastcgi_param SCRIPT_FILENAME   
>>> /disk0/vhosts/domain/public/$fastcgi_script_name;
>>>        include fastcgi_params;
>>>    }
>>>
>>>    location /js/lib/xinha/plugins/ExtendedFileManager/backend.php {
>>>        fastcgi_pass 127.0.0.1:3000;
>>>        fastcgi_index backend.php;
>>>        fastcgi_param SCRIPT_FILENAME    
>>> /disk0/vhosts/domain/public/js/lib/xinha/plugins/ExtendedFileManager/backend.php;
>>>        include fastcgi_params;
>>>        access_log /var/log/nginx/backend1.log;
>>>    }
>>>
>>>    location /js/lib/xinha/plugins/ImageManager/backend.php {
>>>        fastcgi_pass 127.0.0.1:3000;
>>>        fastcgi_index backend.php;
>>>        fastcgi_param SCRIPT_FILENAME    
>>> /disk0/vhosts/domain/public/js/lib/xinha/plugins/ImageManager/backend.php;
>>>        include fastcgi_params;
>>>        access_log /var/log/nginx/backend2.log;
>>>    }
>>>
>>>    location ~ ^/(js)/  {
>>>     
>>
>> Any reasons to use regex here?  It should be enough to use normal 
>>
>>      location /js/ {
>>
>> unless you want to render the above '/js/.../backend.php' locations  
>> useless.
>>   
> Yes the regex is useless in this case.
> Is there any way of merging this to */backend.php locations?

Do not understand question.  All 3 locations mentioned are quite 
different in your config - /js/ serves static, while backend.php's 
are passed to fastcgi (and one backend.php writes backend1.log, 
while other - backend2.log).  What do you mean by "merging"?

If you want to avoid duplicate parts of configuration - use 
include directive or inheritance from upper levels.

Maxim Dounin





More information about the nginx mailing list