Curl: Tester le temps de réponse d’une page

Curl possède une option qui permet d’afficher le temps total passé à récupérer une url via l’option « -w » qui permet d’indiquer à curl d’afficher un certain nombre d’informations.

Exemple pour afficher le temps total d’une requête :

curl -s-o /dev/null -w "%{time_total}\n" http://fr.charles.lescampeurs.org
0,169
  • -s permet de ne pas afficher la barre de progression et les messages d’erreur
  • -o /dev/null redirige le contenu de la requête vers un trou noir
  • enfin -w « %{time_total}\n » est l’information que l’on veut afficher

Le temps d’exécution est affiché en secondes et milli-secondes.

D’autres options intéressantes sont disponibles comme le temps de connection ou le temps pour recevoir le 1er octet.

curl -s -o /dev/null -w "Connect: %{time_connect} TTFB: %{time_starttransfer} Total time: %{time_total}\n" http://fr.charles.lescampeurs.org
######################################################################## 100.0%
Connect: 0,004 TTFB: 0,171 Total time: 0,171

Apache : interdire l’accès à un fichier avec mod_rewrite

Il existe un flag «F» lors de la définition d’une règle de réécriture permettant d’envoyer un code de réponse HTTP 403 (accès interdit).

Pour interdire l’accès à un fichier en particulier, on écrira alors

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^fichier.ext$ - [F,L]
</IfModule>

Pour interdire l’accès à un groupe de fichier, on pourra écrire :

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule .*\.sql$ - [F,L]
</IfModule>

Git: initialiser un dépôt avec un projet existant

Parce que l’on a tous des projets existants qui ne font pas partis d’un dépôt et que vous voulez organiser ça proprement.

Sachant que vous avez initialisé votre projet sur le serveur git, voici la procédure à suivre :

 

$ cd /var/www/projet

$ git init
Dépôt Git existant réinitialisé dans /var/www/projet/.git/

$ git add .

$ git commit -m 'Initial commit'

$ git remote add origin git@github.com:compte/projet.git

$ git push -u origin master

Counting objects: 1541, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (1513/1513), done.
Writing objects: 100% (1541/1541), 8.80 MiB | 5.20 MiB/s, done.
Total 1541 (delta 128), reused 0 (delta 0)
To git@github.com:compte/projet.git
* [new branch] master -> master
La branche master est paramétrée pour suivre la branche distante master depuis origin.

Vous pouvez maintenant utiliser normalement votre dépôt avec git pull / git push.

$ git pull
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
Depuis github.com:compte/projet
   500c171..c69856b  master     -> origin/master
Mise à jour 500c171..c69856b
Fast-forward
 README.md | 2 ++
 1 file changed, 2 insertions(+)
$ vim README.md

$ git add README.md

$ git commit -m "update README.md"
[master 9ea5202] update README.md
 1 file changed, 3 insertions(+)

$ git push
Counting objects: 5, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 320 bytes | 0 bytes/s, done.
Total 3 (delta 2), reused 0 (delta 0)
To git@github.com:compte/projet.git
   c69856b..9ea5202  master -> master

Apache : loguer le temps pour servir une requête

Pour l’optimisation d’un site et son analyse, il peut être intéressant de savoir combien de temps Apache  met pour servir une requête.

C’est possible via le module mod_log_config et ses options de format de la directive LogFormat :

  • %T : le temps pour servir la requête en secondes
  • %D : le temps pour servir la requête en microsecondes

 

Exemple de configuration d’un domaine :

<VirtualHost *:8080>
    DocumentRoot /var/www/domain.com

    <Directory /var/www/domain.com>
        Options FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
    </Directory>

    ServerName domain.com

    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %T/%D" vhost
    CustomLog /var/log/apache2/domain.com/access.log vhost
    ErrorLog /var/log/apache2/domain.com/error.log
</VirtualHost>

Dans cet exemple, on ajoute le temps en secondes et en microsecondes à la fin d’un format classique.

Pour faire quelques tests, j’ai créé le fichier php suivant :

<?php
$us = rand(1, 999999);
usleep($us);
echo "slept for $us microseconds";

 

Exemple des logs générés :

127.0.0.1 - - [14/Aug/2015:17:26:41 +0200] "GET /slow.php HTTP/1.0" 200 29 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.107 Safari/537.36" 0/875640
127.0.0.1 - - [14/Aug/2015:17:26:46 +0200] "GET /slow.php HTTP/1.0" 200 29 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.107 Safari/537.36" 0/176823

Le temps en microsecondes affiché dans la page de test correspond bien au temps fourni par apache.

 

Varnish : tester la configuration avant reload

Pour éviter un downtime lors d’une modification de configuration il faut utiliser le flag -C 

Exemple avec une configuration cassée :

