【问题标题】:How to deploy perl dancer app with cgi and calling external scripts?如何使用 cgi 部署 perl dancer 应用程序并调用外部脚本?
【发布时间】:2014-01-17 00:12:07
【问题描述】:

我有一个使用 CGI 实现的 webapp。它基本上使用 system() 调用来启动其他程序,结果将以 html 呈现。

现在,我正在尝试使用 Dancer 来实现它。为了运行这些外部程序,我在 /MyApp 中创建了一个“脚本”目录,所以它就像 /MyApp/scripts。我将所有其他脚本放在那里,它们将在路由处理程序中调用。

get '/analysis' => sub {
    if (session('user')  && session('logged_in')) {
    open FH, "<", "./scripts/test.out";
    my $msg = <FH>;
    close FH;
    chdir ("./scripts");
    system("call sth"); #call external programs to generate a "test.png"
    my $err;
    copy ("test.png", "../public/images/test.png") || ($err = "cannot copy"); #copy the "test.png" to public/images directory, so the 
    my $img = "test.png";
       template 'analysis',{msg => $msg, img => $img, err => $err};
    }
    else {
    return redirect '/'
   }

};

但是,我可以作为独立应用程序或使用 plackup/starman 成功启动此应用程序。但我不能用 CGI 部署它。我使用 dancer 的关于 cgi 部署的文档完成了每一步。我可以成功地使用 cgi 来启动舞者的示例应用程序。但是当我尝试像上面那样启动自己的时候,我总是得到错误:

应用程序目录 '/home/tester/MyApp/bin/..' 不可写/可执行,并且不能在 /usr/local/share/perl/5.14.2/Dancer/Logger.pm 行对其进行 chmod 16、referer:本地主机

这似乎是一个权限问题,但我不知道如何解决它。有没有更好的方法从路由处理程序启动外部程序?我应该将这些外部程序存储在哪里,以便当舞者应用程序部署为 CGI 时它们可以被执行。

谁能帮帮我?谢谢。

小宽

【问题讨论】:

  • 似乎您的目录上的权限设置为 group:none, others:none,并且 Web 服务器在不同的用户(不是您的)下运行。尝试将相关目录更改为 755,或者在您的代码将 test.png 复制到的 public/images 的情况下可能为 777。当你让它工作时,考虑一下在哪里需要哪些权限,以尽可能少地授予网络服务器的权限以防止黑客攻击。
  • 我已经仔细调整了权限。效果很好。

标签: perl apache dancer


【解决方案1】:

Dancer::Logger::File documentation 说:

可以使用 log_path 选项指定日志目录。

     setting log_path => $dir;

只需在 (production.yml) 环境文件中添加一行:

log_path: /var/log/dancer/myapp/

并使此路径可写入www-data

【讨论】:

    猜你喜欢
    • 2018-07-28
    • 2010-12-18
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多