AWS Elastic Beanstalk не так отзывчив на Transfer-Encoding=chunked, как Heroku
На моем https://disqussearch.com/ развернутом как Jetty в Docker на AWS Elastic Beanstalk (дополнительные сведения об этом процессе см. На https://gmachine1729.com/2019/05/04/i-finally-used-docker-and-amazon-elastic-beanstalk/), когда я запросил https://disqussearch.com/search?username=infoproc&query=feynman&comment_download_limit=1000&match_all_terms=false (сделал это через пользовательский веб-интерфейс, который сделал запрос ajax) вместо потоковой передачи 7 результаты один за другим асинхронно (ответ является фрагментарным) с
response.setHeader("Content-Type", "text/html")
response.setHeader("Transfer-Encoding", "chunked")
в моем коде.
Но на Heroku, с конечной точкой на https://pacific-waters-11622.herokuapp.com/ (и вы можете сделать тот же запрос там с помощью https://pacific-waters-11622.herokuapp.com/search?username=infoproc&query=feynman&comment_download_limit=1000&match_all_terms=false) результаты будут отображаться асинхронно один за другим вместо сообщения о загрузке на некоторое время, а затем "Готово 7 результатов".
Я не очень знаком с заголовком Transfer-Encoding, поэтому сейчас я понятия не имею, что может быть причиной этого.
Мой код интерфейса ниже. Я использую "onprogress" для обновления того, что отображается на странице, которое должно срабатывать при поступлении другого чанка.
$('#search_submit').click(function(){
var username = $('input[name=username]').val();
var query = $('input[name=query]').val();
var comment_download_limit = $('input[name=comment_download_limit]').val();
var match_all_terms = $('input[name=match_all_terms]').is(':checked');
$.ajax({
xhr: function() {
var xhr = $.ajaxSettings.xhr();
xhr.onprogress = function(evt) {
$('#search_results').html(xhr.responseText);
$('#num_results').html(numResultsSoFar());
return false;
}
return xhr;
},
beforeSend: function(xhr) {
$.each(pendingXhr, function(i, xhr) {
xhr.abort();
});
pendingXhr.push(xhr);
$('#search_results').html('');
$('#progress_info').html("Loading results... (<span id='num_results'></span> results)");
$('#num_results').text(numResultsSoFar());
$('.loader').show();
$('#search_progress').show();
},
url: 'search',
type: 'GET',
data: { username: username, query: query, comment_download_limit: comment_download_limit, match_all_terms: match_all_terms },
success: function(result) {
$('#progress_info').html('Done! (' + numResultsSoFar() + ' results) ✔');
$('.loader').hide();
}
})
return false;
});
Что я могу изменить или настроить в своем коде или в AWS EB для решения этой проблемы?
Я также имею в /etc/nginx/sites-enabled/elasticbeanstalk-nginx-docker-proxy.conf
map $http_upgrade $connection_upgrade {
default "upgrade";
"" "";
}
server {
listen 80;
gzip on;
gzip_comp_level 4;
gzip_types text/html text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2})") {
set $year $1;
set $month $2;
set $day $3;
set $hour $4;
}
access_log /var/log/nginx/healthd/application.log.$year-$month-$day-$hour healthd;
access_log /var/log/nginx/access.log;
if ($http_x_forwarded_proto != 'https') {
rewrite ^(.*) https://$host$1 redirect;
}
location / {
proxy_pass http://docker;
proxy_http_version 1.1;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
}
}
Бьюсь об заклад, я мог бы решить это с соответствующим изменением в этом.
nginx version: nginx/1.14.1