Auteur Sujet: Linux: Réaliser un test de débit descendant/montant avec CURL  (Lu 79721 fois)

0 Membres et 1 Invité sur ce sujet

kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 078
  • Paris (75)
Linux: Réaliser un test de débit descendant/montant avec CURL
« Réponse #24 le: 18 novembre 2022 à 15:15:22 »
donc tu n'as pas de endpoint/traitement particulier pour les upload sur '/' comme indiqué en 1ere page:

curl -4 --http1.1 -o /dev/null -F "filecontent=@/tmp/temp.iso" https://bouygues.testdebit.info
ceci fait un POST sur '/' avec le contenu dans le POST. C'est cela qui ne marche pas en HTTP/2.

Je vais monter un apache2 pour faire des tests.

vivien

  • Administrateur
  • *
  • Messages: 47 085
    • Twitter LaFibre.info
Linux: Réaliser un test de débit descendant/montant avec CURL
« Réponse #25 le: 18 novembre 2022 à 17:33:53 »
Rien de particulier, tu peux tester sur pleins de serveurs Apache sur Internet, uploader des fichiers vers le serveur ne pose aucun problème.

Très rapidement le serveur te répond que ta requête. Je viens de tester l'upload sur le site de l'Arcep fonctionne bien comme presque tous les serveurs Apache.

kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 078
  • Paris (75)
Linux: Réaliser un test de débit descendant/montant avec CURL
« Réponse #26 le: 19 novembre 2022 à 17:09:07 »
Rien de particulier, tu peux tester sur pleins de serveurs Apache sur Internet, uploader des fichiers vers le serveur ne pose aucun problème.

Très rapidement le serveur te répond que ta requête. Je viens de tester l'upload sur le site de l'Arcep fonctionne bien comme presque tous les serveurs Apache.

On peux envoyer 1G sur le site de l'arcep mais c'est un Varnish devant :

curl -I https://www.arcep.fr/
HTTP/2 200
date: Sat, 19 Nov 2022 15:49:38 GMT
server: Unknown
accept-ranges: bytes
age: 95
content-language: fr
content-length: 74537
content-security-policy: frame-ancestors 'self' https://www.arcep.fr https://en.arcep.fr;
content-type: text/html; charset=utf-8
vary: Accept-Encoding
via: 1.1 varnish (Varnish/6.0)
x-cache: HIT
x-cacheable: YES
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-ua-compatible: IE=edge
x-varnish: 7941207 7068477
x-varnish-host: 4ddae90f67da
x-xss-protection: 1; mode=block
strict-transport-security: max-age=63072000; includeSubDomains; preload;


curl -v  -o /dev/null -F "filecontent=@1g.iso" https://www.arcep.fr
ca fonctionne:
* h2h3 [:method: POST]
* h2h3 [:path: /]
* h2h3 [:scheme: https]
* h2h3 [:authority: www.arcep.fr]
* h2h3 [user-agent: curl/7.86.0]
* h2h3 [accept: */*]
* h2h3 [content-length: 1000000205]
* h2h3 [content-type: multipart/form-data; boundary=------------------------9338e6b795672709]
* Using Stream ID: 1 (easy handle 0x56215a9e6e60)

tu vas me dire c'est un cache Varnish pas un serveur Apache.
Mais sur https://lafibre.info ca marche aussi.

alors que la meme commande sur https://bouygues.testdebit.info donne:

curl: (92) Stream error in the HTTP/2 framing layer
avec un fichier moins gros ca passe:
* h2h3 [:method: POST]
* h2h3 [:path: /]
* h2h3 [:scheme: https]
* h2h3 [:authority: bouygues.testdebit.info]
* h2h3 [user-agent: curl/7.86.0]
* h2h3 [accept: */*]
* h2h3 [content-length: 1229]
* h2h3 [content-type: multipart/form-data; boundary=------------------------121e358fb001866d]
* Using Stream ID: 1 (easy handle 0x55f98b125e60)

alors qu'en http1.1 ca passe meme avec 1G.

vivien

  • Administrateur
  • *
  • Messages: 47 085
    • Twitter LaFibre.info
Linux: Réaliser un test de débit descendant/montant avec CURL
« Réponse #27 le: 19 novembre 2022 à 22:27:02 »
Oh, l'upload fonctionne avec lafibre.info en HTTP/2 !

C'est une découverte que je ne saurerai pas expliquer pourquoi.

