Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 11/12/2012, à 02:16

@null4ever

Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ?

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.


Better to look like an idiot for a short time when asking something obvious for an expert than pretend to be smart all your life. (c) 2012 by Moi!
MB Asus Sabertooth 990SX CPU FX 8150 8 core@4.2 GhZ RAM: DDR3 32 Gb SSD Crucial 250 Gb (system) HD Samsung 3 Tb 7.200 RPM (data) GPU Saphire Radeon Dual Pro
Ubuntu 10.04.4 + 12.04.1 + Windows 7 + Windows 8 (all OSes 64 bit) !

Hors ligne

#2 Le 11/12/2012, à 02:50

Maisondouf

Re : Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ?

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)

Dernière modification par Maisondouf (Le 11/12/2012, à 02:51)


ASUS M5A88-v EVO avec AMD FX(tm)-8120 Eight-Core Processor,  OS principal Precise 12.04.1 LTS 63bits½
Bricoleur, menteur, inculte, inadapté social et mythomane, enfin d'après certains....
"the secret of my form is summed up in two words, no sport" (Winston Churchill)

Hors ligne

#3 Le 11/12/2012, à 07:33

tiramiseb

Re : Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ?

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 ?

Hors ligne

#4 Le 12/12/2012, à 02:04

@null4ever

Re : Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ?

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>

Dernière modification par @null4ever (Le 12/12/2012, à 23:58)


Better to look like an idiot for a short time when asking something obvious for an expert than pretend to be smart all your life. (c) 2012 by Moi!
MB Asus Sabertooth 990SX CPU FX 8150 8 core@4.2 GhZ RAM: DDR3 32 Gb SSD Crucial 250 Gb (system) HD Samsung 3 Tb 7.200 RPM (data) GPU Saphire Radeon Dual Pro
Ubuntu 10.04.4 + 12.04.1 + Windows 7 + Windows 8 (all OSes 64 bit) !

Hors ligne

#5 Le 12/12/2012, à 07:59

tiramiseb

Re : Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ?

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 ?

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 ?

Hors ligne

#6 Le 13/12/2012, à 00:15

@null4ever

Re : Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ?

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.

Dernière modification par @null4ever (Le 13/12/2012, à 01:00)


Better to look like an idiot for a short time when asking something obvious for an expert than pretend to be smart all your life. (c) 2012 by Moi!
MB Asus Sabertooth 990SX CPU FX 8150 8 core@4.2 GhZ RAM: DDR3 32 Gb SSD Crucial 250 Gb (system) HD Samsung 3 Tb 7.200 RPM (data) GPU Saphire Radeon Dual Pro
Ubuntu 10.04.4 + 12.04.1 + Windows 7 + Windows 8 (all OSes 64 bit) !

Hors ligne

#7 Le 13/12/2012, à 08:53

tiramiseb

Re : Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ?

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")

Bah... Release Early Release Often !


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

Y'a des super didacticiels sur GitHub, c'est en tâtonnant chez eux que j'ai appris le peu que je connais de git.


vous vous serez rendu compte qu'il met à mal la réputation éhonteusement fausse de beaucoup de web serveurs

Quelle réputation ? Lobbying de ce genre, dans le monde du logiciel libre ? Théorie du complot, tout ça ?
...

Apache a la réputation d'être plutôt lent par rapport à Lighttpd ou Nginx.
Et si on peut démontrer qu'il y a encore plus rapide, tant mieux.

Où est le mal à publier des informations qui font ce genre de démonstrations ?

Hors ligne

#8 Le 13/12/2012, à 09:12

tiramiseb

Re : Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ?

Au fait, concernant la superiorité de G-WAN, un benchmark a déjà été fait en ce sens :
http://loadstorm.com/2011/web-server-pe … benchmarks

Hors ligne

#9 Le 13/12/2012, à 09:18

J5012

Re : Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ?

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

Hors ligne

#10 Le 13/12/2012, à 09:37

tiramiseb

Re : Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ?

Dommage que les auteurs de G-WAN soient si farouchement opposés à l'Open Source.
... surtout s'ils ont repiqué du code de thttpd, c'est pas très fair-play.

Cela dit, J5012, où vois-tu ça ? Je ne le vois nulle part sur leur site ou dans l'archive téléchargée.


