Отправка http-запросов с помощью Openresty в Google Analytics

Я использую openresty/nginx+lua для отправки обращений на стороне сервера в протокол измерения Google Analytics. Однако функция, которую я использую (ngx.location.capture), несовместима с HTTP/2 и проблема «не будет исправлена». По-видимому, выход — использовать модуль «resty.http». Должно быть, я делаю что-то неправильно при миграции, потому что она больше не отправляет хиты.

Вот код, который работает:

location /example {
    resolver 8.8.8.8 ipv6=off;
    access_by_lua_block  {
        local request = {
        v = 1,
        t = "pageview",
        tid = "UA-XXXXXXX-Y",
        cid = ngx.md5(ngx.var.remote_addr .. ngx.var.http_user_agent),
        uip = ngx.var.remote_addr,
        dp = ngx.var.request_uri,
        dr = ngx.var.http_referer,
        ua = ngx.var.http_user_agent,
        ul = ngx.var.http_accept_language
        }

        local res = ngx.location.capture(  "/gamp",  {
        method = ngx.HTTP_POST,
        body = ngx.encode_args(request)
        })
    }
}

    location = /gamp {
    internal;
    expires epoch;
    access_log off;
    proxy_pass_request_headers off;
    proxy_pass_request_body on;
    proxy_pass https://google-analytics.com/collect;
    }

Вот как я пытался и потерпел неудачу:

location /example {
        access_by_lua_block  {
                    local request = {
                    v = 1,
                    t = "pageview",
                    tid = "UA-XXXXXXX-Y",
                    cid = ngx.md5(ngx.var.remote_addr .. ngx.var.http_user_agent),
                    uip = ngx.var.remote_addr,
                    dp = ngx.var.request_uri,
                    dr = ngx.var.http_referer,
                    ua = ngx.var.http_user_agent,
                    ul = ngx.var.http_accept_language
                    }

            local http = require "resty.http"
            local httpc = http.new()
            local res, err = httpc:request_uri("https://google-analytics.com/collect", {
            method = "POST",
            body = ngx.encode_args(request)
            })
    }
}

person Lucian Davidescu    schedule 27.09.2019    source источник
comment
Вы пытались выйти из системы из-за ошибки err при вызове request_uri?   -  person Rok    schedule 29.09.2019
comment
Должен ли вывод ngx.encode_args(request) храниться в свойстве query объекта params вместо body?   -  person Rok    schedule 29.09.2019
comment
Не уверен, что я правильно веду журнал, но когда я пытаюсь это сделать, все терпит неудачу: 2019/10/03 16:39:19 [уведомление] 13572#13572: сигнал 3 (SIGQUIT), полученный от 14346, отключение 2019/10 /03 16:39:19 [уведомление] 13574#13574: корректное завершение работы 13574: выход   -  person Lucian Davidescu    schedule 03.10.2019


Ответы (1)


Вам нужно добавить еще две директивы: resolver и lua_ssl_trusted_certificate.

Например,

server {
  ...
  resolver 8.8.8.8 ipv6=off;
  lua_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;
  # optional
  # lua_ssl_verify_depth 5;
  ...
}
person un.def    schedule 07.10.2019
comment
Да, спасибо, это работает, я полностью пропустил сертификат. Я опоздал с награждением, я перезапустил его и отдам, как только система позволит. - person Lucian Davidescu; 09.10.2019