Оставлю рецепт если вдруг у кого будет похожая проблема и придут из поиска: )
1) Экспериментально выяснил, что если зайти на сайт первый раз, то глюков не бывает вовсе
2) Если непрерывно переходить по страницам глюков так же нет.
3) Команда:
netstat -an|awk '/tcp/ {print $6}'|sort| uniq -c | sort -n
выдает большое число соединений в состоянии
FIN_WAIT1, что странно. На других серверах преобладает
TIME_WAIT.
4) Потом начал догадываться в чем дело и проверил что будет, если зайти на страничку посидеть какое-то время и нажать на другую ссылку на сайте. Опа - соединение не устанавливается. Методом проб и ошибок примерно определил время 15-20 секунд, сколько надо держать открытой страницу, что бы соединение не установилось.
5) Сначала грешил на Apache и его
KeepAliveTimeout 15 - дефолтное значение. Проверил что в nginx стоит
keepalive_timeout 65; - тоже дефолт вроде. Сравнил с другим сервером аналогично. Вспомнил что недавно админы тюнили TCP для защиты от DDoS (хотя и утверждали что вернули все обратно по завершении). Проверил
cat /proc/sys/net/ipv4/tcp_keepalive_time, выдало 20. Проверяю на другом сервере 7200. Смотрю в инете дефолтное значение 7200. Всё ясно соединение уже закрыто, а nginx об этом не знает. Увеличиваю значение tcp_keepalive_time больше 65. Проверяю, проблема решилась. Проверка на FIN_WAIT1 показывает что их число уменьшилось почти до 0, а преобладает TIME_WAIT как и должно быть.
Вердикт
значение tcp_keepalive_time в TCP должно быть строго больше, чем keepalive_timeout в nginx