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;
}
|