nginx / starman / dancer网络堆栈的解释

时间:2012-08-26 04:17:41

标签: nginx dancer plack starman

我已经做了一段时间的网络编程,并且对LAMP堆栈非常熟悉。我决定尝试使用nginx / starman / dancer堆栈,我对如何从高层次理解所有部分彼此之间的关系感到困惑。设置堆栈似乎不像设置LAMP堆栈那么简单,但这可能是因为我真的不明白这些部分是如何相关的。

我理解nginx正在扮演的角色 - 一个轻量级的网络服务器/代理 - 但我对starman与pgsi,plack和舞者的关系感到困惑。

我将非常感谢这些部分如何相互关联以及为什么每个部分都必须(或不必要)进行堆栈设置的高级细分。谢谢!

4 个答案:

答案 0 :(得分:47)

我花了最后一天阅读各种组件,我认为我有足够的理解来回答我自己的问题。我的大部分答案都可以在网上的不同地方找到,但希望将所有部分放在一个地方有一些价值:

  • Nginx:要理解的第一个也是最明显的堆栈是nginx。 Nginx是一个轻量级的Web服务器,可以替代无处不在的Apache Web服务器。 Nginx也可以充当代理服务器。它的使用速度一直在快速增长,目前约占所有网络域的10%。 nginx的一个关键优势是它是异步和事件驱动的,而不是创建一个处理每个连接的进程线程。从理论上讲,这意味着nginx能够在不使用大量系统资源的情况下处理大量连接。
  • PSGI:PSGI是一种协议(将其与协议的特定实现区分开来,例如Plack)。据我所知,创建PSGI的主要动机是,在首次创建Apache时,没有本机支持使用例如Perl编写的脚本来处理请求。使用mod_cgi将这一功能强加于Apache。要测试您的Perl应用程序,您必须运行整个Web服务器,因为应用程序在Web服务器中运行。相反,PSGI提供了一种协议,利用该协议,网络服务器可以与例如写入的服务器通信。 Perl的。这样做的一个好处是,独立于Web服务器测试Perl服务器要容易得多。另一个好处是,一旦构建了应用程序服务器,就可以很容易地切换到不同的兼容PSGI的Web服务器进行测试,从而提供最佳性能。
  • Plack:这是PSGI协议的一个特定实现,它提供了兼容PSGI的Web服务器和perl应用服务器之间的粘合剂。 Plack是Perl相当于Ruby的Rack。
  • Starman:基于perl的网络服务器,与PSGI协议兼容。我遇到的一个困惑是为什么我想同时使用Starman和Nginx,但幸好这个问题在Stackoverflow上是answered quite well。本质上是让nginx提供静态文件而不需要perl进程来做到这一点可能会更好,同时也允许perl应用服务器在更高端口上运行。
  • Dancer:Perl的Web应用程序框架。 Ruby on Rails的等价物。或者更确切地说,相当于Sinatra for Ruby(区别在于Sinatra是一个极简主义框架,而Ruby on Rails是一个更全面的Web框架)。作为处理PHP并且以前没有真正使用过Web框架的人,我对这与服务堆栈的关系有点困惑。 Web框架的重点是它们抽象出在Web应用程序中经常执行的常见任务,例如将数据库查询转换为Web应用程序中的对象/数据结构。

  • 安装(在ubuntu上):

    sudo apt-get install nginx
    sudo apt-get install build-essential curl
    sudo cpan App::cpanminus
    sudo cpanm Starman
    sudo cpanm Task::Plack
    sudo apt-get install libdancer-perl
  • 让它运行:
cd
dancer -a mywebapp
sudo plackup -s Starman -p 5001 -E deployment --workers=10 -a mywebapp/bin/app.pl

现在您将拥有一个在端口5001上运行Dancer应用程序的starman服务器。要使nginx向服务器发送流量,您必须修改

/etc/nginx/nginx.conf
并在http部分添加类似这样的规则:

        server {
               server_name permanentinvesting.com
               listen 80;

                location /css/ {
                  alias /home/ubuntu/mywebapp/public/css/;
                  expires 30d;
                  access_log off;
                }



               location / {
                  proxy_pass        http://localhost:5001;
                  proxy_set_header  X-Real-IP  $remote_addr;
                }

        }

第一个位置规则指定nginx应该通过从

/home/ubuntu/mywebapp/public/css/
获取静态内容来处理/ css目录中的静态内容。第二个位置规则表示应将端口80上的Web服务器的流量发送到Starman服务器进行处理。现在我们只需要启动nginx:

sudo service nginx start

答案 1 :(得分:5)

您的答案到目前为止是正确的,但最好通过以下方式设置nginx:

server {
    listen 80;
    server_name foo.example.com;

    location / {
        # Serve static files directly:
        if (-f $request_filename) {
            expires 30d;
            break;
        }

        # Pass on other requests to Dancer app
        proxy_pass_header Server;
        proxy_pass http://localhost:5001/;
    }
}

这使得nginx服务于所有静态文件(JavaScript和图像),而不仅仅是css。

这个例子取自2011 Perl Dancer Advent:)

答案 2 :(得分:4)

来自nginx wiki:
“IfIsEvil ...指令如果在位置上下文中使用时会出现问题,在某些情况下它不会达到您的预期,而是完全不同。在某些情况下甚至会出现段错误。如果可能的话,通常最好避免使用它。 ......“

更好的设置是:

server {
    listen 80;
    server_name foo.example.com;

    location / {  
    # Checks the existence of files and uses the first match
                try_files $uri $uri/ @dancer;
          } 

    location @dancer {
    # Pass on other requests to Dancer app
            proxy_pass_header Server;
            proxy_pass http://localhost:5001/;
        }
}

答案 3 :(得分:1)

更正s.magri的答案:

location @dancer {
  # Pass on other requests to Dancer app
  proxy_pass_header Server;
  proxy_pass http://localhost:5001;
}

我不得不在最后一个proxy_pass指令中删除尾部斜杠。我的nginx版本(1.10.3)不会以尾部斜杠启动。