1초 간격으로 1부터 10까지의 숫자를 인쇄하는 Perl로 작성된 작은 CGI 스크립트가 있습니다.
root@debian-s-1vcpu-1gb-fra1-01:~# cat /usr/lib/cgi-bin/test
#!/usr/bin/perl
use strict;
local $|=1;
print "Content-encoding: none\nContent-type: text/plain\n\n";
#print "Content-type: text/plain\n\n";
for ( my $i = 1 ; $i <= 10 ; $i++ ) {
print "$i\n";
sleep(1);
}
root@debian-s-1vcpu-1gb-fra1-01:~#
다음 명령을 사용할 때 스크립트가 예상대로 작동합니다 curl
.
그러나 웹 브라우저(예: Chromium 88.0.4324.182 또는 Firefox 78.13.0esr)를 사용하면 페이지가 10초 동안 로드된 후 즉시 1부터 10까지의 숫자가 표시됩니다. 웹 브라우저의 요청 및 응답 헤더는 다음과 같습니다.
curl
위의 예와 동일한 요청 헤더를 사용하여 실행 하더라도 Firefox
숫자는 다음과 같이 1초 간격으로 인쇄됩니다.
$ curl -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H 'Accept-Encoding:
gzip, deflate' -H 'Accept-Language: en-US,en;q=0.5' -H 'Connection: keep-alive' -H 'Host: 164.90.236.255' -H 'Upgrade-Insecure-Requests: 1' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0' -v http://164.90.236.255/cgi-bin/test
* Expire in 0 ms for 6 (transfer 0x55b238016fb0)
* Trying 164.90.236.255...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x55b238016fb0)
* Connected to 164.90.236.255 (164.90.236.255) port 80 (#0)
> GET /cgi-bin/test HTTP/1.1
> Host: 164.90.236.255
> Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
> Accept-Encoding: gzip, deflate
> Accept-Language: en-US,en;q=0.5
> Connection: keep-alive
> Upgrade-Insecure-Requests: 1
> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
>
< HTTP/1.1 200 OK
< Date: Mon, 24 Jan 2022 12:19:56 GMT
< Server: Apache/2.4.25 (Debian)
< Content-encoding: none
< Keep-Alive: timeout=5, max=100
< Connection: Keep-Alive
< Transfer-Encoding: chunked
< Content-Type: text/plain
<
1
2
3
4
5
6
7
8
9
10
* Connection #0 to host 164.90.236.255 left intact
$
서버가 Apache 2.4.25
비활성화 되었습니다 mod_deflate
.
이 동작의 원인은 무엇입니까? 웹 브라우저에서 CGI 스크립트 버퍼링을 어떻게 비활성화합니까? 어쩌면 사람들이 이 동작을 제어할 수 있게 해주는 응답 헤더가 있을 수도 있습니다.
답변1
당신이 찾고 있는 것은 일반적으로 Ajax를 통해 이루어집니다. 한 번이 아닌 10번 렌더링해야 하는 매우 복잡한 HTML/JS/CSS 페이지를 상상해 보면 웹 브라우저는 원하는 대로 작동하지 않습니다. 브라우저는 서버가 어떤 데이터를 보낼지 미리 알 수 없으므로 CPU 주기를 절약하기 위해 가능한 한 적은 작업을 수행하려고 합니다.