Archives de catégorie : Système

Administration et systèmes

Configuration Nginx php5-fpm pour symfony 2

Bonjour,

Voilà, je me suis pris la tête pour configurer correctement Symfony sur ma machine (ubuntu) pour faire tourner Symfony 2.

Je vais vous donner quelques astuces supplémentaires et quelques exemples de configuration.

Tout d’abord, on va commencer par php5-fpm (fastcgi). Symfony consomme de la mémoire, pas énormément en “prod” par contre en version de développement, ça bouffe pas mal surtout si on veut faire du debug. On va donc commencer par augmenter la quantité de mémoire allouée a FPM.

On va rechercher le fichier php.ini utilisé.

mathieu@mathieu:~/workspace/statis$ locate php.ini
/etc/php5/apache2/php.ini
/etc/php5/cli/php.ini
/etc/php5/fpm/php.ini
mathieu@mathieu:~/workspace/statis$

Dans le cas présent, je sais que j’utilise nginx donc pour l’exécution de PHP, j’utilise “fpm”, c’est donc le fichier que je vais modifier.

; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit = 1024M

Ici, j’ai fixé la limite de mémoire a 1024Mb, on pourrait aussi l’écrire 1G. Une fois ceci fait, on redémarre “fpm” :

root@mathieu:~/workspace/statis# service php5-fpm restart
 * Restarting PHP5 FastCGI Process Manager php5-fpm    [ OK ] 
root@mathieu:~/workspace/statis#

Symfony 2 utilise dans certains cas les entêtes Http pour retransmettre des informations de debug, notamment à l’attention de ChromePHP et FirePHP. Par défaut la transmission en environnement de “Dev” est active. Du coup, nginx sature et renvoie des erreurs 502 parce que les entêtes sont trop “gros”.

Je vous mets ici ma conf actuelle de nginx, que je commenterai par la suite :

server {
    listen 9999;
    server_name symfony2;
    root /home/mathieu/workspace/statis/web;
    error_log /var/log/nginx/statis.error.log warn;
    access_log /var/log/nginx/statis.access.log warn;
    rewrite ^/app\.php/?(.*)$ /$1 permanent;
    location / {
        index app.php;
        try_files $uri @rewriteapp;
    }
    location @rewriteapp {
        rewrite ^(.*)$ /app.php/$1 last;
    }
    location ~ ^/(app|app_dev|config)\.php(/|$) {
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO       $path_info;
                fastcgi_read_timeout 600;
                fastcgi_buffer_size   16k;
                fastcgi_buffers       4 16k;  # up to 4k + 128 * 4k
                fastcgi_max_temp_file_size 0;
                fastcgi_index index.php;
                include fastcgi_params;
                gzip off;

    }
}
  • Ligne 1 : on ouvre la configuration du serveur
  • Ligne 2 : on définit le port d’écoute. Ici il s’agit du 9999 mais plus généralement on utilise le port 80 spécifique au protocole http.
  • Ligne 3 : on définit le nom du serveur.
  • Ligne 4 : On définit le répertoire racine de l’application. Attention ici le “Webe est important pour symfony parce qu’il contient le système de boot de symfony.
  • Ligne 5 et 6: On définit les noms des fichiers de log nginx.
  • Ligne 7 : On réécrit l’url pour virer les noms app.php en environnement de production.
  • Ligne 8 à 11: on définit l’index de l’application et on stocke en mémoire.
  • Ligne 12 à 14 : on définit les règles de réécriture avec la variable précédemment enregistrée.
  • Ligne 15 à 26 : Parametres pour l’exécution de Fast-cgi : Je vais revenir dessus plus précisément ci-dessous.

Voilà un exemple de configuration Nginx pour le fonctionnement de Symfony 2, je vais maintenant reprendre la partie FPM pour corriger les problèmes d’entêtes trop importants

location ~ ^/(app|app_dev|config)\.php(/|$) {
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO       $path_info;
                fastcgi_read_timeout 600;
                fastcgi_buffer_size   16k;
                fastcgi_buffers       4 16k;  # up to 4k + 128 * 4k
                fastcgi_max_temp_file_size 0;
                fastcgi_index index.php;
                include fastcgi_params;
                gzip off;

    }

Ce qui nous intéresse ici ce sont les ligne 7 et 8, pour redéfinir les tailles des buffers. On les augmente avec les valeurs ci-dessus.

Ce sont les 2 astuces que j’ai repéré pour les configurations des serveurs pour faire fonctionner Symfony 2 avec nginx et phpfpm.

Git : installation d’un repository sur une hébergement mutualisé OVH – Partie 1 : Preparation du repository

Bonjour !

Hier je vous ai parlé de GIT, un système simple de “versioning”. Perso, j’ai certains projets de développement qui m’intéresserait de “versionné”. J’avais essayer Subversion sur un hébergement mutualisé mais comme cela nécessite de pouvoir installer les éléments propres à subversion … j’ai abandonné.

