почему nginx proxy_connect_timeout не работает - PullRequest
0 голосов
/ 27 августа 2018

У меня есть сервер api от nginx, а конфиг ниже.Я использую «proxy_connect_timeout» и «proxy_next_upstream», чтобы создать «резервный сервер», что означает, что «proxy_pass http://backup_server;" занят (может быть, потому что mysql / redis connect timeout), а время запроса до 400 мс,он возвращает мне http_504, и запрос приходит к «jump_to_error», а затем обрабатывается сценариями lua (lua просто возвращает статическое содержимое файла, и я также показываю его ниже).

    location /xxx/xxx/xxx{
            proxy_http_version 1.1;
            proxy_set_header Connection "";
            proxy_set_header Host xxx.xxx.xxx;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_connect_timeout 400ms;
            proxy_send_timeout 400ms;
            proxy_read_timeout 400ms;
            proxy_buffer_size 256k;
            proxy_buffers 4 256k;
            proxy_busy_buffers_size 256k;
            proxy_temp_file_write_size 256k;
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404 http_429;
            proxy_max_temp_file_size 128m;
            proxy_pass http://backup_server;
            access_log /nginx.log json;
            error_page  429 500 502 503 504 = @jump_to_error;
    }

location @jump_to_error {
    default_type 'text/plain';
    content_by_lua_file xxx.lua;
    access_log /lua.log json;
    }

Но когдаувеличение числа запросов в секунду (примерно на 40 в секунду), время $ upstream_response_time в nginxlog становится больше 400 мс. И я проверил загрузку процессора, дисковый ввод-вывод и сетевой ввод-вывод, все они нормальные.

request_time log

Итак, у меня есть два вопроса по этому поводу.

  1. Почему $ upstream_response_time и должно быть больше, чем «proxy_connect_timeout», установленное в nginx.conf.(Я также проверяю, что если продолжать увеличивать qps, время может даже превышать 1 с ..)

  2. Я также проверил свой онлайн-журнал nginx, обнаружил, что есть какой-то запросс двумя «восходящий статус / восходящее время».Я установил два сервера в модуле proxy_pass, и я знаю, что когда один из них отключен, proxy_pass вернет мне два исходящих состояния (502 200) и два восходящих времени (http://nginx.org/en/docs/http/ngx_http_upstream_module.html).). Но я не могу понять, почему существует около 0,1% запросов придва «504 статуса» только в одном «504 статусе».

есть несколько двойных 504 статусов

И это мои сценарии luaкоторые просто возвращают статическое содержимое файла. У меня есть журнал отладки для записи затрат времени в lua, и почти все запросы не превышают 10 мс, так что, возможно, мы можем предположить, что lua не относится к приведенному выше вопросу.

function readfile(path)
  local file = io.open(path, "r")
  if file then
    local content = file:read("*a")
    io.close(file)
    return content
  end
  return nil
end


local file = "/xxx/xxx/file1"

local content = readfile(file)
ngx.header["Access-Control-Allow-Origin"] = "*"
ngx.header["Content-Type"] = "text/plain; charset=utf-8"
ngx.print(content)
...