Par ailleurs, les cas d'utilisation de serveurs web sont tellement variés que G-WAN ne peut probablement pas être utilisé partout dans tous les cas.
Il me semble très peu configurable également (règles de réécriture ? authentification ? support du protocole webdav ?)

Ça semble bien pour du contenu statique et pour des scripts dans différents langages, mais... Comment je fais, moi, pour faire marcher G-WAN avec une appli en Flask et une authentification LDAP ?


En gros, il faut avoir des besoins simples et coder exclusivement pour G-WAN...


Je me permets de citer un commentaire sur Korben :
http://korben.info/g-wan-server-http.html

« c'est comme comparer une ferrari à un camion de pompier, la première va plus vite mais pour éteindre un incendie, c'est plutôt moyen »


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

Dernière modification par tiramiseb (Le 13/12/2012, à 09:49)

Hors ligne

#11 Le 13/12/2012, à 14:51

@null4ever

Re : Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ?

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.


Better to look like an idiot for a short time when asking something obvious for an expert than pretend to be smart all your life. (c) 2012 by Moi!
MB Asus Sabertooth 990SX CPU FX 8150 8 core@4.2 GhZ RAM: DDR3 32 Gb SSD Crucial 250 Gb (system) HD Samsung 3 Tb 7.200 RPM (data) GPU Saphire Radeon Dual Pro
Ubuntu 10.04.4 + 12.04.1 + Windows 7 + Windows 8 (all OSes 64 bit) !

Hors ligne

#12 Le 13/12/2012, à 14:55

@null4ever

Re : Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ?

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.

Dernière modification par xabilon (Le 13/12/2012, à 18:53)


Better to look like an idiot for a short time when asking something obvious for an expert than pretend to be smart all your life. (c) 2012 by Moi!
MB Asus Sabertooth 990SX CPU FX 8150 8 core@4.2 GhZ RAM: DDR3 32 Gb SSD Crucial 250 Gb (system) HD Samsung 3 Tb 7.200 RPM (data) GPU Saphire Radeon Dual Pro
Ubuntu 10.04.4 + 12.04.1 + Windows 7 + Windows 8 (all OSes 64 bit) !

Hors ligne

#13 Le 13/12/2012, à 15:00

tiramiseb

Re : Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ?

@null4ever: je trouve ta réaction envers J5012 particulièrement agressive, excessive et hors de propos.

Si J5012 fait une mauvaise affirmation, demande-lui de préciser ce qu'il dit plutôt que l'agresser comme ça...
Tu qualifies sa phrase de "diatribe verbeuse vraiment nauséabonde" ! Relis ce qu'il a écrit ! Relis ta réaction ! C'est complètement disproportionné !

Et ça ne contribue vraiment pas à l'appréciation de l'outil de ton ami, bien au contraire. De même que ses réactions à lui, que j'ai pu lire par ailleurs.

@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...

Hors ligne

#14 Le 13/12/2012, à 15:13

@null4ever

Re : Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ?

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.


Better to look like an idiot for a short time when asking something obvious for an expert than pretend to be smart all your life. (c) 2012 by Moi!
MB Asus Sabertooth 990SX CPU FX 8150 8 core@4.2 GhZ RAM: DDR3 32 Gb SSD Crucial 250 Gb (system) HD Samsung 3 Tb 7.200 RPM (data) GPU Saphire Radeon Dual Pro
Ubuntu 10.04.4 + 12.04.1 + Windows 7 + Windows 8 (all OSes 64 bit) !

Hors ligne

#15 Le 13/12/2012, à 15:17

tiramiseb

Re : Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ?

par ailleurs accessible à tous les membres de ce forum

Autant accessible que celle de J5012, par un lien "Envoyer un e-mail" sur la page de ton profil.

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

Je ne pense pas


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

Hors ligne

#16 Le 13/12/2012, à 16:51

@null4ever

Re : Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ?

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.

Dernière modification par @null4ever (Le 13/12/2012, à 17:32)