Du coup, après m’être intéressé à git j’ai voulu tenter l’expérience. Après quelques recherches je suis tombé sur plusieurs tutoriel qui expliquait comment le faire. Ceci dit, ces tutoriels n’était à mon gout pas assez clair et documenter. Je ne prétends pas faire mieux mais je vais quand même essayer.

Aujourd’hui, on va donc créer le repository principal de git.

  1. On va donc créer un dossier git dans le répertoire racine pour ne pas interferer avec notre site en lui même.
    mkdir git
  2. Notre répertoire de repository est créé, on va maintenant créer le repository proprement dit en commençant par le répertoire où il sera stocké.
    mkdir monrepo.git
  3. Une fois ce répertoire créé, on va dedans et on initialise la base de données git
    ~/$cd ~/git/monrepo.git
    ~/test.git$ git init-db
    Initialized empty Git repository in ~/test.git/.git/~/test.git$
  4. On as initialisé le repository git. on va maintenant le configurer une petit peu. Il existe quelques instructions a définir: “user.name” qui permet de définir le nom du codeur, “user.email”, qui se passe de commentaire, “color.ui”  permet de faire de la colorisation syntaxique, et enfin “help.autocorrect” qui permet d’executer directement la commande si une seule commande est  trouvée par git.

Bon ben voila le repository de Git est en place. Il ne reste plus qu’à l’utiliser

Git ou le versioning simple !

Bonjour,

On est tous, nous developpeur, à la merci de modifier un fichier et de tout planter ! Seulement voila, après on perd des heures a tout remettre comme avant.

Il existe une solution, je ne dirai pas la solution car en fait il y en as plusieurs :

  • dupliquer son code et faire des sauvegarde a outrance : pratique si on dispose de centaines de GigaOctets à sacrifier …. mouais en fait non …
  • Priez saint linus, patron des codeurs ….. euh les miracles ca existe …mouais en fait non….
  • Utilisez un système de “versioning” qui permet de revenir à tout instant a une version antérieure de notre code …. mouais ….. euh en fait …. OUI !!!!! C’est exactement ce dont j’ai besoin !

Du coup, on appel un ami (google en l’occurence) et on commence à potasser. Plusieurs système existent avec chacun des avantages et des défauts :

  • CVS “l’ancêtre” , fut le premier systeme de versioning à être utiliser.
  • Subversion “l’institution”, successeur de CVS, il permet de gérer les répertoires et dispose de nombreux plugins/applications pour l’intégrer dans vos IDE.
  • Mercurial : nouveau venu sur lequel j’ai de bons échos mais que je n’ai personnellement pas testé.
  • Git : Encore un “nouveau” mais qui fait ses preuves de plus en plus. Il l’avantage contrairement a subversion de pouvoir fonctionner en mode “hors-ligne”.

C’est donc de Git que je vais vous parler un peu plus avant. Avant avec subversion, je n’avais rien compris aux branches etc … avec Git, j’ai tout compris !

Grosso modo, git c’est bien, c’est bon mangez-en !!

Je vous ferai un petit topo sur une install Git  et votre premier dépot !

Mais là, faut encore que je le découvre un peu plus, ceci dit c’est très très prometteur !

Traiter / Parser un mail lors de son arrivée

Bonjour,

On est souvent confronté a un problème qui peut sembler simple sur le papier mais qui en réalité est un peu plus complexe.

Le principe est d’écouter le dossier “mailbox” et sur les évènements executer un traitement. On va pour cela utiliser la commande “inotifywait”.

Tout d’abord installer inotifywait sur le serveur avec la commande suivante :

SERVER:~$ sudo apt-get install inotify-tools
sudo: unable to resolve host mathieu-ubuntu
[sudo] password for mathieu:
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances
Lecture des informations d'état... Fait
Les paquets supplémentaires suivants seront installés :
libinotifytools0
Les NOUVEAUX paquets suivants seront installés :
inotify-tools libinotifytools0
0 mis à jour, 2 nouvellement installés, 0 à enlever et 3 non mis à jour.
Il est nécessaire de prendre 48,1 ko dans les archives.
Après cette opération, 201 ko d'espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer [O/n] ? O
Réception de : 1 http://fr.archive.ubuntu.com/ubuntu/ oneiric/universe libinotifytools0 i386 3.13-3 [21,2 kB]
Réception de : 2 http://fr.archive.ubuntu.com/ubuntu/ oneiric/universe inotify-tools i386 3.13-3 [26,9 kB]
48,1 ko réceptionnés en 0s (113 ko/s)
Sélection du paquet libinotifytools0 précédemment désélectionné.
(Lecture de la base de données... 481663 fichiers et répertoires déjà installés.)
Dépaquetage de libinotifytools0 (à partir de .../libinotifytools0_3.13-3_i386.deb) ...
Sélection du paquet inotify-tools précédemment désélectionné.
Dépaquetage de inotify-tools (à partir de .../inotify-tools_3.13-3_i386.deb) ...
Traitement des actions différées (« triggers ») pour « man-db »...
Paramétrage de libinotifytools0 (3.13-3) ...
Paramétrage de inotify-tools (3.13-3) ...
Traitement des actions différées (« triggers ») pour « libc-bin »...
ldconfig deferred processing now taking place
SERVER:~$

