Почему сервер не дает подключаться к сайту в несколько потоков?
Привет ALl!
Дано:
- Centos7
- apache-24-worker
- php55-fcgi
- MariaDB
Обратился знакомый - у него сайт на самописном движке. Когда он заходит в админку своего сайта и ставит на закачку файл - по какой то непонятной причине пока идет закачка с сайта сайт не открывается, открываем 5 окошек с адресом его сайта - все висят в ожидании, как только закачку обрываем или она заканчивается - во всех окошках сайт моментально прогрузился. Если закачка идет по медленному каналу - апач режет по таймауту соединения и в логи идет 5хх ошибка. Куда копать и что может быть ?
Если файл отдается средствами, ужос, php, то может блокироваться сессия. Попробуйте открыть вкладки в Инкогнито режиме, чтобы была новая сессия - если отработают без задержки, то это оно
Буду ждать утра - владелец сайта ушел спать и сменил пароль в админку, просто с сервака файлы отдаются без проблем и влюбом кол-ве, отдача файлов в админке идет через пхп скрипт... Сутра буду проверять тогда на счет инкогнито и дальше уже по ситуации...
В iptables пусто
В apache нет модулей для ограничения подключений - стоит стандартный centos apache из стандартной репы, mpm-worker включен через просто комментирование строки с prefork и сняте комментария с worker. Из нестандартного - панель VirtalminWebmin и все.
Dmitry: "пока идет закачка с сайта сайт не открывается" - уточните, не открывается только с этого IP или вообще не открывается даже с другого провайдера?
Только с этого же устройства, к сожалению на данный момент не могу проверить если с того же IP но другого устройства будет ли та же проблема - пока не знаю
Алексей: В общем то как и предполагал проблема была в код - только что программист подтвердил. Внятно обьяснить не могу - так как веб-программирование не мой конек. Решение проблемы если дословно "Завершил сессию перед отправкой файла. Файл отправляется последовательным чтением содержимого", я так понимаю что файл отдавался клиенту и сессия на этом не завершалась - а ждала пока закончится закачка, при этом на сервер блокировался файл сессии и в него не получалось писать когда юзер еще раз пробовал подключится, в итоге все процессы подключения в пределах этой сессии ждали когда будет снята блокировка с файла сессии на сервере. Как то так....
Dmitry: Спасибо что не поленились отписаться. Буквально недавно читал статью вроде на Хабре на похожую тематику. Я не подумал про сессии когда накидывал варианты.
Алексей: Ну у меня по опыту чуйка сработала что проблема не в настройках, модули себя так не ведут... А разбираться с чужим кодом при том что я не программист - дело неблагодарное. Хорошо что все разрешилось ожидаемо ))
1) лимит на количество соединений с одного ip заданы обычно где то или в iptables или в apache, вариантов задания этого ограничения много
2) ограничение времени выполнения задано или в apache или скорее всего в php.ini достаточно увеличить max_execution_time
лимитов нет - написал выше, по поводу max_execution_time - стоит 300, что самое интересное - если ждать 300 сек то в логах апача появляется строка
[Sun Sep 04 12:55:43.211254 2016] [fcgid:warn] [pid 4330:tid 140067506943744] (70007)The timeout specif
ied has expired: [client 1.1.1.1:55320] mod_fcgid: ap_pass_brigade failed in handle_request_ipc function, referer: https://www.......
Если оборвать закачку - сразу все открывается. Такое ощущение что на уровне пхп как то проверяется и блокируется. Когда идет закачка файла - все вкладки с попытками открыть сайт висят в ожидании - как будто пхп послал запрос к прмиеру в базу и жде ответ, как только база ернула результат - сразу все прогурзилось, не похоже это на лимиты, так как если мне не изменяет память у того же nginx когда врубаешь лимиты - он на все что выше отдает или 500 или 403 по моему, но ника не держит соедиенение в очереди, а как только появилась возможность все отдалось, но nginx на сервер нет, а мдулей для включения лимитов не ставил, а в стандартной поставке они не идут включенными.
Dmitry: ну так вы гляньте настройки, те про которые он говорит, где то в /etc/apache что то типа fcgid.conf
там видимо будет и таймаут и ограничение на количество одновременных процессов из за которых больше у вас не открываются новые соединения. httpd.apache.org/mod_fcgid/mod/mod_fcgid.html
да нету там ничего особенного, сайт не нагржен, там проект такой что нагрузка волнообразная. Настройки стоят скажем так немыслимые, а именно
php-wrapper:
Я больше грешу на php что в нем где то какие то костыли, но сам не программист и лезть в чужой код нет никакого желания, а разработчик сутки на связь не выходит. Если ближайшее время не появится придется делать глубокое погружение в чужой код, судя пот тому как на сервер сложены файлы, отсутствие порядка, коммиты прям на сервере и открытый доступ в .git по http для всех, я не знаю чего ожидать, потому проверяю что может быть еще в настройках сервера. Если учесть что RedHat решил вывернуть сисадминам мозг с выходом Centos7 - а я реально с этой версией еще не сталкивался, чего ждать не понятно, где искать то же не доконца понятно. Возможно в новой версии ОС какие то свои новые плюшки - завитушки о которых еще не знаю...
я так понимаю срабатывает ограничение IPCCommTimeout но оно срабатывает через 300, потому что проверка состояния процесса происходит каждые FcgidIdleTimeout
есть признаки наличия Suhosin patch к php? этот пач для безопасности придумал дьявал что бы портить жизнь админам =) без него Пхп точно не должен создавать таких проблем, т.к. в силу своей архитектуры он их создать не может (если не написали специальный скрипт для создания таких проблем).
в центос поройтесь в firewalld или у вас его снесли и поставили iptables ?
ваши проблемы возникают на уровне apache-24-worker или фаервола это точно
Walt Disney: Зло по имени Suhosin отсутствует, firewalld как я уже писал не будет держать запрос каким либо образом, тот же iptables если ничего нового не придумали - я ни разу не видел что бы так себя вел. Тут проблема в связке apache + php, кто то долго думает, сейчас буду дальше искать чего там и как
Dmitry: тем не менее iptables для введения таких ограничений используют, это достаточно распространенная практика т.к. такое решение создаёт минимальную нагрузку на сервер.
Walt Disney: правильно - но iptables не будет держать соединение в очереди, пока не закочнится нагрузку, на сколько я знаю iptables - он этого не умеет делать. Да и iptables не контролит apache, отдачу контента и прочее. Ну и в iptables на днный момент нет правил: