cURL SSL ошибка с большим файлом - PullRequest
0 голосов
/ 11 июня 2018

Я пытаюсь сделать резервную копию моего рабочего сервера и отправить резервную копию в tar.gz на другой сервер.Это работало нормально до обновления моего сервера до php7.2-fpm (для HTTP2.0).

Я получаю эту ошибку:

Fatal error: Uncaught Exception: SSL read: error:00000000:lib(0):func(0):reason(0), errno 104

Вот конфигурация двух моих серверов:

- Рабочий сервер: - Система: Linux debian2 4.9.0-6-amd64 # 1 SMP Debian 4.9.88-1 + deb9u1 (2018-05-07) x86_64- Apache: Apache / 2.4.33- Php: PHP версии 7.2.5-1 (с API FPM)

- Сервер резервного копирования: - Система: Linux debian2 3.16.0-4-amd64 # 1 SMP Debian 3.16.51-3 (2017-12-13) x86_64- Apache: Apache / 2.4.10- Php: PHP версии 7.1.13-1 (с обработчиком Apache 2.0)

Сервер резервного копирования по-прежнему использует HTTP1, рабочий сервер использует протокол HTTP2.

Итак, чтобы сделать резервную копию, я иду в свою корневую папку и просто сжимаю все внутри как .tar.gz.

Для отправки файла здесь используется код, который я использую:

/**
 * @brief Sends a file.
 * @param      Array          $data    The data to send (backup file path, file name)
 * @param      String|string  $action  The action (platformBackup, databaseBackup)
 * @return     Array|boolean
 */
public static function sendFile(Array $data, String $action) : Array
{
    $cFile = curl_file_create($data['file']);
    $data['save'] = $cFile;

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,SERVER_SAVE_URL.'/'.SERVER_SAVE_TOKEN.'/' . $action . '/'.PLATEFORM_ID);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_HTTPHEADER,array('Content-Type: multipart/form-data'));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $result = curl_exec($ch);

    if ($result === false)
    {
        throw new Exception(curl_error($ch), curl_errno($ch));
    }

    $result = json_decode($result, true);
    return $result;
}

Работает с небольшим файлом (менее 1 ГБ).Но не с большим.

Моей первой мыслью была плохая конфигурация Apache и php7.2-fpm, потому что раньше все работало отлично.

Но я думаю, что это нормально, вотПеременные, которые я изменил в своем php / 7.2 / fpm / php.ini:

max_execution_time = 10800 
memory_limit = 1024M
post_max_size = 10000M
upload_max_filesize = 10000M

Я также пытаюсь заставить их в php / 7.2 / fpm / pool.d / www.conf, но ничего не меняется.

Заранее спасибо за помощь!

РЕДАКТИРОВАТЬ:

Я обновляю свой сервер резервного копирования до Apache 2.4.33 и включаю протокол HTTP2.0 с php7.2-fpm.Когда я пытаюсь сделать резервную копию, я получаю сообщение в своем журнале ошибок:

[Tue Jun 12 13:10:34.829260 2018] [proxy_fcgi:error] [pid 9092:tid 140388941666048] (70008)Partial results are valid but processing is incomplete: [client XXX.XXX.XXX.XXX:XXX] AH01075: Error dispatching request to : (reading input brigade)

С сервера php7.1-fpm я получил

503 Service Unavailable

С php7.2-fpm я получил:

Fatal error: Uncaught Exception: SSL read:error:00000000:lib(0):func(0):reason(0), errno 104

Поскольку ничего не работалос php и apache я сказал себе, что проблема возникла откуда-то еще, я наблюдаю за моей файловой системой ext4, так что нет проблем с большими файлами, и я пытаюсь отправить резервную копию с SCP, которая тоже отлично работает.Так что для меня проблема только в PHP, Apache или cURL.

Напоминаем, что резервное копирование работает для небольшого сервера (800 МБ), но не для большего (3,4 ГБ)

РЕДАКТИРОВАТЬ 1: Кажется, проблема в SSL, когда я отключаю его на своем сервере резервного копирования, все работает.В качестве временного решения я просто зашифровал файл с помощью openssl сгенерированным ключом и отправил его на мой резервный сервер.

1 Ответ

0 голосов
/ 13 июня 2018

РЕДАКТИРОВАТЬ: в других темах:

Объясняется, как увеличить размер буфера SSL в конфигурации Apache (что может быть вашей проблемой).

<Directory /my/site/here>
...
  # Set this to something big...
  SSLRenegBufferSize 10486000
...
</Directory>

Источник: @ kongekrabben

**

Я видел много таких проблем в наших корпоративных приложениях, в основном потому, что веб-серверы были устаревшими для поддержки новых наборов шифров.

Чтобы полностью отказаться от SSL, я бы запустил следующий тест с использованием openssl:

Для проверки TLS1.2

openssl s_client -connect ${DoMain}:${port} -tls1_2

Измените -tls1_2 на tls1 илиtls1_1 или ssl3 для проверки других наборов шифров.

Приведенное выше будет имитировать SSL-рукопожатие и передачу, если все в порядке, оно должно заканчиваться кодом выхода 0.

Чтобы прочитать выходкод в bash, просто echo $? после выполнения предыдущей команды

Затем сканирование nmap выведет список всех шифров SSL, доступных с сервера, обратите внимание, что это инвазивный тест, который может фактически привести к запуску программы безопасности, что приведет к блокировкеIP-адрес запрашивающей стороны.НЕ используйте этот второй тест, если вы не уверены, что делаете:

nmap --script ssl-enum-ciphers ${DoMain}

Надеюсь, это поможет.

Затем, в зависимости от результатов, установите это в своем объявлении PHP libcurl:

curl_setopt($ch, CURLOPT_SSLVERSION, $int);

Где $int обозначает используемый набор шифров SSL:

  • CURL_SSLVERSION_DEFAULT (0)
  • CURL_SSLVERSION_SSLv2 (2)
  • CURL_SSLVERSION_TLSv1_1 (5)
  • CURL_SSLVERSION_TLSv1_2 (6)

Док: http://php.net/manual/en/function.curl-setopt.php

@ stackOverflow администраторы: Извините,Я хотел прокомментировать, но у меня недостаточно очков для этого.Пожалуйста, отредактируйте или скопируйте / вставьте, затем удалите мой ответ и при необходимости поместите его в комментарий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...