Comments 14
А вы отправляйте не нгинксом напрямую а чем то другим, что умеет логи читать, преобразовывать их и знает urlencode.

Proxy-pass здесь по-мойму лишний, хотя сходу красиво смотрится.
Вот именно proxy_pass и перенаправляет запрос на GA. Можно там прописать не прямую ссылку на GA, а свой php скрипт и в нём уже порешать эти проблемы. Но это показалось лишним звеном в системе…
Вся соль в использовании опции post_action — она дергает указанный путь по окончании обработки запроса.
wiki.nginx.org/HttpCoreModule#post_action (почему-то её нет на обычной страничке с директивами в документации)
Как раз хотел предложить автору использовать Lua-модуль или встроенный перл, котрые бы как раз помогли бы решить 146% описанных в конце статьи проблем :)
В стате есть упомянание про lua. Но хотелось использовать только стандартные модули Nginx. Этот конфиг можно использовать даже на shared-хостингах.

Если кто-то возьмётся за доработку конфига на lua, то будет здорово!
Ну, как я заметил, «встроенный Perl» таки является стандартным модулем который можно использовать везде :) Правда, Perl я знаю несколько хуже, чем Lua, увы ;)
Тогда я голосую за Perl-реализацию :))

А на lua уже есть пример, мне его прислал Николай Шардин (сотрудник Nginx в кремниевой долине):

location / {
set_by_lua $urlencode '
local str = ngx.var.uri
str = string.gsub (str, "([^%w ])",
function © return string.format ("%%%02X", string.byte©) end)
str = string.gsub (str, " ", "+")
return str';
return 200 «your URI is $uri
encoded to $urlencode»;
}

# curl -v 10.2.2.65/привет
* Hostname was NOT found in DNS cache
* Trying 10.2.2.65…
* Connected to 10.2.2.65 (10.2.2.65) port 80 (#0)
> GET /привет HTTP/1.1
> User-Agent: curl/7.35.0
> Host: 10.2.2.65
> Accept: */*
>
< HTTP/1.1 200 OK
* Server nginx/1.7.11 is not blacklisted
< Server: nginx/1.7.11
< Date: Fri, 05 Jun 2015 08:40:21 GMT
< Content-Type: text/html
< Content-Length: 82
< Connection: keep-alive
<
* Connection #0 to host 10.2.2.65 left intact
your URI is /привет
encoded to %2F%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82
По-моему с post_action есть определенного рода проблемы — nginx не закрывает соединение с клиентом до завершения подзапроса, и были еще какие-то нюансы с кодом ответа. Механизм неплох, позволяет очень многое, но недокументирован он, как мне кажется, не зря.
Верно. Поэтому его не следует использовать для других решений кроме как для скачиваний, где коннект рвется сразу после окончания. Если у тебя keep-alive, то процесс nginx при этом будет блокироваться.
Хотя это и не сильно большая проблема, так как GA очень быстро отвечает на запросы, хоть и не мгновенно.
Смотрю на скриншот с юзер-агентами.
А почему в целых 86.73% случаев значение (not set)? Данные где-то теряются?
Нет, это наш клиент выкачивает без указания UserAgent. Данные вообще не теряются, это очень здорово! :)
Не один раз сверяли данные, всё 1 в 1.
Даже делали серьезное нагрузочное тестирование и всё отлично!
Only those users with full accounts are able to leave comments. Log in, please.
Information
Founded

22 July 2008

Location

Россия

Website

drp.su

Employees

2–10 employees

Registered

19 August 2014