ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Порча файлов при апло аде



23.02.2009 00:45, Kirill A.Korinskiy wrote:
At Mon, 23 Feb 2009 00:02:56 +0200,
Alex Vorona <voron@xxxxxxxxxx> wrote:
у меня nginx переставал слать данные запроса по fastcgi, как только начинает идти ответ. Возможно, что-то подобное имеет место у и вас. Попробуйте добавить отладочной информации в переходник и включить debug в nginx.


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

вложенное простое fastcgi-приложение "залипает" в ожидании данных от nginx при аплоаде в него относительно больших файлов.
Если убрать FCGX_FFlush, всё будет работать.

Собиралось на линуксе с fcgi-2.4.1-SNAP-0311112127, тестировалось через 
unix-сокет.

Вывод данных от fastcgi в nginx в то время, как nginx заливает тело запроса в fastcgi, останавливает заливку тела запроса. Возможно, это и происходит у автора треда.
#include "fcgiapp.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <fcntl.h>

extern char **environ;

static void process_r( FCGX_Stream *in, FCGX_Stream *out, 
                             FCGX_ParamArray envp)
{
    char *contentLength = FCGX_GetParam("CONTENT_LENGTH", envp);
    int len = 0;

    FCGX_FPrintF(out,
                 "Content-type: text/html\r\n"
                 "\r\n");
    FCGX_FFlush(out);
    if (contentLength != NULL)
        len = strtol(contentLength, NULL, 10);

    if (len <= 0) {
        FCGX_FPrintF(out, "No data from standard input\n");
    }
    else {
        int i, ch;

        FCGX_FPrintF(out, "Standard input: %d bytes\n",len);
        for (i = 0; i < len; i++) {
            if ((ch = FCGX_GetChar(in)) < 0) {
                FCGX_FPrintF(out,
                             "Error: Not enough bytes received on standard 
input\n");
                break;
            }
            //FCGX_PutChar(ch, out);
        }
        FCGX_FPrintF(out, "Standard input readed: %d bytes\n",i);
    }
    
}

int main(int argc, char *argv[])
{

    int hSocket;
    FCGX_Request r;
    pid_t pid;
    
    int pfdi[2],pfdo[2],pfde[2];
    
    char * cgifile,*method,*length;
    char *newargv[] = { NULL, NULL };

    setsid();

    FCGX_Init();
    int count = 0;
    if( argc != 2 ) {
        printf( "use %s <socket>\n", argv[ 0 ] );
        return -1;
    }
    if( -1 == (hSocket = FCGX_OpenSocket( argv[ 1 ], 10000 ))) { // 2'nd arg - 
backlog
        printf( "Unable to open socket for : %s\n", argv[ 1 ] );
        return -1;
    }else {
        printf( "open fd %d socket : %s\n", hSocket, argv[ 1 ] );
        //fcntl(hSocket,F_SETFL,O_NONBLOCK);//fcgi-socket
    }

    FCGX_InitRequest( &r, hSocket, 0 );

    while( FCGX_Accept_r( &r ) >= 0 ){
        process_r( r.in, r.out, r.envp);
    }//while 1
    
    return 0;

}


 




Copyright © Lexa Software, 1996-2009.