如何使用nginx和自定义URI开发和部署Catalyst fastcgi应用程序?

时间:2013-01-30 18:50:25

标签: perl nginx fastcgi catalyst

可能它并不那么重要,但我会从我的环境开始:Linux操作系统,Perl 5.10,Catalyst 5.80032,nginx 1.0.11。

为了解决这个问题,我们假设我在端口80上使用 mydomain.com 作为应用程序网页的访问点。另外,让我们使用/var/www/mydomain作为我的Catalyst应用程序的物理位置。在这种情况下,静态内容位于/var/www/mydomain/MyApp/root/

我将应用程序作为fastcgi服务器启动(来自MyApp/script):

    > ./myapp_fastcgi.pl -l /tmp/myapp.socket -n 2 -p /tmp/myapp.pid -d

我使用以下配置启动 nginx 服务器:

    server {
        listen       127.0.0.1:80;
        server_name  mydomain.com;

        location / {
            include        fastcgi_params;
            fastcgi_param  PATH_INFO  $fastcgi_script_name;
            fastcgi_pass   unix:/tmp/myapp.socket;
        }

        location /static {
            root   /var/www/mydomain/MyApp/root;
        }
    }

当我以http://mydomain.com/http://mydomain.com/products作为另一个页面(由MyApp::Controller::Products处理)访问应用时,一切似乎都正常。

现在挑战和问题:如何配置 nginx 以便它可以为应用程序提供服务'带有URI前缀的页面(例如/some/prefix

在这种情况下,rootpage应作为http://mydomain.com/some/prefix/访问,第二个作为http://mydomain.com/some/prefix/products访问。

问题的第二部分是:如何修改应用程序代码以便为重定向和所有页面提供有效的URI?$c->uri_for()和类似的方法应该如何(重新)写入对前缀路径具有相同的行为?

我尝试过虚拟直接调整

    location /some/prefix {
        include        fastcgi_params;
        fastcgi_param  PATH_INFO  $fastcgi_script_name;
        fastcgi_pass   unix:/tmp/myapp.socket;
    }

但当然它并没有这样做。因此,在转移到Perl代码并使用重定向和URL生成之前,我甚至无法获得响应,甚至手动键入URL。

1 个答案:

答案 0 :(得分:0)

nginx这样的指令中有alias。它的工作原理如下:

如果您的网址的值为http://my.domain.com/some/prefix/blabla.file,请使用alias指令和location指令,如下所示:

location /some/prefix {
   alias /var/www/mydomain/MyApp/root;
}

生成的网址为/var/www/mydomain/MyApp/blabla.file。为什么?因为alias块中的location指令使用它的值(alias值)作为临时root来提供服务文件,并请求和修剪来自{{{}的匹配请求部分1}}所以当请求在location时,它只会是/some/prefix/blabla.file,当你将其添加到/blabla.file值时,你会得到你想要的东西(如果我理解你的话)。 / p>

根据我们在评论中的讨论,我可以提出两件事。 首先,在nginx中,您可以添加此类alias块:

location

此指令将从location ~ ^/some/prefix(.*)$ { rewrite ^/some/prefix(.*)$ $1; } 中删除/some/prefix,只留下/some/prefix/products。接下来将您的/products块更改为如下所示:

location

因此,您为您的Catalys设置param location / { include fastcgi_params; # Here you provide for your Catalys real uri which was orignally provided by user fastcgi_param REQUEST_URI $request_uri; fastcgi_param PATH_INFO $fastcgi_script_name; fastcgi_pass unix:/tmp/myapp.socket; } ,使其具有用户请求的值,而不进行任何修改。 REQUEST_URI中的变量nginx$request_uri。第一个的值永远不会改变,而第二个的值在每次改变时都会改变,例如,由$uri指令重写。此外,这将有效,因为rewrite的优先级高于location ~,因此请求网址将始终首先仅限于location /模式之后的内容。

现在有用吗?