Créez votre propre serveur Nginx

 · Temps de lecture: 8 mins

Créez votre propre serveur Nginx

Nginx est un serveur HTTP bien connu qui alimente de nombreux sites web (comme le nôtre) et d’autres applications web (comme les reverse proxies) qui est assez facile à configurer. Avec sa vitesse et son coût (gratuit !), les gens qui n’aiment pas l’hébergement mutualisé et qui ne savent pas comment faire les choses choisiront généralement d’avoir leur propre serveur web et de le configurer eux-mêmes.

Exigences

  • Un ordinateur ou un serveur avec une distribution Linux (recommandé : Ubuntu, Debian, CentOS, RedHat)
  • Si cette dernière est configurée depuis un emplacement distant, un client SSH
  • Un nom de domaine pointé vers le serveur web, sinon ce dernier ne sera pas facilement accessible sur le web ouvert.

Options

  • Un client SCP qui permet la manipulation graphique de fichiers
  • Un certificat SSL/TLS prêt à être installé

1 . Préparez votre serveur

(Les commandes de notre guide sont pour la distribution Debian) Tout d’abord, vous devez SSH dans votre serveur web. Une fois dedans, nous pouvons maintenant commencer la procédure, mais avant de commencer nous devons nous assurer qu’il n’y a aucune trace de Nginx avant sa configuration:

sudo apt-get purge -- auto-remove nginx nginx-common
sudo apt-get clean
sudo apt-get update && sudo apt-get upgrade

Une fois cela fait, nous devons également vérifier qu’aucun autre serveur web n’écoute sur les ports 80 et 443 :

sudo netstat -plunt

S’il y en a, vous devez changer leur configuration pour écouter les autres ports, ou les désinstaller.

2. Installez Nginx

Une fois que toutes les étapes préliminaires sont franchies, nous pouvons maintenant mettre en place Nginx :

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install nginx

Cet ensemble de commandes vous permettra de configurer la version par défaut de Nginx fournie par la source principale du logiciel de votre distribution. Si vous souhaitez mettre en place une version plus à jour, n’hésitez pas à compiler Nginx à partir des sources ou ajouter les dépôts de Nginx à votre liste de sources.

3. Configurez Nginx

Nous allons maintenant configurer Nginx avec SSL/TLS activé, pour plus de sécurité. Par conséquent, nous devons commencer par configurer les paramètres DH pour Nginx en utilisant OpenSSL :

openssl dhparam -out /etc/nginx/dhparam.pem 2048

3.1 Le fichier de configuration principal

Une fois cela fait, nous pouvons maintenant configurer le fichier de configuration principal /etc/nginx/nginx/nginx.conf. Ci-dessous, vous verrez une configuration que nous avons écrite, et que vous pouvez utiliser pour remplacer celle que nous avons déjà écrite ici.

user www-data;
pid /run/nginx.pid;
worker_processes auto;
worker_rlimit_nofile 65535;

events {
	multi_accept on;
	worker_connections 65535;
}

http {
	charset utf-8;
	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	server_tokens off;
	log_not_found off;
	types_hash_max_size 2048;
	client_max_body_size 16M;
	keepalive_timeout 65;

	include mime.types;
	default_type application/octet-stream;

	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log warn;

	ssl_session_timeout 1d;
	ssl_session_cache shared:SSL:50m;
	ssl_session_tickets off;

	ssl_dhparam /etc/nginx/dhparam.pem;

    	ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
   	ssl_prefer_server_ciphers on;

	ssl_stapling on;
	ssl_stapling_verify on;
	resolver 8.8.8.8 8.8.4.4 208.67.222.222 208.67.220.220 valid=60s;
	resolver_timeout 2s;

	include /etc/nginx/conf.d/*.conf;
	include /etc/nginx/sites-enabled/*;
}

Vous devrez peut-être supprimer TLSv1.3 de la ligne ssl_protocols si votre version d’OpenSSL ne le supporte pas.

3.2 Le fichier des paramètres généraux

Ce fichier définit tous les en-têtes nécessaires d’un site régulier. Il doit toujours être inclus dans un fichier de configuration de site en utilisant la directive include, mais jamais dans un bloc http. Il se définit dans le fichier /etc/nginx/_general.conf

# security headers
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Content-Security-Policy "default-src * data: 'unsafe-eval' 'unsafe-inline'" always;
#add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

# . files
location ~ /\. {
	deny all;
}

# assets, media
location ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ {
	expires 7d;
	access_log off;
}

# svg, fonts
location ~* \.(?:svgz?|ttf|ttc|otf|eot|woff|woff2)$ {
	add_header Access-Control-Allow-Origin "*";
	expires 7d;
	access_log off;
}

# gzip
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml application/json application/javascript application/xml+rss application/atom+xml image/svg+xml;

Ce fichier ne doit pas être utilisé pour les paramètres FastCGI ou les en-têtes de proxy.

3.3 La configuration FastCGI

C’est une étape critique pour supporter les sites dynamiques, en particulier en langage PHP. Il se définit dans /etc/nginx/fastcgi.conf


fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
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  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;

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;

4. Configuration des sites.

Vous verrez maintenant de nombreux cas sous différents scénarios et donc différentes configurations.

4.1 Un site statique simple

Nginx est le serveur web le plus rapide pour les fichiers statiques, il est beaucoup plus rapide qu’Apache et utilise moins de ressources système. Maintenant, pour créer un fichier statique sur Nginx, vous devez créer un nouveau fichier sous /etc/nginx/sites-available/ et définir :

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name www.example.com;
    root /var/www/html/example.com/;
    index index.html index.htm;
    ssl_certificate /var/ssl/example.com/certificate.crt;
    ssl_certificate_key /var/ssl/example.com/private.key;
	add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
    include _general.conf;
}

server {
    listen 80;
    listen [::]:80;
    server_name www.example.com example.com;
    return 301 https://$host$request_uri;
}

Remplacez-les par les valeurs appropriées si nécessaire. Dans ce cas, un serveur SSL/TLS est configuré et la version HTTP normale est redirigée vers la version HTTPS. La racine du document est /var/www/html/example.com.

Pour le certificat SSL/TLS pour HTTPS, il vous suffit de le configurer dans le répertoire de la directive ssl_certificate. Dans notre exemple, il doit y avoir deux fichiers dans ce répertoire : un fichier .crt qui doit contenir le certificat du site et les chaînes de confiance éventuelles, et un fichier private.key qui doit contenir votre clé privée.

Il existe de nombreuses autorités de certification que vous pouvez utiliser pour obtenir votre certificat, y compris Let’s Encrypt, Buypass et TrustAsia (les gratuits) ou Comodo, DigiCert, GoDaddy (les payants).

Si vous ne voulez vraiment pas de sécurité avec votre site web, voici une configuration alternative :

server {
        listen 80;
        listen [::]:80;
        server_name www.example.com example.com.com;
        include _general.conf;
        root /var/www/html/example.com/;
}

Nous ne recommandons pas cette pratique en raison de la falsification des données et de l’écoute clandestine.

4.2 Proxy inverse

Nginx est le meilleur serveur web reverse proxy du marché. Il est particulièrement utile lorsqu’une application n’écoute sur un autre port HTTP que GitLab-unicorn ou Gogs, et que vous souhaitez le faire sur les ports réguliers 80 et 443, avec HTTPS pour chiffrer les communications. Vous devez ensuite créer un nouveau fichier sous /etc/nginx/sites-available/ et ajouter :

# Example configuration for a Git platform, replace the values!
server {

    listen 80;
    server_name example.com;
    
    return 301 https://$server_name$request_uri;
    
    location / {
        proxy_pass http://localhost:3000;
		proxy_set_header Host $host
    }


}

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /var/ssl/example.com/certificate.crt;
    ssl_certificate_key /var/ssl/example.com/private.key;


    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_pass http://localhost:3000;
		proxy_set_header Host $host
    }

}

# You may also reuse the try_files directive if static files in the reverse proxy are NOT loaded.

4.3 Sites dynamiques

Voici un exemple de configuration que vous pouvez utiliser pour les sites dynamiques qui utilisent FastCGI :

server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
	
        server_name www.example.com;
	root /var/www/html/example.com/;
	
	index index.php;
	location / {
		try_files $uri $uri/ /index.php?$query_string;
	}
	location ~ \.php$ {
		include fastcgi.conf;
	}
	include _general.conf;


	# SSL
        ssl on;
        ssl_certificate /var/ssl/example.com/certificate.crt;
        ssl_certificate_key /var/ssl/example.com/private.key;
        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
        include _general.conf;
}

# Redirige le domaine apex vers sa version www. Vous pouvez aussi faire le contraire, et vous pouvez aussi le faire dans n'importe quel autre bloc et pour n'importe quel site, pas seulement les sites dynamiques.
server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;

        server_name example.com;

        # SSL
        ssl on;
        ssl_certificate /var/ssl/example.com/certificate.crt;
        ssl_certificate_key /var/ssl/example.com/private.key;
        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
        return 301 https://$host$request_uri;
}

# Redirect HTTP to HTTPS
server {
        listen 80;
        listen [::]:80;

        server_name www.example.com example.com;

        return 301 https://$host$request_uri;
}

4.4 Etapes générales après la configuration

Une fois tout cela fait, vous devez créer un lien symbolique entre votre fichier dans /etc/nginx/sites-available/ et un nouveau fichier du même nom dans /etc/nginx/sites-enabled. Après cela, n’hésitez pas à tester votre configuration à l’aide de :

sudo nginx -t

Et si le test réussit, vous pouvez redémarrer Nginx avec:

sudo systemctl restart nginx

Félicitations ! Votre site Web fonctionne maintenant.

5. Commencez à créer votre site web

Vous devez maintenant commencer à créer votre site Web dans la racine du document que vous avez spécifiée. En fonction de vos besoins, vous pouvez réaliser un site dynamique, un site statique, une application web derrière un reverse proxy…. Vous aurez peut-être besoin de configurer d’autres outils comme MySQL cependant.


Publié par Rémy Samkocwa