Search code examples
perlnginxcgi-application

nginx fastcgi configuration for CGI::Application app


I am trying to get a C::A app work in nginx fastcgi environment (debian 6.0) and using spawn-fcgi.

C::A route is configured using $self->mode_param( path_info=> 1, param => 'rm' );

the problem is that whatever C::A app urls (example.com/cities, example.com/profile/99 etc ) I am requesting, it always displays the homepage which is what the example.com/index.pl does.

my nginx setup is

server {
    listen   80;
    server_name example.com;
    root /var/www/example.com/htdocs;
    index  index.pl index.html;

    location / {
        try_files $uri $uri/ /index.pl;
    }

    location ~ .*\.pl$ {
            include fastcgi_params;   # this is the stock fastcgi_params file supplied in debian 6.0
            fastcgi_index index.pl;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PERL5LIB "/var/www/example.com/lib";
            fastcgi_param CGIAPP_CONFIG_FILE "/var/www/example.com/conf/my.conf";
            fastcgi_pass unix:/var/run/fcgiwrap.socket;
    }

}

I have successfully setup few php apps in similar fashion.

in this case, however, I suspect that I am not passing essential fastcgi_param down to C::A which is required by it.

what's your thoughts?


Solution

  • I ended up solving the problem with a workaround in my C::A app. And I am documenting it here.

    So I didn't managed to have nginx pass along the PATH_INFO down to my C::A app. To work around this, I set the PATH_INFO with the value of REQUEST_URI in my C::A app so it picks up the correct runmode.

    Also, nginx isn't passing QUERY_STRING either so I had to append $query_string to the catch all route in order to pass along QUERY_STRING down as well.

    my nginx config ends up like this:

    server {
        listen   80;
        server_name example.com;
        root /var/www/example.com/htdocs;
        index  index.pl index.html;
    
        location / {
            try_files $uri $uri/ /index.pl?$query_string;
        }
    
        location ~ .*\.pl$ {
                include fastcgi_params;   # this is the stock fastcgi_params file supplied in debian 6.0
                fastcgi_index index.pl;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PERL5LIB "/var/www/example.com/lib";
                fastcgi_param CGIAPP_CONFIG_FILE "/var/www/example.com/conf/my.conf";
                fastcgi_pass unix:/var/run/fcgiwrap.socket;
        }
    
    }