Ok “inotify-tools” est installé, on peut maintenant parcourir l’aide de ce petit outils avec la commande  “inotifywait –help” :

SERVER:~$ inotifywait --help
inotifywait 3.13
Wait for a particular event on a file or set of files.
Usage: inotifywait [ options ] file1 [ file2 ] [ file3 ] [ ... ]
Options:
-h|--help Show this help text.
@<file> Exclude the specified file from being watched.
--exclude <pattern>
Exclude all events on files matching the
extended regular expression <pattern>.
--excludei <pattern>
Like --exclude but case insensitive.
-m|--monitor Keep listening for events forever. Without
this option, inotifywait will exit after one
event is received.
-r|--recursive Watch directories recursively.
--fromfile <file>
Read files to watch from <file> or `-' for stdin.
-q|--quiet Print less (only print events).
-qq Print nothing (not even events).
--format <fmt> Print using a specified printf-like format
string; read the man page for more details.
--timefmt <fmt> strftime-compatible format string for use with
%T in --format string.
-c|--csv Print events in CSV format.
-t|--timeout <seconds>
When listening for a single event, time out after
waiting for an event for <seconds> seconds.
If <seconds> is 0, inotifywait will never time out.
-e|--event <event1> [ -e|--event <event2> ... ]
Listen for specific event(s). If omitted, all events are
listened for.Exit status:
0 - An event you asked to watch for was received.
1 - An event you did not ask to watch for was received
(usually delete_self or unmount), or some error occurred.
2 - The --timeout option was given and no events occurred
in the specified interval of time.Events:
access file or directory contents were read
modify file or directory contents were written
attrib file or directory attributes changed
close_write file or directory closed, after being opened in
writeable mode
close_nowrite file or directory closed, after being opened in
read-only mode
close file or directory closed, regardless of read/write mode
open file or directory opened
moved_to file or directory moved to watched directory
moved_from file or directory moved from watched directory
move file or directory moved to or from watched directory
create file or directory created within watched directory
delete file or directory deleted within watched directory
delete_self file or directory was deleted
unmount file system containing file or directory unmounted
SERVER:~$

On remarque plusieurs options intéressantes notamment l’option ” -e” qui permet de spécifier des evenements d’ecoute. Une commande du type “inotifywait -e create” va écouter les evenement de type “Création de fichier”. On trouve aussi l’option “-m” qui permet a inotify de ne pas s’arreter apres le premier evenement détecté. il existe aussi l’option “-c” qui permet de recupérer l’evenement sous un format CSV.

On va donc utiliser toutes ses options pour détecter les evenements qui nous intéresseavec la commande suivante :

SERVER:~#inotifywait -cm -e create /home/vpopmail/domains/domain.com/journal/Maildir/new/ | php parseMail.php

Cette commande permet de détecter les evenements de création de fichier dans le dossier mailbox du domaine domain.com . On execute à la suite de cet évènements la commande #php parseMail.php qui va traiter le mail recu.

 

Installation subversion Etape 2

Salut !!

Petit post pour finir l’install de subversion sur Gentoo en tant que module APACHE (merci dav 🙂 )

Je vous donnes mes fichiers de configuration.

Fichier ‘/etc/apache2/modules.d/47_mod_dav_svn’  :

<IfDefine SVN>
      <IfModule !mod_dav_svn.c>
              LoadModule dav_svn_module      modules/mod_dav_svn.so
      </IfModule>
      <Location /repos>
              DAV svn
              SVNPath /var/svn/repos
              AuthType Basic
              AuthName "Subversion repository"
              AuthUserFile /var/svn/mon_repository/conf/svnusers
              Require valid-user
      </Location>
      <IfDefine SVN_AUTHZ>
              <IfModule !mod_authz_svn.c>
                      LoadModule authz_svn_module    modules/mod_authz_svn.so
              </IfModule>
      </IfDefine>
</IfDefine>

Dans mon /httpd.conf

Verifier les lignes suivantes :

Code:

LoadModule dav_svn_module modules/mod_dav_svn.so 
LoadModule authz_svn_module modules/mod_authz_svn.so

<Location /svn>

      DAV svn
      SVNPath /home/ton_login/svn
      AuthType basic
      AuthName "SVN : TON SITE"
      AuthUserFile /home/ton_login/.htpasswd
      #AuthzSVNAccessFile /home/ton_login/svn.authz
      AuthzSVNAccessFile /home/ton_login/.authz
      <Limitexcept>
              Require valid-user
      </LimitExcept>
</Location>

Et voila si ca peut finir de vous aider