Apache2, PHP-FPM, FastCGI et APC cache d’Opcode

Il existe plusieurs façons d’installer PHP sur une machine. En fonction du but recherché, on pourra passer d’une installation très simple comme l’installation en module d’Apache, à une installation plus complexe si l’on souhaite contrôler les processus PHP par utilisateur, par hôte virtuel, le tout sur un serveur Web Multi-threadé. Voyons comment réaliser cette tâche avec PHP-FPM.

La dernière version de PHP, la 5.3.3 inclus nativement FPM. Autrefois appliqué comme patch à PHP, le gestionnaire de processus Fastcgi « FPM » apporte aussi quelques améliorations à PHP Cgi. Pour le tutoriel, l’installation va se dérouler sur une Debian 5 (lenny), 6 (squeeze) ou 7 (wheezy). Le paquet PHP5-FPM nous est fourni par le dépôt de sources Dotdeb (non nécessaire sous Debian 7 Wheezy).

Note de révision du 4 septembre 2010 : l’utilisation de wrapper suEXEC pour attribuer un « utilisateur / groupe » par hôte virtuel n’est pas justifiée. PHP-FPM joue ce rôle.
Note de révision du 6 octobre 2010 : correctifs de quelques typos. Contenus remaniés.
Note de révision du 10 février 2011 : correctifs de la configuration de fast-cgi et du vhost, directives inutiles supprimées.
Note de révision du 20 mars 2011 : installation fonctionnelle sous Debian 6 (Squeeze)
Note de révision du 18 avril 2011 : correctifs pour compatibilité avec la dernière version du package Dotdeb de PHP-FPM (5.3.6).
Note de révision du 03 juillet 2011 : ajout du réglage du timeout FastCGI.
Note de révision du 03 mars 2012 : installation compatible avec PHP 5.4
Note de révision du 27 mars 2013 : note à propos de la directive « upload_tmp_dir »
Note de révision du 04 mai 2013 : installation sous Debian 7 Wheezy

1. Apache 2 Multi-threadé

Nous choisissons d’installer Apache en MPM Worker. Pour une installation de PHP en module d’Apache, il est clairement déconseillé d’utiliser ce MPM. D’autres MPM (multi-processing module) existent, si vous voulez en savoir plus, vous pouvez consulter une série de billets portant sur l’installation sécurisée de PHP dans laquelle Stuart Herbert en teste quelques-uns.

Installer Apache2 sur Debian en invoquant simplement la commande :

aptitude install apache2 apache2-mpm-worker

2. le module FastCGI

Nous avons maintenant besoin d’installer le module « FastCGI » d’Apache. En effet, contrairement à « FCGID » (gestionnaire de processus plus moderne et souvent associé à l’installation de PHP en CGI), « FastCGI » fourni la directive permettant de préciser un gestionnaire externe de processus CGI, dans notre cas PHP5-FPM. « libapache2-mod-fastcgi » est un paquet de la section « non-free » (paquets qui ne respectent pas les DFSG). Vos sources de paquets doivent comprendre cette section pour pouvoir installer le module FastCGI.

# Sources sous Debian wheezy
deb http://ftp.fr.debian.org/debian/ wheezy main contrib non-free
deb-src http://ftp.fr.debian.org/debian/ wheezy main contrib non-free

deb http://security.debian.org/ wheezy/updates main contrib non-free
deb-src http://security.debian.org/ wheezy/updates main contrib non-free

Installez le module,

aptitude install libapache2-mod-fastcgi

Modifions le fichier de configuration du module « fastgci » d’Apache

nano /etc/apache2/mods-available/fastcgi.conf
<IfModule mod_fastcgi.c>
  AddHandler php5-fcgi .php
  Action php5-fcgi /cgi-bin/php5.external
  <Location "/cgi-bin/php5.external">
    Order Deny,Allow
    Deny from All
    Allow from env=REDIRECT_STATUS
  </Location>
</IfModule>

Activons les modules « fastcgi » et « actions » (utilisé dans le fichier de configuration de FastCGI).

a2enmod fastcgi actions

3. Installation PHP5-FPM

Comme précisé en début de billet, PHP5-FPM est fourni par le dépôt Dotdeb (non nécessaire sous Debian 7 Wheezy). PHP5-FPM, c’est à la fois PHP5 et un gestionnaire de processus FastCGI. Une fois Dotdeb ajouté à vos sources, l’installation s’effectue simplement :

aptitude install php5-fpm

Vous pouvez compléter l’installation de PHP5 en ajoutant diverses librairies dont le gestionnaire de cache d’Opcode APC :

aptitude install php5-mysql php5-mcrypt php5-curl php5-gd php5-xsl php5-xmlrpc php5-apc

Les fichiers de configuration sont situés dans :

/etc/php5/fpm/

Depuis la version 5.3.6 du package Dotdeb, vous n’avez plus à modifier le fichier de configuration de PHP5-FPM afin de pouvoir définir la configuration des pools de processus PHP en dehors de ce fichier (la directive d’inclusion des définitions de « pool » est faite en fin de fichier) :

nano /etc/php5/fpm/php-fpm.conf
;;;;;;;;;;;;;;;;;;;;;
; FPM Configuration ;
;;;;;;;;;;;;;;;;;;;;;

; All relative paths in this configuration file are relative to PHP's install
; prefix (/usr). This prefix can be dynamicaly changed by using the
; '-p' argument from the command line.

