uWSGI Perl支持 (PSGI)

在Perl世界中, PSGI 等价于 WSGI 。

官方支持PSGI插件,并且官方分配给它一个uwsgi modifier, 5 。因此,照例,如果你要将请求派发给Perl应用,那么在你的web服务器配置中设置 modifier1 值为5。

编译PSGI插件

你可以使用提供的 buildconf/psgi.ini 文件来构建一个仅PSGI的uWSGI服务器。在构建PSGI插件之前,确保安装了 ExtUtils::Embed 模块和它的先决条件。

  1. python uwsgiconfig.py --build psgi
  2. # or compile it as a plugin...
  3. python uwsgiconfig.py --plugin plugins/psgi
  4. # and if you have not used the default configuration
  5. # to build the uWSGI core, you have to pass
  6. # the configuration name you used while doing that:
  7. python uwsgiconfig.py --plugin plugins/psgi core

或者 (如常),你可以使用网络安装程序:

  1. curl http://uwsgi.it/install | bash -s psgi /tmp/uwsgi

这样,在/tmp/uwsgi中,你就有了一个带有perl支持的单个uwsgi二进制文件。

使用

这个插件只导出了一个选项: psgi <app>

你可以这样简单加载应用

  1. ./uwsgi -s :3031 -M -p 4 --psgi myapp.psgi -m
  2. # or when compiled as a plugin,
  3. ./uwsgi --plugins psgi -s :3031 -M -p 4 --psgi myapp.psgi -m

测试PSGI框架/应用

以下框架/应用已经用uWSGI测试过了:

多应用支持

你可以使用 mount 选项或者使用 UWSGI_SCRIPT/UWSGI_FILE 请求变量在同一个uWSGI进程中加载多个几乎相互隔离的应用。

  1. [uwsgi]
  2.  
  3. mount = app1=foo1.pl
  4. mount = app2=foo2.psgi
  5. mount = app3=foo3.pl
  1. server {
  2. server_name example1.com;
  3. location / {
  4. include uwsgi_params;
  5. uwsgi_pass 127.0.0.1:3031;
  6. uwsgi_param UWSGI_APPID app1;
  7. uwsgi_param UWSGI_SCRIPT foo1.pl;
  8. uwsgi_modifier1 5;
  9. }
  10. }
  11.  
  12. server {
  13. server_name example2.com;
  14. location / {
  15. include uwsgi_params;
  16. uwsgi_pass 127.0.0.1:3031;
  17. uwsgi_param UWSGI_APPID app2;
  18. uwsgi_param UWSGI_SCRIPT foo2.psgi;
  19. uwsgi_modifier1 5;
  20. }
  21. }
  22.  
  23. server {
  24. server_name example3.com;
  25. location / {
  26. include uwsgi_params;
  27. uwsgi_pass 127.0.0.1:3031;
  28. uwsgi_param UWSGI_APPID app3;
  29. uwsgi_param UWSGI_SCRIPT foo3.pl;
  30. uwsgi_modifier1 5;
  31. }
  32. }

自动重载器 (自uWSGI 1.9.18起)

选项 –perl-auto-reload <n> 允许你指示uWSGI监控由perl vm导入的每一个单一的模块。

每当其中一个模块改变,整个实例将会被(优雅)加载。

监控器通过在处理一个请求并且经过指定的秒数(自最后一次运行起)(这个秒数是选项的值)之后,迭代%INC工作的。

这可能看起来是次优的 (你会获得从以下请求起的新内容),但对于perl的工作方式而言,它是一种更稳定(安全)的方式。

如果你想从监控跳过指定文件,只需使用–perl-auto-reload-ignore来添加它们。

记住,总会扫描%INC中的模块,如果你想要监控你的.psgi文件,那么你需要使用经典的–touch-reload选项来指定它们。

注意事项

  • 应该默认支持异步。
  • 在启用了ithreads的perl构建中,支持线程。对于每个应用,会为每个线程创建一个新的解释器。这应该不会与一个简单的多进程基于fork()的子系统有太大的不同。
  • 存在目前未知的内存泄漏。

真实世界例子: HTML::Mason

  • 安装来自CPAN的HTML::Mason PSGI处理器,并为你的站点创建一个目录。
  1. cpan install HTML::Mason::PSGIHandler
  2. mkdir mason
  • 创建 mason/index.html:
  1. % my $noun = 'World';
  2. % my $ua = $r->headers_in;
  3. % foreach my $hh (keys %{$ua}) {
  4. <% $hh %><br/>
  5. % }
  6. Hello <% $noun %>!<br/>
  7. How are ya?<br/>
  8. Request <% $r->method %> <% $r->uri %><br/>
  • 创建PSGI文件 (mason.psgi):
  1. use HTML::Mason::PSGIHandler;
  2.  
  3. my $h = HTML::Mason::PSGIHandler->new(
  4. comp_root => "/Users/serena/uwsgi/mason", # required
  5. );
  6.  
  7. my $handler = sub {
  8. my $env = shift;
  9. $h->handle_psgi($env);
  10. };

注意 comp_root ,它必须是一个绝对路径!

  • 现在运行uWSGI:
  1. ./uwsgi -s :3031 -M -p 8 --psgi mason.psgi -m
  • 然后在你的浏览器中访问 /index.html