FastCGI — Werkzeug 文档
快速CGI
在 lighttpd 和 nginx 等服务器上非常流行的部署设置是 FastCGI。 要将您的 WSGI 应用程序与其中任何一个一起使用,您首先需要一个 FastCGI 服务器。
最受欢迎的是 flup,我们将在本指南中使用它。 确保已安装它。
创建 .fcgi 文件
首先,您需要创建 FastCGI 服务器文件。 我们称之为 yourapplication.fcgi:
#!/usr/bin/python
from flup.server.fcgi import WSGIServer
from yourapplication import make_app
if __name__ == '__main__':
application = make_app()
WSGIServer(application).run()
这足以让 Apache 工作,但是 ngingx 和旧版本的 lighttpd 需要显式传递套接字以与 FastCGI 服务器通信。 为此,您需要将套接字的路径传递给 WSGIServer
:
WSGIServer(application, bindAddress='/path/to/fcgi.sock').run()
该路径必须与您在服务器配置中定义的路径完全相同。
将 yourapplication.fcgi 文件保存在您可以再次找到的地方。 在 /var/www/yourapplication 或类似的东西中有它是有意义的。
确保在该文件上设置可执行位,以便服务器可以执行它:
# chmod +x /var/www/yourapplication/yourapplication.fcgi
配置 lighttpd
lighttpd 的基本 FastCGI 配置如下所示:
fastcgi.server = ("/yourapplication.fcgi" =>
((
"socket" => "/tmp/yourapplication-fcgi.sock",
"bin-path" => "/var/www/yourapplication/yourapplication.fcgi",
"check-local" => "disable",
"max-procs" -> 1
))
)
alias.url = (
"/static/" => "/path/to/your/static"
)
url.rewrite-once = (
"^(/static.*)$" => "$1",
"^(/.*)$" => "/yourapplication.fcgi$1"
请记住启用 FastCGI、别名和重写模块。 此配置将应用程序绑定到 /yourapplication。
有关 FastCGI 和 Python 的更多信息,请参阅 Lighty 文档。
配置nginx
在 nginx 上安装 FastCGI 应用程序有点棘手,因为默认情况下某些 FastCGI 参数没有正确转发。
nginx 的基本 FastCGI 配置如下所示:
location /yourapplication/ {
include fastcgi_params;
if ($uri ~ ^/yourapplication/(.*)?) {
set $path_url $1;
}
fastcgi_param PATH_INFO $path_url;
fastcgi_param SCRIPT_NAME /yourapplication;
fastcgi_pass unix:/tmp/yourapplication-fcgi.sock;
}
此配置将应用程序绑定到 /yourapplication。 如果您想在 URL 根目录中使用它会更容易一些,因为您不必弄清楚如何计算 PATH_INFO 和 SCRIPT_NAME:
location /yourapplication/ {
include fastcgi_params;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_param SCRIPT_NAME "";
fastcgi_pass unix:/tmp/yourapplication-fcgi.sock;
}
由于 Nginx 不加载 FastCGI 应用程序,因此您必须自己完成。 您可以为此编写 init.d 脚本或在屏幕会话中执行它:
$ screen
$ /var/www/yourapplication/yourapplication.fcgi
调试
FastCGI 部署在大多数网络服务器上往往难以调试。 通常,服务器日志告诉您的唯一内容是“标题过早结束”。 为了调试应用程序,唯一可以真正让您了解它为什么会中断的方法是切换到正确的用户并手动执行应用程序。
此示例假设您的应用程序名为 application.fcgi,并且您的网络服务器用户为 www-data:
$ su www-data
$ cd /var/www/yourapplication
$ python application.fcgi
Traceback (most recent call last):
File "yourapplication.fcg", line 4, in <module>
ImportError: No module named yourapplication
在这种情况下,错误似乎是“您的应用程序”不在 python 路径上。 常见问题有:
- 使用的相对路径。 不要依赖当前的工作目录
- 代码取决于 Web 服务器未设置的环境变量。
- 使用了不同的 python 解释器。