У меня есть сервер Linux (Ubuntu 10.04) с apache2 и PHP. Все работает нормально при доступе к странице из любого браузера с другого компьютера Linux или Mac. Но когда я пытаюсь получить доступ к странице с любого сочетания компьютера с Windows и браузера, у меня возникает 30-секундная задержка, прежде чем страница возвращается. Доступ к простому старому HTML-файлу из браузера Windows запускает быстрое разделение. Так что вроде бы просто PHP. MySQL установлен, но простая тестовая страница, не использующая MySQL, по-прежнему работает медленно.
Я не думаю, что это DNS, потому что если я жестко закодирую IP-адрес в URL-адресе, ничего не изменится. Кажется, в файлах журнала нет ничего, что я мог бы сказать.
Что могло вызвать такое поведение на клиентах Windows?
Обновление: некоторые советы по отладке "3-й базы";
Достаточно жестокий способ получить некоторую отладку - ограничить работающий процесс apache, и это на самом деле проще, потому что процессы будут зависать на некоторое время.
Эта команда ниже будет работать, как указано, только если ваш apache находится в режиме предварительной вилки, но я бы предположил, что в рабочем режиме она будет работать примерно так же. (но вам придется потратить некоторое время на получение ps
и grep
чтобы найти идентификаторы потоков ...) в любом случае я думаю, что php требует предварительной вилки ...
Сначала убедитесь, что сервер находится в режиме предварительной вилки ...
root@server-72839:/home/ubuntu# apachectl -V | grep MPM
Server MPM: Prefork <----------- prefork mode works with php
-D APACHE_MPM_DIR="server/mpm/prefork"
установить strace
root@server-72839:/home/ubuntu# apt-get install strace
сделайте некоторый запрос к серверу, а затем выполните следующую команду, чтобы отследить системные вызовы, сделанные зависшим процессом;
root@server-72839:~# netstat -antp | grep "ESTABLISHED" | grep 80 | while read _ _ _ _ client _ proc; do strace -f -p ${proc#/*} & done
root@server-72839:~# Process 21570 attached - interrupt to quit
restart_syscall(<... resuming interrupted call ...>) = 0
chdir("/") = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fabb16b0000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fabb16ae000
позвольте запросу страницы пройти через медленное окно windoze, а затем вставьте весь вывод обратно в пастебин и разместите ссылку в комментарии.
Если вам это не нравится, включите отладку php и httpd Loglevel, чтобы отладить и вставить все это в pastebin и предоставить ссылку ....
Изменить: (хорошо, возможно, не определенно), возможно, проблема с обратным DNS на сервере apache. попробуйте следующее ....
убедитесь, что вы установили HostnameLookups Off
на вашем сервере Apache.
http://httpd.apache.org/docs/2.2/mod/core.html#hostnamelookups
Также убедитесь, что ваш resolv.conf указывает рабочие серверы имен;
[root@workstation001 /root]# cat /etc/resolv.conf
....
nameserver 192.168.1.254 <---- this must work. test it with dig
протестировать сервер имен с помощью dig;
[root@workstation001 /root]# dig @192.168.1.254 www.google.co.uk +short
www-cctld.l.google.com.
173.194.67.94
заставить работать сервер имен, изменив его на 8.8.8.8 (общедоступный DNS-сервер Google)
/etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.8.4
Начните с проверки файлов журналов php.log и apache на предмет медленных подключений, проблема, скорее всего, прямо там в журналах.
Однако, если вы уверены, что это не проблема DNS (которую вы можете проверить с помощью инструмента командной строки nslookup) и на стороне сервера нет ничего очевидного, тогда я бы использовал встроенные инструменты разработчика google chrome, чтобы увидеть временную шкалу страницы. нагрузка.
Это скажет вам, какой элемент на странице занимает так много времени, и была ли задержка во время соединения или во время загрузки ресурсов и т. Д.
Вы можете перейти к таким инструментам, как wget, curl в cygwin или простой telnet, для дальнейшего изучения со стороны клиента.