【问题标题】:How to develop and deploy Catalyst fastcgi apps with nginx and custom URIs?如何使用 nginx 和自定义 URI 开发和部署 Catalyst fastcgi 应用程序?
【发布时间】:2013-01-14 17:05:39
【问题描述】:

可能不太相关,但我将从我的环境开始:Linux OS、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)的应用程序页面提供服务

在这种情况下,根页应以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,我也无法获得响应。

【问题讨论】:

    标签: perl nginx fastcgi catalyst


    【解决方案1】:

    nginx 中有类似alias 这样的指令。它是这样工作的:

    如果您有一个值为http://my.domain.com/some/prefix/blabla.file 的url,并使用alias 指令和location 指令,如下所示:

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

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

    根据我们在 cmets 中的讨论,我可以提出两件事。 首先,在 nginx 中你可以添加这样的location 块:

    location ~ ^/some/prefix(.*)$ {
       rewrite ^/some/prefix(.*)$ $1;
    }
    

    该指令将从/some/prefix/products 中删除/some/prefix,只留下/products。接下来将您的 location 块更改为如下所示:

    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;
    }    
    

    因此,您将 Catalys 的参数 REQUEST_URI 设置为具有用户请求的价值,无需任何修改。在nginx 中是变量$request_uri$uri。第一个的值永远不会改变,而第二个的值每次都会改变,例如,被rewrite 指令重写。此外,这将起作用,因为location ~location / 具有更高的优先级,因此请求网址将始终首先修剪为仅在/some/prefix 模式之后出现的内容。

    现在有用吗?

    【讨论】:

    • 感谢您的干预,但我有一个涉及 FastCGI 和 Catalyst 框架的更具体的案例。我知道alias,与静态文件相比,我怀疑它在 FastCGI 场景中是否有用。在 Apache 中可以使用 Aliasmod_fastcgi 完成,但 nginx 的 alias 不同。
    • 在 nginx 中告诉它不同是什么意思?
    • 我的意思是来自 ApacheAlias 指令不等同于来自 nginxalias 指令。我试图用 nginx 做的事情可以用 ApacheAlias 来完成,我的重点是应该由 FastCGI 提供服务的 URL,而不是静态的内容。
    • 也许我误解了你的问题。您能否再次告诉您您对nginx 的期望是什么?
    • 这不是一个纯粹的nginx 问题,可能这就是它看起来不太清楚的原因。 Catalyst webapp 将 URL 分派到 actions 并且我需要 nginx 以使 Catalyst 应用程序可以继续使用 prefixed 路径的方式转换请求和 FastCGI 变量。如果我确切地知道对nginx 的期望,那么我可能知道如何解决它。
    猜你喜欢
    • 2012-05-02
    • 2012-01-04
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    • 2021-07-27
    • 2014-06-04
    • 1970-01-01
    相关资源
    最近更新 更多