nginx web

Собираем mod_wsgi с новым Nginx

Dmitry Vasiliev 16:46, 2009 12 28

Со времени моей статьи по Nginx прошел уже год, ветка Nginx 0.7.* стала стабильной и пришла пора менять патчи для сборки с mod_wsgi.

Основной алгоритм сборки не меняется, но в этот раз я взял последние стабильные версии Nginx 0.7.64 и PCRE 8.00. Для сборки mod_wsgi с новым Nginx и Python до версии 2.6 нужно приложить следующий патч:

--- mod_wsgi-8994b058d2db/src/ngx_http_wsgi_handler.c  2008-03-26 22:35:15.000000000 +0300
+++ mod_wsgi/src/ngx_http_wsgi_handler.c       2009-12-27 15:24:03.236910911 +0300
@@ -71,7 +71,7 @@

   if (r->method == NGX_HTTP_GET || r->method == NGX_HTTP_HEAD) {
     /* XXX not sure */
-    rc = ngx_http_discard_body(r);
+    rc = ngx_http_discard_request_body(r);

     if (rc != NGX_OK && rc != NGX_AGAIN) {
       return rc;
--- mod_wsgi-8994b058d2db/src/ngx_http_wsgi_module.c   2008-03-26 22:35:15.000000000 +0300
+++ mod_wsgi/src/ngx_http_wsgi_module.c        2009-12-27 15:29:46.162943943 +0300
@@ -55,6 +55,9 @@



+static ngx_path_init_t  ngx_http_wsgi_temp_path = {
+  ngx_string(NGX_HTTP_WSGI_TEMP_PATH), { 1, 2, 0 }
+};

 static ngx_conf_enum_t  ngx_http_wsgi_reload_mechanism[] = {
   { ngx_string("module"), reload_module },
@@ -156,7 +159,7 @@
     ngx_conf_set_path_slot,
     NGX_HTTP_LOC_CONF_OFFSET,
     offsetof(ngx_http_wsgi_loc_conf_t, temp_path),
-    (void *) ngx_garbage_collector_temp_handler },
+    NULL },

   { ngx_string("wsgi_var"),
     NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,
@@ -342,10 +345,9 @@
   ngx_conf_merge_size_value(conf->write_buffer_size, prev->write_buffer_size,
                             (size_t) ngx_pagesize);

-  ngx_conf_merge_path_value(conf->temp_path,
+  ngx_conf_merge_path_value(cf, &conf->temp_path,
                             prev->temp_path,
-                            NGX_HTTP_WSGI_TEMP_PATH, 1, 2, 0,
-                            ngx_garbage_collector_temp_handler, cf);
+                            &ngx_http_wsgi_temp_path);

   ngx_conf_merge_value(conf->use_main_interpreter,
                        prev->use_main_interpreter, 0);

Что бы собрать mod_wsgi с Python 2.6 нужно приложить дополнительно следующий патч:

--- mod_wsgi-8994b058d2db/src/ngx_wsgi.c       2008-03-26 22:35:15.000000000 +0300
+++ mod_wsgi/src/ngx_wsgi.c    2009-12-27 20:30:08.052753263 +0300
@@ -281,6 +281,7 @@
   0,                      /*tp_subclasses*/
   0,                      /*tp_weaklis*/
   0,                      /*tp_del*/
+  0,                      /*tp_version_tag*/
 #ifdef COUNT_ALLOCS
   0,                      /*tp_allocs*/
   0,                      /*tp_frees*/
@@ -445,6 +446,7 @@
   0,                      /*tp_subclasses*/
   0,                      /*tp_weaklis*/
   0,                      /*tp_del*/
+  0,                      /*tp_version_tag*/
 #ifdef COUNT_ALLOCS
   0,                      /*tp_allocs*/
   0,                      /*tp_frees*/
@@ -1138,6 +1140,7 @@
   0,                      /*tp_subclasses*/
   0,                      /*tp_weaklis*/
   0,                      /*tp_del*/
+  0,                      /*tp_version_tag*/
 #ifdef COUNT_ALLOCS
   0,                      /*tp_allocs*/
   0,                      /*tp_frees*/
@@ -1240,6 +1243,7 @@
   0,                      /*tp_subclasses*/
   0,                      /*tp_weaklis*/
   0,                      /*tp_del*/
+  0,                      /*tp_version_tag*/
 #ifdef COUNT_ALLOCS
   0,                      /*tp_allocs*/
   0,                      /*tp_frees*/
@@ -1397,6 +1401,7 @@
   0,                      /*tp_subclasses*/
   0,                      /*tp_weaklis*/
   0,                      /*tp_del*/
+  0,                      /*tp_version_tag*/
 #ifdef COUNT_ALLOCS
   0,                      /*tp_allocs*/
   0,                      /*tp_frees*/

Comments All comments

Comment by Артём Семёнов on 05:21, 2009 12 30

Артём Семёнов's Gravatar

А mod_wsgi для nginx, который вроде бы заброшен автором, разве не блокирует?

Comment by Dmitry Vasiliev on 10:55, 2009 12 30

Dmitry Vasiliev's Gravatar

Видимо заброшен - потому и патчи. :-)

Если блокируешь, то блокируется конечно.

Из простых способов это преодолеть - делать все быстро :-) и/или запускать много рабочих процессов.

Из сложных способов - mod_wsgi предоставляет интерфейс похожий на poll(), так что можно писать полностью асинхронные приложения.

Add comment

Name:
Email: (Never will be published.)
Web site:
Comment: (Paragraphs divided by empty lines, line breaks and links will be automatically formatted.)