Linux PHP - отследить цепочку серверов в запросе

at0m1x

Новичок
Всем привет. У меня есть сайт (ubuntu server, php, nginx). Он связан с другим сайтом и отправляет много POST запросов на API этого другого сайта. В день уходит примерно 10000 запросов. Из них 2000 не успешных. Отправляю запросы с помощью CURl:

$ch = curl_init('http://api.other-site.com/api');
curl_setopt($ch, CURLOPT_POST,true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
'field1'=>'value1',
'field2'=>'value2',
...
]));
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
$result = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);

При не успешных запросах в переменную $error ложится строка: Recv failure: Connection reset by peer

Я хочу выяснить из-за чего такая не стабильная связь. Скорее всего не стабильный интернет канал между моим сервером и сервером API.

В идеале было бы сделать скрипт, который бы отправил 10000 тестовых запросов с моего сервера на сервер API, и при этом подробно бы залогировал через какие промежуточные сервера шел запрос, и на каком оборвался в случае не успешного выполнения. Т.е. что бы лог был примерно в таком виде:

2015-10-1510:10:12 success
Request:
URL: http://api.other-site.com/api
METHOD: POST
PARAMS: field1=value1&field2=value2&field3=value3
123.236.100.240 server1.com
123.236.99.240 server2.com
123.6.100.240 server3.com
123.6.100.20 api.other-site.com
Response:
123.6.100.20 api.other-site.com
123.6.100.240 server3.com
123.236.99.240 server2.com
123.236.100.240 server1.com

2015-10-1510:10:12 error
Request:
URL: http://api.other-site.com/api
METHOD: POST
PARAMS: field1=value1&field2=value2&field3=value3
123.236.100.240 server1.com
123.236.99.240 server2.com
123.6.100.240 server3.com CONNECTION RESET
NO RESPONSE

Этот скрипт будет запускаться из под консоли сервера. Возможно такой написать на PHP, или каком то другом языке?
 

Hello

Новичок
@at0m1x, невозможно.
Узнать сервера можно через traceroute, но не факт что для TCP и ICMP трафика будут выбраны одинаковые маршруты.
 

fixxxer

К.О.
Партнер клуба
tcp traceroute никто сделать не запрещает, но это тоже мало о чем скажет - в обратную сторону трафик идет совсем иначе
 

at0m1x

Новичок
В итоге остановился на баш команде tcptraceroute

Эта команда как раз стучится на 80-й порт и показывает через какие промежуточные сервера проходит запрос.

Сделал баш скрипт, который переодически выполняет эту команду и логирует результаты. Запустил его на несколько часов, после чего проанализировал логи и выяснилось что запросы все таки сбрасывает API сервер к которому я обращаюсь. Т.к. через все промежуточные сервера зарос проходит стабильно, а при обрыве если посмотреть по логу он всегда происходил именно на конечном сервере. Так что команда помогла выяснить где именно обрывается запрос.

Код баш скрипта:

Код:
while[1=1]
do
date >>./trace-so.log
tcptraceroute api.server.com >>./trace-so.log
done
 
Сверху