Il va falloir jouer au jeu des 7 différences, car c'est très proche avec les autres serveurs en termes de configuration Apache.

Si tu as une idée de quoi regarder, en regardant rapidement, cela ne saute pas aux yeux.

kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 078
  • Paris (75)
Linux: Réaliser un test de débit descendant/montant avec CURL
« Réponse #28 le: 20 novembre 2022 à 14:43:45 »
T'as rien en frontal devant lafibre.info même un truc transparent ou chez un provider ?

J'avoue que c'est curieux et l'erreur de curl aussi. Avec nspeed je ne vois même pas d'erreur, ca coupe juste l'upload car le serveur renvoi de suite la page d'accueil comme un GET en fait.
mon explication est que POST ou GET c'est pareil pour https://bouygues.testdebit.info et si on envoi trop de data ca doit saturer un buffer a un moment et arrêter le flux http/2 ?




vivien

  • Administrateur
  • *
  • Messages: 47 085
    • Twitter LaFibre.info
Linux: Réaliser un test de débit descendant/montant avec CURL
« Réponse #29 le: 20 novembre 2022 à 19:03:28 »
Rien en frontal sur LaFibre.info, aucun accélérateurs (APC, eAccelerator, Turck MMCache, Memcached, Zend Platform,...).

La seule chose spéciale, c'est le fait d'avoir un opérateur pour l'IPv4 (MilkyWan sur ETH1) et un opérateur pour IPv6 (Adeli sur ETH0).

La conf, que ce soit Apache ou PHP est très similaire entre Bouygues et LaFibre.info.

kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 078
  • Paris (75)
Linux: Réaliser un test de débit descendant/montant avec CURL
« Réponse #30 le: 21 novembre 2022 à 14:42:14 »
La conf, que ce soit Apache ou PHP est très similaire entre Bouygues et LaFibre.info.

T'as du php sur la racine de bouygues.testdebit.info ?

c'est peu-etre ca la différence.

vivien

  • Administrateur
  • *
  • Messages: 47 085
    • Twitter LaFibre.info
Linux: Réaliser un test de débit descendant/montant avec CURL
« Réponse #31 le: 21 novembre 2022 à 14:44:46 »
Pas de PHP à la racine.

Il y a du PHP configuré sur le serveur pour le fichier upload.php

kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 078
  • Paris (75)
Linux: Réaliser un test de débit descendant/montant avec CURL
« Réponse #32 le: 22 novembre 2022 à 13:05:42 »
analyse sur un Ubuntu 22.04.1 LTS. tl:dr:  voir "5. conclusion"

1 - install apache2 (apres un clean profond)
             sudo apt-get --purge remove apache2* && sudo apt-get autoremove && sudo rm -r /etc/apach2 /var/lib/apache2
             sudo apt install apache2 apache2-utils ssl-cert
test get http://localhost ok (landing page d'apache 2 ubuntu)
test upload 10G sur / en http (avec curl -F): ok

lors d'un upload (POST) le serveur répond un 404 car il n'y rien par défaut pour traiter un POST sur '/'. Mais en HTTP 1.1 le client envoi quand meme toute les data.

2 - activation http/2:
             sudo a2enmod http2 ssl
             création d'un vhost pour 433 (certificat locaux; affichage d'un répertoire).
             redémarrage apache2
test get https://localhost : ok
test upload 10G sur https://localhost: erreur  ("Stream error in the HTTP/2 framing layer")
test upload 10G sur https://localhost en forcant http1.1 : ok

