Моя проблема в том, что curl и wget обычно не могут получить больше, чем только первую часть любого заданного файла, а часто вообще ничего. Оба раньше работали на одном сервере, и больше ничего в моей сети не изменилось - и я не совсем уверен, что изменилось на моем сервере, чтобы теперь они не работали, хотя очень периодически это будет работать нормально.
У меня включены автоматические обновления, так что, возможно, это как-то связано (а может и нет), но в любом случае я не знаю, как решить.
Итак, мой сервер работает под управлением CentOS Linux версии 7.3.1611 (обновление: теперь обновлено до 7.6.1810)
Моя версия curl очень свежая:
curl 7.64.0 (x86_64-redhat-linux-gnu) libcurl / 7.64.0 NSS / 3.36 zlib / 1.2.7 libpsl / 0.7.0 (+ libicu / 50.1.2) libssh2 / 1.8.0 nghttp2 / 1.31.1
Проблема впервые стала очевидной для меня, когда я пытался обновить WordPress (и это было проблемой какое-то время), когда обновления не выполнялись, например:
Ошибка загрузки. Ошибка cURL 28: время ожидания операции истекло через 300000 миллисекунд, получено 1355444 из 5007255 байт
Иногда обновления работают, но я думаю, что обычно это происходит с очень маленькими файлами.
Итак, что касается попытки решить проблему с WordPress, я попробовал:
... но без изменений. Также пробовал из командной строки, используя как curl, так и wget, но та же проблема.
например $ curl -O -v https://downloads.wordpress.org/plugin/nimble-builder.1.5.0.zip
....
curl: (56) Истекло время ожидания операции ввода-вывода
Также:
a) resolv.conf - ранее было добавлено: options single-request-reopen, что разрешило конфликт с IPv4 / IPv6 много месяцев назад
- также использовали несколько различных настроек DNS-сервера
б) пробовал получать данные с сайтов http и https
в) попытался получить с использованием IP-адресов вместо доменных имен
г) брандмауэр - временно запретил iptables блокировать входящие соединения:
$ iptables -I ВВОД 1 -j ПРИНЯТЬ
а потом восстановил после тестирования:
$ iptables -D ВХОД 1
д) перезагружен
е) все обновления ОС установлены
Не совсем уверен, что еще попробовать. Это очень неприятно. Любая помощь приветствуется. Спасибо!
Обновление-1: Я могу использовать yum без проблем и впоследствии обновил систему, и теперь она работает под управлением CentOS Linux версии 7.6.1810, но у меня все те же проблемы с curl и wget.
Обновление-2: Ниже приведен пример вывода strace:
Near beginning, a lot like this:
open("/lib64/libk5crypto.so.3", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\220H\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=210824, ...}) = 0
mmap(NULL, 2302664, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7ff0cbf8c000
mprotect(0x7ff0cbfbd000, 2093056, PROT_NONE) = 0
mmap(0x7ff0cc1bc000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x30000) = 0x7ff0cc1bc000
close(3) = 0
Part way through, stuff like this:
access("/home/xyz/.pki/nssdb/.57765795_dOeSnotExist_.db", F_OK) = -1 ENOENT (No such file or directory)
access("/home/xyz/.pki/nssdb/.57765796_dOeSnotExist_.db", F_OK) = -1 ENOENT (No such file or directory)
access("/home/xyz/.pki/nssdb/.57765797_dOeSnotExist_.db", F_OK) = -1 ENOENT (No such file or directory)
access("/home/xyz/.pki/nssdb/.57765798_dOeSnotExist_.db", F_OK) = -1 ENOENT (No such file or directory)
access("/home/xyz/.pki/nssdb/.57765799_dOeSnotExist_.db", F_OK) = -1 ENOENT (No such file or directory)
access("/home/xyz/.pki/nssdb/.57765800_dOeSnotExist_.db", F_OK) = -1 ENOENT (No such file or directory)
...
and quite a few of these:
recvfrom(3, 0x184e0d5, 12115, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
poll([{fd=3, events=POLLIN}], 1, 1000) = 1 ([{fd=3, revents=POLLIN}])
poll([{fd=3, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 1 ([{fd=3, revents=POLLIN|POLLRDNORM}])
recvfrom(3, "\322U\200l9\332+\31w\235*\322dt\233\273\37]\244~\264{\24g\2\301\320\276\271\207\337["..., 12115, 0, NULL, NULL) = 1448
recvfrom(3, 0x184e67d, 10667, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
Close to end, a lot like this:
write(2, "k", 1) = 1
poll([{fd=3, events=POLLIN}], 1, 1000) = 0 (Timeout)
poll([{fd=3, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)
write(2, "\r", 1)
Объем памяти:
total used free shared buff/cache available
Mem: 8175404 1734268 310528 20832 6130608 5936760
Swap: 8257532 85472 8172060
Обновление-3: Я также отключил IPv6 на случай каких-либо конфликтов, но это тоже не имеет значения.
Обновление-4: С тех пор я обнаружил, что yum (который работает) использует Python, тогда как curl и wget (которые не работают) не используют Python. Использование небольшого скрипта Python для проверки тех же URL-адресов, которые я пытался получить с помощью curl / wget, работает нормально, поэтому я предполагаю, что должна быть какая-то библиотека / код / что-то, что использует curl / wget, чего нет в Python, что играет не очень хорошо. Однако я не знаю, как исследовать / тестировать / и т.д., чтобы заставить работать curl / wget. Тем не менее, по крайней мере, я знаю, что это не миллион других вещей, которые могли бы быть, но был бы очень благодарен, если бы кто-нибудь мог помочь мне в решении. Спасибо!