Nginx et PHP
Par Dju » 13 mars 2010 (14:40) - Serveur
Maintenant, on va utiliser nginx comme serveur web unique, pour se faire un petit site en PHP. Contrairement à Apache, il faut utiliser php en mode CGI, donc dans un process séparé, auquel nginx passera la demande d'exécution de la page php.
On commence donc par un exemple de fichier /etc/nginx/sites-enabled/
server { listen 1.2.3.4:80; server_name mon-pti-site.com; access_log /var/log/nginx/monptisite.access.log; error_log /var/log/nginx/monptisite.errors.log; root /var/www/monptisite; location / { index index.html index.htm index.php; } # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME /var/www/root/monsite$fastcgi_script_name; include /etc/nginx/fastcgi_params; } # favico location /favico.ico { empty_gif; } }
ici, on définit un host mon-pti-site.com, pour lequel nginx écoutera sur l'ip 1.2.3.4 sur le port 80.
Afin d'utiliser php en CGI, on utilise encore la directive location et une regex
On y définit index.php/htm/html en page d'index
Histoire d'utiliser une super feature de nginx, on s'amuse à rajouter une image vide lorsqu'un client demande favico.ico :D
Puis on va éditer le fichier /etc/nginx/fastcgi_params dont nginx va avoir besoin pour du CGI.
fastcgi_connect_timeout 60; fastcgi_send_timeout 180; fastcgi_read_timeout 180; fastcgi_buffer_size 128k; fastcgi_buffers 4 256k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; fastcgi_intercept_errors on; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; # PHP only, required if PHP was built with --enable-force-cgi-redirect fastcgi_param REDIRECT_STATUS 200; fastcgi_index index.php;
Enfin, on se créer un "demon" php-cgi qui va tourner en permanence, écouter sur un port précis et executer tout script PHP que nginx lui passera. Pour ce faire, on a besoin d'installer le mode CGI pour php, puis crééer 2 fichiers pour gérer notre démon.
aptitude install php5-cgi
Au cas ou, le fichier de conf pour le cgi est par défaut dans /etc/php5/cgi/php.ini
Le 1er fichier va donner les options générales: /etc/default/php-fastcgi
START=yes # Which user runs PHP? (default: www-data) EXEC_AS_USER=www-data # Host and TCP port for FASTCGI-Listener (default: localhost:9000) FCGI_HOST=127.0.0.1 FCGI_PORT=9000 # Environment variables, which are processed by PHP PHP_FCGI_CHILDREN=2 PHP_FCGI_MAX_REQUESTS=1000
On définit ici que php-cgi tournera avec l'utilisateur www-data, aura 3 instances (la principale, et 2 enfants), que chaque instance peut accepter 1000 requêtes, et que le démon écoutera sur 127.0.0.1 sur le port 9000.
Le 2è va être le script d'init. (je l'ai trouvé sur le net après quelques recherches)
... je ne vais pas vous mettre le contenu ici car il est assez gros et bien chiadé :D
Voici le lien direct pour le télécharger
(Et grand merci à son créateur, Kurt Zankl qui l'a publié ici )
Une fois dézippé, mettez le dans /etc/init.d puis n'oubliez pas de le lancer, et de faire un update-rc.d pour le lancer automatiquement au démarrage.
chmod +x /etc/init.d/php-fastcgi
/etc/init.d/php-fastcgi start
update-rc.d -f php-fastcgi defaults
Finalement, on relance nginx pour valider
/etc/init.d/nginx restart
(on peut aussi lui dire de recharger sa config sans couper le service; ça marche plutôt bien, contrairement à apache )
/etc/init.d/nginx reload
maintenant, faites vous une petite page php contenant un tuc du style
<?php phpinfo(); ?>
puis appelez cette page depuis votre navigateur pour vérifier que tout fonctionne bien.
Soyez le premier à commenter ce billet
URL de rétrolien : https://blog.crifo.org/trackback/36