【问题标题】:Start Django FastCGI automatically when OS X bootsOS X 启动时自动启动 Django FastCGI
【发布时间】:2012-01-13 17:11:20
【问题描述】:

我的 Django FastCGI/nginx 在 OS X 上运行良好。我从终端启动我的 FastCGI 进程,如下所示:

python manage.py runfcgi host=127.0.0.1 port=8000 --settings=settings

在我的 nginx.conf 文件中,我有:

server {
    listen       8080;
    server_name  localhost;
    location / {
        fastcgi_pass 127.0.0.1:8000;

我让 nginx 使用 launchd 自动启动,详细说明 here

我的问题是:在机器启动时让 FastCGI 进程自动启动的正确方法是什么?

谢谢!

【问题讨论】:

  • 如果您已经将 FastCGI/nginx 设置为通过/System/Library/LaunchDaemons/nginx.plist 的文件运行,并且您说它是自动启动的,那么问题出在哪里?听起来机器启动时它应该已经启动了。
  • nginx 启动,但 django-fastcgi 部分是一个单独的进程。 nginx 通过套接字(或命名管道等)与 django webapp 进程通信(通过 fastcgi,据我所知)。
  • 你不能重复你用来启动 nginx 的过程来启动 django fastcgi 服务吗?使用 FastCGI,无论服务以什么顺序开始,一旦收到实际请求,它们就会找到彼此。
  • 我想这就是答案,只是没有例子似乎很奇怪! (OS X 用于生产网络服务器?哈哈)

标签: django macos nginx fastcgi


【解决方案1】:

我建议在这种情况下使用 wsgi,因为 wsgi 进程是由 nginx 触发的,而它是一个“独立”进程。一个典型的 nginx 和 wsgi 配置:

myproject.wsgi:

#!/usr/bin/python2.7

import djangorecipe.wsgi

application = djangorecipe.wsgi.main('settings', logfile='/var/log/django/myproject.wsgi.log')

myproject.nginx.conf:

server {
    listen       80;
    server_name  myproject.com;

    # static resources
    location ^~ /static/ {
        alias   /var/www/myproject/static/;
        expires 31d;
    }

    wsgi_var  REQUEST_METHOD      $request_method;
    wsgi_var  QUERY_STRING        $query_string;
    wsgi_var  CONTENT_TYPE        $content_type;
    wsgi_var  CONTENT_LENGTH      $content_length;
    wsgi_var  SERVER_NAME         $server_name;
    wsgi_var  SERVER_PORT         $server_port;
    wsgi_var  SERVER_PROTOCOL     $server_protocol;

    # additional variables (not used if unavailable)
    wsgi_var  REQUEST_URI         $request_uri;
    wsgi_var  DOCUMENT_URI        $document_uri;
    wsgi_var  DOCUMENT_ROOT       $document_root;
    wsgi_var  SERVER_SOFTWARE     $nginx_version;
    wsgi_var  REMOTE_ADDR         $remote_addr;
    wsgi_var  REMOTE_PORT         $remote_port;
    wsgi_var  SERVER_ADDR         $server_addr;
    wsgi_var  REMOTE_USER         $remote_user;

    location  / {
        client_body_buffer_size 50;
        wsgi_pass /var/www/myproject/myproject.wsgi;

        wsgi_pass_authorization off;
        wsgi_script_reloading on;
        wsgi_use_main_interpreter on;
    }

    # logging
    access_log  /var/log/nginx/myproject/access.log;
    error_log   /var/log/nginx/myproject/error.log;
}

【讨论】:

  • nginx 的mod_wsgi 插件有一些严重的缺点;特别是,一旦 python 应用程序阻塞,您就会失去 nginx 的性能优势,而 django 应用程序会经常这样做(等待数据库/文件系统调用)。
  • 谢谢,我完全不知道这一点,尽管我已经在类似的设置上进行了许多负载测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-02
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多