Table des matières

Installation de Nginx

Compiler Nginx

Configurer Nginx

Config générale de nginx

Fichier /etc/nginx/nginx.conf :

user  www-data www-data; # Default: nobody
worker_processes  4; # Default : 1
# Nombre de fichiers ouverts par processeur
worker_rlimit_nofile 100000;
 
pid /var/run/nginx.pid;
 
# [ debug | info | notice | warn | error | crit ]
error_log  /var/log/nginx-error.log  info;
 
events {
    worker_connections  1024; # Default : 1024
    # use [ kqueue | rtsig | epoll | /dev/poll | select | poll ] ;
    # use kqueue;
    use epoll;
}
 
http {
    include  mime.types;
    # include  /etc/nginx/fastcgi.conf;
    index    index.html index.htm index.php;
 
    default_type  application/octet-stream;
 
    log_format main   '"$remote_addr" $host [$time_local] '
                                '"$request" $status $body_bytes_sent '
                                '$request_length $bytes_sent "$http_referer" '
                                '"$http_user_agent" $request_time "$gzip_ratio"';
 
    # La ligne ci-dessous semble inutile puisqu'il faut la redéfinir dans chaque vhost : server {}
    access_log  /var/log/nginx-access.log  main;
 
    sendfile       on;
    tcp_nopush     on;
 
    # 1er param : timeout pour les connections keep-alive ; 2ème param : valeur du header "Keep-Alive: timeout=" envoyé en réponse
    keepalive_timeout 30 30;
    # délai d'attente de la réponse de php-fpm : à accorder avec request_terminate_timeout dans la conf de php-fpm
    fastcgi_read_timeout 3600s;
 
    gzip on;
    gzip_comp_level 9; # 1 <= level <= 9
    gzip_min_length 50; # les fichiers plus petits que 50 octets ne sont pas compressés
    # types de fichiers à compresser
    gzip_types
        text/css
        text/plain
        text/javascript
        application/javascript
        application/json
        application/x-javascript
        application/xml
        application/xml+rss
        application/xhtml+xml
        application/x-font-ttf
        application/x-font-opentype
        application/vnd.ms-fontobject
        image/svg+xml
        image/x-icon
        application/rss+xml
        application/atom_xml;
 
    # Load all vhosts !
    include /etc/nginx/sites-enabled/*.conf;
}

Config du domaine d'administration

Exemple de config pour le sous-domaine sql.clapas.ovh

Domaine sql.clapas.ovh , fichier /etc/nginx/site-available/sql.clapas.ovh.conf :

server {
    server_name sql.clapas.ovh www.sql.clapas.ovh;
    root "/home/admin/www/phpmyadmin";
 
    index index.php index.html index.htm; 
    client_max_body_size 10m;
 
    access_log /home/admin/_logs/access.log;
    access_log /var/log/nginx-access.log main;  
    error_log /home/admin/_logs/error.log;
 
    # BLOCAGE - Bloquer l'accès à certains robots et extracteurs de contenu
 
    # Bloquer l'accès à certains robots
    if ($http_user_agent ~* (Baiduspider|webalta|nikto|wkito|pikto|scan|acunetix|morfeus|webcollage|youdao) ) { 
        return 401;
    }   
    # Bloquer l'accès aux extracteurs de contenu
    if ($http_user_agent ~* (HTTrack|clshttp|archiver|loader|email|harvest|extract|grab|miner) ) { 
        return 401;
    }   
 
    # PROTECTION - Éviter l'affichage de fichiers sensibles
 
    # Éviter l'affichage du contenu des dossiers des gestionnaires de versions
    location ~ "\.(svn|git|hg|bzr|cvs)" {
        return 404;
    }   
 
    # Éviter l'affichage des fichiers de config en .ini
    location ~ "\.ini$" {
        return 404;
    }   
 
    # Éviter l'affichage des fichiers sensibles
    location ~ "\.(htaccess|htpasswd)$" {
        return 404;
    }
 
    # Réecritures générales
 
    location / { 
        try_files $uri $uri/ /index.php$uri?$args;
    }   
 
    location ~ "^(.+\.php)($|/)" {
        fastcgi_split_path_info ^(.+\.php)(.*)$;
 
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param SCRIPT_NAME $fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param SERVER_NAME $host;
 
        if ($uri !~ "^/uploads/") {
            fastcgi_pass   unix:/var/run/admin_fpm.sock;
        }
        include fastcgi_params;
    }
 
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        expires max;
        log_not_found off;
        access_log off;
    }
 
    location ~* \.(html|htm)$ {
        expires 30m;
    }
}

Exemple de config d'un domaine fournissant une api

Fichier /etc/nginx/site-available/api.bota.ovh.conf (s'en inspirer pour api-test.bota.ovh , en ajustant le server_name, le root, les logs etc.) :

server {
    server_name api.bota.ovh www.api.bota.ovh;
    root "/home/apibota/www";
 
    index index.php index.html index.htm;
    client_max_body_size 50m;
 
    access_log /home/apibota/_logs/access.log;
    access_log /var/log/nginx-access.log main;
    error_log /home/apibota/_logs/error.log;
 
    if ($http_user_agent ~* (Baiduspider|webalta|nikto|wkito|pikto|scan|acunetix|morfeus|webcollage|youdao) ) { 
        return 401;
    }   
 
    if ($http_user_agent ~* (HTTrack|clshttp|archiver|loader|email|harvest|extract|grab|miner) ) { 
        return 401;
    }   
 
    # Éviter l'affichage du contenu des dossiers des gestionnes de versions
    location ~ "\.(svn|git|hg|bzr|cvs)" {
        return 404;
    }
 
    # Eviter l'affichage des fichiers de config en .ini
    location ~ "\.ini$" {
        return 404;
    }
 
    location / { 
        try_files $uri $uri/ /index.php$uri?$args;
    }
 
    # CORS dynamique multi-domaines
    set $cors_origine_acceptee "http://www.bota.ovh";
    if ($http_origin ~* (www\.bota\.ovh|localhost)) {
        set $cors_origine_acceptee "$http_origin";
    }
 
    # Entêtes pour CORS
    add_header Access-Control-Allow-Origin "$cors_origine_acceptee"; # mode dynamique
    add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS";
    add_header Access-Control-Allow-Credentials "true";
    add_header Access-Control-Expose-Headers "X-DebugJrest-Data";
 
    # redéfinition par défaut de la query_string
    set $query_string_api $args;
 
    location ~ "^(.+\.php)($|/)" {
        fastcgi_split_path_info ^(.+\.php)(.*)$;
 
        include /etc/nginx/fastcgi.conf;
        fastcgi_pass   unix:/var/run/apibota_fpm.sock;
 
        # Réecriture des headers pour l'API d'eFlore
        fastcgi_param REQUEST_URI $request_uri_api;
        fastcgi_param QUERY_STRING $query_string_api;
    }
 
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        expires max;
        log_not_found off;
        access_log off;
    }
 
    location ~* \.(html|htm)$ {
        expires 30m;
    } 
}

Installation du script de création des domaines virtuels

Remplacer le contenu de nginx.vhost.conf.template par :

server {
    server_name @@HOSTNAME@@ www.@@HOSTNAME@@;
    root "@@PATH@@";
 
    index index.php;
    client_max_body_size 10m;
 
    access_log @@LOG_PATH@@/access.log;
    access_log /var/log/nginx-access.log main;
    error_log @@LOG_PATH@@/error.log;
 
    if ($http_user_agent ~* (Baiduspider|webalta|nikto|wkito|pikto|scan|acunetix|morfeus|webcollage|youdao) ) { 
        return 401;
    }   
 
    if ($http_user_agent ~* (HTTrack|clshttp|archiver|loader|email|harvest|extract|grab|miner) ) { 
        return 401;
    }   
 
    location / { 
        try_files $uri $uri/ /index.php$uri?$args;
    }   
 
    location ~ "^(.+\.php)($|/)" {
        fastcgi_split_path_info ^(.+\.php)(.*)$;
 
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param SCRIPT_NAME $fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param SERVER_NAME $host;
 
        if ($uri !~ "^/uploads/") {
            fastcgi_pass   unix:@@SOCKET@@;
        }   
        include        fastcgi_params;
    }   
 
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        expires max;
        log_not_found off;
        access_log off;
    }   
 
    location ~* \.(html|htm)$ {
        expires 30m;
    }   
 
    location ~* /\.(ht|git|svn) {
        deny  all;
    }   
}

Remplacer le contenu de pool.conf.template par :

; Doc sur les paramètres : http://www.php.net/manual/fr/install.fpm.configuration.php
[@@USER@@]
listen = /var/run/@@USER@@_fpm.sock
listen.owner = @@USER@@
listen.group = @@USER@@
listen.mode = 0660
user = @@USER@@
group = @@USER@@
pm = dynamic
pm.max_children = @@MAX_CHILDS@@
pm.start_servers = @@START_SERVERS@@
pm.min_spare_servers = @@MIN_SERVERS@@
pm.max_spare_servers = @@MAX_SERVERS@@
pm.max_requests = 500 
request_terminate_timeout = 30s 
chdir = / 
php_admin_value[session.save_path] = "@@HOME_DIR@@/_sessions"
php_admin_value[open_basedir] = "@@HOME_DIR@@:/usr/share/pear:/usr/share/php:/tmp:/usr/local/lib/php"

Activer Speedy sur Nginx