Installation de Nginx
Un article de Diablotins.org.
|
Sommaire |
Nginx
Comme beaucoup j'ai utilisé Apache comme serveur web. Même s'il fonctionne très bien, c'est l'artillerie lourde. Or pour mon joli serveur, je n'ai besoin que de :
- support de php pour SquirrelMail.
- SSL
- Hôtes virtuels.
Nginx est un serveur HTTP léger, un reverse proxy et un serveur proxy IMAP/POP3. Ici je ne parlerais que de l'utilisation en serveur web.
La documentation de Nginx se trouve sur http://wiki.codemongers.com/Main
Installation
Nginx est organisé en « modules », chacun apportant une fonctionnalité.
La liste des modules est disponible ici http://wiki.codemongers.com/NginxModules
L'installation s'effectue par les ports (www/nginx-0.5.31_1). Le Makefile défini plusieurs options de compilation, nous n'utiliserons que :
HTTP_MODULE "Enable HTTP module" on
HTTP_REWRITE_MODULE "Enable http_rewrite module" on
HTTP_SSL_MODULE "Enable http_ssl module" on
HTTP_STATUS_MODULE "Enable http_stub_status module" on
WWW "Enable html sample files" on
Le reste étant à off. Ce qui valide les modules HTTP (ça va servir !), la réécriture d'URL (ça peut servir), le SSL sur HTTP et les statistiques.
Une fois le port installé, les fichiers de configuration se trouvent dans le catalogue /usr/local/etc/nginx. Le port installe un script de démarrage /usr/local/etc/rc.d/nginx.
Evidemment il faudra aussi installer php et SquirrelMail mais nous n'en causerons pas ici.
Configuration
Le fichier de configuration est nginx.conf, le wiki fourni quelques exemples : http://wiki.codemongers.com/NginxConfiguration. Et la documentation des directives des modules pour, par exemple, le module « HttpCore » : http://wiki.codemongers.com/NginxHttpCoreModule.
Syntaxe
La syntaxe du fichier de configuration n'est pas vraiment documentée (du moins en anglais) et ce qui suit n'est qu'une déduction.
Le fichier de configuration est organisé en « contexte », suivi d'une accolade ouvrante '{' et terminé par une accolade fermante '}'. Un contexte contient des directives (qui peuvent aussi être un contexte), les directives ne s'appliquent qu'au contexte courant et à ses sous contextes. Pour chaque directive, la documentation indique quel est le contexte attendu.
Dans l'exemple ci-dessous, le contexte « http » inclu un contexte « server » qui inclu un contexte « location ».
http {
directive
directive
directive
server {
directive
location xxxx {
directive
}
}
}
D'une manière générale, le fichier de configuration se compose d'un contexte principal, suivi d'un contexte 'http' qui inclue un contexte 'server' pour chaque serveur http.
Contexte principal
http://wiki.codemongers.com/NginxHttpMainModule
Ici on spécifie les directives qui concerne le processus : ie l'utilisateur et le groupe utilisé par Nginx, le nombre de processus 'worker' ...
user www www;
worker_processes 1;
events {
worker_connections 1024;
}
Contexte http
Ici on indique les directives communes à tous nos serveurs (contexte server)
http://wiki.codemongers.com/NginxHttpCoreModule
http {
# types MIME : voir /usr/local/etc/nginx/mime.types
include mime.types;
default_type application/octet-stream;
# utilise sendfile
sendfile on;
# autoindex
autoindex on;
autoindex_exact_size off;
# Taille maximale du corps d'une requête client.
# Il est indispensable de l'augmenter pour pouvoir
# échanger des fichiers importants (pièces jointes)
# avec SquirellMail
client_max_body_size 7m;
Contexte server
http://wiki.codemongers.com/NginxModules (Standard HTTP Modules)
C'est la partie qui va le plus nous intéresser, chaque contexte serveur décris un serveur HTTP.
Ici on a un serveur nommé lamaiziere.net ou www.lamaiziere qui est localisé à la racine /home/www/lamaiziere.net, les fichiers php sont transmis en FastCGI pour être exécutés.
server {
# port d'écoute (80 étonnant non ?)
listen 80;
# noms du serveur, le serveur s'appelle lamaiziere.net
# ou www.lamaiziere.net
server_name lamaiziere.net www.lamaiziere.net;
# chemin de la racine du serveur et fichiers d'index
location / {
root /home/www/lamaiziere.net;
index index.html index.htm index.php;
}
# redirige les pages d'erreurs vers les pages statiques /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# Transfère les scripts PHP au serveur FastCGI qui écoute sur
# 127.0.0.1, port 8002
# voir la partie sur le PHP
location ~ \.php$ {
fastcgi_pass localhost:8002;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/www/lamaiziere.net$fastcgi_script_name;
include fastcgi_params;
}
}
Si on veut cloner www.lamaiziere.net en HTTPS (ssl), il suffit d'un copier coller du serveur précédent, de le faire écouter sur le port 443 et d'y ajouter les directives pour le SSL. Et bien sûr de créer les certificats.
http://wiki.codemongers.com/NginxHttpSslModule
Ce qui donne :
server {
listen 443;
server_name lamaiziere.net www.lamaiziere.net;
ssl on;
ssl_certificate /usr/local/etc/nginx/server.crt;
ssl_certificate_key /usr/local/etc/nginx/server.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
[...CUT...]
Et c'est tout ! On peut ajouter des serveurs virtuels simplement en ajoutant des directives server, par exemple http://jpm.lamaiziere.net
server {
listen 80;
# noms du serveur, le serveur s'appelle jpm.lamaiziere.net
server_name jpm.lamaiziere.net
# chemin de la racine du serveur et fichiers d'index
location / {
root /home/www/jpm;
index index.html index.htm;
}
[...CUT...]
}
PHP
Nginx passe les scripts php à exécuter en FastCGI à PHP qui doit donc être compilé avec l'option FASTCGI du port lang/php5
[X] FASTCGI Enable fastcgi support (CGI only)
Php doit aussi être lancé en mode serveur, pour cela il y a deux méthodes : utiliser le programme spawn-fcgi qui vient avec le serveur lighttpd (port www/lighttpd) ou faire un script qui va lancer PHP.
Voir http://blog.kovyrin.net/2006/05/30/nginx-php-fastcgi-howto/
Pour ma part j'utilise le script rc suivant :
#!/bin/sh # PROVIDE: phpcgi # REQUIRE: DAEMON # BEFORE: LOGIN # KEYWORD: shutdown # Define these phpcgi_* variables in one of these files: # /etc/rc.conf # /etc/rc.conf.local # # DO NOT CHANGE THESE DEFAULT VALUES HERE # phpcgi_enable=${phpcgi_enable-"NO"} phpcgi_flags=${phpcgi_flags-""} phpcgi_user=${phpcgi_user-"www"} phpcgi_child=${phpcgi_child-"5"} phpcgi_maxrequests=${phpcgi_maxrequests-"500"} phpcgi_pidfile="" . /etc/rc.subr name="phpcgi" rcvar=`set_rcvar` command="/usr/local/bin/php-cgi" procname="php-cgi" load_rc_config $name PHP_FCGI_CHILDREN=${phpcgi_child} export PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS=${phpcgi_maxrequests} export PHP_FCGI_MAX_REQUESTS start_cmd="echo \"Starting ${name}.\"; /usr/bin/su -m ${phpcgi_user} -c \"${command} ${phpcgi_flags} &\"" stop_cmd="echo \"Stopping ${name}.\"; /usr/bin/killall ${procname}" run_rc_command "$1"
php-cgi ne renvoie pas le pid du processus créé d'où le killall qui ne me plait pas trop, si vous avez une idée n'hésitez pas.
/etc/rc.conf :
phpcgi_enable="YES" # adresse et port d'écoute (qui doit correspondre # avec la conf de Nginx!) phpcgi_flags="-b localhost:8002 -q" # utilisateur phpcgi_user="www" # nombre de processus fils phpcgi_child="5" # nombre de requêtes max par fils, au bout de ce nombre # le processus fils est arrêté et un nouveau est créé. phpcgi_maxrequests="100"
Fin
Nginx fonctionne bien, je n'ai pas eu le moindre soucis pour l'instant. Léger et facile à configurer il peut être une alternative intéressante à Apache.
Chanson
Ivan and Aljosha, Pavel and Serjosha,
Leonid and Vladimir, Juri and Grigori
Those Russian boys they sing so nice
Juchei Juchei Kalinka Kalinka Kalinka...
[Nina Hagen - Russian Reggae]
Catégories de la page: Documentations | Langage | Web | Serveur | Ports | Installation | Configuration | Modèles | Présentation
