AWS Elastic Beanstalk не так отзывчив на Transfer-Encoding = chunked, как Heroku - PullRequest
0 голосов
/ 06 мая 2019

На моем 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» для обновления того, что отображается на странице, которое должно срабатывать приanotприходит ее чанк.

$('#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) &#10004;');
                $('.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
...