$ /usr/local/sbin/varnishd -C -f /usr/local/etc/varnish/default.vcl
Message from VCC-compiler:
Expected ';' got 'unset'
(program line 174), at
('input' Line 75 Pos 9)
 unset req.http.cookie;
--------#####-----------------
Running VCC-compiler failed, exit 1
VCL compilation failed

Lorsque la configuration est correcte, elle est alors affichée en langage C.

 

Symfony : profiler et debugger introuvables (404 Not Found)

Sur une nouvelle installation, il arrive que la route pour appeler le profiler soit introuvable.

La première chose à vérifier est la configuration Apache. Il faut que la directive AcceptPathInfo soit active. Par exemple, dans une balise <Directory> :

<VirtualHost *:8080>
    DocumentRoot "/var/www/symfony/web"
    ServerName www.acme.com

    <Directory /var/www/750g/web>
        AcceptPathInfo On
    </Directory>
<VirtualHost>

La seconde chose est de vérifier si mod_rewrite est bien activé si vous utilisez une réécriture pour cache app_dev.php ou app.php des urls.

 

Linux: changer la locale (langue) par défaut

Cet article décrit comment la langue par défaut d’un système Linux peut-être configurée ou re-configurée.
Les commandes suivantes ont été testées sur Debian et Ubuntu.

La locale par défaut du sytème est configurée dans /etc/default/locale

$ cat /etc/default/locale
# File generated by update-locale
LANG="fr_FR.UTF-8"

Vous pouvez voir les variables d’environnement actuelles en tapant la commande suivante :

$ locale
LANG=fr_FR.UTF-8
LANGUAGE=
LC_CTYPE="fr_FR.UTF-8"
LC_NUMERIC="fr_FR.UTF-8"
LC_TIME="fr_FR.UTF-8"
LC_COLLATE="fr_FR.UTF-8"
LC_MONETARY="fr_FR.UTF-8"
LC_MESSAGES="fr_FR.UTF-8"
LC_PAPER="fr_FR.UTF-8"
LC_NAME="fr_FR.UTF-8"
LC_ADDRESS="fr_FR.UTF-8"
LC_TELEPHONE="fr_FR.UTF-8"
LC_MEASUREMENT="fr_FR.UTF-8"
LC_IDENTIFICATION="fr_FR.UTF-8"
LC_ALL=

 

Pour la changer, il faut utiliser dpkg-reconfigure locales qui permet de configurer les locales disponibles sur le système ainsi que la locale par défaut.

Une fois reconfigurées, le nouveau fichier locale :

# File generated by update-locale
LANG=en_US.UTF-8
LC_ALL="C"

Pour vérifier la locale dans votre session courante :

$ echo $LANG
en_US.UTF-8

 

$ locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

Vim: désactiver l’indentation automatique quand on colle

Je viens de trouver une commande très pratique par annuler l’auto-indentation lorsqu’on colle du code dans un fichier.

Il y a un mode spécial « collage ». Pour l’activer :

:set paste

Notez que lorsque vous êtes maintenant en mode édition, le message suivante apparaît :

-- INSERTION (collage) --

Pour désactiver l’option :

:set nopaste

 

Ruby : installer des gems pour l’utilisateur courant

Il est parfois utile d’ajouter des gems spécifiques pour l’utilisateur courant, soit parce que vous n’avez pas les droits administrateur, soit parce que vous avez besoin d’une version précise.

Pour cela il faut utiliser l’option –user-install :

$ gem install capistrano -v "=2.15.5" --user-install

Les gems seront installées dans votre répertoire $HOME dans le sous-répertoire .gem/ruby/x_y_z 

Si des « binaires » sont associés à la gem, ils seront dans le répertoire .gem/ruby/x_y_z/bin

Pour pouvoir les utiliser, il faut rajouter ce chemin dans votre $PATH. Par exemple dans votre .bashrc :

if which ruby >/dev/null && which gem >/dev/null; then
    PATH="$(ruby -rubygems -e 'puts Gem.user_dir')/bin:$PATH"
fi

Exemple pour capistrano :

$ which cap
/var/www/.gem/ruby/1.9.1/bin/cap

 

Git : Utiliser une clé ssh spécifique

Lorsque l’on travaille avec Github, on ne peut pas ajouter la même clé ssh sur plusieurs dépôts. Il faut alors générer plusieurs clés et indiquer à git en ligne de commande quelle clé utiliser pour l’opération.

Disons que votre clé liée à votre dépôt se trouve dans .ssh/id_dsa_github_deploy 

Configurer alors ssh de la manière suivante dans .ssh/config :

Host gitops
Hostname github.com
User git
IdentityFile ~/.ssh/id_dsa_github_deploy
IdentitiesOnly yes

Alors qu’habituellement vous utilisez la commande suivante pour cloner votre dépôt :

$ git clone git@github.com:acme/ops.git

Maintenant, utilisez la commande suivante :

git clone gitops:acme/ops.git