LINUX.ORG.RU
решено ФорумAdmin

добавить тело в запрос scgi

 ,


0

1

здравствуйте, полный профан в nginx... никак не пойму как сделать чтоб он слал в scgi-запросе еще и тело запроса(у меня оно пустое посылается):

scgi_param  REQUEST_METHOD     $request_method;
scgi_param  REQUEST_URI        $request_uri;
scgi_param  QUERY_STRING       $query_string;
scgi_param  CONTENT_TYPE       $content_type;

scgi_param  DOCUMENT_URI       $document_uri;
scgi_param  DOCUMENT_ROOT      $document_root;
scgi_param  SCGI               1;
scgi_param  SERVER_PROTOCOL    $server_protocol;
scgi_param  REQUEST_SCHEME     $scheme;
scgi_param  HTTPS              $https if_not_empty;

scgi_param  REMOTE_ADDR        $remote_addr;
scgi_param  REMOTE_PORT        $remote_port;
scgi_param  SERVER_PORT        $server_port;
scgi_param  SERVER_NAME        $server_name;

вот как сюда впиндюрить тело запроса... в доках ngx_http_scgi_module упоминается только про scgi_pass_request_body on | off; но это не то... а то, что надо, найти не могу

★★

Последнее исправление: xperious (всего исправлений: 1)
Ответ на: комментарий от l0stparadise

чет я не понял, это принципиально невозможно чтоли?

xperious ★★
() автор топика

Nginx принимает решение о проксировании сразу после чтения заголовка запроса. Небольшой кусок от тела появляется из-за того, что Nginx читает данные кусками. Заранее неизвестно, где именно кончится заголовок, поэтому при чтении туда попадает ещё и кусочек тела.

i-rinat ★★★★★
()
Ответ на: комментарий от xperious

Тело никак не надо задавать, оно в любом случае передается. Но ваш бэкенд прекращает его принимать раньше, чем nginx его передаст.

l0stparadise ★★★★★
()
Ответ на: комментарий от l0stparadise

что-то не пойму, вот, допустим, из вики:

        "70:"
            "CONTENT_LENGTH" <00> "27" <00>
            "SCGI" <00> "1" <00>
            "REQUEST_METHOD" <00> "POST" <00>
            "REQUEST_URI" <00> "/deepthought" <00>
        ","
        "What is the answer to life?"
post-запрос, как мне такой же сформировать?) акромя scgi_param REQUEST_METHOD POST; а именно what is the answer to life? куда всобачить

xperious ★★
() автор топика
Последнее исправление: xperious (всего исправлений: 1)
Ответ на: комментарий от xperious

Видимо, я неправильно вопрос понял. Тебе нужно принудительно задать тело вне зависимости от того, что клиент пришлёт на Nginx? Такого, вроде, нельзя сделать.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

не, у меня по-другому сделано: у меня nginx сейчас используется сам как клиент, посылает post-запрос, а бэкенд обрабатывает в зависимости от того что в теле, но тело пустое... так вот я не пойму как сделать чтоб тело было не пустое в запросе от nginx-а самого

это чисто для тестирования приложения, не хочется самому scgi-шные запросы писать

location /scgi {
                include   scgi_params;
                scgi_pass_request_body on;
                scgi_pass localhost:5555;
        }

xperious ★★
() автор топика
Последнее исправление: xperious (всего исправлений: 2)
Ответ на: комментарий от xperious

Сейчас затестил у себя. Настроил scgi_pass с scgi_pass_request_body on. Создал запрос:

POST /scgi/ HTTP/1.1
Host: localhost
Content-Length: 524303
Connection: close

AAAAAAAAAAAAAAAAAAAAAAAAAAA...
[request-end]

Строка с буквами A на самом деле большая, там полмегабайта этих A. А второй строчкой маркер окончания, чтобы было лучше видно в дампе.

Потом поднял nc -lp 5555 и послал запрос на nginx. В netcat пришло это (через hexdump -C):

