Nginx ModWsgi 不好吗?

Nginx ModWsgi 不好吗?

我原本想用 mod_wsgi 部署 Nginx。但是我读到了这篇博客:

http://blogg.ingspree.net/blog/2007/11/24/nginx-mod-wsgi-vs-fastcgi/

在这里,nginx 的 mod_wsgi 的作者说,极少数工作线程可能会被阻塞相对较长的时间,等待脚本返回,这会降低服务器的速度。

这是真的吗?我应该坚持使用 fastcgi 还是有更好的选择?

答案1

因为 nginx 是一个事件驱动系统,所以它在最低级别上实际上是单线程的。换句话说,与使用 Apache 时的 prefork MPM 没有太大区别。这意味着一旦在 nginx/mod_wsgi 下运行的 WSGI 应用程序中处理请求,就无法执行任何并行任务。

在 Apache 的 prefork MPM 中,这不是一个太严重的问题,因为 Apache 进程不会接受连接,除非它能够立即处理,因此任何其他请求都将由另一个进程处理。然而,nginx/mod_wsgi 的情况并非如此,因为使用事件驱动系统意味着它可以贪婪地一次接受许多请求,即使它在技术上一次只能处理一个请求。然后这些请求将一次处理一个,因此进程已经接受的后续请求将被延迟。

关于这个问题的进一步解释可以参见:

http://blog.dscpl.com.au/2009/05/blocking-requests-and-nginx-version-of.html

答案2

我建议使用 fastCGI。wsgi 的最后一次更新是在 2008 年或更早的时候)

fcgi 的示例 Django.conf:

# Django project
server {
    listen  80;
    server_name www.server.com;

    location / {
        fastcgi_pass unix:/home/projectname/server.sock;
#       fastcgi_pass 127.0.0.1:8000;
        include conf/fastcgi.conf;      
        access_log  /logs/nginx_django.log  main;
    }

    location ^~ /admin/ {
        fastcgi_pass unix:/home/projectname/server.sock;
        include  conf/fastcgi.conf;     
            allow 222.222.0.0/16;
            allow 111.111.111.111;
            deny all;
        access_log   off;
            auth_basic "Gimme the key!";
            auth_basic_user_file /etc/nginx_passwd;
    }

    location ~* ^.+\.(mpg|avi|mp3|swf|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|txt|tar|mid|midi|wav|rtf|mpeg)$ {
        root   /home/projectname/media;
            limit_rate 2000K;
        access_log  /logs/nginx_django_media.log  download;
        access_log   off;
    }

    location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|bmp|js)$ {
        root   /home/projectname/static;
        access_log   off;
        expires      30d;
    }
}

server {
        listen  80;
        server_name server.com;
        rewrite  ^(.*)$  http://www.server.com$1;
    access_log  /logs/nginx_django.log  main;
}

Fastcgi配置文件

    fastcgi_pass_header Authorization;
    fastcgi_intercept_errors off;

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

    fastcgi_param REQUEST_URI       $request_uri;
    fastcgi_param DOCUMENT_URI      $document_uri;
    fastcgi_param DOCUMENT_ROOT         $document_root;
    fastcgi_param SERVER_ADDR           $server_addr;
    fastcgi_param REMOTE_USER       $remote_user;
    fastcgi_param REMOTE_ADDR       $remote_addr;
    fastcgi_param REMOTE_PORT       $remote_port;       
    fastcgi_param SERVER_SOFTWARE   "nginx";
    fastcgi_param GATEWAY_INTERFACE     "CGI/1.1";

    fastcgi_param UID_SET       $uid_set;
    fastcgi_param UID_GOT       $uid_got;    

#    fastcgi_param SCRIPT_NAME      $fastcgi_script_name;

终于:

su www -c "./manage.py runfcgi 方法={线程 | prefork} {socket=/home/projectname/server.sock | host=127.0.0.1 port=8000}pidfile=/home/项目名称/server.pid”

祝你好运!

相关内容