Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
nombre réponses : 25

#0 Re : -1 »  Petit Tuto : Installer un serveur FTP avec GUI sous Ubuntu 10.04 » Le 19/05/2013, à 23:23

@null4ever
Réponses : 22

Bonjour Ashday, et désolé du temps mis pour répondre car je ne viens plus très souvent sur ce forum.

Ashday a écrit :

Bonjour,
n'arrivant pas a faire fonctionner correctement ProFtpd, je suis tombé sur ce tuto très bien expliqué mais qui néanmoins après plusieurs tentative ne résous pas mon problème.
Ce problème se situe au niveau de la création des utilisateurs, enfin pas en totalité, puisque j'arrive a crée un utilisateur et a m'y connecté via Filezilla.

Donc la manipulation :

Nom d'utilisateur :    ashday
Mot de passe:          tartampion
Group :                    FTP ( doit il correspondre avec quelque chose ? )
Comment :               Test
Shell :                       /dev/null
Require password :   Coché

Dossier : Ici j'ajoute donc le dossier que je souhaite mettre à disposition pour ce compte à savoir ->  /home/desktop/musique
Les droits sur le dossier : Par défaut

J'applique tout ça, je démarre mon serveur, jusque là tout vas bien. Avec Filezilla, je me connecte au compte ashday et là surprise, je ne suis pas dans le dossier " musique " mais carrément à la racine du système !!

Pourquoi la restriction du dossier n'est pas prise en compte ?

Si quelqu'un à la solution, je le remercie d'avance.

Cordialement.

Bonjour,

D'après le peu d'expérience que j'ai de ce serveur web pourtant très facile à mettre en oeuvre, je crois que TOUS les dossiers à partager doivent se touver dans /var/www/.

La solution consiste alors peut-être à faire un lien de /home/desktop/musique dans /var/www/ mais je n'ai pas essayé.

Si quelqu'un de plus féru dans ce domaine peut confirmer, ce serait sympatique.

Bon courage.

#1 Re : -1 »  Petit Tuto : Installer un serveur FTP avec GUI sous Ubuntu 10.04 » Le 12/11/2013, à 15:33

@null4ever
Réponses : 22

Bonjour sibe39.

sibe39 a écrit :

@null4ever tu crains !

Déjà d'après les captures d'écran tu tourne sous Windows 7 tu n'es donc pas Linuxien.

C'est ce qui s'appelle la liberté ! tongue

sibe39 a écrit :

De plus, tu ne respecte pas la philosophie des logiciels libre puisque ton logiciel de virtualisation est VmWare Workstation qui est un logiciel propriétaire alors que tu as des logiciels libre comme VirtualBox qui font le taf (sans parler que la version "workstation" est payante donc tu l'a certainement craké).

Veux-tu une copie de mes factures de VMware ? STP, avant de proférer de telles accusations, renseignes toi un peu. Quand à l'utilisation de VirtualBox, compare la réellement avec celle VMware Workstation (si tu peux te l'offrir car critiquer sans savoir, c'est très facile), en particulier au niveau de l'usage CPU et de la RAM ou des fonctionnalités, et on en reparle après. cool

sibe39 a écrit :

Honte a toi ! si Richard Stallman était a coté de toi, il te donnerai une grosse fessée !

Si tu savais ce que je pense des geeks comme lui... roll

Cordialement en sans rancune. wink

#2 Re : -1 »  Petit Tuto : Installer un serveur FTP avec GUI sous Ubuntu 10.04 » Le 12/11/2013, à 15:47

@null4ever
Réponses : 22

Bonjour sambote,

sambote a écrit :

Bonjour,

Je cherchais un serveur FTP, a installer le plus simplement possible, et j'ai trouvai ton poste, merci.
J'aurais une petite question, je possède un NAS de Netgear SC101, relié par un câble Ethernet a ma BOX, qui me suffit amplement, pour mes besoins, je souhaiterai savoir si je pouvais installer Ubuntu 10.04, et ton serveur sans être contraint de laisser un PC en marche en continu, et pouvoir transférer de petits fichier afin de ne pas encombrer mon Smartphone, et en plus d'avoir la sécurité de sauvegarde.
Merci pour ta réponse. smile

Sam

Désolé de ne pas pouvoir t'aider, mais je n'ai pas de serveur NAS et de plus je ne connais pas le tien (NetGear SC101).

Je ne sais donc pas ce que tu peux ou ne peux pas installer dessus.

Petite remarque: ce n'est pas "MON" serveur, mais un projet GNU/Linux qui je crois a été originellement créé par Tim Cosse.

#3 Re : -1 »  Petit Tuto : Installer un serveur FTP avec GUI sous Ubuntu 10.04 » Le 15/11/2013, à 05:21

@null4ever
Réponses : 22

@sibe39 : quand on me cherche, on me trouve.

sibe39 a écrit :

En consommation les 2 sont a peu près équivalent (vmware WS/virtualbox)

Mais c'est bien sur.

Je dois surement faire en sorte que VirtualBox (qui est gratuit) mette ma machine à genou et pas VMware Workstation (dont je dois payer la licence) !

Tu as surement raison. Je dois être vraiment maso !

sibe39 a écrit :

moi qui utilise souvent virtualbox je peux te dire que je n'ai absolument aucun souci de lenteur avec plusieurs machines virtuel simultané

Tant mieux pour toi car c'est très loin d'être le cas chez moi.

sibe39 a écrit :

et ton tuto tu aurai très bien pu le faire avec virtualbox plutôt que vmware, au moins tu aurai utilisé du "libre".

Mais seulement, moi je n'aime pas VirtualBox aux vues de ses piètres performances chez moi en comparaison de ce que j'obtiens avec VMware Workstation !

Donc, j'utilise ce qui me convient le mieux et surement pas ce qui fait plaisir au geeks.

Les Ayatollahs du libre aboient pendant que la caravane des hommes vraiment libres passe et les laisse à leurs certitudes fanatiques d'être les maîtres du monde avec moins de 1 % des desktops.

Désolé, mais avec moi le terrorisme intellectuel ne fonctionne pas !

Et au moins, quand j'utilise Windows 7 et VMware Workstation pour faire tourner une (ou plusieurs) distro(s) Linux et que W7 se plante (assez rarement d'ailleurs), je sais pourquoi => C'est facile, c'est la faute de MSFT, de VMware et du closed source !

Mais par contre, quand Ubuntu se plante (bien trop souvent à mon gout avec la dernière 13.10), là ce n'est évidemment de la faute de personne !

Sur ce, je te laisse à tes convictions car je ne cherche en aucun cas à te convaincre.

Mais, STP, laisse moi utiliser ce qui me convient sans critiquer (tu as surement bien mieux à faire que ce genre de remarque inutile et stérile par rapport au sujet de ce thread).

Sans rancune.

#4 Re : -1 »  Petit Tuto : Installer un serveur FTP avec GUI sous Ubuntu 10.04 » Le 15/11/2013, à 13:11

@null4ever
Réponses : 22

Bonjour michel_04,

michel_04 a écrit :

Bonjour,

sibe39 a écrit :

Déjà Ubuntu n'est pas du tout une référence dans le monde de Linux, d'ailleurs dans la plupart des forums linux, la communauté s'accorde a dire que si il y a une distribution a ne pas utiliser c'est bien Ubuntu. Alors ne prend pas Ubuntu comme référence ce n'est pas exemple.

La communauté ? Quelle communauté ? Sources ?
A+

Sa communauté ! tongue

C'est d'ailleurs à ce demander pourquoi il traine sur le forum Ubuntu !

Peut-être pour troller et aussi pour y chercher des réponses à des questions qu'il ne trouve pas ailleurs ?

~@sibe39,

Je sais, je suis le roi des abrutis.

