我原本想用 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”
祝你好运!