c'est bien HTTP/2 (et pas le chiffrement) qui pose problème donc.
ce qui semble normal vu le fonctionnement d'http/2 car on fait un POST (entete+data) , le serveur reçoit les trames d'entete, traite de suite et renvoi la réponse (un 404 ou un 200 suivant le path demandé) et ferme le stream  (on voit bien le 'stream 0 closed' avec curl -v). Et donc ne consomme jamais la suite des trames de data (en http1.1 c'est un seul flux entete+data).


(source : https://web.dev/performance-http2/ )

=> Il manque donc quelque chose coté serveur pour traiter les POST en "consommant" tout le stream y compris les trames data.

C'est normal car de base apache2 ne gere que du contenu statique. cela fait pareil avec nginx d'ailleurs.

Il manque donc un "handler" pour traiter les POST et consommer la data.

3 - installation de php
         sudo apt install php-fpm libapache2-mod-php
         redémarrage d'apache2:
test upload 10G: erreur, aucun changement . normal.

4. activation de php:
          sudo a2enmod proxy_fcgi setenvif
          redémarrage d'apache2:
test upload 10G: erreur, aucun changement . normal.
          sudo systemctl start php8.1-fpm
          sudo systemctl enable php8.1-fpm
          sudo a2enconf php8.1-fpm
          redémarrage d'apache2:
test upload 10G: erreur, aucun changement . normal.

creation d'un simple fichier hello.php dans la répertoire racine:
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
<body> 
  <?php echo "Hello World"?>
</body>
</html>

redémarrage d'apache2:
test upload 10G: erreur, aucun changement . normal.

test php:
curl  https://localhost/hello.php
-> ok on a bien hello world
test upload 10G sur https://localhost/: erreur, aucun changement . normal.
test upload 10G sur https://localhost/hello.php -> OK !

5. conclusion:
tout semble logique donc, il faut un 'handler' qui consomme la data.

un moyen si php est installé est d'activer le handler sur  la racine '/':
        <Directory "/some/path">
                ....
                SetHandler "proxy:unix:/run/php/php8.1-fpm.sock|fcgi://localhost"
                ...
        </Directory>
comme n'importe quel url va passer par le handler php et pas seulement ceux terminant par .php
Tu peux aussi ne matcher que '/' et pas un sous chemin avec un LocationMatch:

        <LocationMatch "^/$">
                SetHandler "proxy:unix:/run/php/php8.1-fpm.sock|fcgi://localhost"
        </LocationMatch>

l'avantage ainsi c'est tes fichiers statiques /10G/10G.iso par exemple, ne passeront pas par le handler php en sortie sur un GET.
ou alors ne mettre le handler que si c'est POST. etc

bon pres utiliser le handler php pour consommer des données n'est peut-etre pas la meilleur des méthodes. Il faudrait voir si y'a un mod ou une config qui permet de consommer tout un POST sans impact sur le serveur.

vivien

  • Administrateur
  • *
  • Messages: 47 085
    • Twitter LaFibre.info
Linux: Réaliser un test de débit descendant/montant avec CURL
« Réponse #33 le: 22 novembre 2022 à 14:56:39 »
Donc en fait, il n'y a rien à faire de mon côté.

Il faut que j'indique la bonne url pour l'upload : https://bouygues.testdebit.info/ul/upload.php

Avec curl :
curl -o /dev/null -F "filecontent=@/tmp/temp.iso" https://bouygues.testdebit.info/ul/upload.php

Je vais mettre à jour la page d'accueil pour indiquer l'URL d'upload (c'est /ul/upload.php sur les serveurs que je gére)

kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 078
  • Paris (75)
Linux: Réaliser un test de débit descendant/montant avec CURL
« Réponse #34 le: 22 novembre 2022 à 15:56:51 »
Donc en fait, il n'y a rien à faire de mon côté.

Il faut que j'indique la bonne url pour l'upload : https://bouygues.testdebit.info/ul/upload.php

Avec curl :
curl -o /dev/null -F "filecontent=@/tmp/temp.iso" https://bouygues.testdebit.info/ul/upload.php

Je vais mettre à jour la page d'accueil pour indiquer l'URL d'upload (c'est /ul/upload.php sur les serveurs que je gére)

oui si ton fichier upload.php ne fait pas de stockage des données récus sinon tu vas saturer ton serveur.

kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 078
  • Paris (75)
Linux: Réaliser un test de débit descendant/montant avec CURL
« Réponse #35 le: 22 novembre 2022 à 16:22:43 »
de ce que a posté précedement:

<?php
$datas 
file_get_contents(&#38;#39;php://input&#38;#39;);
$resultArray["status"] = "FICHIER RECU";
...

pas certain que file_get_contents soit le mieux pour les gros upload.

idéalement utilise un fichier php sans code php dedans.

apres si Apache2 est mal 'tuner' pour http/2 ca peut aussi être lent.
il faut notamment:
H2WindowSize 1048576dans /etc/apache2/mods-enabled/http2.conf
car la valeur par défaut est 64k je crois.
Cloudflare a benchmarké cela: https://blog.cloudflare.com/delivering-http-2-upload-speed-improvements/
ils recommendent au moins 256k. Avec 1M t'es tranquille je pense.