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

  • Автор темы Автор темы at0m1x
  • Дата начала Дата начала

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, или каком то другом языке?
 
@at0m1x, невозможно.
Узнать сервера можно через traceroute, но не факт что для TCP и ICMP трафика будут выбраны одинаковые маршруты.
 
tcp traceroute никто сделать не запрещает, но это тоже мало о чем скажет - в обратную сторону трафик идет совсем иначе
 
В итоге остановился на баш команде tcptraceroute

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

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

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

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