Better to look like an idiot for a short time when asking something obvious for an expert than pretend to be smart all your life. (c) 2012 by Moi!
MB Asus Sabertooth 990SX CPU FX 8150 8 core@4.2 GhZ RAM: DDR3 32 Gb SSD Crucial 250 Gb (system) HD Samsung 3 Tb 7.200 RPM (data) GPU Saphire Radeon Dual Pro
Ubuntu 10.04.4 + 12.04.1 + Windows 7 + Windows 8 (all OSes 64 bit) !

Hors ligne

#17 Le 13/12/2012, à 17:45

tiramiseb

Re : Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ?

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

Hors ligne

#18 Le 13/12/2012, à 17:58

@null4ever

Re : Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ?

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

Dernière modification par @null4ever (Le 13/12/2012, à 18:06)


Better to look like an idiot for a short time when asking something obvious for an expert than pretend to be smart all your life. (c) 2012 by Moi!
MB Asus Sabertooth 990SX CPU FX 8150 8 core@4.2 GhZ RAM: DDR3 32 Gb SSD Crucial 250 Gb (system) HD Samsung 3 Tb 7.200 RPM (data) GPU Saphire Radeon Dual Pro
Ubuntu 10.04.4 + 12.04.1 + Windows 7 + Windows 8 (all OSes 64 bit) !

Hors ligne

#19 Le 13/12/2012, à 18:07

tiramiseb

Re : Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ?

"un dénigrement qui porte préjudice"

« 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


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.

Désolé, pour ma part je ne maîtrise qu'Apache smile



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

Hors ligne

#20 Le 13/12/2012, à 18:25

@null4ever

Re : Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ?

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.

Dernière modification par @null4ever (Le 13/12/2012, à 18:29)


Better to look like an idiot for a short time when asking something obvious for an expert than pretend to be smart all your life. (c) 2012 by Moi!
MB Asus Sabertooth 990SX CPU FX 8150 8 core@4.2 GhZ RAM: DDR3 32 Gb SSD Crucial 250 Gb (system) HD Samsung 3 Tb 7.200 RPM (data) GPU Saphire Radeon Dual Pro
Ubuntu 10.04.4 + 12.04.1 + Windows 7 + Windows 8 (all OSes 64 bit) !

Hors ligne

#21 Le 13/12/2012, à 18:57

NooP

Re : Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ?

En fait, tu nous annonce 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 explique :

@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 [...]

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" [...]

Serais-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 ...

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 !

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 ...

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[...]

Dernière modification par NooP (Le 13/12/2012, à 20:16)


Votez Macron, vous l'aurez dans le fion !

Hors ligne

#22 Le 14/12/2012, à 03:25

@null4ever

Re : Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ?

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.

Dernière modification par @null4ever (Le 14/12/2012, à 17:28)


Better to look like an idiot for a short time when asking something obvious for an expert than pretend to be smart all your life. (c) 2012 by Moi!
MB Asus Sabertooth 990SX CPU FX 8150 8 core@4.2 GhZ RAM: DDR3 32 Gb SSD Crucial 250 Gb (system) HD Samsung 3 Tb 7.200 RPM (data) GPU Saphire Radeon Dual Pro
Ubuntu 10.04.4 + 12.04.1 + Windows 7 + Windows 8 (all OSes 64 bit) !

Hors ligne

#23 Le 14/12/2012, à 06:10

J5012

Re : Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ?

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 ...

Hors ligne

#24 Le 14/12/2012, à 17:26

@null4ever

Re : Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ?

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 ?

Dernière modification par @null4ever (Le 14/12/2012, à 17:35)


Better to look like an idiot for a short time when asking something obvious for an expert than pretend to be smart all your life. (c) 2012 by Moi!
MB Asus Sabertooth 990SX CPU FX 8150 8 core@4.2 GhZ RAM: DDR3 32 Gb SSD Crucial 250 Gb (system) HD Samsung 3 Tb 7.200 RPM (data) GPU Saphire Radeon Dual Pro
Ubuntu 10.04.4 + 12.04.1 + Windows 7 + Windows 8 (all OSes 64 bit) !

Hors ligne

#25 Le 15/12/2012, à 08:07

Pseudo supprimé

Re : Comment inhiber les logs d'Apache2, Cherokee, Lighttpd et Nginx ?

du buzz et du spam sur ce topic d'exécrable qualité.
aucun intérêt.