Назад | Перейти на главную страницу

Nginx ModWsgi Плохо?

Я думал о развертывании Nginx с mod_wsgi. Однако я прочитал этот блог:

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

Здесь автор mod_wsgi для nginx говорит, что очень немногие рабочие потоки могут быть заблокированы на относительно долгое время, ожидая возврата вашего скрипта, что замедлит работу сервера.

Насколько это правда? Мне просто придерживаться fastcgi или есть что-то получше?

Поскольку nginx - это система, управляемая событиями, она фактически является однопоточной на самом низком уровне. Другими словами, при использовании Apache не сильно отличается от prefork MPM. Это означает, что после обработки запроса в приложении WSGI, работающем под управлением nginx / mod_wsgi, выполнение параллельных задач невозможно.

В prefork MPM Apache это не слишком серьезная проблема, потому что процесс Apache не будет принимать соединение, если он не сможет обработать его немедленно, и поэтому любые другие запросы будут обрабатываться другим процессом. Это не относится к nginx / mod_wsgi, поскольку использование системы, управляемой событиями, означает, что он может жадно принимать множество запросов одновременно, хотя технически он может обрабатывать только один за раз. Затем эти запросы будут обрабатываться по одному, поэтому последние запросы, которые уже были приняты процессом, будут отложены.

Дальнейшее объяснение этой проблемы можно найти в:

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

Рекомендую использовать fastCGI. Последнее обновление wsgi было в 2008 году или ранее)

Пример Django.conf для fcgi:

# 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.conf

    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 method ={резьбовой | prefork} {socket = / home / имя проекта / server.sock | хост = 127.0.0.1 порт = 8000} pidfile = / home / имя проекта / server.pid "

Удачи!