00000000  33 33 35 3a 43 4f 4e 54  45 4e 54 5f 4c 45 4e 47  |335:CONTENT_LENG|
00000010  54 48 00 35 32 34 33 30  33 00 52 45 51 55 45 53  |TH.524303.REQUES|
00000020  54 5f 4d 45 54 48 4f 44  00 50 4f 53 54 00 52 45  |T_METHOD.POST.RE|
00000030  51 55 45 53 54 5f 55 52  49 00 2f 73 63 67 69 2f  |QUEST_URI./scgi/|
00000040  00 51 55 45 52 59 5f 53  54 52 49 4e 47 00 00 43  |.QUERY_STRING..C|
00000050  4f 4e 54 45 4e 54 5f 54  59 50 45 00 00 44 4f 43  |ONTENT_TYPE..DOC|
00000060  55 4d 45 4e 54 5f 55 52  49 00 2f 73 63 67 69 2f  |UMENT_URI./scgi/|
00000070  00 44 4f 43 55 4d 45 4e  54 5f 52 4f 4f 54 00 2f  |.DOCUMENT_ROOT./|
00000080  74 6d 70 2f 35 2f 68 74  6d 6c 00 53 43 47 49 00  |tmp/5/html.SCGI.|
00000090  31 00 53 45 52 56 45 52  5f 50 52 4f 54 4f 43 4f  |1.SERVER_PROTOCO|
000000a0  4c 00 48 54 54 50 2f 31  2e 31 00 52 45 51 55 45  |L.HTTP/1.1.REQUE|
000000b0  53 54 5f 53 43 48 45 4d  45 00 68 74 74 70 00 52  |ST_SCHEME.http.R|
000000c0  45 4d 4f 54 45 5f 41 44  44 52 00 31 32 37 2e 30  |EMOTE_ADDR.127.0|
000000d0  2e 30 2e 31 00 52 45 4d  4f 54 45 5f 50 4f 52 54  |.0.1.REMOTE_PORT|
000000e0  00 33 34 38 39 38 00 53  45 52 56 45 52 5f 50 4f  |.34898.SERVER_PO|
000000f0  52 54 00 38 30 38 30 00  53 45 52 56 45 52 5f 4e  |RT.8080.SERVER_N|
00000100  41 4d 45 00 6c 6f 63 61  6c 68 6f 73 74 00 48 54  |AME.localhost.HT|
00000110  54 50 5f 48 4f 53 54 00  6c 6f 63 61 6c 68 6f 73  |TP_HOST.localhos|
00000120  74 00 48 54 54 50 5f 43  4f 4e 54 45 4e 54 5f 4c  |t.HTTP_CONTENT_L|
00000130  45 4e 47 54 48 00 35 32  34 33 30 33 00 48 54 54  |ENGTH.524303.HTT|
00000140  50 5f 43 4f 4e 4e 45 43  54 49 4f 4e 00 63 6c 6f  |P_CONNECTION.clo|
00000150  73 65 00 2c 41 41 41 41  41 41 41 41 41 41 41 41  |se.,AAAAAAAAAAAA|
00000160  41 41 41 41 41 41 41 41  41 41 41 41 41 41 41 41  |AAAAAAAAAAAAAAAA|
*
00080150  41 41 41 41 0a 5b 72 65  71 75 65 73 74 2d 65 6e  |AAAA.[request-en|
00080160  64 5d 0a                                          |d].|
00080163

Как видишь, тело там просто посылается за заголовком. Твой SCGI сервер должен это уметь читать.

i-rinat ★★★★★
()
Ответ на: комментарий от xperious

Я его не менял, он такой же, как после make install nginx'а. До компа доберусь — выложу.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

хм, понял наконец-то, надо было http пост-запрос послать на nginx, а он уже делает из него scgi и шлет на сервер... спасибо за ответ

xperious ★★
() автор топика
Ответ на: комментарий от xperious

Забыл выложить. :)

Вот:


scgi_param  REQUEST_METHOD     $request_method;
scgi_param  REQUEST_URI        $request_uri;
scgi_param  QUERY_STRING       $query_string;
scgi_param  CONTENT_TYPE       $content_type;

scgi_param  DOCUMENT_URI       $document_uri;
scgi_param  DOCUMENT_ROOT      $document_root;
scgi_param  SCGI               1;
scgi_param  SERVER_PROTOCOL    $server_protocol;
scgi_param  REQUEST_SCHEME     $scheme;
scgi_param  HTTPS              $https if_not_empty;

scgi_param  REMOTE_ADDR        $remote_addr;
scgi_param  REMOTE_PORT        $remote_port;
scgi_param  SERVER_PORT        $server_port;
scgi_param  SERVER_NAME        $server_name;

i-rinat ★★★★★
()
Ответ на: комментарий от xperious

Теоретически, тело можно передавать переменной. Но для этого нужно будет изменять исходники Nginx. Правда, вряд ли это стоит затрат на разработку.

i-rinat ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.