Configuration Nginx
Guide complet de configuration Nginx pour FeedbackPulse SaaS.
Prérequis
- Nginx 1.18+
- PHP-FPM 8.4+
- Certificat SSL (recommandé)
Bloc serveur de base
Créez une nouvelle configuration Nginx :
sudo nano /etc/nginx/sites-available/feedbackpulse
Collez le contenu suivant :
server {
listen 80;
listen [::]:80;
server_name yourdomain.com www.yourdomain.com;
root /var/www/feedbackpulse-saas/public;
index index.php index.html;
charset utf-8;
# Réécriture d'URL Laravel
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# Traitement PHP
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_hide_header X-Powered-By;
}
# Refuser l'accès aux fichiers cachés
location ~ /\.(?!well-known).* {
deny all;
}
# Mise en cache des fichiers statiques
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
# Taille maximale d'upload (pour les photos, logos)
client_max_body_size 20M;
# Journaux
access_log /var/log/nginx/feedbackpulse-access.log;
error_log /var/log/nginx/feedbackpulse-error.log;
}
Activez le site :
sudo ln -s /etc/nginx/sites-available/feedbackpulse /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default # Supprimer le site par défaut (optionnel)
sudo nginx -t # Tester la configuration
sudo systemctl restart nginx
Bloc serveur HTTPS (avec Let's Encrypt)
# Redirection HTTP vers HTTPS
server {
listen 80;
listen [::]:80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://yourdomain.com$request_uri;
}
# Serveur HTTPS principal
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name yourdomain.com www.yourdomain.com;
root /var/www/feedbackpulse-saas/public;
index index.php index.html;
charset utf-8;
# Configuration SSL
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# En-têtes de sécurité
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# Réécriture d'URL Laravel
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# Traitement PHP
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_hide_header X-Powered-By;
fastcgi_read_timeout 300;
}
# Refuser l'accès aux fichiers cachés (sauf .well-known pour ACME)
location ~ /\.(?!well-known).* {
deny all;
}
# Mise en cache des fichiers statiques
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
client_max_body_size 20M;
access_log /var/log/nginx/feedbackpulse-access.log;
error_log /var/log/nginx/feedbackpulse-error.log;
}
Support des sous-domaines génériques
Pour les sous-domaines locataires comme acme.yourdomain.com :
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name yourdomain.com *.yourdomain.com;
root /var/www/feedbackpulse-saas/public;
# Utiliser un certificat SSL générique
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
# ... reste de la configuration identique au bloc HTTPS ci-dessus ...
index index.php index.html;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_hide_header X-Powered-By;
}
location ~ /\.(?!well-known).* {
deny all;
}
client_max_body_size 20M;
}
Requis : Enregistrement DNS générique + certificat SSL générique. Voir Configuration DNS Wildcard.
Configuration PHP-FPM
Optimisez PHP-FPM pour FeedbackPulse :
sudo nano /etc/php/8.4/fpm/pool.d/www.conf
Paramètres clés :
; Gestion des processus
pm = dynamic
pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 10
pm.max_requests = 500
; Délais d'expiration
request_terminate_timeout = 300
; Limites d'upload
php_admin_value[upload_max_filesize] = 20M
php_admin_value[post_max_size] = 25M
php_admin_value[memory_limit] = 256M
Redémarrez PHP-FPM :
sudo systemctl restart php8.4-fpm
Laravel Forge / Ploi / RunCloud
Si vous utilisez un fournisseur de serveur géré :
Laravel Forge
- Créez un nouveau site avec le domaine
yourdomain.com - Définissez le Répertoire web sur
/public - Déployez votre code (Git ou téléversement)
- Forge configure automatiquement Nginx correctement
- Activez SSL via l'onglet "SSL" (Let's Encrypt)
Ploi
- Ajoutez un nouveau site → saisissez votre domaine
- Définissez la racine sur
/public - Déployez le code
- SSL est configuré automatiquement
RunCloud
- Créez une application web → sélectionnez "PHP" → saisissez le domaine
- Définissez le chemin public sur
public - Déployez via Git ou le gestionnaire de fichiers
- Activez SSL
Vérifier la configuration Nginx
# Tester la syntaxe
sudo nginx -t
# Vérifier si PHP-FPM fonctionne
sudo systemctl status php8.4-fpm
# Vérifier si Nginx fonctionne
sudo systemctl status nginx
# Vérifier quel socket PHP-FPM est utilisé
ls /var/run/php/
# Tout redémarrer
sudo systemctl restart php8.4-fpm nginx
Problèmes Nginx courants
| Problème | Solution |
|---|---|
| 502 Bad Gateway | PHP-FPM ne fonctionne pas ou le chemin du socket est incorrect. Vérifiez que fastcgi_pass correspond à votre socket PHP-FPM. |
| 404 sur toutes les routes | try_files $uri $uri/ /index.php?$query_string; manquant dans le bloc location. |
| 413 Request Entity Too Large | Augmentez client_max_body_size (la valeur par défaut est 1M). |
| "File not found" | Vérifiez que root pointe vers le répertoire public/ et que $realpath_root est utilisé dans SCRIPT_FILENAME. |
| Page blanche | Consultez storage/logs/laravel.log et /var/log/nginx/feedbackpulse-error.log. |