Nginx, Passenger и Ruby on Rails

8 Ноя
2011

Недавно начал изучать ruby on rails, и конечно же захотел их использовать с nginx, и сразу столкнулся с серьезной проблемой — с nginx не работает passenger, о чем пишет наверное уже весь интернет (Вроде как все должно работать но nginx в error.log пишет: «cache: [GET /] miss» а браузер выдает пустую страницу со статусом 200.)

Пришлось воспользоваться всем своим опытом работы с исходным кодом.
Сначала сделал патч к nginx, откатывающим те изменения, которые приводили к появлению проблемы, впервые это случилось при переходе от версии 1.1.3 к 1.1.4
--- a/src/http/ngx_http_upstream.c.new 2011-10-29 20:40:15.000000000 +0400
+++ b/src/http/ngx_http_upstream.c 2011-10-29 22:05:38.000000000 +0400
@@ -1951,9 +1951,14 @@
r->headers_out.status = u->headers_in.status_n;
r->headers_out.status_line = u->headers_in.status_line;

- r->headers_out.content_length_n = u->headers_in.content_length_n;
+ u->headers_in.content_length_n = r->headers_out.content_length_n;

- u->length = u->headers_in.content_length_n;
+ if (r->headers_out.content_length_n != -1) {
+ u->length = (size_t) r->headers_out.content_length_n;
+
+ } else {
+ u->length = NGX_MAX_SIZE_T_VALUE;
+ }

return NGX_OK;
}

А позже разработчик из nginx посоветовал патчить не nginx, а passenger, что и было мною сделано по его подсказке для passenger-3.0.9:
--- a/ext/nginx/ContentHandler.c.orig 2011-10-19 22:44:40.000000000 +0400
+++ b/ext/nginx/ContentHandler.c 2011-10-30 00:58:06.700129856 +0400
@@ -920,6 +920,7 @@
}

u = r->upstream;
+ u->headers_in.content_length_n = r->headers_out.content_length_n;

if (rc == NGX_HTTP_SCGI_PARSE_NO_HEADER) {
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
@@ -984,6 +985,7 @@
} state;

u = r->upstream;
+ u->headers_in.content_length_n = r->headers_out.content_length_n;

state = r->state;

@@ -1409,6 +1411,7 @@
/* Setup upstream stuff and prepare sending the request to the backend. */

u = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_t));
+ u->headers_in.content_length_n = r->headers_out.content_length_n;
if (u == NULL) {
return NGX_HTTP_INTERNAL_SERVER_ERROR;
}


Три дополнительные строки в коде passenger и nginx по прежнему работает с ним.
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх