Modifier les contextes virtuels (Nginx)

Avant de modifier quoi que ce soit, il faut dans un premier temps faire une sauvagarde du ou des fichier(s) puis activer la nouvelle configuration:

cp /etc/nginx/site-available/default  /etc/nginx/site-available/mon_site.com
ln -s /etc/nginx/site-available/mon_site.com /etc/nginx/site-enabled/mon_site.com

Et n'oublions pas de vérifier que la syntaxe dans le fichier de configuration est correcte :

nginx -t

Lister un répertoire

server {
  location ~/accueil {
    autoindex on;
  }
}

Filtrer les accès

On peut le faire que par IP ou par réseau logique :

location /strategie {
    allow 192.168.1.129;
    deny all;
}

location /docs {
    deny 192.168.0.0/24;
    allow ::1;
    # Allow étant présent par défaut
}

Redirection HTTP vers HTTPS

rewrite ^/(.*)$$scheme://$host$request_uri permanent;

ou

return 301 https://$host$request_uri;

Redirection d'un domaine

if ($host = 'domaine.fr') {
    rewrite ^/(.*)$ http://www.domaine.fr/$1 permanent;
}

Plusieurs domaines par IP

server {
        # On défini par la même occasion que c'est le site par défaut
        listen 80 default;
        server_name toto.org;
        root /var/www/html/toto;
        index index.html;
}

server {
        listen 80;
        server_name titi.org;
        root /var/www/html/titi;
        index index.html;
}

Il existe une autre solution avec les virtualhosts dynamique

server_name ~^(www\.)?(?<domain>.+)$;
root /var/www/html/$domain/;

Ainsi http://toto.org/index.html revient à se rendre dans le dossier /var/www/html/toto.com/index.html

Créer un Alias

Pour une courte période on peut simplifier l'accès à une ressource situé sur un serveur web en raccourcissant son URL :

location /court {
     root /pointe/vers/un/autre/dossier;
     alias  /permet/de/faire/un/chemin/plus/court/;
}

Exécuter des scripts

Nginx ne disposant pas de module pour les exécuter, il communique donc avec un logiciel tiers comme Spawn-fcgi :

 apt-get install spawn-fcgi

Il faut également que le script en question soit exécutable et que ses dépendances soient installés. Pour le cas d'un programme écrit en ruby, il aura besoin des paquets suivants :

 apt-get install ruby ruby-dev
 gem install fcgi

Voici un exemple de code écrit en ruby :

Click to display ⇲

Click to hide ⇱

s.rb
#!/usr/bin/ruby
require 'cgi'
require 'fcgi'
 
def print_env(title,env)
  str = "#{title}:<br>\n<pre>\n";
  env.each { |k,v| str<<"#{k}=#{v}\n" }
  str<< "</pre><p>\n"
end
 
count = 0
 
FCGI.each_cgi do |cgi|
  count += 1
  content = "<title>FastCGI echo</title><h1>FastCGI echo</h1>\n"
  content<< sprintf("Request number %d, Process ID: %d<p>\n", count, Process.pid)
  content<< print_env("Request environment", cgi.env_table)
  content<< print_env("Initial environment", ENV)
  cgi.out{content}
end

On configure le contexte du serveur Nginx :

server {   

   location ~ \.rb {
            include /etc/nginx/fastcgi_params;
            fastcgi_pass  127.0.0.1:9000;
   }
}

Lors de l'installation de Nginx, ils ont eu la bonne idée d'y apporter une pré-configuration inclue dans le fichier /etc/nginx/fastcgi_params. Il nous reste plus qu'a redémarrer le service puis de lançer le programme spawn-fcgi :

 spawn-fcgi -d /var/www/html/ -f /var/www/html/s.rb -a 127.0.0.1 -p 9000

Réécriture d’URL

Par exemple http://mon-site.com/test/ devienne http://mon-site.com/docs/index.html :

  • Soit avec Rewrite
server {

    rewrite /test/ /docs/index.html;
    root /var/www/html;
}
  • Soit avec Return qui retourne en plus le code d'erreur 301 :
server {

   location /test {
      return 301 http://mon-site.com/docs/index.html;
   }
}
  • Réécriture conditionnelle

On veut que le visiteur 192.167.1.31 accède à une page du site différente par rapport aux autres Internautes :

server {

   if ( $remote_addr = "192.168.1.31" ) {
        rewrite / /premium/;
   }
}

Informations sur le service

server {
  location /status {
     stub_status on;
  }
}

Personnaliser les logs

http {
    log_format filtre '$pid' '"$request"';

    server {
        listen 80;
        root /var/www/html;
        index index.html;

        access_log /var/log/nginx/toto.access.log filtre;
    }
}

Dans le log_format ont choisi les variables d'environnement que l'on souhaite utiliser.

Filtrage conditionnel

http {
    map $remote_addr $mon_filtre {
        default       0;
        192.168.1.30 1;
    }

    server {

           if($mon_filtre) {
               access_log /var/log/nginx/filtre.access.log combined;
           }
    }
}

Limiter les méthodes HTTP

Admettons qu'une ressource doit être uniquement accessible en lecture et pas moyen d'envoyer une image. On insérer ces directives :

server{
    location /secure {
        limit_except GET {
                
        }    
    }
}