Вопрос или проблема
Я пытаюсь устранить проблему с низкой производительностью при загрузке больших файлов на сервер Windows, работающий под управлением Apache.
Сервер:
Windows Server 2019 Datacenter
Процессор AMD EPYC 7763 с 64 ядрами, 2.44 GHz
32 ГБ ОЗУ
Скорость загрузки (Мбит/с): 1737.12
Скорость выгрузки (Мбит/с): 2284.35
Локально:
Скорость загрузки (Мбит/с): 269.31
Скорость выгрузки (Мбит/с): 48.37
Apache/PHP:
Apache/2.4.58 (Win64) PHP/8.2.16 OpenSSL/3.1.5 настроен
Файл:
Формат MP4
886 МБ
Я проверил скорость, загружая файл через WeTransfer, и это заняло 2 минуты 45 секунд.
Проблема, с которой я столкнулся, заключается в том, что при попытке передать файл, используя plupload с чанками (50 МБ) или простой HTML-формой; через веб-браузер это занимает около 4 минут 30 секунд.
Затем я протестировал скрипт cURL в командной оболочке, чтобы отправить тот же файл на тот же сервер (как по http, так и по https), и передача заняла 2 минуты 32 секунды.
Может кто-то объяснить, почему производительность по cURL значительно лучше, чем в браузере; и, если возможно, как я могу настроить Apache для работы ближе к передаче по cURL?
Спасибо заранее,
Баз
Редактировать 1
Хорошо, я думаю, проблема возникает при использовании PHP веб-формы по SSL.
Я следил за производительностью Ethernet сервера (Microsoft Hyper-V Network Adapter) во время передач.
PHP веб-форма HTTP = 2:30м при 48-50 Мбит/с
PHP веб-форма HTTPS = 4:30м при 30 Мбит/с
Я все еще не уверен, почему curl ведет себя одинаково как по HTTP, так и по HTTPS, или как решить проблему с PHP/SSL.
Редактировать 2
После дополнительных проверок, кажется, что проблема возникает, когда используется протокол http2 (h2).
Тестирование передачи файла по https с использованием http/1.1 выполняется так же, как и http.
Однако при определении http2 (h2) производительность ухудшается.
Я подозреваю, что это связано с управлением потоком приема или чем-то подобным.
Может кто-то предложить возможные решения для Windows Server 2019?
Проблема заключалась в включенном протоколе HTTP2.
Возврат к HTTP/1.1 решил проблемы со скоростью загрузки (что было заметно только с более крупными файлами).
Ответ здесь: https://serverfault.com/a/932702/345337
Ответ или решение
Для решения проблемы медленной загрузки файлов на сервере Windows с Apache, оптимизируем работу с протоколом HTTP/2, который, как вы отметили, приводит к ухудшению производительности при передаче больших файлов. Вот ряд шагов, которые помогут улучшить скорость загрузки:
1. Отключение HTTP/2
Как вы уже заметили, отключение протокола HTTP/2 и использование HTTP/1.1 значительно улучшает скорость загрузки. Для этого необходимо внести изменения в конфигурационный файл Apache. Найдите файл httpd.conf
или файл, где заданы параметры виртуального хоста (обычно в папке conf
Apache) и измените следующие строки:
Protocols h2 http/1.1
на
Protocols http/1.1
2. Настройка PHP
Убедитесь, что настроены лимиты на загрузку и время выполнения скриптов в php.ini
. Увеличьте значения параметров upload_max_filesize
, post_max_size
, и max_execution_time
, если это необходимо:
upload_max_filesize = 1000M
post_max_size = 1000M
max_execution_time = 300
max_input_time = 300
3. Оптимизация Apache
Проверьте конфигурацию Apache и убедитесь, что заданы оптимальные значения для KeepAlive
, MaxKeepAliveRequests
, и KeepAliveTimeout
:
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
Убедитесь, что включены модули mod_deflate
и mod_headers
для оптимизации передачи данных.
4. Мониторинг сети
Проверьте производительность сети между клиентом и сервером, особенно если тесты проводятся из разных мест. Используйте инструменты мониторинга сети, чтобы убедиться, что нет перегрузок или задержек на этапе передачи данных.
5. Тестирование
После внесения изменений протестируйте загрузку файлов снова с использованием браузера, чтобы удостовериться в улучшении производительности. Для наиболее точных результатов тестируйте как через HTTP, так и HTTPS, чтобы увидеть, какой протокол дает лучшие результаты.
Заключение
Использование HTTP/1.1 вместо HTTP/2 в вашем случае критически важно для увеличения скорости загрузки. Также проводите регулярный мониторинг настроек и производительности, чтобы сохранять оптимальные условия на сервере. Если проблема все еще сохраняется, возможно, стоит рассмотреть внедрение дополнительного программного обеспечения для кэширования или настройки других параметров сети.
Если потребуется более детальная помощь, не стесняйтесь обращаться!