C'est pour cela que j'ai toutes les distributions suivantes installées aussi bien en réel sur ma machine de test (hé oui, j'ai assez de place pour tout ça) que dans des VMs :

- ArchLinux (là, il faut surement être AchiNull pour être capable de l'installer et encore plus avec une interface graphique)
- Bridge (j'aime pas son image de fond par défaut qui me fait penser au vieux jeu Vietcong)
- CentOS 6.4 (bof)
- Debian 6 et 7 (très stable)
- Fedora 17, 18 et 19 (pas fana du tout de son interface)
- LinuxMint 14 et 15 (très sympa avec Cinamon)
- Manjaro (avec Cinanom et avec OpenBox) et c'est ma préférée surtout pour sa communauté où l'on ne se fait pas incendier lorsque l'on parle de Windows !
- Red Hat Enterprise Linux 6.4 (passage obligé car N° 1 en entreprises)
- Ubuntu 10.04 LTS, 10.10, 11.04, 11.10, 12.04 LTS kernel 3.0.2 et kernel 3.0.5, 12.10, 13.04 et enfin 13.10. et pire, chacune des 9 distros Ubuntu en Desktop et en Serveur.

Ne t'en déplaise, Ubuntu est aujourd'hui "LA" référence en matière de nombre d'installation de desktops, même si je ne suis pas du tout fana d'Unity, et qu'aussi bien LinuxMint que Manjaro lui bouffent de plus en plus de part de marché (grâce à Cinamon pour ces 2 distros et aussi surtout pour le système de rolling release pour Manjaro).

Et en passant, chaque distro est installée avec Apache2, Cherokee, G-WAN, Lighttpd, Monkey et Nginx !

Ha grand Ayatollah du libre, comme tu vois, tu parles un peu trop vite et surtout sans rien savoir de à qui tu t'en prends.

Mais,  c'est vrai, je ne suis qu'un pauvre "peine à jouir de la plume" (c'est à dire un journaliste) qui fait des conneries avec le compte root et qui n'y strictement connait rien !

Pauvre de moi !

Allez, sans rancune.

#5 Re : -1 »  Petit Tuto : Installer un serveur FTP avec GUI sous Ubuntu 10.04 » Le 16/11/2013, à 17:10

@null4ever
Réponses : 22

@sibe39

sibe39 a écrit :

plutôt que dire des conneries, regarde cette vidéo et apprend : http://www.youtube.com/watch?v=kNY2ZgmUy0g

Je n'ai pas de temps à perdre à écouter ni surtout encore moins à apprendre d'un Ayatollah du libre d'une malhonnêteté maintes fois démontrée qui fait des prêches totalement politiques et sans aucun argument technique.

Les geeks comme lui font preuve d'un total obscurantisme et d'un fanatisme totalement en dehors de toute réalité économique.

Libre à toi d'écouter ces blablateries, libre à moi de ne surtout pas en tenir compte !

Basta ! tongue

#6 -1 »  Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ? » Le 11/12/2012, à 03:16

@null4ever
Réponses : 25

Bonjour,

Ceci est un appel aux compétences de spécialistes du paramétrage des serveurs web et serveurs d'application web.

Dans le cadre d'un test comparatif de support de montée en charge de différents serveurs (Apache2, Cherokee, Lighttpd et Nginx), j'aimerai pouvoir désactiver (temporairement) les différents fichiers log de ces serveurs pour ne pas désavantager l'un ou l'autre en regard de ses accès disques (ouverture des fichiers log, écriture des infos plus ou moins détaillées suivant les serveurs, fermeture des fichiers, et rebelote à chaque passe d'une boucle de tests.).

Merci d'avance de vos conseils avisés.

Cordialement.

#7 Re : -1 »  Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ? » Le 12/12/2012, à 03:04

@null4ever
Réponses : 25

Bonjour Maisondouf, wink

Maisondouf a écrit :

Pour Apache2, il faut commenter la ligne suivante dans /etc/apache2/apache2.conf

ErrorLog ${APACHE_LOG_DIR}/error.log

Et également toutes les lignes commençant par

ErrorLog
CustomLog

dans les fichiers de /etc/apache2/sites-available qui sont actifs (qui ont un lien dans /etc/apache2/sites-enabled)

Merci beaucoup.

Bonjour tiramiseb, wink

tiramiseb a écrit :

Salut.
Je ne vais pas apporter la réponse que tu attends; voici mon avis :

En production les logs seront activés, alors autant les garder activés lors des tests... Non ?

Vous avez parfaitement raison pour ce qui concerne un serveur web en production, mais dont le but n'est très certainement pas de subir un test "ultime" de sa résistance à la montée en charge de multiples requêtes faites simultanément par "n" clients comme par exemple 1.000.000 de requêtes faites par 1.000 clients simultanés comme cela existe sur certains sites de jeux en ligne ou de sites financiers ou de sites de moteurs de recherches, etc.! (les utilitaires de test tels AB, HTTPerf ou weighttp ne sont-ils d'ailleurs pas fait pour cela pour des laboratoires et non pas en production ?).

Maintenant, pour être plus précis, l'utilisation du wrapper de Weighttp que je propose avec comme paramètres REQ = 1.000.000 (nombre de requêtes) FROM = 0 TO = 1.000 (nombre de clients simultanés) STEP = 10 (saut de la boucle d'augmentation de FROM - TO) et ITER = 3 (nombre de fois ou Weighttp est lancé pour chaque FROM - TO pour obtenir des statistqiues "fiables" ninimum, moyenne, maximum) génère un fichier log de près de 30 Gb. pour Apache2 si ses fichiers log sont activés ! Même GEDIT explose avant d'arriver à lire le fichier "RESULTS.txt" ! Je vous laisse alors imaginer la taille de ce fichier si FROM =1 et TO = 1000 et surtout que ITER = 10 (pour avoir des statistiques de moyenne encore plus précises) ! big_smile

Maintenant, explication du choix de l'outil de test Weighttp (de Lighttpd) ?

Le cadre du test avec un wrapper de Weighttp est de mesurer de la manière la plus impartiale possible la résistance à la montée en charge de "x" requêtes faites simultanément par "y" clients d'un serveur web tout en augmentant régulièrement le nombre "y" de clients simultanés, et ce indépendamment de tout autre facteur extérieur (telle la lenteur des lectures/écritures disques) et ce d'autant plus que chaque serveur web commente de manière différente les erreurs qu'il traite (ou ne traite pas) pour ne tester que les performances du serveur web.

De même, le facteur de la taille du fichier html utilisé pour chaque requête est lui aussi à prendre en compte car plus le fichier est gros, plus on teste les capacités I/O de l'OS et non pas celles du serveur lui même.

Par contre, l'utilisation de "moyens" ou "gros" servlets plutôt que de fichiers statiques (comme par exemple 100.0.html)  sert bien plus à tester la vitesse de traitement de la "pile" utilisée (Java, PHP, Scala, etc.) que de la performance du serveur web lui-même. Je traiterai de ce sujet plus tard.

Idem pour le facteur de l'utilisation de localhost (127.0.0.1:80) car en faisant un test sur un serveur web distant, le ralentissement du à la vitesse de liaison (réseau local à 10, 100 ou 1.000 Mb/s, ADSL 512, 2.000, 8.000 ou 20.000, Cable 5Gb/s ou 20 Gb/s ou 100 Gb/s ou horreur Modem 56 Kb/s) avec le dit serveur sert bien plus a mesurer la dite vitesse de cette liaison que les performances intrinsèques du serveur que l'on veut tester.

Avant toute autre considération, il faut toujours se rappeler que le tuyau le plus petit (méchanisme le plus lent) sera celui qui est testé.

Pourquoi ne pas choisir le classique et "très vieux" AB ?

Tout simplement parce qu'il ne peut pas utiliser les performances des CPUs dit "modernes" multi coeurs, (qui sont quand même disponibles sur le marché pour le commun des mortels depuis 1994). Cela met donc cet outil totalement hors concours.

Pourquoi ne pas choisir HTTperf ?

HTTPerf crée de nouvelles connexions progressivement, et ne récupère les statistiques qu'après 5 secondes (pour permettre de relancer le serveur avant qu'il ne soit testé). Cela ne reflète pas non plus la "vie réelle" dans la quelle sur certains sites très utilisés par des milliers d'utilisateurs simultanés les clients envoient de multiples requêtes dans un temps ultra court. Comme HTTPerf prend son temps, cela implique que TIME_WAIT devient un problème fondamental si vous faites un test de concurrence sérieux. Dans le détail, HTTPerf n'est pas capable de tester une montée en charge de client simultanés. Si 'rate' est 1 mais num-conn est 2 et num-call est 100.000, vous êtes plus que certain (tests à l'appui) de finir avec des connexions simultanées parce que toutes les requêtes ne sont pas exécutées quand la seconde connexion est lancée. Donc si vous lancez HTTperf avec une valeur de num-call plus petite, alors vous testez la pile TPC/IP et non pas le code user-mode du serveur. En conclusion, HTTPerf ne peut être utilisé de manière fiable que sans l'option Keep-Alives (donc avec num-call=1)

De ces réflexions, l'outil Weighttp me semble à ce jour l'utilitaire le plus approprié pour tester efficacement la montée en charge de requêtes faites simultanément par un grand nombre de clients pour des serveurs web sur nos PC actuels.

Pourquoi faire un wrapper (clwsbt: pour Customizable Linux Web Server Benchmark Tool) pour Weighttp ?

Simplement parce que Weighttpl ne permet pas de simuler une montée en charge progressive du nombre de clients simultanés via sa seule interface console limitée à sa seule utilisation telle qu'initialement définie par l'équipe de Lighttpd.

Conclusion : cool

Ces tests comparatifs faits de la manière la plus impartiale possible (une seule machine identique pour tous, les mêmes réglages OS pour tous, le même disque SSD pour tous, etc.) permettent de se faire une idée réelle de la capacité de tel ou tel autre serveur web en "labo", qui transposée dans la vie réelle (fichiers log activés) peuvent donner une bonne idée de leur capacité à répondre à de multiples requêtes faites sur de multiples Vhots (entre autre sur les serveurs mutualisés de certains ISP).

Aussi, si comme Maisondouf vous pouvez me renseigner sur la désactivation des fichiers log de Cherokee et/ou de Lighttpd et/ou de Nginx, je vous en serai très reconnaissant, et tout comme Maisondouf, je n'hésiterai pas à vous citer dans l'aide que vous m'apporterez pour réaliser ces tests. cool

Merci encore à vous deux (et à d'autres spécialistes du paramétrage de serveurs web) de votre aide très précieuse (car je suis un néophyte du paramétrage de ces différents serveurs web - et même loin de la  roll).

Très cordialement à vous deux. wink

Edited on 2012/12/12 at 05:15 for "typos"

PS : Personne n'a répondu à ma question "Où puis-je proposer sur ce forum les sources du wrapper de weighttp - (clwsbt)" ou dois-je proposer (et à qui) un tutoriel ? yikes

Donc, en attendant une réponse (et pour ceux que cela intéresse) voici le code du wrapper de weighttp qui détaille en entête comment l'installler (avec ses dépendances) ainsi qu'après le fichier 100.html utilisé pour ses tests.

clwsbt :

/* ----------------------------------------------------------------------------
 *  clwsbt - Customizable Linux Web Server Benchmark Tool - Weighttp Wrapper
 * ----------------------------------------------------------------------------
 *
 *  @category Linux Web Server and Web Application Server Benchmark Tool
 *  @package clwsbt.tar.gz
 *  @author The Liberated Seven Dwarfs
 *  @copyright 2012 The L7D
 *  @license http://creativecommons.org/licenses/by-sa
 *  @link http://www.as2.com/linux/clwsbt.tar.gz
 *  @version 0.1 - December 6, 2012
 *  @filesource clwsbt.c
 *
 * ----------------------------------------------------------------------------
 *  Introduction
 * ----------------------------------------------------------------------------
 *
 *  "clwsbt" is a variant of the Trustleap's excellent "ab.c" open source code
 *  and is available for free in the public domain using the Creative Common's
 *  "By-Sa" license.
 *
 *  In return, any help to fix problems into clwsbt will be appreciated.
 *
 * ----------------------------------------------------------------------------
 *
 *  "clwsbt" is a tiny variant of the Trustleap's original ab.c wrapper, but 
 *  only made to use the benchmark tool Weighttp (developed by Lighttpd) and to
 *  be only be used with Linux OSes (Debian, Ubuntu, Fedora - no Windows OSes)
 *  in order to test the load rise and scalability of any web server and web
 *  application server.
 *
 *  "clwsbt" is very useful especially to "fairly" compare performances of web
 *  servers and web application servers loaded on modern multicore machines and
 *  especially with G-WAN (by far the fastest of all) but also Apache2 (the
 *  slowest on Linux), Cherokee, Lighttpd, Monkey HTTP deamon or Nginx, (these
 *  last four ones performing almost in the same range), and / or any others.
 *
 * ----------------------------------------------------------------------------
 *
 *  Question:
 *  ---------
 *
 *  Why using "clwsbt" Vs. the original Weighttp  or AB or HTTPerf tools?
 *
 *  Top five Answers:
 *  -----------------
 *
 *  5) Nor AB and HTTPerf benchmark tools are able to be useful on our modern
 *     multicores systems (even if such CPUs are available since 1994)!
 *
 *  4) The Lighttpd's test is faster than both of the classical AB and HTTPerf
 *     tools!
 *
 *  3) clwsbt uses the same interface as AB but a long warm-up and no 
 *     intermediate output nor provides any statistics!
 *
 *     See here: http://redmine.lighttpd.net/projects/weighttp/wiki
 *
 *  2) clwsbt can benchmark both static and dynamic contents and uses 
 *     variables to set up the length (and duration) of its test!
 *
 *  1) why bother us to use deprecated old tools such as AB or HTTPerf when
 *     they're not able (designed) to use our "modern" CPUs capabilities (BTW 
 *     available since 1994)
 *
 *   ;=}
 *
 *  So:
 *
 *  a) "clwsbt" invokes Weighttp on a concurrency range and collects results 
 *     in a CVS file suitable for LibreOffice charting.
 *
 *     See http://www.documentfoundation.org/download/.
 *
 *  b) clwsbt "optionally" collects CPU and RAM usages for the specified 
 *     server.
 *
 *     The command "./clwsbt gwan" or "./clwsbt apache2" or "./clwsbt ???"
 *     (where "???" is the name of the server process), collects statistics
 *     for all the relevant "???" server instances.
 *
 *  Then, doing a) and b) in the same process reduces the overhead of using
 *  different processes.
 *
 *  htop (like others tools) consumes a lot of CPU resources to only report the
 *  RAM / CPU resources usage because it does many things that we don't need
 *  for such a benchmark.
 *
 *  Sample of statistics collected by "clwsbt"
 *  -------------------------------------------
 *
 *    Client          Requests per second              CPU
 *  -----------  ------------------------------   ---------------  -----
 *  Concurrency    min        ave         max      user    kernel   RAM
 *  -----------  -------    -------     -------   ------   ------  -----
 *   =>   40,      52658,     56100,      59829,   29.46,   70.54,   4.18
 *
 *  Note:
 *  -----
 *
 *  The "CPU load" can either be (a) "System Load" or (b) "Application Load":
 *
 *  (a) "System Load" is what you see in the "system monitor": a process using
 *      "100% of the CPU" will consume only "25% of the System" on a 4-Core PC.
 *
 *  (b) "Application Load" is what you see in the "top" command: an application
 *      with 2 processes using respectively 50% and 100% of the CPU is reported
 *      as using 150% of the resources.
 *
 *  Just like for RAM usage, it makes sense to have both information:
 *
 *  (a) the [percentage of System RAM] used by an application.
 *
 *  (b) the [amount of RAM] used by an application.
 *
 *  But as a) depends on a specific machine (on a 256 GB RAM server, a 256 MB
 *  memory footprint will be invisible (like 0.1%) as a percentage of the total
 *  RAM) this is why the more relevant method (b) is used for application
 *  benchmarks.
 *
 *  ----------------------------------------------------------------------------
 *  Prerequisites:
 *  --------------
 *
 *  I) Dependent software and tools needed to use and install clwsbt:
 *  ------------------------------------------------------------------
 *
 *  clwsbt launches weighttp within in a configurable loop.
 *
 *  So, you need to install weighttp on your system.
 *
 *  Meanwhile, weighttp uses libev.
 *
 *  So, you need "first" to install libev on your system, then to install
 *  Weighttp and finally to install clwsbt!
 *
 *  Here is how to do so:
 *  ---------------------
 *
 *  I.1) Install libev:
 *  -------------------
 *
 *      I.1.a) Download libev:
 *      ----------------------
 *
 *          For your convenience, you can download libev here:
 *          http://www.as2.com/linux/libev.tar.gz
 *
 *          Unpack libev.tar.gz into a folder (i.e. Downloads/libev)
 *
 *      I.1.b) Install libev:
 *      ---------------------
 *          Launch the following commands into a terminal:
 *
            sudo su
            apt-get build-dep libev
            cd /Downloads/libev
            make clean
            make install
            exit
 *
 *  I.2: Install weighttp:
 *  ----------------------
 *
 *      I.2.a- Download weighttp:
 *      -------------------------
 *
 *          For your convenience, you can download weighttp here:
 *          http://www.as2.com/linux/weighttp/weighttp.tar.gz
 *
 *          Unpack weighttp.tar.gz into a folder (i.e. Downloads/weighttp)
 *
 *       I.2.b- Install weighttp:
 *       ------------------------
 *
 *          Launch the following commands into a terminal:
 *
            sudo su
            cd /Downloads/weighttp
 *
 *          option a):
 *          ----------
 *
            ./waf configure
            ./waf build
            ./waf install
 *
 *          or option b):
 *          -------------
 *
            gcc -g2 -O2 -DVERSION='"123" src/*.c -o weighttp -lev -lpthread
            cp ./weighttp /usr/local/bin
 *
 *  I.3: Building clwsbt:
 *  --------------------
 *
 *      I.3.a- Download clwsbt:
 *      ----------------------
 *
 *          For your convenience, you can download clwsbt here:
 *          http://www.as2.com/linux/clwsbt.tar.gz
 *
 *          Unpack clwsbt.taz.gz into a folder (i.e. into /Downloads/clwsbt)
 *
 *      I.3.b- Build clwsbt:
 *      -------------------
 *
 *          Launch the following commands:
 *
            sudo su
            cd /Downloads/clwsbt
            gcc clwsbt -O2 -o clwsbt -lpthread
 *
 *          So, you're done but don't launch clwsbt right now since you've also
 *          to set up your OS in order to sustain the load of clwsbt and, maybe
 *          to change some clwsbt variable values to feet your benchmark needs.
 *
 *  II) OS settings:
 *  ----------------
 *
 *  Accordingly to Trusleap's development team researches, it is mandatory to
 *  change some basic Linux settings in order to sustain the load rise of such
 *  a benchmark tool.
 *
 *  Below is the note included into the Trustleap's original ab.c wrapper that
 *  applies also to clwsbt:
 *
 * ----------------------------------------------------------------------------
 *  # Linux Ubuntu did not show significant boot-related side-effects
 *  # but here also I have had to tune the system (BOTH on the server and
 *  # client sides).                               ^^^^
 *  #
 *  # The modification below works after a reboot (if an user is logged):
 *  #
      sudo gedit /etc/security/limits.conf
 *  #
 *  # Insert the statements at the bottom of the limits.conf file:
 *  #
        * soft nofile 200000
        * hard nofile 200000
 *  #
 *  # Save and reboot.
 *  #
 *  # Note:
 *  # -----
 *  #
 *  # If you are logged as 'root' in a terminal, type (instant effect):
 *  # ulimit -HSn 200000
 *  #
 *  # "Performance Scalability of a Multi-Core Web Server", Nov 2007
 *  # Bryan Veal and Annie Foong, Intel Corporation, Page 4/10
 *  #
      sudo gedit /etc/sysctl.conf
 *  #
 *  # Insert the following statements into the sysctl.conf file:
 *  #
      fs.file-max = 5000000
      net.core.netdev_max_backlog = 400000
      net.core.optmem_max = 10000000
      net.core.rmem_default = 10000000
      net.core.rmem_max = 10000000
      net.core.somaxconn = 100000
      net.core.wmem_default = 10000000
      net.core.wmem_max = 10000000
      net.ipv4.conf.all.rp_filter = 1
      net.ipv4.conf.default.rp_filter = 1
      net.ipv4.tcp_congestion_control = bic
      net.ipv4.tcp_ecn = 0
      net.ipv4.tcp_max syn backlog = 12000
      net.ipv4.tcp_max tw buckets = 2000000
      net.ipv4.tcp_mem = 30000000 30000000 30000000
      net.ipv4.tcp_rmem = 30000000 30000000 30000000
      net.ipv4.tcp_sack = 1
      net.ipv4.tcp_syncookies = 0
      net.ipv4.tcp_timestamps = 1
      net.ipv4.tcp_wmem = 30000000 30000000 30000000
 *
 *  # optionally, avoid TIME_WAIT states on localhost no-HTTP Keep-Alive tests:
 *  # "error: connect() failed: Cannot assign requested address (99)"
 *  # On Linux, the 2MSL time is hardcoded to 60 seconds in /include/net/tcp.h:
 *  # define TCP_TIMEWAIT_LEN (60*HZ)
 *  #
 *  # WARNING:
 *  # --------
 *  #
 *  # The option below lets you reduce TIME_WAITs by several orders of magnitude
 *  # but this option is for benchmarks, NOT for production servers (NAT issues)
 *  #
      net.ipv4.tcp_tw_recycle = 1
 *  #
 *  # other settings found from various sources tp be included into sysctl.conf
 *  #
      net.ipv4.ip_local_port_range = 1024 65535
      net.ipv4.ip_forward = 0
      net.core.netdev_max_backlog = 32768
      net.ipv4.tcp_dsack = 0
      net.ipv4.tcp_fack = 0
      net.ipv4.tcp_fin_timeout = 30
      net.ipv4.tcp_orphan_retries = 0
      net.ipv4.tcp_keepalive_time = 120
      net.ipv4.tcp_keepalive_probes = 3
      net.ipv4.tcp_keepalive_intvl = 10
      net.ipv4.tcp_retries2 = 15
      net.ipv4.tcp_retries1 = 3
      net.ipv4.tcp_synack_retries = 5
      net.ipv4.tcp_syn_retries = 5
      net.ipv4.tcp_max_tw_buckets = 32768
      net.ipv4.tcp_moderate_rcvbuf = 1
      kernel.sysrq = 0
      kernel.shmmax = 67108864
 *  #
 *  # Save and reboot.
 *  #
 *  # To update your environment, use
 *  #
      sudo sysctl -p /etc/sysctl.conf
 *  #
 *  # This command must be typed in each open terminal for the changes
 *  # to take place (same effect as a reboot).
 *  #
 *  # As I was not able to make the 'open files limit' persist for G-WAN
 *  # after a reboot, G-WAN attemps to setup this to an 'optimal' value
 *  # depending on the amount of RAM available on your system:
 *  #
 *  # fd_max = (256 * (totalram / 4) < 200000) ? 256 * (total / 4) : 1000000;
 *  #
 *  # For this to work, you have to run gwan as 'root':
 *  #
      sudo su
      cd /gwan_folder/ && ./gwan
 *  #
 *  # or
 *  #
      cd /gwan_folder && sudo ./gwan
 *  #
 *  # Note:
 *  # -----
 *  #
 *  # On a 1 GbE LAN and for the for 100.html test, this test was up
 *  # to 2x faster when client and server were using Linux 64-bit
 *  # (instead of Linux 32-bit) but absolute performances are less
 *  # relevant than relative server performances for me, hence the
 *  # localhost test).
 *  #
 *  # Experiments demonstrate that, for a 100-byte static file, IIS
 *  # and Apache use 90-100% of a 4-Core CPU at high concurrencies
 *  # while being much slower than G-WAN (which uses "0%" of the CPU
 *  # on a gigabit LAN).
 *  #
 *  # A low CPU usage matters because leaving free CPU resources
 *  # available for other tasks allows G-WAN to:
 *  #
 *  # - achieve better performances by not starving the system;
 *  # - make room to generate dynamic contents (C servlets);
 *  # - make room for a database, proxy, email or virtual server;
 *  # - save energy (CPUs consume more energy under high loads);
 *  # - save money (doing 20-200,000x more on each of your server).
 *  #
 *  # For a small static file such as the 100.html file, if your test
 *  # on a LAN is slower than on localhost then your environment is
 *  # the bottleneck (NICs, switch, client CPU, client OS...).
 * ----------------------------------------------------------------------------
 *
 * clwsbt coding style is "Whitesmiths non wrapped lines".
 *
 * ----------------------------------------------------------------------------
 *
 *  You can also edit & play this program in one step this way:
 *
    sudo ./gwan -r clwsbt
 *
 * ----------------------------------------------------------------------------
 *
 *  End of introduction comments.
 *
 *  ===========================================================================
 */

/*
 *     Modify the IP ADDRESS & PORT below to match your server values:
 */
#define IP    "127.0.0.1"
#define PORT  "80"
/*
 *     Set the following parameters to match your benchark load needs:
 *     number of requests to be sent per concurrent client
 */
#define NBRREQ 100000
/*
 *     range to cover FROM & TO (0 - 1,000 concurrent clients)
 */
#define FROM   0
#define TO     1000
/*
 *     number of concurrency steps clwsbt actually skips
 */
#define STEP   10
/*
 *     number of iterations of weighttp per STEP (3: worse, average, best)
 *     (10: will give better avairage stats but the test will take a while).
 */
#define ITER   3
/*
 *     URL that you want to test
 */
#define URL    "/100.html"
/*
 *     Comment the first line below for a no-HTTP Keep-Alive test
 */
#define KEEP_ALIVES
#ifdef KEEP_ALIVES
    #define KEEP_ALIVES_STR "-k"
#else
    #define KEEP_ALIVES_STR ""
#endif
/*
 *     Modify below the name of the file to save the results of the test
 */
#define RESFILE "results-gwan.txt" 
/*
 *     Comment the line below to enable HTTP error tracking.
 *     This option is useful to collect error 30x (redirects) or 404
 *     (not found) on badly configured servers that make users report
 *     that their application server is fast when this is not the case.
 *     However, traking HTTP errors slows the test!
 */
#define TRACK_ERRORS

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <stdint.h>
#include <arpa/inet.h>
#include <ctype.h>
#include <errno.h>
#include <linux/major.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>
#include <sys/param.h>
#include <sys/resource.h>
#include <sys/socket.h>
#include <sys/sysctl.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/user.h>
#include <sys/utsname.h>

typedef unsigned int u32;
typedef unsigned long long u64;
#define FMTU64 "llu"
volatile int clwsbt_done = 0;

/*
 * "16:14:07" // HH:MM:SS
 */
char *tm_now(char *str)
    {
        time_t ltime = time(NULL);
        struct tm *tm = localtime(&ltime);
        sprintf(str, "%02d:%02d:%02d", tm->tm_hour, tm->tm_min, tm->tm_sec);
        return (str);
    }

int pidsof(char *process_name, u32 **pids)
    {
        if (!process_name || !*process_name || !pids)
            {
                return (0);
            }
        char str[4096] = "ps -C ";
        strcat(str, process_name);
        FILE *f = popen(str, "r");
        if (!f)
            {
                return (0);
            }
        *str = 0;
        int len = fread(str, 1, sizeof(str) - 1, f);
        pclose(f);
        if (!len)
            {
                return (0);
            }
        u32 *n = *pids = (u32*) malloc(sizeof(u32) * 512), nbr_pids = 0, end = 1;
        char *p = str, *e;
        while (*p != '\n')
            {
                /*
                 *  pass " PID TTY  TIME CMD" header
                 */
                p++;
            }
        if (*p)
            {
                p++;
            }
        while (*p)
            {
                e = p;
                while (*e && *e == ' ')
                    {
                        e++;
                    }
                while (*e && *e != ' ')
                    {
                        e++;
                    }
                if (*e == ' ')
                    {
                        *e = 0;
                    }
                n[nbr_pids++] = atoi(p);
                p = e + 1;
                while (*p != '\n')
                    {
                        /*
                         *  pass " ?  00:00:00 gwan" rest of line
                         */
                        p++;
                    }
                if (*p)
                    {
                        p++;
                    }
            }
        *pids = (u32*) realloc(*pids, sizeof(u32) * nbr_pids);
        return (nbr_pids);
    }

/*
 * wait 'n' milliseconds
 */
void msdelay(u32 milisec)
    {
        struct timespec req;
        time_t sec = (u32) (milisec / 1000);
        milisec = milisec - (sec * 1000);
        req.tv_sec = sec;
        req.tv_nsec = milisec * 1000000L;
        while (nanosleep(&req, &req) == -1)
            {
                continue;
            }
    }

/*
 * update CPU and RAM statistics, only one time per second
 */
typedef struct
    {
        u64 user, system;
    } icpu_t;

typedef struct
    {
        char *cpu_buf;
        int nbr_pids, *pids;
        icpu_t *old_cpu;
    } res_args_t;

void th_resources(void *ptr)
    {
        res_args_t *arg = (res_args_t*) ptr;
        char *cpu_buf = arg->cpu_buf;
        int nbr_pids = arg->nbr_pids;
        u32 *pids = arg->pids;
        icpu_t *old_cpu = arg->old_cpu;
        *cpu_buf = 0;
        char str[32], buffer[256];
        FILE *f;
        /*
         *  give time for clwsbt to warm-up the server
         */
        msdelay(100);
        u64 mem = 0, max_mem = 0;
        icpu_t cpu =
            {
                0, 0
            }, max =
            {
                0, 0
            };
        /*
         *  100 + (80 * 10 ms) < 1 second (length of the each clwsbt shot)
         */
        int loop = 80;
        while (loop-- && !clwsbt_done) // loop to track the (varying) RAM usage
            {
                int i = nbr_pids;
                while (i-- && !clwsbt_done)
                    {
                        unsigned long new_cpu_user = 0, new_cpu_system = 0;
                        sprintf(str, "/proc/%u/stat", pids[i]);
                        f = fopen(str, "r");
                        char *ok = fgets(buffer, sizeof(buffer) - 1, f);
                        fclose(f);
                        char *p = strchr(buffer, ')') + 2;
                        if (*p >= 'D' && *p <= 'W')     // track a [R]unning process
                            {
                                p += 2;
                                /*
                                 * pass spaces to skip unused variables
                                 */
                                int n = 9;
                                while (n)
                                    {
                                        if (*p++ == ' ')
                                            {
                                                n--;
                                            }
                                        p += 2;
                                    }
                                /*
                                 * pass spaces to skip unused variables
                                 */
                                n = 10;
                                while (n)
                                    if (*p++ == ' ')
                                        {
                                            n--;
                                        }
                                    /*
                                     *  physical memory used by process
                                     */
                                    long phys = 0;
                                    sscanf(p, "%ld", &phys);
                                    /*
                                     *  convert 4096-byte pages into bytes
                                     */
                                     mem += (u64) phys << 12llu;
                            }
                    }
                /*
                 * we only keep the highest values found during the test
                 */
                if (mem > max_mem)
                    {
                        max_mem = mem;
                    }
                /*
                 *  take another measure after a pause
                 */
                msdelay(100);
                mem = 0;
            }
        /*
         * now clwsbt is done, get the (always increasing) CPU time
         */
        int i = nbr_pids;
        /*
         *  loop to query all the processes
         */
        while (i--)
            {
                unsigned long new_cpu_user = 0, new_cpu_system = 0;
                sprintf(str, "/proc/%u/stat", pids[i]);
                f = fopen(str, "r");
                char *ok = fgets(buffer, sizeof(buffer) - 1, f);
                fclose(f);
                char *p = strchr(buffer, ')') + 2;
                /*
                 *  track a [R]unning process
                 */
                if (*p >= 'D' && *p <= 'W')
                    {
                        p += 2;
                        /*
                         * pass spaces to skip unused variables
                         */
                            int n = 9;
                            while (n)
                                if (*p++ == ' ')
                                    {
                                        n--;
                                    }
                                p += 2;
                                sscanf(p, "%lu %lu", &new_cpu_user, &new_cpu_system);
                                /*
                                 * pass spaces to skip unused variables
                                 */
                                n = 10;
                            while (n)
                                if (*p++ == ' ')
                                    {
                                        n--;
                                    }
                        /*
                         *  physical memory used by process
                         */
                        long phys = 0;
                        sscanf(p, "%ld", &phys);
                        /*
                         *  convert 4096-byte pages into bytes
                         */
                        mem += (u64) phys << 12llu;
                    }
                    cpu.user += new_cpu_user - old_cpu[i].user;
                    cpu.system += new_cpu_system - old_cpu[i].system;
                    old_cpu[i].user = new_cpu_user;
                    old_cpu[i].system = new_cpu_system;
            }
            /*
             * we only keep the highest values found during the test
             */
            if (cpu.user + cpu.system > max.user + max.system)
                {
                    max.user = cpu.user;
                    max.system = cpu.system;
                }
            if (mem > max_mem)
                {
                    max_mem = mem;
                }
            /*
             * format cumulated results (user/kernel proportion)
             * const double total = (max.user + max.system) / 100.;
             * sprintf(cpu_buf, "%7.02f, %7.02f, %7.02f", // User, Kernel, MB RAM
             * (max.user / total),// / nbr_cpu, // "System load"
             * (max.system / total),// / nbr_cpu, // "System load"
             * max_mem / (1024. * 1024.));
             *
             * format cumulated results (user/kernel amounts)
             *
             * User, Kernel, MB RAM
             *
             */
            sprintf(cpu_buf, "%7llu, %7llu, %7.02f", max.user, max.system, max_mem / (1024. * 1024.));
            /*
             * puts(cpu_buf);
             */
    }
	
/*
 * invoke a command and fetch its output
 */
int run_cmd(char *cmd, char *buf, int buflen)
    {
        FILE *f = popen(cmd, "r");
        if (!f)
            {
                perror("!run_cmd():");
                return (0);
            }
        *buf = 0;
        int len = fread(buf, 1, buflen, f);
        pclose(f);
        if (!*buf)
            {
                return (0);
            }
        return (len);
    }
	
/*
 * just a wrapper for the code above
 */
typedef struct
    {
        char *cmd, *buf;
        u32 buflen;
    } run_cmd_t;
	
void th_run_cmd(void *ptr)
    {
        run_cmd_t *arg = (run_cmd_t*) ptr;
        long len = run_cmd(arg->cmd, arg->buf, arg->buflen);
        pthread_exit((void*) len);
    }

/*
 * return the physical RAM used by process 'pid'
 */
u64 pid_ram(u32 pid)
    {
        char str[32];
        sprintf(str, "/proc/%u/statm", pid);
        FILE *f = fopen(str, "r");
        if (f)
            {
                unsigned long virt = 0, phys = 0;
                int len = fscanf(f, "%lu %lu", &virt, &phys);
                fclose(f);
                /*
                 *  convert 4096-byte pages into bytes
                 */
                return ((u64) phys << 12llu);
            }
        return (0);
    }

/*
 * return the free/used physical RAM of the System
 */
void sys_ram(u64 *free, u64 *total)
    {
        *free = 0;
        *total = 0;
        FILE *f = fopen("/proc/meminfo", "r");
        if (f)
            {
                char buffer[1024];
                while ((!*free || !*total) && fgets(buffer, sizeof(buffer), f))
                    {
                        if (!strncmp(buffer, "MemTotal:", 9))
                            {
                                *total = atol(buffer + 10);
                            }
                        else if (!strncmp(buffer, "MemFree:", 8))
                            {
                                *free = atol(buffer + 9);
                            }
                    }
            }
    }

/*
 * print the number and type of CPUs and Cores
 */
int cpu_type(FILE *fo)
    {
        int nbr_cpu = 0, phys_cpu_id = -1, nbr_cores = 0;
        char buffer[1024], model[128] =
            {
                0
            };
        FILE *f = fopen("/proc/cpuinfo", "r");
        if (f)
            {
                while (fgets(buffer, sizeof(buffer), f))
                    {
                        if (!strncmp(buffer, "processor\t:", 11))
                            {
                                nbr_cpu++;
                            }
                        else if (!strncmp(buffer, "physical id\t:", 13))
                            {
                                int id = atoi(buffer + 14);
                                if (id > phys_cpu_id)
                                    {
                                        phys_cpu_id = id;
                                    }
                            }
                        else if (!*model && !strncmp(buffer, "model name\t:", 12))
                            {
                                char *s = buffer + 13, *d = model;
                                while (*s)
                                    {
                                        *d++ = *s;
                                        /*
                                         *  copy string removing consecutive spaces
                                         */
                                        if (*s++ == ' ')
                                            {
                                                while (*s == ' ')
                                                    {
                                                        s++;
                                                    }
                                                *d++ = *s++;
                                            }
                                    }
                            }
                        if (!nbr_cores && !strncmp(buffer, "cpu cores\t:", 11))
                            {
                                nbr_cores = atoi(buffer + 12);
                            }
                    }
                fclose(f);
            }
        if (nbr_cores > 0)
            {
                nbr_cpu = nbr_cores;
            }
        printf("Machine: %d x %u-Core CPU(s) %s", phys_cpu_id >= 0 ? phys_cpu_id + 1 : 1, nbr_cores, model);
        fprintf(fo, "Machine: %d x %u-Core CPU(s) %s", phys_cpu_id >= 0 ? phys_cpu_id + 1 : 1, nbr_cores, model);
        return (nbr_cpu << 16 | nbr_cores);
    }

/*
 * ============================================================================
 */
static int http_req(char *request);

/*
 * ----------------------------------------------------------------------------
 * usage:
 * clwsbt       (logs requests per second)
 * clwsbt nginx (logs requests per second, CPU and memory of process 'nginx')
 * ----------------------------------------------------------------------------
 */
int main(int argc, char *argv[])
    {
        printf("\n===================================================================================================\n\n"
                "clwsbt - Customizable Linux Web Server Benchmark Tool - Weighttp Wrapper (C) CC-By-Sa by The L7D\n\n"
                "-------------------------------------------- Start ------------------------------------------------\n");
        int i, j, nbr, max_rps, min_rps, ave_rps;
        char str[256], buf[4070], buffer[256], cpu_buf[256] =
            {
                0
            };
        time_t st = time(NULL);
        u64 tmax_rps = 0, tmin_rps = 0, tave_rps = 0;
        FILE *f;
        puts(" ");
        /*
         * fprintf(stderr, "URL=%s\n", URL);
         * fprintf(stderr, "ret=%d\n", http_req(URL));
         * exit(0);
         *
         */
        FILE *fo = fopen(RESFILE, "a+b");
        if (!fo)
            {
                /*
                 *  "Permission denied"
                 */
                perror("can't open output file");
                return (1);
            }
        fputs("\n===================================================================================================\n\n"
                "clwsbt - Customizable Linux Web Server Benchmark Tool - Weighttp Wrapper (C) CC-By-Sa : The L7D\n\n"
                "-------------------------------------------- Start ------------------------------------------------\n\n", fo);
        int nbr_cpu = cpu_type(fo), nbr_cores = nbr_cpu & 0x0000ffff;
        nbr_cpu >>= 16;
        {
            u64 free = 0, total = 0;
            sys_ram(&free, &total);
            if (free && total)
                {
                    sprintf(buf, "RAM: %.02f/%.02f (Free/Total, in GB)\n", free / (1024. * 1024.), total / (1024. * 1024.));
                    fputs(buf, fo);
                    printf("%s", buf);
                }
        }
        {
            char name[256] =
                {
                    0
                };
            f = fopen("/etc/issue", "r");
            if (f)
                {
                    int len = fread(name, 1, sizeof(name) - 1, f);
                    if (len > 0)
                        {
                            /*
                             * just in case
                             */
                            name[len] = 0;
                            char *p = name;
                            while (*p && !iscntrl(*p))
                                {
                                    p++;
                                }
                            *p = 0;
                        }
                    fclose(f);
                }
            struct utsname u;
            uname(&u);
            sprintf(buf, "%s %s v%s %s\n%s\n\n", u.sysname, u.machine, u.version, u.release, name);
            fputs(buf, fo);
            printf("%s", buf);
            sprintf(buf, "weighttp -n %d -c [%u-%u step:%d rounds:%u] -t %u %s \"http://" IP ":" PORT URL "\" %s\n\n", NBRREQ, FROM, TO, STEP, ITER, nbr_cores, KEEP_ALIVES_STR, argv[1]);
            fputs(buf,fo);
            printf("%s", buf);
        }
        /*
         * since some servers like Nginx use processes (instead of threads like G-WAN)
         * to implement workers, we have to find all of them
         */
        icpu_t *old_cpu = 0, *beg_cpu = 0;
        int nbr_pids = 0;
        u32 *pids = 0;
        /*
         *  any server process name provided on command line?
         */
        if (argv[1])
            {
                sprintf(buf, "Collecting CPU/RAM stats for server '%s'", argv[1]);
                fputs(buf, fo);
                printf("%s", buf);
                char str[128];
                nbr_pids = pidsof(argv[1], &pids);
                if (nbr_pids)
                    {
                        old_cpu = (icpu_t*) calloc(nbr_pids, sizeof(icpu_t)), beg_cpu = (icpu_t*) calloc(nbr_pids, sizeof(icpu_t));
                    }
                sprintf(buf, ": %u process(es)\n", nbr_pids);
                fputs(buf, fo);
                printf("%s", buf);
                int i = nbr_pids;
                while (i--)
                    {
                        float mem = (float) pid_ram(pids[i]) / (1024. * 1024.);
                        sprintf(buf, "pid[%d]:%u RAM: %.02f MB\n", i, pids[i], mem);
                        fputs(buf, fo);
                        printf("%s", buf);
                    }
                fputs(" ", fo);
                puts(" ");
                /*
                 * get the start count of CPU jiffies for this server
                 */
                res_args_t res_args =
                    {
                        cpu_buf, nbr_pids, pids, beg_cpu
                    };
                th_resources(&res_args);
            }

    fputs("\n"
          "  Client           Requests per second              CPU           RAM\n"
          "-----------  -------------------------------  ----------------  -------\n"
          "Concurrency     min        ave        max      user     kernel     MB\n"
          "-----------  ---------  ---------  ---------  -------  -------  -------\n", fo);
    for (i = FROM; i <= TO; i += STEP)
        {
            sprintf(str, "weighttp -n %d -c %d -t %u %s -H \"Accept-Encoding: gzip\" \"http://" IP ":" PORT URL "\"", NBRREQ, i > nbr_cores ? i : nbr_cores, nbr_cores, KEEP_ALIVES_STR);
            for (max_rps = 0, ave_rps = 0, min_rps = 0xffff0, j = 0; j < ITER; j++)
                {
                    if (nbr_pids)
                        {
                            clwsbt_done = 0;
                            run_cmd_t cmd_args =
                                {
                                    .cmd = str, .buf = buf, .buflen = sizeof(buf)
                                };
                            pthread_t th_ab;
                            pthread_create(&th_ab, NULL, th_run_cmd, (void*) &cmd_args);
                            res_args_t res_args =
                                {
                                    cpu_buf, nbr_pids, pids, old_cpu
                                };
                            pthread_t th_res;
                            pthread_create(&th_res, NULL, th_resources, (void*) &res_args);
                            void *ret_code;
                            pthread_join(th_ab, (void**) &ret_code);
                            nbr = (long) ret_code;
                            clwsbt_done = 1;
                            pthread_join(th_res, NULL);
                        }
                    else
                        {
                            nbr = run_cmd(str, buf, sizeof(buf));
                        }
                    if (nbr > 0 && nbr < sizeof(buf))
                        {
                            *(buf + nbr) = 0;
                        }
                    nbr = 0;
                    if (*buf)
                        {
                            /*
                             *  "microsec, 12345 req/s"
                             */
                            char *p = strstr(buf, "microsec,");
                            if (p)
                                {
                                    p += sizeof("microsec,");
                                    nbr = atoi(p);
                                    #ifdef TRACK_ERRORS
                                        /*
                                         *  "succeeded, 0 failed, 0 errored"
                                         */
                                        p = strstr(p, "succeeded,");
                                        u32 nbr_errors = 0;
                                        if(p)
                                            {
                                                p += sizeof("succeeded,");
                                                nbr_errors = atoi(p);
                                            }
                                        if(nbr_errors)
                                            {
                                                printf("* Non-2xx responses:%d\n", nbr);
                                                fprintf(fo, "* Non-2xx responses:%d\n", nbr);
                                                /*
                                                 * dump the server reply on stderr for examination
                                                 */
                                                http_req(URL);
                                                goto end;
                                            }
                                    #endif
                                }
                        /*
                         * goto round_done;
                         */
                        }
                    if (max_rps < nbr)
                        {
                            max_rps = nbr;
                        }
                    if (min_rps > nbr)
                        {
                            min_rps = nbr;
                        }
                    ave_rps += nbr;
                }
            ave_rps /= ITER;
            round_done:
            tmin_rps += min_rps;
            tmax_rps += max_rps;
            tave_rps += ave_rps;
            /*
             * display data for convenience and save it on disk
             */
            nbr = sprintf(buf, "%10d,%10d,%10d,%10d, %s\n", i ? i : 1, min_rps, ave_rps, max_rps, cpu_buf);
            printf("%s   %s", tm_now(str), buf);
            if (fwrite(buf, 1, nbr, fo) != nbr)
                {
                    printf("fwrite(fo) failed");
                    return (1);
                }
            /*
             *  in case we interrupt the test
             */
            fflush(fo);
        }
        end: st = time(NULL) - st;
        strcpy(buf, "---------------------------------------------------------------------------------------------------\n");
        puts(buf);
        fputs(buf, fo);
        fputs("\n", fo);
        strftime(str, sizeof(str) - 1, "%X", gmtime(&st));
        sprintf(buf, "Cumulated requests ->  min: %"FMTU64"   avg: %"FMTU64"   max: %"FMTU64 "\n\nElapsed Time -> %ld seconds: [%s] \n", tmin_rps, tave_rps, tmax_rps, st, str);
        puts(buf);
        fputs(buf, fo);
        fputs("\n", fo);
        /*
         * server process name provided on command line (apache2, cherokee, gwan, lighttpd, nginx, etc.)
         */
        if (argv[1]) 
            {
                /*
                 * print the total count of CPU jiffies for this server
                 */
                u64 user = 0, kernel = 0;
                int i = nbr_pids;
                while (i--)
                    {
                        user += (old_cpu[i].user - beg_cpu[i].user), kernel += (old_cpu[i].system - beg_cpu[i].system);
                    }
                sprintf(buf, "CPU jiffies ->  user: %"FMTU64"   kernel: %"FMTU64"   total: %"FMTU64, user, kernel, user + kernel);
                puts(buf);
                fputs(buf, fo);
                strcpy(buf, "\n============================================= End =================================================\n");
                puts(buf);
                fputs(buf, fo);
            }
        fputs(" ", fo);
        puts(" ");
        fclose(fo);

        printf("Please wait (~1 minute) for the next message to cool down your CPU before to restart a huge test.\n");
        msdelay(60000);
        puts("Now you're done.\n\n");
        return (0);
    }

/*
 * ============================================================================
 * A 'quick and (really) dirty' wget (Don't use this code in production!)
 * ----------------------------------------------------------------------------
 * read a CRLF-terminated line of text from the socket
 * return the number of bytes read, -1 if error
 * ----------------------------------------------------------------------------
 */
static int read_line(int fd, char *buffer, int max)
    {
        char *p = buffer;
        while (max--)
            {
                if (read(fd, p, 1) <= 0)
                    {
                        break;
                    }
                if (*p == '\r')
                    {
                        continue;
                    }
                if (*p == '\n')
                    {
                        break;
                    }
                p++;
            }
        *p = 0;
        return (p - buffer);
    }

/*
 * ----------------------------------------------------------------------------
 * read 'len' bytes from the socket
 * return the number of bytes read, -1 if error
 * ----------------------------------------------------------------------------
 */
static int read_len(int fd, char *buffer, int len)
    {
        int ret;
        char *p = buffer;
        while (len > 0)
            {
                ret = read(fd, p, len);
                if (ret <= 0)
                    {
                        return (-1);
                    }
                p += ret;
                len -= ret;
            }
        return (p - buffer);
    }

/*
 * ----------------------------------------------------------------------------
 * connect to the server, send the HTTP request and dump the server reply
 * return the HTTP status sent by the server, -1 if error
 * ----------------------------------------------------------------------------
 */
static int http_req(char *request)
    {
        char buf[4096], *p;
        int ret = -1, s, len;
        struct hostent *hp;
        struct sockaddr_in host;
        while ((hp = gethostbyname(IP)))
            {
                memset((char*) &host, 0, sizeof(host));
                memmove((char*) &host.sin_addr, hp->h_addr, hp->h_length);
                host.sin_family = hp->h_addrtype;
                host.sin_port = htons((unsigned short) atoi(PORT));
                if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0)
                    {
                        break;
                    }
                if (connect(s, (struct sockaddr*) &host, sizeof(host)) < 0)
                    {
                        break;
                    }
                len = sprintf(buf, "GET %s HTTP/1.1\r\nHost: " IP ":" PORT "\r\nUser-Agent: a.c\r\nAccept-Encoding: gzip\r\nConnection: close\r\n\r\n", request);
                if (write(s, buf, len) != len)
                    {
                        break;
                    }
                else
                    {
                        len = read_line(s, buf, sizeof(buf) - 1);
                        fputs(buf, stderr);
                        putc('\n', stderr);
                        if (len <= 0)
                            {
                                break;
                            }
                        else if (sscanf(buf, "HTTP/1.%*d %3d", (int*) &ret) != 1)
                            {
                                break;
                            }
                    }
                /*
                 *  ret is the HTTP status, parse the server reply
                 */
                if (ret > 0)
                    {
                        for (*buf = 0;;)
                            {
                                int n = read_line(s, buf, sizeof(buf) - 1);
                                fputs(buf, stderr);
                                putc('\n', stderr);
                                if (n <= 0)
                                    {
                                        break;
                                    }
                                for (p = buf; *p && *p != ':'; p++)
                                    {
                                        *p = tolower(*p);
                                    }
                                sscanf(buf, "content-length: %d", &len);
                            }
                        len = (len > (sizeof(buf) - 1)) ? (sizeof(buf) - 1) : len;
                        len = read_len(s, buf, len);
                        if (len > 0)
                            {
                                buf[len] = 0;
                                fputs(buf, stderr);
                                putc('\n', stderr);
                            }
                    }
                break;
            };
        close(s);
        return (ret);
    }
/* 
 * ============================================================================
 * End of Source Code
 * ============================================================================
 */

La commande de compilation de clwsbt (une fois libev et weigthp installé - voir dans les commentaires d'entête du source de "clwsbt.c" comment procéder aux téléchargements complémentaires nécessaires et à à leurs installations respectives indispensables pour l'utilisation de ce "wrapper"):

gcc -O2 clwsbt.c -lpthread -o clwsbt

Le fichier 100.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "[url]http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd[/url]">
<html xmlns="http://www.w3.org/1999/xhtml">
   <head>
      <meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"/>
      <title>100 static characters test</title>
   </head>
   <body>
      <p>abcdefghijklmnopqrstuvwxyz - 0123456789 - ABCDEFGHIJKLMNOPQRSTUVWYYZ - 9876543210 - 100 characters!</p>
   </body>
</html>

#8 Re : -1 »  Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ? » Le 13/12/2012, à 01:15

@null4ever
Réponses : 25

Bonjour tiramiseb

tiramiseb a écrit :

Moi je pense qu'il ne faut pas limiter ce wrapper à ce forum, ça peut intéresser plein de gens de par le monde !
Un petit dépôt git sur github par exemple ?

Merci de votre soutien mais d'une part ce wrapper n'en est qu'à sa version 0.1 et n'est pas terminé (j'ai encore pas mal de choses à y ajouter pour le rendre vraiment "usable"), et d'autre part je n'ai strictement aucune idée de comment faire un petit dépôt git, que ce soit sur github où ailleurs.

De plus, si vous avez vous-même testé ce wrapper, vous vous serez rendu compte qu'il met à mal la réputation éhonteusement fausse (pour cause de lobbying tout comme d'incompétence et/ou d'intérêts de journalistes dits spécialisés) de beaucoup de web serveurs considérés actuellement comme des "dieux" intouchables.

Aux vues des résultats comparatifs que j'ai déjà réalisés, je les considère plutôt comme des "reliques" du passé si on ose vraiment les comparer à des solutions novatrices comme G-WAN ou même (dans une moindre mesure) Monkey Deamon Tool.

Je vous suggère par exemple de tester Apache2 avec et sans Varnish ou encore Zend Server avec clwsnt et les valeurs REQ = 1000000, FROM = 0, TO = 1000, STEP = 10 et ITER = 3 ! Les résultats risquent de fâcher un certain nombre de leurs afficionados ! tongue

A ce propos, sur ma machine serveur (configuration dans ma signature) Apache2 "EXPLOSE" litéralement à partir de 180, 190 clients simultanés avec les valeurs de clwsbt ci-dessus ! lol hmm mad

En attendant, en référence à votre première intervention sur ce thread, si vous avez une réponse pour désactiver les fichiers log de Cherokee et/ou de Lighttpd et/ou de Nginx, je suis preneur pour pouvoir "publier" des tests comparatifs non "biaisés". roll

Merci encore de vos conseils avisés. wink

Cordialement. cool

PS: Petite précision : je ne suis en rien affilié de près ou de loin à Trustleap (la société Suisse éditrice de G-WAN) ni n'ai strictement aucun intérêt peronnel, direct ou indirect en regard de sa diffusion si ce n'est d'avoir le plaisir de l'honnèteté de reconnaître la véritable suppériorité de ses performances hors du commun et être ébahi par les possibilités de cet outil (closed source mais gratuit - comme des tones de FreeWare d'ailleurs) qui mérite vraiment d'être connu (et reconnu) aussi bien du grand public que des petits et grands acteurs du Web. cool

Edited for typos.

#9 Re : -1 »  Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ? » Le 13/12/2012, à 15:51

@null4ever
Réponses : 25

Bonjour J5012,

J5012 a écrit :

gwan n'a rien invente : il repique le code de thttpd en y ajoutant qqs extensions modernes comme php et cie ...

Ha bon ?

Et d'où tenez vous cette affirmation pseudo technique et sans aucun fondement ?

Connaissez vous l'architecture de thttpd ?

Et celle de G-WAN ?

Les avez-vous comparé pour dire cela ?

Avant de publier de telles accusations péremptoires, merci de nous donner vos preuves.

Comme déjà dit précédemment, je ne suis lié en rien, ni de près ni de loin, ni n'ait strictement aucun intérêt direct ou indirect avec la société Suisse Trustleap et/ou la diffusion de ses différents logiciels, dont G-WAN !

En revanche, j'ai le plaisir de connaitre effectivement personnellement Pierre Gauthier, le Président de Trustleap, depuis plus de 12 ans (je l'ai rencontré alors qu'il était l'un de mes plus sérieux concurrent de l'époque et contrairement aux habitudes des Français, nous sommes devenus amis bien que compétiteurs dans la même cour).

Je sais donc quelles vicissitudes il a eu par le passé à se battre judiciairement, entre autre en France, contre le piratage éhonté de l'un de ses produits par plusieurs grandes compagnies soit disant très respectueuses, puisque j'ai du moi-même traverser les mêmes arcanes judiciaires (TGI de Paris, expertises judiciaires multiples, Cour d'Appel et enfin victoire... mais à quel prix !).

Been there, done that ! Chat échaudé craint l'eau froide !

Maintenant, libre à vous de critiquer publiquement de façon anonyme (c'est plus facile et confortable et cela vous évite surtout un procès en diffamation) G-WAN (ou tout autre produit) dont vous ne seriez d'ailleurs certainement pas capable d'écrire même la première ligne, mais en ayant au strict minimum l'honnêteté de faire vos critiques avec de véritables arguments établis et prouvés et non pas par une diatribe verbeuse vraiment nauséabonde !

A bon entendeur...

Très cordialement quand même.

#10 Re : -1 »  Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ? » Le 13/12/2012, à 15:55

@null4ever
Réponses : 25

Bonjour tiramiseb,

tiramiseb a écrit :

Wow, je suis en train de lire les commentaires sur http://nbonvin.wordpress.com/2011/03/24 … er-to-use/, Pierre (l'auteur de G-Wan) n'aime vraiment pas qu'on pose des questions sur son produit ou qu'on fasse une quelconque critique !!! Je suis atterré par les réactions de ce gars

Effectivement, Pierre Gautier a un peu "le sang chaud". Mais si vous le connaissiez personnellement et aviez eu une expérience similaire, vous comprendriez très certainement pourquoi.

Ce qui le révolte particulièrement est le type d'accusation faite par des [modéré : restons respectueux] comme celle de J5012.

Je vous réponds en MP sur votre adresse courriel pour vous donner quelques explications à ce sujet, car elles sont H.S. sur ce forum.

Très cordialement.

PS: si vous ne recevez pas mon message, mon adresse e-mail est "null4ever as2.com" [modération remplacer l’espace par un @]. Merci de vérifier dans les messages indésirables de votre messagerie.

#11 Re : -1 »  Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ? » Le 13/12/2012, à 16:13

@null4ever
Réponses : 25

Re bonjour tiramiseb,

tiramiseb a écrit :
@null4ever a écrit :

libre à vous de critiquer publiquement de façon anonyme

Tu as bon dos de critiquer l'anonymat, en usant toi-même...

J5012 ne fait pas une affirmation, mais une accusation, ce qui est très différent !

D'autre part, je donne mon adresse courriel, par ailleurs accessible à tous les membres de ce forum, et lorsque que quelqu'un m'envoie un message à cette adresse, je réponds généralement via mon compte courriel réel (et non pas via mon pseudo).

Ma façon de réagir aux propos de J5012 est donc du même niveau que son accusation infondée car elle porte préjudice même de façon anonyme à une société et/ou un produit qu'il n'a même pas essayé !

Et oui, effectivement Pierre Gautier réagit lui aussi de manière un peu virulente aux accusations mensongères et infondées sur le travail de sa société, comme je vous l'expliquerai par un courriel personnel d'ici environ 15 minutes.

Cela vous permettra sans doute de réviser un peu votre propre réaction !

Très sincèrement et cordialement.

#12 Re : -1 »  Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ? » Le 13/12/2012, à 17:51

@null4ever
Réponses : 25

Re bonjour J5012 (et pour la partie technique re bonjour à tiramiseb à qui ne s'adresse pas ma réponse à J5012).

J5012 a écrit :

gwan n'a rien invente : il repique le code de thttpd en y ajoutant qqs extensions modernes comme php et cie ...

Voici une réponse un peu plus "objective" et surtout "technique" à votre (J5012) dénigrement infondé de G-WAN :

@J5012 : Selon Wikipedia thttpd a des fonctions comme le bandwidth throttling que G-WAN n'a toujours pas depuis 2009 (et pour cause).

Ce sont donc deux projets bien distincts et prétendre le contraire comme vous le faites (sans même tenter d'apporter la moindre preuve) est à l'évidence un "mensonge" qui ne peut que profiter aux concurrents (malheureusement très inférieurs) de G-WAN.

Quel est donc votre intérêt à publier une telle affirmation péremptoire et totalement infondée (par ailleurs pénalement répréhensible) ?

Commencez-donc à faire des recherches avant d'affirmer n'importe quoi !

G-WAN ne ré-utilise donc le code d'aucun serveur Web et c'est justement ce qui le rend bien plus rapide que tous les autres grâce à une architecture novatrice.

Prouvez le contraire ! Sinon, excusez-vous ou au moins taisez-vous !

tiramiseb a écrit :

Comment je fais, moi, pour faire marcher G-WAN avec une appli en Flask et une authentification LDAP ?

@tiramiseb : G-WAN offre des "handlers" (l'équivalent des modules de Nginx et d'Apache, en bien plus simple à écrire et à utiliser).

Donc il est trivial de créer des règles de réécriture (dont plusieurs exemples sont publiés sur le site de G-WAN, Stackoverflow, etc.)  d'authentification ou de support de n'importe quel protocole comme webdav.

Exemple : http://gwan.com/developers#handler

G-WAN permettant de lier n'importe quelle librairie C sans le moindre code d'interface il n'a jamais été aussi facile d'utiliser des bases de données ou de se connecter à LDAP (la librairie cURL supporte LDAP et voici comment l'utiliser depuis G-WAN).

Exemple : http://www.gwan.ch/source/curl.c

cURL supporte d'autres protocoles comme FILE, FTP, FTPS, GOPHER, HTTP/HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET, TFTP, et G-WAN est le seul serveur qui permette d'utiliser ces librairies aussi facilement.

Enfin, G-WAN est le seul serveur qui permette de faire tout cela en 15 langages de programmation, tous ayant des connecteurs LDAP et base de données.

Mais encore faut-il avoir les compétences nécessaires et requises pour utiliser ces langages et ces librairies (n'est-ce pas J5012) !

Bref, il est vraiment très regrettable de voir autant de mauvaise foi publiée (le post de J5012) à seule fin de désinformer les gens - juste parce que certains sont fâchés de voir G-WAN être un meilleur serveur que le leur (et/ou que celui qu'ils utilisent), et menacer leurs parts de marché (et/ou leurs prétendues compétences).

tiramiseb a écrit :

PS: Va voir dans un dictionnaire la définition de "diatribe".

Diatribe cf. Larousse : Discussion d'école (pas de cour d'école) vive, parfois très intense voir même injurieuse ! Accuser Trustleap d'avoir copié le code de thttpd est non seulement injurieux mais aussi diffamatoire. Ce mot est donc parfaitement justifié pour qualifier les propos de J5012. Je rajoute même que si j'étais lui (J5012), je prendrai très sérieusement garde à ne pas être poursuivi en justice pour avoir publié une telle affirmation sans aucun fondement qui porte préjudice à cette entreprise et à son produit et dont le but caché n'est certainement pas très clair ni avouable ! A bon entendeur...

Très cordialement (et sans rancune pour J5012).

Edited for typos.

#13 Re : -1 »  Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ? » Le 13/12/2012, à 18:58

@null4ever
Réponses : 25

Re re re bonjour tiramiseb,

tiramiseb a écrit :

Pour "diatribe" on n'a pas les mêmes sources smile

Sur le witionnaire :
1. Critique amère et violente.
2. Discours ou écrit violent et injurieux.

À part une affirmation en l'air sans aucune explication ni argument, je ne vois rien de violent, injurieux ou amer...

Enfin passons, nous n'allons pas nous battre sur une définition de dictionnaire big_smile

En effet, on ne va pas se battre pour des définitions de dictionnaires toutes autant discutables les unes que les autres. lol

En revanche, écrire que "machin repique le code de truc" est à mon sens non seulement très violent, mais aussi injurieux si ce n'est même carrément diffamatoire, sans parler du fait que le Sieur accusateur en question n'apporte strictement aucun argument pour appuyer cette accusation !

Si ce n'est pas ce que vous appelez "un dénigrement qui porte préjudice", alors je ne sais pas quelle est la signification de ces termes. roll

Bon, maintenant chacun voit midi à sa porte. Moi je n'ai pas de porte ! Alors je vois midi à ma montre ou à la pendule de la cuisine. tongue

Merci de répondre (quand vous en aurez le temps) à mon e-mail. cool

Très cordialement.

PS: En attendant, je reste sur ma faim pour la désactivation des fichiers log de Cherokee, Lighttpd et Nginx, ce qui était le but de mon post d'origine. hmm

#14 Re : -1 »  Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ? » Le 13/12/2012, à 19:25

@null4ever
Réponses : 25
tiramiseb a écrit :

« G-Wan c'est de la merde, il a brûlé ma maison et violé ma femme, ne l'utilisez surtout pas ! » en serait un.

Mais "X pompe sur Y" y'en a plein des affirmations comme ça, on n'en fait pas tout un foin smile

C'est juste une question d'appréciation ! Comme pour "midi à sa porte" ! tongue

Mais quand on est passé par où est passé Pierre Gautier (tout comme moi - voir mon e-mail) on peut aisément comprendre pourquoi de telles affirmations sans fondement ("G-WAN repique le code de thttpd et y ajoute..." est quand même assez différent de "l'auteur de G-WAN s'est inspiré du code de thttpd", ce qui par ailleurs est tout aussi faux) peuvent vraiment vous hérisser le poil et contribue au dénigrement systématique (sans plus de fondement d'ailleurs à par la jalousie de ne pas savoir faire aussi bien) véritablement organisé par d'autres !

Quand aux pratiques "merdiques" de certains membres connus du monde de l'Open Source pour mettre en avant leur produit par rapport à d'autres solutions bien meilleures, il y a des tas d'exemples peu recommandables qui ne valent vraiment pas mieux que les pratiques "mafieuses" de certains éditeurs de logiciels propriétaires ! roll

tiramiseb a écrit :

PS: je répondrai au mail, sans faute !

Ce serait très sympa de votre part. cool

Très cordialement.

#15 Re : -1 »  Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ? » Le 14/12/2012, à 04:25

@null4ever
Réponses : 25

Bonsoir NooP,

NooP a écrit :

En fait, tu nous annonces cela :

@null4ever a écrit :

PS: Petite précision : je ne suis en rien affilié de près ou de loin à Trustleap [...]

Ensuite, quelques messages plus loin, tu nous expliques :

@null4ever a écrit :

En revanche, j'ai le plaisir de connaitre effectivement personnellement Pierre Gauthier, le Président de Trustleap, depuis plus de 12 ans [...]

Oops !

Depuis quand connaître "quelqu'un" depuis longtemps, apprécier son travail et le défendre devant des accusations infondées d'un geek incompétent et surtout menteur (J5012 n'a même pas essayé G-WAN et affirme des choses qu'il n'a pas vérifié et d'ailleurs son post le démontre vu qu'il parle de fonctionnalités de G-WAN qui n'ont pas encore été diffusées au grand public - "CQFD") signifie que l'on est affilié d'une manière ou d'une autre à ce "quelqu'un" ?

Je n'ai (et malheureusement pour moi) strictement aucun intérêt financier dans Trustleap, ni dans la diffusion par ailleurs gratuite de G-WAN, quelque soit son succès (ou non) !

Et même si j'avais (ce qui n'est malheureusement pas le cas même pour ma seule et unique satisfaction intellectuelle de participer à ce superbe projet) 10 % de G-WAN... 10 % de 0 (valeur de commercialisation de ce freeware) = "la tête à Toto" ! LoL

NooP a écrit :

On notera au passage, que niveau diffamation, bien que tu le reproches aux autres, toi même ne te retiens guère :

@null4ever a écrit :

[...] il met à mal la réputation éhonteusement fausse (pour cause de lobbying tout comme d'incompétence et/ou d'intérêts de journalistes dits spécialisés) de beaucoup de web serveurs considérés actuellement comme des "dieux" intouchables.
[...] Quand aux pratiques "merdiques" de certains membres connus du monde de l'Open Source pour mettre en avant leur produit par rapport à d'autres solutions bien meilleures, il y a des tas d'exemples peu recommandables qui ne valent vraiment pas mieux que les pratiques "mafieuses" [...]

Me suis-je abaissé (comme J5012 qui est aux abonnés absents et les absents ont toujours tors) de nommer tel ou tel produit, tel ou tel journaliste dans ce que vous relevez ci-dessus ?

Non !

NooP a écrit :

Seraist-ce faire de la diffamation qu’oser imaginer que tu sois passé ici seulement pour un p'tit coup de pub à ton pote ?
Je sais pas, mais connaître personnellement le PDG d'une boite depuis 12 ans et dire qu'on est en rien affilié, même de loin, à cette boite, tout en encensant le produit de ladite boite, ça laisse penseur ...

A nouveau, me suis-je abaissé (comme J5012 qui est encore aux abonnés absents...) de citer ci-dessus telle ou telle solution dans ce que vous relevez ci-dessus ?

Non !

Maintenant, si vous croyez tout ce qui est publié dans les journaux (LoL), ou vu à la télivision ou dit à la radio, ou même écrit par des anonymes sur des blogs ou des fora... (comme disait le très regretté Coluche : "Je me marre !")... big LoL !

Par contre il y a plein d'exemples du genre de bashing carrément "mafieux" que je dénonce aussi bien dans le monde des logiciels propriétaires (et les exemples ne manquent pas) que dans le monde du "libre" (les exemples sont plus rares mais il y en a aussi... malheureusement).  Si vous voulez des exemples, échangeons donc sereinement par e-mail !

Dans toute communauté, il y a malheureusement des "black sheeps" !

NooP a écrit :

Seraist-ce faire de la diffamation qu’oser imaginer que tu sois passé ici seulement pour un p'tit coup de pub à ton pote ?
Je sais pas, mais connaître personnellement le PDG d'une boite depuis 12 ans et dire qu'on est en rien affilié, même de loin, à cette boite, tout en encensant le produit de ladite boite, ça laisse penseur ...

Vous avez parfaitement le droit de penser et d'imaginer ce que vous voulez ! Cependant, relisez simplement ce que j'ai écrit... et non pas ce que vous voulez bien (mal) interpréter.

NooP a écrit :

Sinon, ce furieux serveur web, quelqu'un l'utilise (C'est une vraie question hein) ?
Parce que j'ai beau chercher partout, je trouve personne qui se targue d'utiliser le truc en production !

Oui, ceci est une vraie question ! Qui plus est parfaitement valable et vraiment légitime.

Et voici une vraie réponse : Entre autre (car je n'ai pas à vous dévoiler tous les clients de Trustleap que je ne connais d'ailleurs pas) la société américaine EON qui administre à ce jour (je viens de vérifier à l'instant sur leur site qui est régulièrement mis à jour) pas moins de 15,723 serveurs sous G-WAN et propose des solutions "cloud" et qui, entre autre, a démontré les performances de G-WAN lors du Oracle Open World de San Francisco du 01 au 03 octobre 2012 !

Et croyez moi, le succès a été au rendez-vous !

Et si vous savez un tout petit peu qui est Alex Korotkoff (I'm not going to make your home work), vous devriez être plus que rassuré sur la légitimité de G-WAN !

Au fait (et pour vous éviter de chercher), la société EON a aussi pour co-fondateur Pierre Gautier.

Mais c'est vrai, il faut un peu sortir de l'hexagone pour se renseigner !!!

Mais aussi : inutile de vous dire (mais vous vous en doutiez surement déjà) que (là encore malheureusement pour moi) je ne suis impliqué en rien dans EON ! Mais c'est tellement mieux en le disant (juste au cas ou...) !

NooP a écrit :

PS : En fait, à te lire, et à lire le blog de ton pote, j'ai l'impression ici de lire ton pote (même message : Agressif, diffamant, insultant et rabaissant envers les autre solutions, insultant et rabaissant envers l'OpenSource etc...), si tu vois ce que je veux dire ...

Ce qui est (pour reprendre vos qualificatifs dans le même ordre) : agressif, diffamant, insultant et rabaissant sont des accusations malveillantes et infondées comme celle de J5012 (toujours aux abonnés absents) les actes volontaires de certains "compétiteurs" de G-WAN ou de leurs "supporters" parfaitement connus qui se targuent par exemple sur Wiki de : " G-WAN is piece of crap [that] should be deleted as it is nothing more than a marketing push by the people behind GWAN" ou mieux encore de : "I don't think G-WAN has a place here at all and this is obviously written by someone from G-WAN.  I don't even know where to start rectifying this."  ou enfin encore pire : "The world would be better without G-WAN"!

Edifiant non ?

Surtout quand on sait (il n'y a pas beaucoup à chercher pour trouver l'identité d'un certain "perbu") qui est l'auteur de ces lignes si élogieuses !

NooP a écrit :

PS2 : Par contre, on trouve deci-delà (entendre : sur d'autres sites) un null4ever qui place au cours de ses discussions des choses dans ce genre :

sur developpez.com, null4ever a écrit :

[...] Par exemple, le trop peu connu serveur web G-WAN de la société [...]

sur cnet.com, null4ever a écrit :

[...] use the best ever and faster web appliction server in the world named G-WAN[...]

Oui, Null4Ever est le pseudo que j'utilise sur tous les "fora" (pluriel du mot latin forum) sur les quels j'écris quelques messages.

Moi, au moins, je ne change pas de pseudo !

Mais ce n'est en aucun cas celui de Pierre Gautier qui lui signe toujours de son vrai nom !

Maintenant, vous savez comment me joindre par courriel pour de plus amples, franches et sincères discussions non biaisées !

Espérant avoir répondu à vos observations, même si elles sont un peu "acides" à mon goût car totalement injustifiées !

Très cordialement quand même.

PS: Au fait, avez-vous au moins pris le temps d'essayer le wrapper clwsbt Open Source et gratuit que j'ai eu le plaisir d'offrir à la communauté de ce forum d'autant plus qu'il peut être utilisé avec n'importe quel web server (pages statiques) et/ou web application server (contenu dynamique) autre que G-WAN, car c'était bien aussi l'un des buts de ce thread ? Je vous remercie donc par avance de vos remarques, suggestions et/ou corrections bienvenues à son sujet !

PS: A propos de mon passage ici, j'ai aussi déjà un peu (trop peu d'ailleurs) contribué gracieusement à la fourniture de petits tutos sans prétention qui semblent avoir répondu aux problèmes récurrents de certaines questions de "newbees".

Edited for typos.

#16 Re : -1 »  Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ? » Le 14/12/2012, à 18:26

@null4ever
Réponses : 25

Bonjour J5012,

J5012 a écrit :

wouah , quelle grosse rotomontade ... bon je m'ecrabouille et te fais de geantes excuses a toi a gwan a ton pote a la societe trustleap? etc ... je peux meme effacer le pet de lapin incriminant ??

oui oui pour moi ce n'est qu'un pet de lapin (ma diatribe?) issu d'une nuit sans sommeil ...

je comprends ta super reaction oui une super ... Une amitie comme celle la est super ....

en effet je viens de relire mes sources thttpd n'a rien a voir avec gwan
a force de lire et de compulser ces centaines pages de doc, de howto, de rtfm, apres qqs nuits blanches, mes neurones ont du faire un bizarre raccourci entre deux donnees completement eloignees ... bigre

et merci a ta contribution meme si je n'utiliserais pas ce script tout de suite ... merci

pour la reponse tardive, c'est normal : je suis de l'autre cote de la planete, j'ai une vraie vie en dehors de l'internet ...

Il n'y a plus aucun problème à partir du simple moment où vous acceptez de reconnaitre que votre post était une bêtise.

Tout le monde peut se tromper... et surtout moi (j'ai encore tant de choses à apprendre, aussi bien sur Linux que sur le C car je n'ai pas la prétention d'être un développeur et encore moins un expert système) !

A part ça, je vous souhaite d'avoir le même genre d'amitié que celle que j'entretiens avec l'équipe de Trustleap et avec son Président (comme aussi avec d'autres équipes de développements) car croyez-moi, c'est très gratifiant, surtout lorsque c'est désintéressé.

D'autre part, ne me remerciez pas pour ce petit wrapper de weighttp.

D'une part ce n'est qu'une variante simplifiée et plus facilement paramétrable de l'original "ab.c" développé par Trusleap (disponible en open source sur son site) limité à l'utilisation de weighttp sous Linux (tout le code relatif à AB et à HTTPerf a été supprimé ainsi que le code pour Windows) et d'autre part ce n'est qu'une simple contribution comme tant d'autres qui dans le cas présent peut être utilisé avec n'importe quel serveur web ou serveur d'application web et pas seulement G-WAN.

S'il rend service à quelques uns, tant mieux.

Sur ce, sans rancune. On efface tout et on recommence.

Sincèrement et cordialement.

Null4Ever.

PS: Pour clore, une petite question idiote de ma part : Si vous êtes de l'autre côté de la planète, comment faites vous pour rester les pieds collés sur le sol ? Avez-vous des chaussures spéciales comme les pattes de mouche qui permettent de rester collé au plafond ?

#17 Re : -1 »  Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ? » Le 16/12/2012, à 03:12

@null4ever
Réponses : 25
Titouan a écrit :

aucun intérêt.

Tout comme votre brillante intervention ! tongue

#18 -1 »  Quel bon paramétrage d'apache2.conf ? » Le 30/11/2012, à 18:51

@null4ever
Réponses : 4

Bonjour,

Sur une machine un peu musclée (AMD FX 8150 8 cores @ 4.2 Ghz, RAM 32 Gb DDR3, SSD Crucial 250 Gb SATA3) avec Ubuntu 10.04.4 LTS à jour, j'ai installé un serveur Apache2 avec mpm-worker.

La montée en charge de ce serveur est testée avec l'outil weighttp via le wrapper ab.c

Malheureusement, Apache2 s'arrête de fonctionner avec une erreur "segmentation fault" dès que le test dépasse 180 utilisateurs simultanés.

Le fichier de configuration apache2.conf est le suivant :

#
# Based upon the NCSA server configuration files originally by Rob McCool.
#
# This is the main Apache server configuration file.  It contains the
# configuration directives that give the server its instructions.
# See http://httpd.apache.org/docs/2.2/ for detailed information about
# the directives.
#
# Do NOT simply read the instructions in here without understanding
# what they do.  They're here only as hints or reminders.  If you are unsure
# consult the online docs. You have been warned.  
#
# The configuration directives are grouped into three basic sections:
#  1. Directives that control the operation of the Apache server process as a
#     whole (the 'global environment').
#  2. Directives that define the parameters of the 'main' or 'default' server,
#     which responds to requests that aren't handled by a virtual host.
#     These directives also provide default values for the settings
#     of all virtual hosts.
#  3. Settings for virtual hosts, which allow Web requests to be sent to
#     different IP addresses or hostnames and have them handled by the
#     same Apache server process.
#
# Configuration and logfile names: If the filenames you specify for many
# of the server's control files begin with "/" (or "drive:/" for Win32), the
# server will use that explicit path.  If the filenames do *not* begin
# with "/", the value of ServerRoot is prepended -- so "/var/log/apache2/foo.log"
# with ServerRoot set to "" will be interpreted by the
# server as "//var/log/apache2/foo.log".
#

### Section 1: Global Environment
#
# The directives in this section affect the overall operation of Apache,
# such as the number of concurrent requests it can handle or where it
# can find its configuration files.
#

#
# ServerRoot: The top of the directory tree under which the server's
# configuration, error, and log files are kept.
#
# NOTE!  If you intend to place this on an NFS (or otherwise network)
# mounted filesystem then please read the LockFile documentation (available
# at <URL:http://httpd.apache.org/docs-2.1/mod/mpm_common.html#lockfile>);
# you will save yourself a lot of trouble.
#
# Do NOT add a slash at the end of the directory path.
#
ServerRoot "/etc/apache2"

#
# The accept serialization lock file MUST BE STORED ON A LOCAL DISK.
#
#<IfModule !mpm_winnt.c>
#<IfModule !mpm_netware.c>
LockFile /var/lock/apache2/accept.lock
#</IfModule>
#</IfModule>

#
# PidFile: The file in which the server should record its process
# identification number when it starts.
# This needs to be set in /etc/apache2/envvars
#
PidFile ${APACHE_PID_FILE}

#
# Timeout: The number of seconds before receives and sends time out.
#
Timeout 300

#
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive On

#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
# MaxKeepAliveRequests 100
MaxKeepAliveRequests 100

#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
# KeepAliveTimeout 15
KeepAliveTimeout 15

##
## Server-Pool Size Regulation (MPM specific)
## 

# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
#<IfModule mpm_prefork_module>
#    StartServers          5
#    MinSpareServers       5
#    MaxSpareServers      10
#    MaxClients          150
#    MaxRequestsPerChild   0
#</IfModule>

# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
#<IfModule mpm_worker_module>
#    StartServers          2
#    MinSpareThreads      25
#    MaxSpareThreads      75 
#    ThreadLimit          64
#    ThreadsPerChild      25
#    MaxClients          150
#    MaxRequestsPerChild   0
#</IfModule>

<IfModule mpm_worker_module>
    StartServers          8
    MinSpareThreads      25
    MaxSpareThreads     128 
    ThreadLimit         128
    ThreadsPerChild      25
    MaxClients         1000
    MaxRequestsPerChild   0
</IfModule>

# event MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
#<IfModule mpm_event_module>
#    StartServers          2
#    MaxClients          150
#    MinSpareThreads      25
#    MaxSpareThreads      75 
#    ThreadLimit          64
#    ThreadsPerChild      25
#    MaxRequestsPerChild   0
#</IfModule>

# These need to be set in /etc/apache2/envvars
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

#
# AccessFileName: The name of the file to look for in each directory
# for additional configuration directives.  See also the AllowOverride
# directive.
#

AccessFileName .htaccess

#
# The following lines prevent .htaccess and .htpasswd files from being 
# viewed by Web clients. 
#
<Files ~ "^\.ht">
    Order allow,deny
    Deny from all
    Satisfy all
</Files>

#
# DefaultType is the default MIME type the server will use for a document
# if it cannot otherwise determine one, such as from filename extensions.
# If your server contains mostly text or HTML documents, "text/plain" is
# a good value.  If most of your content is binary, such as applications
# or images, you may want to use "application/octet-stream" instead to
# keep browsers from trying to display binary files as though they are
# text.
#
DefaultType text/plain

#
# HostnameLookups: Log the names of clients or just their IP addresses
# e.g., www.apache.org (on) or 204.62.129.132 (off).
# The default is off because it'd be overall better for the net if people
# had to knowingly turn this feature on, since enabling it means that
# each client request will result in AT LEAST one lookup request to the
# nameserver.
#
HostnameLookups Off

# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a <VirtualHost>
# container, error messages relating to that virtual host will be
# logged here.  If you *do* define an error logfile for a <VirtualHost>
# container, that host's errors will be logged there and not here.
#
# ErrorLog /var/log/apache2/error.log
ErrorLog Off

#
# LogLevel: Control the number of messages logged to the error_log.
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
#
LogLevel warn

# Include module configuration:
Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf

# Include all the user configurations:
Include /etc/apache2/httpd.conf

# Include ports listing
Include /etc/apache2/ports.conf

#
# The following directives define some format nicknames for use with
# a CustomLog directive (see below).
# If you are behind a reverse proxy, you might want to change %h into %{X-Forwarded-For}i
#
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

#
# Define an access log for VirtualHosts that don't define their own logfile
CustomLog /var/log/apache2/other_vhosts_access.log vhost_combined

# Include of directories ignores editors' and dpkg's backup files,
# see README.Debian for details.

# Include generic snippets of statements
Include /etc/apache2/conf.d/

# Include the virtual host configurations:
Include /etc/apache2/sites-enabled/

Autres caractéristiques du paramétrage du système :

Le fichier /etc/security/limits.conf est le suivant :

* soft nofile = 200000
* hard nofile = 200000

Le fichier /etc/sysclt.conf est le suivant :

#
# /etc/sysctl.conf - Configuration file for setting system variables
# See /etc/sysctl.d/ for additional system variables.
# See sysctl.conf (5) for information.
#

#kernel.domainname = example.com

# Uncomment the following to stop low-level messages on console
#kernel.printk = 4 4 1 7

##############################################################3
# Functions previously found in netbase
#

# Uncomment the next two lines to enable Spoof protection (reverse-path filter)
# Turn on Source Address Verification in all interfaces to
# prevent some spoofing attacks
#net.ipv4.conf.default.rp_filter=1
#net.ipv4.conf.all.rp_filter=1

# Uncomment the next line to enable TCP/IP SYN cookies
#net.ipv4.tcp_syncookies=1

# Uncomment the next line to enable packet forwarding for IPv4
#net.ipv4.ip_forward=1

# Uncomment the next line to enable packet forwarding for IPv6
#net.ipv6.conf.all.forwarding=1


###################################################################
# Additional settings - these settings can improve the network
# security of the host and prevent against some network attacks
# including spoofing attacks and man in the middle attacks through
# redirection. Some network environments, however, require that these
# settings are disabled so review and enable them as needed.
#
# Ignore ICMP broadcasts
#net.ipv4.icmp_echo_ignore_broadcasts = 1
#
# Ignore bogus ICMP errors
#net.ipv4.icmp_ignore_bogus_error_responses = 1
# 
# Do not accept ICMP redirects (prevent MITM attacks)
#net.ipv4.conf.all.accept_redirects = 0
#net.ipv6.conf.all.accept_redirects = 0
# _or_
# Accept ICMP redirects only for gateways listed in our default
# gateway list (enabled by default)
# net.ipv4.conf.all.secure_redirects = 1
#
# Do not send ICMP redirects (we are not a router)
#net.ipv4.conf.all.send_redirects = 0
#
# Do not accept IP source route packets (we are not a router)
#net.ipv4.conf.all.accept_source_route = 0
#net.ipv6.conf.all.accept_source_route = 0
#
# Log Martian Packets
#net.ipv4.conf.all.log_martians = 1

# "Performance Scalability of a Multi-Core Web Server", Nov 2007
# Bryan Veal and Annie Foong, Intel Corporation, Page 4/10
fs.file-max = 5000000
net.core.netdev_max_backlog = 400000
net.core.optmem_max = 10000000
net.core.rmem_default = 10000000
net.core.rmem_max = 10000000
net.core.somaxconn = 100000
net.core.wmem_default = 10000000
net.core.wmem_max = 10000000
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.tcp_congestion_control = bic
net.ipv4.tcp_ecn = 0
net.ipv4.tcp_max syn backlog = 12000
net.ipv4.tcp_max tw buckets = 2000000
net.ipv4.tcp_mem = 30000000 30000000 30000000
net.ipv4.tcp_rmem = 30000000 30000000 30000000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_wmem = 30000000 30000000 30000000    
                
# optionally, avoid TIME_WAIT states on localhost no-HTTP Keep-Alive tests:
# "error: connect() failed: Cannot assign requested address (99)"
# On Linux, the 2MSL time is hardcoded to 60 seconds in /include/net/tcp.h:
# #define TCP_TIMEWAIT_LEN (60*HZ)
# The option below lets you reduce TIME_WAITs by several orders of magnitude
# but this option is for benchmarks, NOT for production servers (NAT issues)

net.ipv4.tcp_tw_recycle = 1

# other settings above found from various sources
# fs.file-max = 200000						# set to 5000000 in Bryan Veal and Annie Foong settings
# net.ipv4.ip_local_port_range = 1024 65535	# not set in Bryan Veal and Annie Foong settings
# net.ipv4.ip_forward = 0					# not set in Bryan Veal and Annie Foong settings
# net.ipv4.conf.default.rp_filter = 1		# set to 1 in Bryan Veal and Annie Foong settings
# net.core.rmem_max = 262143				# set to 10000000 in Bryan Veal and Annie Foong settings
# net.core.rmem_default = 262143			# set to 10000000 in Bryan Veal and Annie Foong settings
# net.core.netdev_max_backlog = 32768		# not set in Bryan Veal and Annie Foong settings
# net.core.somaxconn = 2048					# set to 10000000 in Bryan Veal and Annie Foong settings
# net.ipv4.tcp_rmem = 4096 131072 262143	# set to 30000000 30000000 30000000 in Bryan Veal and Annie Foong settings
# net.ipv4.tcp_wmem = 4096 131072 262143	# set to 30000000 30000000 30000000 in Bryan Veal and Annie Foong settings
# net.ipv4.tcp_sack = 0						# set to 1 in Bryan Veal and Annie Foong settings
# net.ipv4.tcp_dsack = 0					# not set in Bryan Veal and Annie Foong settings
# net.ipv4.tcp_fack = 0						# not set in Bryan Veal and Annie Foong settings
# net.ipv4.tcp_fin_timeout = 30				# not set in Bryan Veal and Annie Foong settings
# net.ipv4.tcp_orphan_retries = 0			# not set in Bryan Veal and Annie Foong settings
# net.ipv4.tcp_keepalive_time = 120			# not set in Bryan Veal and Annie Foong settings
# net.ipv4.tcp_keepalive_probes = 3			# not set in Bryan Veal and Annie Foong settings
# net.ipv4.tcp_keepalive_intvl = 10			# not set in Bryan Veal and Annie Foong settings
# net.ipv4.tcp_retries2 = 15				# not set in Bryan Veal and Annie Foong settings
# net.ipv4.tcp_retries1 = 3					# not set in Bryan Veal and Annie Foong settings
# net.ipv4.tcp_synack_retries = 5			# not set in Bryan Veal and Annie Foong settings
# net.ipv4.tcp_syn_retries = 5				# not set in Bryan Veal and Annie Foong settings
# net.ipv4.tcp_timestamps = 0				# set to 1 in Bryan Veal and Annie Foong settings
# net.ipv4.tcp_max_tw_buckets = 32768		# not set in Bryan Veal and Annie Foong settings
# net.ipv4.tcp_moderate_rcvbuf = 1			# not set in Bryan Veal and Annie Foong settings
# kernel.sysrq = 0							# not set in Bryan Veal and Annie Foong settings
# kernel.shmmax = 67108864					# not set in Bryan Veal and Annie Foong settings

net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.ip_forward = 0
net.core.netdev_max_backlog = 32768
net.ipv4.tcp_dsack = 0
net.ipv4.tcp_fack = 0
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_orphan_retries = 0
net.ipv4.tcp_keepalive_time = 120
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_retries2 = 15
net.ipv4.tcp_retries1 = 3
net.ipv4.tcp_synack_retries = 5
net.ipv4.tcp_syn_retries = 5
net.ipv4.tcp_max_tw_buckets = 32768
net.ipv4.tcp_moderate_rcvbuf = 1
kernel.sysrq = 0
kernel.shmmax = 67108864

Sur cette machine et avec ces réglages, Cherokee, Lighttpd, Nginx et G-WAN supportent (plus ou moins rapidement et avec plus ou moins d'efficacité selon le serveur web) une montée en charge de 1.000.000 requètes de 1.000 utilisateurs d'un fichier html statique de 100 caractères.

Est-ce qu'un spécialiste d'Apache2, saurait me dire comment configurer Apache2 pour qu'il puisse tenir une telle montée en charge sans obtenir l'erreur "segmentation fault", ou est-ce impossible avec ce serveur web sur ce type de configuration matérielle ?

Merci d'avance de vos conseils avisés.

Très cordialement.

#19 Re : -1 »  Quel bon paramétrage d'apache2.conf ? » Le 02/12/2012, à 16:02

@null4ever
Réponses : 4

Bonjour Haleth,

Haleth a écrit :

C'est un bug, pas une erreur de conf.

Apache est développé depuis 1995, soit près de 17 ans, et ce par une communauté de brillants experts et de contributeurs prestigieux comme par exemple IBM qui entre autre l'utilise dans WebSphere.

Si comme vous le pensez il s'agit d'un bug, comment se fait-il qu'il n'ait pas été rapporté depuis tout ce temps, ni donc corrigé ?

Pour ma part, je ne pense donc pas qu'il s'agisse alors d'un bug, mais bien plutôt d'une mauvaise configuration de ma part due à mon inexpérience dans ce domaine. hmm

Si ce n'est pas le cas, alors comment et à qui rapporter ce problème car d'autres solutions telles Cherokee, Lighttpd, G-WAN, Nginx et même le récent Monkey HTTP Deamon passent le test de montée en charge de weighttp sans problème (cependant avec des différences très notables en résultats et temps d'exécution).

Merci.

#20 Re : -1 »  Quel bon paramétrage d'apache2.conf ? » Le 11/12/2012, à 02:59

@null4ever
Réponses : 4

Bonjour Haleth,

Haleth a écrit :

Apache est toujours en dev
Ensuite, ce n'est pas forcement un bug d'apache, mais d'un composant externe.

Une segfault est TOUJOURS un bug.

Le problème est d'une part que je n'utilise aucun composant spécifique sauf php5-fpm qui dans le cas de ce test n'est pas appelé, et d'autre part que de temps en temps, ça marche, et de temps en temps, Apache2 s'arrête de répondre.

Je penche donc définitivement pour une mauvaise configuration de ma part.

Haleth a écrit :

Pour te donner une idée, peut-être, tu devrais changer ceci:

<IfModule mpm_worker_module>
    StartServers          8
    MinSpareThreads      25
    MaxSpareThreads     128 
    ThreadLimit         128
    ThreadsPerChild      25
    MaxClients         1000
    MaxRequestsPerChild   0
</IfModule>

J'ai essayé différentes valeurs de ThreadLimit (500 au lieu de 128) et de ThreadsPerChild (128 au lieu de 25) en les augmentant significativement en me basant sur différentes sources trouvées sur le net mais le problème reste le même.

Haleth a écrit :

Par ailleurs, les logs ne te disent rien de plus ? Regarde dans /var/log/apache2/error.log

Non, ils ne précisent rien de particulier, ce qui me semble assez logique vu qu'Apache2 semble "mourir" et n'a donc à priori pas le temps d'écrire quoi que ce soit dans ses fichiers logs.

Merci quand même.

Je savais déjà qu'Apache2 était le plus lent de tous les serveurs web pour Linux, mais quand même pas à ce point par rapport à Cherokee, Lighttpd, Monkey Deamon Tool, Nginx et surtout G-WAN (de très loin le plus véloce d'entre tous et dans des proportions incroyables).

Ceci est très surprenant vu sa part de marché estimée à environ 60 pour 100 des serveurs web installés dans le monde.

Pourquoi donc est-il encore utilisé par tant d'ISP alors qu'il est très largement surpassé par de nombreuses autres solutions?

Omerta de la presse spécialisée et des aficionados (payés ou non) de l'Apache Fundation sur les réelles capacités comparées de ses concurrents ?

Lobby d'IBM (qui est le principal partenaire financier et technique de la Apache Fundation) ?

Ceci est très étrange !

Cordialement.

PS: A propos d'outil de test de montée en charge de serveurs web, j'aimerai proposer sur ce forum un petit utilitaire sans prétention que j'ai écrit qui utilise weighttp (actuellement le seul outil de test capable d'utiliser correctement les performances des CPU multi coeurs, ce qui n'est pas le cas ni d'AB ni de HTTPerf) et qui permet de tester n'importe quel serveur web (static files) et serveur d'applications web (dynamic contents) en ne changeant que quelques paramètres (nom du serveur testé, adresse IP, port, nombre de clients simultanés, nombre de requêtes demandées par chaque client, nombre d'occurrences de weighttp lancées à chaque étape de la boucle de test, sauts de la boucle) et qui sauvegarde les résultats dans un fichier texte (dont le nom est paramétrable) formaté de manière à pouvoir être utilisé pour réaliser facilement des graphiques.

Bien entendu les sources (qui contiennent aussi toutes les instructions d'installation et de paramétrage optimal de l'OS) sont "ouvertes" et "gratuites" via les termes de la licence Creative Commons By-Sa.

Dois-je rédiger un petit tuto pour cela ou puis-je tout simplement le mettre ici entre les balises Code et /Code ?

#21 Re : -1 »  Help, SOS, A l'aide... upgrade de 10.04 vers 12.04 impossible! » Le 10/11/2012, à 03:06

@null4ever
Réponses : 21

Re re bonsoir david96,

david96 a écrit :

Bâ je suis sous debian squeeze depuis 2 ans, donc si tu l'installes et que tu as un souci je pourrais peut-être t'aider.

Merci très sincèrement de votre offre.

Je n'y manquerai pas en cas de grosse difficulté.

Pour l'instant je vais essayer une 6ème fois de faire migrer Ubuntu 10.04.4 vers Ubuntu 12.04.1 en suivant la piste donnée par pierguiard.

Et si cela ne fonctionne pas une nouvelle fois, je ne me priverai pas de le faire savoir très clairement, même si cela en dérange certains... ici ou ailleurs ! tongue tongue tongue

Très cordialement. cool

#22 Re : -1 »  Help, SOS, A l'aide... upgrade de 10.04 vers 12.04 impossible! » Le 10/11/2012, à 03:39

@null4ever
Réponses : 21

Bonsoir faustus

faustus a écrit :

T'as qu'à faire comme ça : http://forum.ubuntu-fr.org/viewtopic.ph … #p10226171
Avec ça il n'y a pas de problèmes : tu as l'ancien système qui reste opérationnel, et le nouveau à côté, tout ça en dual-boot. Ce qui fait que tu peux continuer à bosser sur l'ancien tout en configurant peu à peu le nouveau. Et tu "upgrade" pour de bon seulement quand le nouveau est pleinement fonctionnel, pas avant...

Voici très exactement la configuration que j'ai.

- /dev/sda1 -> partition primaire : swap
- /dev/sda2 -> partition primaire : ubuntu 12.04.1 LTS 64 bit
- /dev/sda3 -> partition primaire : ubuntu 10.04.4 LTS 64 bit
- /dev/sda4 -> partition étendue
- /dev/sda5 -> partition logique: copie de /dev/sda3 pour migration d'ubuntu 10.04.4 vers ubuntu 12.04.1

Bien évidemment, l'uuid de /dev/sda5, son fstab et son grub.cfg sont différents de ceux de /dev/sda3 et le boot par défaut se fait sur /dev/sda5 grâce à l'excellent outil de yannbuntu - bootrepair (je suis nul mais pas à ce point quand même wink ).

La raison de ma tentative de mise à jour de /dev/sda5 d'un ubuntu 10.04.4 vers un ubuntu 12.04.1 est d'une part que j'ai un ubuntu 10.04.4 configuré comme j'en ai besoin et d'autre part que cela m'est proposé par le système de mise à jour ! lol

Alors j'essaye... hmm

Comme cette tentative de mise à jour avait déjà lamentablement merdé lors de la sortie de la 12.04 LTS et qu'il m'avait à l'époque été "très chaudement" recommandé d'attendre la 12.04.1, (je me suis d'ailleurs bien fait insulté pour avoir osé critiquer Canonical pour cette mise à jour qui ne fonctionnait pas) j'ai effectivement attendu... roll

Mais je dois me rendre compte que la situation n'a malheureusement pas évolué d'un iota avec cette nouvelle mise à jour vers la 12.04.1 LTS ! tongue tongue tongue

C'est très dommage car si cela marchait, ce serait très confortable (même si cela prend près de 2 heures). sad

Maintenant, une question idiote et qui fâche : pourquoi continuer à proposer une mise à jour qui manifestement ne fonctionne pas ?

Merci quand même de votre contribution.

Cordialement. cool

#23 Re : -1 »  Help, SOS, A l'aide... upgrade de 10.04 vers 12.04 impossible! » Le 11/11/2012, à 19:08

@null4ever
Réponses : 21

Bonsoir The Uploader,

The Uploader a écrit :

Migration de la 10.04 à la 12.04 sans problème, ni aucun message d'erreur :
http://pix.toile-libre.org/upload/thumb/1352551171.jpg
http://pix.toile-libre.org/upload/thumb/1352551205.jpg
http://pix.toile-libre.org/upload/thumb/1352551222.jpg
Et j'ai juste utilisé le gestionnaire de mises à jours. smile

Oh les belles images.

Bon, comme j'ai la prétention de ne pas être dernier des C.NS, et que je ne remets certainement pas votre parole en doute, par simple respect pour le temps que vous avez passé pour vous même faire cette migration, j'ai voulu refaire pour la 7ème fois cette tentative.

Mais cette fois, non pas en utilisant une copie fidèle de la 10.04.4 LTS 64 bit que j'utilise et qui fonctionne parfaitement, mais en partant d'une nouvelle installation.

J'ai donc réinstallé une 10.04 LTS 64, sans aucune modification, puis utilisé les 3 lignes de commandes proposées par pierguiard (la première d'entre elle effectuant une mise à jour vers une 10.04.4 LTS 64 bit), et enfin lancé comme vous le gestionnaire de mises à jour.

Et oh surprise, cette fois la mise à jour a été jusqu'au bout, grub a bien été mis à jour; et le reboot m'a bien placé sur une 12.04.1 LTS 64 bit (contrairement à ce que montrent les images de mon premier post) un seul message d'erreur par ailleurs totalement illisible en raison de caractères de type "petits carrés" partout s'étant affiché pendant cette migration.

Qu'elle différence y a-t-il donc entre la 10.04.4 LTS 64 bit que j'utilise tous les jours et une nouvelle installation d'une 10.04 LTS de base ?

Aucune si ce n'est queqlues logiciels très standards comme Apache 2, Cheeroke, Lighttpd, Nginx ou PHP5-FPM et MySQL.

Plus Teamviewer, VMware Workstation 9.01, ddrescue et BootRepair.

Rien  d'autre.

Par acquis de conscience, je vais désinstaller ces logiciels pour voir si alors la mise à jour s'effectue correctement, mais dans ce cas là, vous conviendrez que la mise à jour n'a alors plus aucun intérêt pour moi, si je dois ensuite les réinstaller sous la 12.04.1 migrée.

Autant repartir d'une 12.04.1 directement, non ?

Just my two cents et sans rancune. cool

#24 Re : -1 »  Est-ce que le compte root a disparu de la 12.04.1? » Le 10/11/2012, à 03:15

@null4ever
Réponses : 8

Bonsoir xavier4811

xavier4811 a écrit :

Quelle que soit la distro et son age, le compte root existe toujours. Sur Ubuntu il est volontairement désactivé pour protéger l'utilisateur de lui même.
Mieux vaut utiliser sudo et gksudo, après chacun fait ce qu'il veut( et plante son système comme il veut lol ). Ça ne protège pas de tout, ça incite juste a réfléchir avant de valider une commande.

Je suis tout à fait d'accord avec vous.

Seulement, étant le seul à utiliser ma machine, l'activation ou non du compte root ne m'empèchera pas de planter mon système en cas de mauvaise commande.

En revanche, l'ajout de mon compte utilisateur dans le groupe "sudoers" et l'option de ne plus demander de mot de passe lors de l'utilisation de "sudo" ou de "su" me permet de gagner en confort d'utilisation.

Ceci dit, ce n'est effectivement pas recommandé en cas de l'utilisation d'une machine par plusieurs personnes.

Merci encore de votre précision plus que justifiée.

Cordialement. cool