Needlworks / Textcube

Textcube : Brand yourself! / Personalized web publishing platform with multi-user support
http://www.textcube.org
Other
208 stars 55 forks source link

RSS response problem #1740

Open outsideris opened 9 years ago

outsideris commented 9 years ago

Sometimes rss response is broken. I guess it's related with content size because it occured when I write pretty long posts or I increase post count for RSS to 15 or 20.

At that time, if I checked it using Feed validator, it report as IncompleteRead(3786 bytes read, 4398 more expected) (IncompleteRead; misconfigured server?)(see this)

It looks likes the response is flushed too early or just end up incompletely.

My env : nginx 1.6.2, PHP 5.4, Textcube 1.10.0

achimnol commented 9 years ago

Could you show us the details of your configurations, such as PHP memory limit, timeout (execution time limit), and maximum output bytes allowed (in either webserver or PHP)? And if possible, please attach the URL of the feed you are experiencing the issue.

inureyes commented 9 years ago

Tested w/ 50 posts. Worked ok on my machine. PHP 5.6.2. / memory_limit = 512M

inureyes commented 9 years ago

@outsideris Can you add

set_time_limit(0);

on line 5 of interface/rss/index.php and notify the result to us?

It could be the execution time problem OR memory problem. We need to confirm the origin of the problem..

inureyes commented 9 years ago

예전에 @coolengineer 님께서 백업파일 생성 관련 버퍼 부분을 수정하셨던게 생각나네요. 그 때 수정한 원인과 같은 이유가 아닐까 짐작해봅니다.

outsideris commented 9 years ago

@inureyes @achimnol 피드백이 늦어서 죄송합니다. set_time_limit(0);을 설정해도 동일합니다. php-fpm을 쓰고 있는데 제가 PHP개발자가 아니라 어떤 설정 보여드리면 되는지 말씀해 주시면 설정을 보여드리겠습니다.

RSS 주소는 http://blog.outsider.ne.kr/rss이고 현재 20개로 설정해 놔서 최하단으로 내리시면 XML이 완료안되고 중간에 끊긴 것을 보실 수 있습니다. 이전에는 10개로 보통 셋팅해서 쓰고 있었는데 긴 글을 쓰다가 RSS를 발견한 것으로 보아 RSS부분에서 텍스트양이 많아지면 발생하는 것으로 보이는데 정확한 원인은 제가 추정하기가 어렵네요.

coolengineer commented 9 years ago

php.ini의 memory_limit 값을 512M 정도로 늘리면 어떨까요? 기존 생성된 rss/1.xml 파일을 삭제해서 다시 생성되는지 확인해봐주셨으면 합니다.

outsideris commented 9 years ago

@coolengineer 512로 늘리고 확인해 봤는데 rss/1.xml도 파일을 재 생성했습니다.(자동으로는 안되는것 같고 어드민에서 rss 설정 바꿔주니까 다시 생성되더군요.) 그래도 여전히 응답에서 마지막 부분이 잘리는데 rss/1.xml를 확인해 보니 이 파일은 마지막 </rss> 닫는태그까지 정상적으로 있는 것으로 보아 이 파일 생성자체는 제대로 된것 같습니다. 혹시 PHP에서는 응답을 제대로 주는데 nginx에서 이를 잘라서 줄 수도 있을까요?(이부분도 확인해 보고 싶었는데 php와 nginx 사이의 중간값을 어떻게 확인하는지 몰라서 못했습니다. 참고로 php-fpm 사용중입니다.)

inureyes commented 9 years ago

This thread could be the reason. (not sure) http://forum.nginx.org/read.php?2,216085,216085#msg-216085

outsideris commented 9 years ago

But response size issue is only for RSS.

$ curl -O 'http://blog.outsider.ne.kr/rss' \
  -H 'Pragma: no-cache' \
  -H 'Accept-Encoding: gzip, deflate, sdch' \
  -H 'Accept-Language: ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4' \
  -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36' \
  -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' \
  -H 'Cache-Control: no-cache' \
  -H 'Connection: keep-alive' \
  --compressed

... response data... 

curl: (18) transfer closed with outstanding read data remaining

$ curl -O 'http://blog.outsider.ne.kr/rss' \
  ... same with above options
$ ls -la
137K   rss

Using curl, reponse is closed with remaining data didn't received. It's size is only about 137K. The size is vary every request.

$ curl -O 'http://blog.outsider.ne.kr/category/JAVA/Framework' \
  -H 'Accept-Encoding: gzip, deflate, sdch' \
  -H 'Accept-Language: ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4' \
  -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36' \
  -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' \
  -H 'Cache-Control: max-age=0' \
  -H 'Connection: keep-alive' \
  --compressed

  ... response data... 

$ curl -O 'http://blog.outsider.ne.kr/category/JAVA/Framework' \
  ... same with above options
$ ls -la
667K  1  7 13:44 Framework

but other request is fine even the response size is larger than rss'. That's why I think it is a bug in RSS.

outsideris commented 9 years ago

다들 바쁘실텐데 이슈를 주고받다보니 제 서버의 설정이나 다른 요소때문인가 하는 걱정이 되네요 ㅠㅠ 새해복 많이 받으시고 텍스트큐브 잘 쓰고 있습니다. :+1:

inureyes commented 9 years ago

@outsideris nginx가 버퍼링을 위해 사용하는 proxy_temp 디렉토리의 퍼미션 이슈에 의해 비슷한 현상이 생길 수 있는 것 같습니다. http://serverfault.com/questions/598650/nginx-terminates-connection-after-65k-bytes

achimnol commented 9 years ago

gzip 인코딩과 PHP의 flush를 같이 사용하는 경우 이슈가 좀 있는 것 같습니다. 아직 저도 직접 실험해보지는 못했어요; (텍큐 코드에 flush를 쓰는 부분이 있는지는 저도 확인을 해봐야...) http://stackoverflow.com/questions/12165810/how-to-disable-output-buffering-in-nginx-for-php-application http://stackoverflow.com/questions/4870697/php-flush-that-works-even-in-nginx