Reputation: 353
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?
Upvotes: 4
Views: 1221
Reputation: 353
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;
}
}
Upvotes: 1
Reputation: 13381
I maintain CGI::Application and also use Nginx. I have not done the same thing, but I would try this:
fastcgi_split_path_info ^(/index.pl)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
This is supposed to capture and forward the PATH_INFO that you need.
References:
Upvotes: 2