; Include one or more files. If glob(3) exists, it is used to include a bunch of
; files from a glob(3) pattern. This directive can be used everywhere in the
; file.
; Relative path can also be used. They will be prefixed by:
;  - the global prefix if it's been set (-p arguement)
;  - /usr otherwise
;include=/etc/php5/fpm/*.conf

;;;;;;;;;;;;;;;;;;
; Global Options ;
;;;;;;;;;;;;;;;;;;

[global]
; Pid file
; Note: the default prefix is /var
; Default Value: none
pid = /var/run/php5-fpm.pid

; Error log file
; Note: the default prefix is /var
; Default Value: log/php-fpm.log
error_log = /var/log/php5-fpm.log

; Log level
; Possible Values: alert, error, warning, notice, debug
; Default Value: notice
;log_level = notice

; If this number of child processes exit with SIGSEGV or SIGBUS within the time
; interval set by emergency_restart_interval then FPM will restart. A value
; of '0' means 'Off'.
; Default Value: 0
;emergency_restart_threshold = 0

; Interval of time used by emergency_restart_interval to determine when
; a graceful restart will be initiated.  This can be useful to work around
; accidental corruptions in an accelerator's shared memory.
; Available Units: s(econds), m(inutes), h(ours), or d(ays)
; Default Unit: seconds
; Default Value: 0
;emergency_restart_interval = 0

; Time limit for child processes to wait for a reaction on signals from master.
; Available units: s(econds), m(inutes), h(ours), or d(ays)
; Default Unit: seconds
; Default Value: 0
;process_control_timeout = 0

; Send FPM to background. Set to 'no' to keep FPM in foreground for debugging.
; Default Value: yes
;daemonize = yes

;;;;;;;;;;;;;;;;;;;;
; Pool Definitions ;
;;;;;;;;;;;;;;;;;;;;

; Multiple pools of child processes may be started with different listening
; ports and different management options.  The name of the pool will be
; used in logs and stats. There is no limitation on the number of pools which
; FPM can handle. Your system will tell you anyway :)

; To configure the pools it is recommended to have one .conf file per
; pool in the following directory:
include=/etc/php5/fpm/pool.d/*.conf

Le répertoire des définitions des pools de processus PHP est automatiquement créé :

cd /etc/php5/fpm/pool.d/

Par défaut, un exemple de pool est fourni, vous pouvez le renommer et le garder comme exemple.

mv www.conf www.conf.dist

Créez un fichier de définition de pool de processus PHP :

nano /etc/php5/fpm/pool.d/first.conf
; Nom du pool
[firstweb]
; On utilisera une socket
listen = /home/www/.socks/firstweb.sock

; Permission pour la socket
listen.owner = firstweb
listen.group = webgroup
listen.mode = 0666

; Utilsateur/Groupe des processus
user = firstweb
group = webgroup

; On choisira une gestion dynamique des processus
pm = dynamic

pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10

slowlog = /var/log/php5-fpm.firstweb.log.slow

; Quelques directives de configuration de PHP
; Si vous activez "open_basedir", "upload_tmp_dir" doit être un répertoire enfant.
php_admin_value[open_basedir]=/home/www/firstweb/public_html
php_admin_value[session.save_path]=/home/www/firstweb/tmp
php_admin_value[upload_tmp_dir]=/home/www/firstweb/public_html/tmp

Créez le répertoire des sockets :

mkdir -p /home/www/.socks

4. Définition de l’hôte virtuel

nano /etc/apache2/sites-available/firstweb
<VirtualHost *:80>
        ServerName firstweb.example.com
        ServerAdmin     firstweb@example.com
        DocumentRoot /home/www/firstweb/public_html
        Options None

        # Fast CGI + FPM
        FastCgiExternalServer /home/www/firstweb/cgi-bin/php5.external -socket /home/www/.socks/firstweb.sock
        Alias /cgi-bin/ /home/www/firstweb/cgi-bin/

        <Directory /home/www/firstweb/public_html>
                Options SymLinksIfOwnerMatch
                AllowOverride All
                Order allow,deny
                Allow from all
        </Directory>

        # Log
        ErrorLog /var/log/apache2/error-firstweb.log
        LogLevel warn
        CustomLog /var/log/apache2/access-firstweb.log combined
</VirtualHost>

Par défaut, le timeout FastCGI est de 30 secondes, si vous souhaitez modifier cette valeur, il suffit de modifier la ligne suivante du vhost et ajouter l’argument -idle-timeout suivi de la valeur du timeout en secondes. Vous pouvez donc préciser cette valeur indépendamment pour chaque vhost.

FastCgiExternalServer /home/www/firstweb/cgi-bin/php5.external -socket /home/www/.socks/firstweb.sock -idle-timeout 60

Le fichier « /home/www/first/cgi-bin/php5.external » précisé par la directive « FastCgiExternalServer » n’a pas besoin d’exister.
Activez cet hôte virtuel :

a2ensite firstweb

Créez le groupe et l’utilisateur web :

groupadd webgroup
useradd -b /home/www -g webgroup  -s /bin/false firstweb

Passez à la création de l’espace « Web » correspondant à la définition de l’hôte virtuel. Pour l’exemple, sa structure est la suivante :

mkdir -p /home/www/firstweb/public_html
mkdir -p /home/www/firstweb/cgi-bin
mkdir -p /home/www/firstweb/tmp

Le répertoire parent « firstweb » appartient à « root:root », les répertoires enfants à « firstweb:webgroup ».

Rechargez Apache, démarrez PHP5-FPM

/etc/init.d/apache2 reload
/etc/init.d/php5-fpm start

Un phpinfo() au niveau de cet hôte virtuel devrait vous donner les informations similaires à :

Sur une Debian Squeeze fraîchement installée :

Avec PHP 5.4 :

Sous Debian 7 Wheezy :

php5.4.4-dotdeb-wheezy

5. Côté cache d’opcode

Avec ce type d’installation, la gestion du cache d’Opcode fonctionne correctement mais il faut garder à l’esprit que le cache est partagé entre tous les hôtes virtuels. La totalité du cache peut donc être effacée à partir de n’importe quel hôte. C’est exactement la même chose avec une installation en module d’Apache (mod_php).

Une autre solution permet d’avoir du cache par utilisateur, en utilisant FastCGI + PHP CGI. Cependant, il faut jouer avec le nombre de processus parent / enfants, car les processus parents ne partagent pas leur cache. Avec FCGID, le problème est similaire sauf qu’on ne peut pas limiter le nombre de processus parent à 1, les performances deviennent alors désastreuses. FCGID et FastCGI ne traitent pas les requêtes PHP de la même manière, voir les remarques sur Fcgid avec PHP CGI :

Special PHP considerations
[...]
The popular APC opcode cache for PHP cannot share a cache between PHP FastCGI processes unless PHP manages the child processes. Thus, the effectiveness of the cache is limited with mod_fcgid; concurrent PHP requests will use different opcode caches.

Le temps me manque pour effectuer des tests de ces différentes configurations avec la problèmatique de cache d’Opcode. En tout cas, n’hésitez pas à me faire part de vos remarques.

88 réponse à Apache2, PHP-FPM, FastCGI et APC cache d’Opcode

  1. Pingback: Apache + SuExec + php-fpm - how to set them up? - Just just easy answers

  2. Pingback: Apache 2.2 on Debian Wheezy w/ PHP-FPM, FastCGI, APC and a kind of suEXEC | Hödlmosers' Hard- and SoftwareCuisine

  3. le juin 12, 2013 à 2:40 , John dit:

    Merci pour ce tuto qui fonctionne parfaitement sur Debian 7 avec php-fpm 5.4.4. installé sur plusieurs serveur en multihost

    mais impossible de pouvoir installer sur Debian 7 la version 5.3.26 de Squeeze (d’après les Dotdeb) en adaptant pour php-fpm ce tuto pour php5-cgi

    http://blog.cheramy.name/2013/06/03/php-5-3-sur-debian-wheezy/

    # aptitude install php5-fpm=5.3.26-1~dotdeb.0
    Les NOUVEAUX paquets suivants vont être installés :
    php5-fpm{b}
    0 paquets mis à jour, 1 nouvellement installés, 0 à enlever et 0 non mis à jour.
    Il est nécessaire de télécharger 3 258 ko d’archives. Après dépaquetage, 9 115 ko seront utilisés.
    Les paquets suivants ont des dépendances non satisfaites :
    php5-fpm : Dépend: libdb4.8 qui est un paquet virtuel
    Dépend: libonig2 (>= 5.2.0) mais il ne sera pas installé.
    Dépend: libqdbm14 (>= 1.8.74) mais il ne sera pas installé.
    Dépend: libssl0.9.8 (>= 0.9.8m-1) qui est un paquet virtuel
    Dépend: php5-common (= 5.3.26-1~dotdeb.0) mais il ne sera pas installé.
    Les actions suivantes permettront de résoudre ces dépendances :
    Conserver les paquets suivants dans leur version actuelle :
    1) php5-fpm [Non installé]
    Accepter cette solution ? [Y/n/q/?] n
    Les actions suivantes permettront de résoudre ces dépendances :
    Installer les paquets suivants :
    1) libonig2 [5.9.1-1 (stable)]
    2) libqdbm14 [1.8.78-2 (stable)]
    3) php5-common [5.4.4-14 (stable)]
    4) php5-fpm [5.4.4-14 (stable)]
    5) psmisc [22.19-1+deb7u1 (stable)]
    Accepter cette solution ? [Y/n/q/?] q

    Quelqu’un a déjà essayé cette manipulation ?

    • le juin 19, 2013 à 11:06 , Fabien dit:

      Salut,

      Je n’ai pas essayé ce type d’installation, tu peux toujours installer une Debian 6, c’est plus simple. Maintenant, la Debian 6, tout comme php 5.3 ne seront plus maintenus très longtemps.

      Fabien

  4. le juin 4, 2013 à 7:56 , Nicolas dit:

    Bonjour, très bon tuto.
    Par contre j’ai peut-être raté quelque chose, lorsqu’un utilisateur tape url.fr/cgi-bin il tombe sur une page Forbidden, n’y a t-il pas un autre moyen de bloquer l’accès à ce dossier ?

    • le juin 19, 2013 à 11:04 , Fabien dit:

      Salut,
      Je ne me suis pas posé la question, là je ne vois pas.
      Fabien

  5. le mars 17, 2013 à 6:28 , m3adow dit:

    Hi, thanks for this guide. I never used PHP5-FPM and this really helped me.

    I got one question: Isn’t the basedir inside the html-subfolder a bit too restrictive? As far as I understand this way the php_upload_tmp_dir can’t be accessed. I experienced this while testing tiny tiny rss.

    • le mars 27, 2013 à 3:22 , Fabien dit:

      Hi,

      You’ve right, PHP upload_tmp_dir can’t be outside open_basedir if enabled. Thanks for you’re feedback.

      Fabien

  6. Pingback: comment booster les performances de wordpress

  7. le octobre 17, 2012 à 10:52 , valentin ciopei dit:

    bonjour, c’est un très bon guide

  8. le octobre 2, 2012 à 3:32 , leshcat dit:

    Thank you very much for your explicit explanation.

    Yeah, i thought so. Yes, i know of open_basedir capabilities.

    Its just feels bit insecure.

    Anyway, nice setup, nice manual, thank you once again.

    • le octobre 2, 2012 à 6:14 , Fabien dit:

      Thx, you’re welcome ;-)

  9. le octobre 2, 2012 à 12:22 , leshcat dit:

    That’s part of the problem. :)

    Once again, for example, simple setup of apache with mpm-itk – 640/750 – here we go, fully isolated user folder, none of scripts of other users will execute inside that folder :)

    With this setup, potentially if i got mistaken i will upload any php file to user folder with totally different user:group than that folder – and it will execute. I’ve been playing with rights and ownerships, 640 does do the job, unfortunately but not all scripts function properly with such rights even if have proper user:group ownership.

    • le octobre 2, 2012 à 10:21 , Fabien dit:

      Hi,

      I’m not an expert of security, but I think that all points of security can’t be ensured only by apache and/or php-fpm.

      - So, make ensure that files uploaded by user1 can only owned by user1:user1. But in fact, even if some files have a different user, what the problem ? If user1 (through php-fpm, under user1 rights) can read it, the script will be interpreted, but what is the consequence ?

      - For each php-fpm users, the directive « open_basedir » ensures that user can’t access files outside this directory. If the Apache directive « FollowSymlinks » is set, ensure that the directive « SymlinksIfOwner » is also set.

      - You can also desactivate some PHP functions (exec, init_set, etc…).

      - You can try the « chroot » directive of PHP-FPM (I never try).

      I don’t know how mpm-itk works, if access control is only based on the file owner, but with PHP-FPM, it’s based on systems rights.

      With PHP-FPM, user must at least a read access to the file to interpreted it.
      Apache user (only one for each vhosts) must at least have a read access for files except for PHP files that are read and interpreted by PHP-FPM (under specific user rights). With mpm-itk (with mod_php), all files must be at least readable by the user set in the vhost, it’s more easy to control access (I guess it works like that), you can’t do the same with Apache + PHP-FPM (2 users, one for Apache, an other for FPM-PHP, but can be the same as Apache…).

  10. le octobre 1, 2012 à 1:30 , leshcat dit:

    Hey Fabien,

    Thanks for quick reply. However, maybe i was a bit incorrect in my question.
    Let me make it even clear:

    I have:
    user1:user1 with homedir /home/user1/public_html/ with files and folders running same u:g
    user2:user2 with homedir /home/user2/public_html/ with files and folders running same u:g

    Following rights: 644 for files and 755 for folders are set.

    What i want is that IF user2 will have some phpinfo.php in user1′s homedir, i want apache/fpm to forbid such process.
    i.e.:/home/user1/public_html/phpinfo.php belongs to user2:user2 —> forbid to execute, until file will be under user1:user1

    Just like mpm-itk would do. Can this be accomplished?

    • le octobre 1, 2012 à 10:05 , Fabien dit:

      Hi,

      In your example, a chmod 640 on the file should work, but what’s the point ? It’s normal that user1 can read a file with 644 rights.

      Fabien

  11. le septembre 30, 2012 à 2:02 , leshcat dit:

    Hi there,

    This is really great manual, plain and simple.

    However, i’d like to return to rights/ownership issue in this setup:

    You said:
    « Contrairement à ce que je disais dans la première version du billet, nous n’avons pas besoin du wrapper suEXEC pour attribuer un « utilisateur / groupe » par hôte virtuel, PHP-FPM s’en charge. L’installation de suEXEC n’est pas nécessaire, les directives de configurations s’en trouvent simplifiées. »

    Well, once you setup everything as man says, with 644/755 rights everything is going to operate properly, however, its loosing one of the most important things: anyone can be the owner of files/folders and with such rights system will execute it.

    With 640/750 u’ll gain 403 error.

    I would like to prevent this from happening, only owner of files/folders should be executed, everyone else should get 403/500. Just like mpm-itk.
    Is it possible?

    • le septembre 30, 2012 à 11:28 , Fabien dit:

      In the second paragraph, i say you don’t need SuExec to manage different user rights, It’s the responsibility of PHP-FPM (for PHP files only in fact).
      You can set the rights to 640 for files, and 750 for directories, but don’t forget that apache user must have rights to access your files.

      For example,

      If you have 2 users :

      user1:www-data
      user2:www-data

      And for Apache :

      www-data:www-data

      It work fine with 640 for file and 750 for directories. It’s less permissive than 644/755, but it’s not perfect (all php users have the same group, but we can’t do better). If Apache and PHP users not share the same group, you will need to use 644 for files and 755 for directories.

  12. Pingback: comment booster les performances de wordpress

  13. le mars 15, 2012 à 10:55 , Guillaume Dievart dit:

    Bonjour,

    j’ai tenté hier d’installer le module fcgi sur un apache 2.4, je rencontre une série d’erreurs lors de la compilation du module.

    Les headers de la version apache 2.4 sont t ils encore compatible avec le module_fcgi ?

    Merci.

  14. le février 8, 2012 à 12:43 , Web Hosting dit:

    En passant pas mal de temps sur google, j’ai pu trouver qu’il faut rajouter le paramètre suivant au fichier pool FPM du virtual host en question:

    security.limit_extensions = no

    Apparament c’est un nouveau paramètre depuis PHP 5.3.9 encore non-documenté…

    • le février 8, 2012 à 11:48 , Fabien dit:

      Merci pour l’info ;-)

  15. le février 7, 2012 à 6:24 , Web Hosting dit:

    Encore une question, avec ta configuration est-ce qu’il est possible d’avoir du code PHP dans des fichiers avec l’extension .html? J’ai essayé de modifier le paramètre AddHandler dans /etc/apache2/mods-available/fastcgi.conf:

    AddHandler php5-fcgi .php .html

    mais quand j’essaie d’accèder un fichier .html qui contient du code PHP il me renvoie un « Access denied. » :(

    • le février 7, 2012 à 11:54 , Fabien dit:

      Bonjour,
      Je regarderai dès que j’aurai un peu de temps, mais là c’est très chargé.

  16. le février 6, 2012 à 11:24 , Web Hosting dit:

    Sympa, merci pour les 2 liens. Je vois que c’est pas mal de travail pour tout simplement chrooter un utilisateur. Sinon j’ai trouvé une alternative qui s’appele lshell ça pourrait aussi t’interesser: http://lshell.ghantoos.org/

    • le février 6, 2012 à 8:48 , Fabien dit:

      Merci, je ne connaissais pas, je mets cela de côté.

  17. le février 4, 2012 à 1:30 , Web Hosting dit:

    Merci de ta réponse. Je comprends maintenant mieux pourquoi tu utilises le même groupe. Au fait en parlais de chroot SSH, comment est-ce que tu fais pour facilement chrooter SSH pour tes utilsateurs web?

  18. le février 3, 2012 à 3:48 , Web Hosting dit:

    Bonjour Fabien,

    Quel est la logique derrière d’avoir tes utilisateurs (ici firstweb) dans le group webgroup (et donc si je comprends bien de partager le group webgroup entre differents utilisateurs) ?

    Au niveau sécurité ne serait-il pas mieux d’avoir user firstweb et group firstweb et un autre utilisateur par exemple user secondweb avec group secondweb? Ou cela n’est pas possible avec PHP-FPM?

    A+

    • le février 3, 2012 à 7:28 , Fabien dit:

      Bonjour,

      Le groupe « webgroup » est juste là pour l’exemple, rien n’empêche en fait d’utiliser un groupe spécifique pour chaque utilisateur.
      Avoir un groupe commun peut-être utile par exemple pour une configuration de SSH où tu précises que pour ce groupe tu chrootes les utilisateurs dans leur HOME.

      A+

  19. le décembre 17, 2011 à 6:57 , casa dit:

    Attention le paquet phpmyadmin sur debian casse cette configuration

    #aptitude install phpmyadmin

    Les NOUVEAUX paquets suivants vont être installés :
    apache2-mpm-prefork{a} libapache2-mod-php5{a} php5-cli{a} phpmyadmin
    Les paquets suivants seront ENLEVÉS :
    apache2-mpm-worker{a}
    0 paquets mis à jour, 4 nouvellement installés, 1 à enlever et 0 non mis à jour.

    on revient à un php5 en module, un nouveau php.ini et un apache qui fonctionne en prefork, une catastrophe, à fuir, mieux vaux installer phpmyadmin indépendamment.

    pour revenir :
    # aptitude install apache2-mpm-worker

    Les paquets suivants sont CASSÉS :
    libapache2-mod-php5
    Les NOUVEAUX paquets suivants vont être installés :
    apache2-mpm-worker
    Les paquets suivants seront ENLEVÉS :
    apache2-mpm-prefork{a}
    Supprimer les paquets suivants :
    libapache2-mod-php5
    phpmyadmin

    Le score est de -170

    Accepter cette solution ? [Y/n/q/?] Y
    Les NOUVEAUX paquets suivants vont être installés :
    apache2-mpm-worker
    Les paquets suivants seront ENLEVÉS :
    apache2-mpm-prefork{a} libapache2-mod-php5{a} phpmyadmin{a}

    et on retombe sur ses pieds

    • le décembre 18, 2011 à 8:28 , Fabien dit:

      C’est surement le cas de tous les paquets qui installent une application PHP. Il faut donc effectivement faire attention aux dépendances des paquets. Un petit « aptitude show paquet » doit suffire.

  20. le décembre 16, 2011 à 8:06 , casa dit:

    bonjour,

    j’ai suivi votre tutoriel en l’adaptant à une architecture /home/user/www et avec un groupe par user (user1:user1, user2:user2, etc…) et où le user www-data fait partie de tous les groupes user1, user2, user3, etc… comme je fais sur mes serveurs avec php5-fastcgi et suexec-custom mes répertoires sont alors en chmod 750 et les fichiers php en 644.

    avec votre installation, et avec les users comme ci-dessus, et www-data appartenant ou pas à tous les groupes users, il me faut mettre tous les répertoires à chmod 755 et non pas 750 sans quoi on obtient une erreur 403.

    je n’ai jamais aimé pour des questions de sécu mettre les répertoires à 755, avez-vous une solution pour palier cela ?

    en tout cas merci de faire avancé le débat php5 fastcgi apc .

    • le décembre 18, 2011 à 8:17 , Fabien dit:

      Bonjour,

      J’ai effectué le test, effectivement cela retourne une 403, du moins tant que l’on ne redémarre pas Apache. En ajoutant le « www-data » au groupe de l’utilisateur, en redémarrant ensuite Apache (pas trop cherché à savoir pourquoi….), ça passe avec les dossiers en 750.

  21. le novembre 19, 2011 à 1:26 , Ahmed Kamal dit:

    Hi,

    I want to thank you for this nice article, and wanted to ask for a version in English to reach a broad spectrum of developers ;).

    I applied the above steps and worked fine with me for php requests only, but for subsequent request like (JS, CSS, Images, ….) they all fail, so what I got is a missed up HTML, I think this issue is related to rewrite rules or folder permissions.

    For rewrite rules I added the following line to the vritual hosts file:

    Options SymLinksIfOwnerMatch
    AllowOverride FileInfo AuthConfig Limit Indexes Options
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec

    Order allow,deny
    Allow from all

    Order deny,allow
    Deny from all

    AllowOverride All
    Order allow,deny
    Allow from all

    and for folder permissions I did this:

    sudo chgrp -R www-data mysite

    but it does not work correctly

    I got another problem the server always gives me 500 response, I have to refresh many times to get the right output.

    Thanks.

    • le novembre 19, 2011 à 3:16 , Fabien dit:

      Hi,

      To have more information about errors, take a look at apache log, it will tell you the real cause.

      Don’t forget that Apache user (www-data by default) needs to have the read access on the files it serves.
      You can do a chmod 644 on the files that Apache should be able to read, plus a 755 on the directories containing these files.
      For the vhost directives, try with my sample, and after, when it works, tunes the directives to be less or more restrictive.

      Fabien

      • le novembre 26, 2011 à 1:53 , Ahmed Kamal dit:

        Hi

        I have changed the permissions, and it works fine with me now.

        And for the 500 error, I was putting the configuration of fastcgi.conf in vhosts file, I supposed that it should be the same as Apache reads the configuration when it launches once, and every thing should go normal, but I don’t understand why this is happening?

        Thanks.

        • le novembre 26, 2011 à 3:24 , Fabien dit:

          Hi,

          You have to put the fastcgi config in the vhost to make it work ? I don’t know why…

          Fabien

  22. le juillet 2, 2011 à 9:52 , Malawhere dit:

    Par contre, si on a un petit serveur et pas mal de domaine (avec vhosts), on devra créer autant de pool que de domaine, pour y mettre open_basedir adapté ?

    Cela créera autant de processus parents que de domaines ? On aura pas de gestion global de l’ensemble des processus?

    • le juillet 3, 2011 à 12:14 , Fabien dit:

      Si tu veux définir un open_basedir par host, tu n’as pas vraiment le choix d’utiliser un pool par host, sinon, faudrait le définir à un niveau plus bas, et utiliser un seul pool pour un ensemble de sites :

      /home/www/pool1/site1
      /home/www/pool1/site2

      Avec l’open_basedir sur /home/www/pool1 (donc site1 peut accèder à site2, et inversement), et un utilisateur pool1 (home : /home/www/pool1) pour les 2 sites… Je n’ai pas testé, mais théoriquement, ça doit fonctionner.

      Sinon, oui, autant de pool que de host si tu veux bien tout séparer, utilisateurs, etc… En fonction des ressources de ta machine, tu peux faire le calcul précis, pour voir combien tu peux attribuer de processus.

  23. le juin 29, 2011 à 3:25 , Coolboard dit:

    J’ai suivit ce tuto et le seul point dur que j’ai rencontré c’est au moment de la répartition des droits propriétaires des répertoires public_html ; cgi-bin et tmp

    ils étaient restés en root:root

    un chmod user:group ./* à corrigé le problème

    Merci pour ce tuto qui est très propre :)

  24. Pingback: VPS从零到high之6—安装配置apache-worker + php-fpm | Changblog

  25. le juin 20, 2011 à 11:00 , Julien dit:

    Bonjour,

    Tout cela fonctionne bien, merci pour le tuto !

    Par contre j’ai un script qui me pose problème mais qui m’est nécessaire, voilà mon log :
    FastCGI: comm with server « /home/site/cgi-bin/php5.external » aborted: idle timeout (30 sec), referer: http://www.xxxxx

    J’ai donc édité le fichier :
    /etc/apache2/mods-available/fastcgi.conf

    où j’ai ajouté :
    FastCgiConfig -idle-timeout 120

    Malgré un redémarrage du service apache et php-fpm, la valeur ne semble pas prise en compte car le script échoue toujours au bout de 30 secondes.

    Avez-vous une idée ?

    Merci

    • le juin 21, 2011 à 8:04 , Fabien dit:

      Bonjour,
      Tu as regardé du côté de la config PHP, http://php.net/max-execution-time ?

      => Changer la valeur par défaut pour l’utilisateur Web concerné, ou de manière globale. C’est un script qui doit être lancé en http ? Sinon, je te conseille de laisser la valeur par défaut pour PHP-FPM, et de lancer ton script par un cron via PHP-CLI.

      • le juin 22, 2011 à 1:14 , Julien dit:

        Oui c’est en http.
        J’ai ajouter max_execution_time = 60
        Mais le script provoque la même erreur au bout de 30 secondes. J’ai pourtant vérifié via phpinfo et la valeur est bien de 60.

        Je ne peux malheureuseùent exécuter le script via php-cli, je suis sur Magento avec des scripts qui s’enchaînent.

        Mais je ne comprends pas où je dois agir pour accepter qu’un script mette plus de temps. Je ne sais pas si ça vient de php-fpm, fastcgi ou apache.

      • le juin 22, 2011 à 4:14 , Julien dit:

        Avez-vous la possibilité de tester ce code pour voir si vous avez le même problème (et donc en augmentant quelque part la durée d’exécution du script) ? :

        • le juin 22, 2011 à 4:16 , Julien dit:

          Ca ne passe pas, donc il suffit de mettre dans un fichier php par exemple :
          sleep(35);

          • le juin 22, 2011 à 5:32 , Julien dit:

            J’ai finalement trouvé.

            Dans la définition de l’hôte virtuel, il faut dans :
            /etc/apache2/sites-available/firstweb

            Remplacer :
            FastCgiExternalServer /home/www/firstweb/cgi-bin/php5.external -socket /home/www/.socks/firstweb.sock

            par :
            FastCgiExternalServer /home/www/firstweb/cgi-bin/php5.external -socket /home/www/.socks/firstweb.sock -idle-timeout X

            où x est la valeur souhaitée en secondes.

          • le juin 22, 2011 à 9:16 , Fabien dit:

            Je n’aurai même pas à chercher ;-)
            Je vais ajouter ton « tips » au tutorial, en tout cas vraiment merci d’avoir retourné la solution.

  26. Pingback: Compilation de Nginx, PHP 5.3 (FPM) et APC sous Linux :: Opendev

  27. Pingback: Configurer Apache et PHP-FPM sous Gentoo | Le carnet technique de Poirsouille

  28. le avril 10, 2011 à 4:32 , AeM dit:

    nickel ça marche super :)
    ça venait de ce changement soudain de config…

    je prépare une config avec ça, mysql,proftpd et quelques autres joyeusetés
    intéressé par la suite ?

    • le avril 11, 2011 à 11:19 , Fabien dit:

      Content que le tutorial vous ait servi. Je ne configure jamais de FTP sur mes serveurs, mes utilisateurs Web sont chrootés, l’accès des utilisateurs Web s’effectue en SSH avec un mécanisme de clé privée/publique.

  29. le avril 10, 2011 à 3:40 , aem dit:

    ajout :
    php-fpm.conf au lieu de php5-fpm.conf
    pool.d pris en compte par défaut au lieu de pools qui était à mettre en place

    ceci à partir du paquet php5_5.3.6-6~dotdeb.1_all.deb
    depuis hier soir…

  30. le avril 10, 2011 à 3:19 , AeM dit:

    attention pour les packages php de dotdeb.org :

    pour php-fpm ça vient de changer :
    la config php-fpm.conf pointe sur un sous-répertoire pool.d déjà créé
    avec un http://www.conf déjà créé aussi dedans…

    vous pourriez mettre à jour dans le tuto ceci svp ? :)
    merci!

    • le avril 11, 2011 à 11:15 , Fabien dit:

      Bonjour, je vais regarder ce qui a changé avec le nouveau package pour php5-fpm 5.3.6. Je mettrais le tutorial à jour en conséquence. Merci

      As « AeM » said, the new « php5-fpm package » (5.3.6) comes with some changes. Please read this

      Dotdeb php5-fpm package 5.3.6 and adapt the tutorial.

      I’ll update the tutorial soon.

  31. le avril 9, 2011 à 2:15 , AeM dit:

    refait sur une nouvelle squeezy neuve, pour l’instant résultat sur le web :

    Not Found
    The requested URL /cgi-bin/php5.external/~firstweb/index.php was not found on this server.

    • le avril 9, 2011 à 2:52 , Fabien dit:

      Vérifiez la ligne du vhost (sur une seule ligne) :

      FastCgiExternalServer /home/www/firstweb/cgi-bin/php5.external -socket /home/www/.socks/firstweb.sock

      Vérifiez les directives suivantes :

      DocumentRoot /home/www/firstweb/public_html
      Directory /home/www/firstweb/public_html

      Si vous avez réellement copier-coller, je comprends pas bien d’où vient l’erreur.

  32. le avril 9, 2011 à 12:52 , AeM dit:

    bonjour,

    j’ai suivi en copiant-collant votre tutoriel sous une squeeze (/ovh)
    tout fraîche et à la fin en relançant php5-fpm j’obtiens un superbe fail :)

    je vais essayer en mettant « debug » pour le log…

    • le avril 9, 2011 à 1:00 , Fabien dit:

      Jettez un oeil aux logs, si vous avez suivi le tutos, « normalement », il n’y a pas de problème (testé récemment sous Squeeze).

  33. le mars 19, 2011 à 2:12 , tuurtnt dit:

    Hi, I followed this tutorial but I get 403 errors… Anyone a solution?

    • le mars 19, 2011 à 3:51 , Fabien dit:

      Hi,

      Check the path of the DocumentRoot in your virtual host and check that you’ve not forgot a step of the tutorial. It should work if you copy/paste all the steps.

      Fabien

      • le mars 20, 2011 à 1:07 , tuurtnt dit:

        Hi do i need to change something in httpd.conf
        Or the http://www.conf (php-fpm)?

        • le mars 20, 2011 à 4:44 , Fabien dit:

          No, nothing to change in the httpd.conf. You just need to follow the tutorial, the main steps are :

          edit the fastcgi.conf
          edit the php5-fpm.conf (remove the sample pool declaration « www » and add the declaration to load all the per-user pool configuration)
          add a php-fpm pool declaration (will be loaded by the php5-fpm.conf)
          add a vhost configuration for the user

          I’ve just re-played the tutorial on a fresh Debian Squeeze install, I’ve copied / pasted all the steps, it’s working.
          Don’t forget to add file (index.php for example) in your web root, if not, without any file, you’ll get your 403 error.

          Fabien

          • le mars 21, 2011 à 9:07 , tuurtnt dit:

            Thanks! I will test it!

          • le mars 21, 2011 à 10:38 , tuurtnt dit:

            Ok I found the problem… It has something to do with rights on the /home folder…

  34. le mars 10, 2011 à 1:14 , aser dit:

    Ok it was disabled,

  35. le mars 9, 2011 à 3:37 , aser dit:

    I get this failure, made the config the same as above:

    Invalid command ‘FastCgiExternalServer’, perhaps misspelled or defined by a module not included in the server configuration

    • le mars 9, 2011 à 4:00 , Fabien dit:

      Hi,

      Have you forget to install the fastcgi module (don’t forget to modify the « apt sources » list) ?

      aptitude install libapache2-mod-fastcgi

      Or have you simply forget to enable it ?

      a2enmod fastcgi

      Or else forget to reload apache configuration ?

      /etc/init.d/apache2 reload

  36. le février 11, 2011 à 12:01 , Dan Alloway dit:

    Shouldn’t SetHandler fastcgi-script
    Read instead SetHandler php5-fcgi
    Or am I missing something?

    • le février 11, 2011 à 12:27 , Fabien dit:

      Hi,

      You asked a good question… I see that the last two directives (« SetHandler fastcgi-script » and « Options ExecCGI ») are useless. I’ve corrected the fast-cgi file configuration. In the vhost configuration, I’ve also removed the ExecCGI option.

      Thank you.

  37. le janvier 10, 2011 à 2:33 , Julien dit:

    Bonjour,

    J’ai essayé de suivre ce tuto mais lorsque je fais « /etc/init.d/php5-fpm start » j’obtiens :
    Starting php5-fpm /etc/init.d/php5-fpm: line 64: /usr/bin/php5-fpm: Aucun fichier ou répertoire de ce type
    failed

    Et effectivement pas de trace de php5-fpm dans /usr/bin.

    Si je fais un locate php5-fpm
    /etc/init.d/php5-fpm
    /etc/logrotate.d/php5-fpm
    /etc/php5/fpm/php5-fpm.conf
    /var/cache/apt/archives/php5-fpm_5.3.5-0.dotdeb.0_amd64.deb
    /var/lib/dpkg/info/php5-fpm.list
    /var/lib/dpkg/info/php5-fpm.postrm

    Une idée du problème ?

    Par ailleurs, dans le tuto à la fin il faut remplace « /etc/init.d/apache reload » par « /etc/init.d/apache2 reload ».

    Merci

    • le janvier 10, 2011 à 7:41 , Fabien dit:

      Bonjour,

      Je ne sais pas vraiment pourquoi le binaire php5-fpm n’est pas présent dans /usr/bin. Avez-vous effectué une ré-installation du paquet ?

      Merci pour la correction de la typo.

  38. Pingback: La veille du week-end (huitième) | LoïcG

  39. Pingback: Apache + SuExec + php-fpm – how to set them up?

  40. le novembre 14, 2010 à 7:52 , joep dit:

    good call! what seems to happen is php-fpm starts automatically when the package is installed.

    i did a config dump for good measure
    php-fpm -c /etc/php5/fpm/php.ini -y /etc/php5/fpm/php5-fpm.conf

    you might want to ammend the last line of your walkthrough to say
    /etc/init.d/php5-fpm restart

    many thanks Fabien.

    • le novembre 14, 2010 à 6:36 , Fabien dit:

      Thanks for ur feedback.
      I’ve checked if « php5-fpm » daemon starts at the package installation (Dotdeb package on Debian Lenny), and it isn’t started, but ready to start at the next reboot.
      Fabien

  41. le novembre 13, 2010 à 7:23 , joep dit:

    I am having the same problem as Undo after following your tutorial. Can’t seem to get any php scripts to load.

    Apache is spitting out these errors when I try to load phpinfo.php:
    (111)Connection refused: FastCGI: failed to connect to server /home/www/firstweb/cgi-bin/php5.external: connect() failed
    FastCGI: incomplete headers (0 bytes) received from server /home/www/firstweb/cgi-bin/php5.external

    Any help would be greatly appreciated.

    • le novembre 13, 2010 à 8:44 , Fabien dit:

      Hi,

      The php-fpm daemon seems not to be started. Have you started php-fpm daemon ?

      « /etc/init.d/php-fpm start »

      If the service no starts, check the php-fpm config.

      Fabien

  42. le octobre 6, 2010 à 8:13 , Fabien dit:

    L’installation de PHP-FPM n’a rien d’expérimentale (et officiellement supportée depuis PHP 5.3.3).
    J’ai supprimé la partie concernant la copie des fichiers de configuration, elle n’était plus valable (pas distribués sur la dernière version). J’ai ajouté quelques commentaires, corrigé quelques typos qui trainaient encore, et re-testé complètement le tuto en partant de zéro sur une Debian 5 fraichement installée.

    En suivant pas à pas le tutorial, cela fonctionne.

    En cas de problème, n’hésitez pas à me soumettre les erreurs.

  43. le octobre 5, 2010 à 11:29 , centar dit:

    C’est pas compliqué ce tuto à explosé tout mes Vhosts.

    Gros problèmes de compatibilité PHP 5.3.3 de chez dotdeb.

    cette section du tuto :

    « cp php.ini.ucf-dist php.ini

    Créez un fichier de configuration de PHP5-FPM « php5-fpm.conf » à partir du fichier de « php5-fpm.conf.dpkg-dist »
    voir la source
    imprimer?
    1 cp php5-fpm.conf.dpkg-dist php5-fpm.conf »

    Ne correspond pas . Dans ma Lenny je trouve aucune correspondance. Je déconseille fortement cette méthode lorsque vous utilisez plusieurs sites en vhosts avec des CMS ou pas d’ailleurs.

    Il faudrait un peu plus d’explications dans ce tuto car c’est vraiment de l’expérimental

  44. le septembre 18, 2010 à 7:12 , Fabien dit:

    Il y avait une typo dans la config du pools :

    J’ai remplacé cette ligne :

    php_admin_value[open_basedir]=/home/www/firstweb/httpdocs

    par :

    php_admin_value[open_basedir]=/home/www/firstweb/public_html

    Et une autre typo dans la définition du virtual host :

    FastCgiExternalServer /home/www/first/cgi-bin/php5.external -socket /home/www/.socks/firstweb.sock

    par

    FastCgiExternalServer /home/www/firstweb/cgi-bin/php5.external -socket /home/www/.socks/firstweb.sock

  45. le septembre 18, 2010 à 1:37 , Undo dit:

    A noter : même en retournant le problème dans tous les sens, impossible de faire fonctionner php-fpm sur un serveur dédié debian ou Ubuntu tout frais. Apache renvoit soit des 404 not found soit des 500 internal error. Testé sur plusieurs config.

    Si quelqu’un sait ce qui cloche dans ce tuto, faites passer l’info :)

    • le septembre 18, 2010 à 7:04 , Fabien dit:

      Bonjour,

      Des traces d’erreurs dans les logs d’Apache? PHP-FPM est-il bien lancé ?

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>