Comment créer un serveur web Nginx : Différence entre versions
(→Installation de PhpMyAdmin) |
(→Configuration php5-fpm) |
||
| Ligne 97 : | Ligne 97 : | ||
'''NOTE''': On sauvegarde dans un emplacement différent pour que Nginx ne le charge pas ce qui évitera des conflits inutiles. | '''NOTE''': On sauvegarde dans un emplacement différent pour que Nginx ne le charge pas ce qui évitera des conflits inutiles. | ||
| − | <code>cp /etc/nginx/default | + | <code>cp /etc/nginx/sites-enabled/default /etc/nginx/default</code><br /> |
On édite le fichier :<br /> | On édite le fichier :<br /> | ||
Version du 6 mai 2015 à 12:03
Sommaire
Introduction
| |
| Ce tutoriel n'est pas destiné aux administrateurs ayant installé un serveur lampp ! |
Ce Tutoriel a été réalisé afin de vous montrez comment créer un serveur web avec nginx, php, mysql et phpmyadmin.
Au final vous pourrez installer votre site web, cms etc...
Il faut savoir que ce tutoriel est destiné aux utilisateurs ayant quelques bases sur l'utilisation de Linux et ses dérivés.
| Note | |
|---|---|
C'est une configuration type basé sur ce que j'ai trouvé sur la toile donc à vous de tester et de peaufiner la configuration de Nginx pour obtenir le meilleur de votre serveur web. | |
Requis
Connecter vous en ROOT via puTTY.
Nous allons utiliser les dépôts DotDeb pour avoir une version de Nginx à jour.
Comme toujours, nous procédons à une sauvegarde du fichier :
cp /etc/apt/sources.list{,.defaut}
nano /etc/apt/sources.list
Ajouter à la fin :
deb http://packages.dotdeb.org wheezy all
deb-src http://packages.dotdeb.org wheezy all
Si vous souhaitez avoir php 5.5, ajouter ceci à la suite :
deb http://packages.dotdeb.org wheezy-php55 all
deb-src http://packages.dotdeb.org wheezy-php55 all
Faite CTRL + X puis O pour sauvegarder la modification.
Maintenant, on ajoute la clé :
wget http://www.dotdeb.org/dotdeb.gpg
cat dotdeb.gpg | apt-key add -
Cela nous retourne :
OK
On met à jour :
aptitude update && aptitude upgrade
Installation nginx
aptitude install nginx php5-fpm php-apc
On vérifie que tout fonctionne, dans votre navigateur, taper http://votre_ip_ou_domaine.fr
Vous devriez voir :
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.
For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.
Thank you for using nginx.
Dans ce tutoriel, nous installons le minimum mais vous pouvez inclure les modules php que vous souhaitez, voici une petite liste parmi les plus utilisés :
php5-curl php5-intl php-pear php5-imagick php5-imap php5-memcache php5-memcached php5-ming php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl memcached
Vérification de la version de Nginx :
nginx -V
Configuration Nginx
Voici ce qu'il faut savoir sur les différentes configuration :
- nginx.conf: C'est le fichier de configuration du serveur, c'est ici que tout se jouera sur la stabilité de votre serveur hormis votre machine bien entendu.
- sites-available: Fichier de configuration pour les vhosts qui par défaut sont ignoré par Nginx.
- sites-enabled: C'est un lien symbolique du fichier de configuration qui sera dans sites-available
- conf.d : Utilisé pour faire une configuration commun aux divers sites, pour désactiver un fichier .conf, il faudra le renommer en .disabled.
Configuration php5-fpm
Sauvegarde :
NOTE: On sauvegarde dans un emplacement différent pour que Nginx ne le charge pas ce qui évitera des conflits inutiles.
cp /etc/nginx/sites-enabled/default /etc/nginx/default
On édite le fichier :
nano /etc/nginx/sites-enabled/default
Chercher :
#location ~ \.php$ {
# fastcgi_split_path_info ^(.+\.php)(/.+)$;
# # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
#
# # With php5-cgi alone:
# fastcgi_pass 127.0.0.1:9000;
# # With php5-fpm:
# fastcgi_pass unix:/var/run/php5-fpm.sock;
# fastcgi_index index.php;
# include fastcgi_params;
#}
Remplacer par :
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
With php5-cgi alone:
#fastcgi_pass 127.0.0.1:9000;
# With php5-fpm:
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
include fastcgi_params;
}
On active la redirection en cas d'erreur de type 50X :
Chercher :
#error_page 500 502 503 504 /50x.html;
#location = /50x.html {
#root /usr/share/nginx/html;
#}
Remplacer par :
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
ensuite, on interdit la lecture des fichirs .htaccess :
Chercher :
#location ~ /\.ht {
# deny all;
#}
Remplacer par :
location ~ /\.ht {
deny all;
}
On ajoute la lecture des fichiers de type *.php.
Chercher index index.html index.htm;, ajouter après index.htm et avant ; :
index.php
Ceci doit ressembler à :
index index.html index.htm index.php;
On ajoute un système de cache pour les fichiers dit statique (images, css, js etc...), soit on l'intègre en dur dans la configuration soit on créer notre propre configuration (ce qui en fera l'objet ici) :
nano /etc/nginx/conf.d/nginx-caches.conf
server {
location ~* \.(?:rss|atom)$ {
expires 1h;
add_header Cache-Control "public";
}
location ~* \.(?:jpg|jpeg|gif|png|ico|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {
expires 1M; # ou mettre la valeur à max si vous le souhaiter
access_log off;
add_header Cache-Control "public";
try_files $uri $uri/ @rewrite;
gzip off;
}
location ~* \.(jpg|jpe?g|gif|png|ico|html|xml)$ {
access_log off;
expires 30d;
}
location ~* \.(mp3|wav)$ {
expires 1y;
access_log off;
gzip off;
}
location ~* \.(css)$ {
expires 1d;
access_log off;
}
location ~* \.(js)$ {
access_log off;
log_not_found off;
expires 7d;
}
location = /favicon.ico {
access_log off;
return 204;
}
location ~ /\.ht {
deny all;
}
}
On déclare notre fichier nginx-caches.conf :
nano /etc/nginx/nginx.conf
Chercher :
include /etc/nginx/sites-enabled/*;
Ajouter après :
## caches nginx
include /etc/nginx/conf.d/nginx-caches.conf;
Pour vous protéger des flood http, vous pouvez ajoutez ceci dans votre configuration :
Sauvegarde :
cp /etc/nginx/nginx.conf{,.origine}
nano /etc/nginx/nginx.conf
Chercher :
worker_processes 4;
Remplacer par :
worker_processes 1; #ou mettre la valeur en auto, egale a la valeur du nombre de processeur
Chercher :
worker_processes 1;
Ajouter après :
worker_priority -10; # priorite donne a nginx par le systeme
worker_rlimit_nofile 50000;
Dans le block events { :
Chercher :
worker_connections 768;
Remplacer par :
worker_connections 1024; use epoll;
Dans le block http { :
Cette étape regroupe plusieurs modifications donc soyez vigilant !
Chercher :
# Basic Settings ##
Ajouter et/ou Remplacer par :
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=5r/s;
connection_pool_size 256;
request_pool_size 4k;
## Start: Size Limits & Buffer Overflows ##
client_body_buffer_size 1K;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;
## END: Size Limits & Buffer Overflows ##
keepalive_requests 100000;
server_tokens off;
server_names_hash_bucket_size 64;
## Start: Timeouts ##
client_body_timeout 10;
client_header_timeout 10;
keepalive_timeout 5 5;
send_timeout 10;
## End: Timeouts ##
output_buffers 1 32k;
postpone_output 1460;
types_hash_max_size 2048;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+$
On peut définir error_log ce qui prendra en compte uniquement les erreurs critiques :
error_log /var/log/nginx/error.log crit;
Vous pouver également désactiver la variable access_log si vous souhaiter avoir de meilleur performance, ceci aura pour effet de ne plus sauvegarder les informations de vos visiteurs :
Chercher :
access_log /var/log/nginx/access.log;
Remplacer par :
- access_log /var/log/nginx/access.log;
Chercher include /etc/nginx/sites-enabled/*; :
Ajouter après :
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=5r/s;
server {
limit_conn conn_limit_per_ip 10;
limit_req zone=req_limit_per_ip burst=10 nodelay;
}
Faite CTRL + X puis O pour sauvegarder la modification.
Maintenant, éditons le fichier php.ini :
Sauvegarde :
cp /etc/php5/fpm/php.ini{,.origine}
nano /etc/php5/fpm/php.ini
Chercher (Ligne 754) :
;cgi.fix_pathinfo=1
Remplacer par :
cgi.fix_pathinfo=0
Avant de redémarer, on peut vérifier que la configuration est correcte :
nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
</blocquote>
On redémarre Nginx et php5-fpm :
service php5-fpm restart
service nginx restart
Vérifions que le module apc soit bien chargé :
nano /usr/share/nginx/html/info.php
Ajouter :
echo "<?php phpinfo(); ?>" >> /usr/share/nginx/html/info.php
Faite CTRL + X puis O pour sauvegarder la modification.
Dans votre navigateur, taper http://votre_ip_ou_domaine.fr/info.php
Sous Firefox, appuyer sur CTRL + F et taper apc puis Entrée et vous devriez trouver :
APC SupportConfiguration fcgiwrap
Vous devez avoir Nginx d'installé avant de commencer !
Installation et configuration de fcgiwrap.
aptitude install fcgiwrap
![]()
cp /usr/share/doc/fcgiwrap/examples/nginx.conf /etc/nginx/fcgiwrap.conf
Sauvegarde :
cp /etc/php5/fpm/pool.d/www.conf{,.origine}On édite le fichier www.conf:
nano /etc/php5/fpm/pool.d/www.confChercher :
listen = /var/run/php5-fpm.sockRemplacer par :
listen = 127.0.0.1:9000On édite notre virtualhost:
nano /etc/nginx/sites-enabled/defaultChercher :
# fastcgi_pass 127.0.0.1:9000;Remplacer par :
fastcgi_pass 127.0.0.1:9000;Chercher :
fastcgi_pass unix:/var/run/php5-fpm.sock;Remplacer par :
# fastcgi_pass unix:/var/run/php5-fpm.sock;On copie le fichier de configuration dans le répertoire de Nginx :
![]()
cp /usr/share/doc/fcgiwrap/examples/nginx.conf /etc/nginx/fcgiwrap.conf
Maintenant on vas déclarer la prise en compte des fichiers de type .cgi.
On édite notre virtualhost:
nano /etc/nginx/sites-enabled/defaultAvant # deny access to .htaccess, ajouter :
location /cgi-bin/ {
# Disable gzip (it makes scripts feel slower since they have to complete
# before getting gzipped)
gzip off;
# Set the root to /usr/lib (inside this location this means that we are
# giving access to the files under /usr/lib/cgi-bin)
root /usr/share/nginx/html;
# Fastcgi socket
fastcgi_pass unix:/var/run/fcgiwrap.socket;
# Fastcgi parameters, include the standard ones
include /etc/nginx/fastcgi_params;
# Adjust non standard parameters (SCRIPT_FILENAME)
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
Faite CTRL + X puis O pour sauvegarder la modification.
On vérifie que tout est ok:
nginx -tnginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Création du répertoire cgi-bin:
mkdir -p /usr/share/nginx/html/cgi-binOn créer un fichier test.cgi :
nano /usr/share/nginx/html/cgi-bin/test.cgi
#!/usr/bin/perl -w
# Tell perl to send a html header.
print "<body>
# So your browser gets the output
# rather then <stdout>(command line
# on the server.)
print "Content-type: text/html\n\n";
# print your basic html tags.
# and the content of them.
print "<html><head><title>Hello World!! </title></head>\n";Hello world
</body></html>\n";Faite CTRL + X puis O pour sauvegarder la modification.
chmod 755 /usr/share/nginx/html/cgi-bin/test.cgi
On recharge et redémarre nginx ainsi que php-fpm:
/etc/init.d/nginx reload
/etc/init.d/php5-fpm restart
/etc/init.d/nginx restart
Installation du serveur MySQL
aptitude install mysql-server-5.5 php5-mysqlMettez un mot de passe puis confirmer celui-ci et la configuration sera terminée.
Définisser un mot de passe pour le compte administrateur ROOT de MySQL.
On installe les tables Mysql:
A exécuter en root :
mysql_install_dbIl faudra créer un utilisateur, n'oublier pas qu'on a choisis de ne pas utiliser la base de donnée de phpmyadmin (dbconfig-common) :
A exécuter en root :
mysql -paprès :
use mysql;ensuite :
NOTE: Penser à modifier votreutilisateur avant de copier/coller...
GRANT ALL PRIVILEGES ON *.* TO votreutilisateur@localhost IDENTIFIED BY 'votre_mot_de_passe' WITH GRANT OPTION;
flush privileges;
exit
Concernant l'étape ci-dessous, nous vous recommandons de répondre y à ces questions :
* Remove anonymous users, * Remove test database and access to itAprès, ce n'est qu'une recommandations, vous faites comme bon vous semble. ;)
On peut sécuriser MySQL en exécutant :
/usr/bin/mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MySQL to secure it, we'll need the current
password for the root user. If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none):
OK, successfully used password, moving on...
Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.
You already have a root password set, so you can safely answer 'n'.
Change the root password? [Y/n] n
... skipping.
By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] y
... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] n
... skipping.
By default, MySQL comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] y
- Dropping test database...
... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] y
... Success!
Cleaning up...
All done! If you've completed all of the above steps, your MySQL
installation should now be secure.
Thanks for using MySQL!
Installation de PhpMyAdmin
aptitude install phpmyadminLors de la question Serveur web à reconfigurer automatiquement, ne rien sélectionner et appuyez sur Entrée.
A la questionFaut-il configurer la base de données de phpmyadmin avec │ │ dbconfig-common, répondre Oui.On créer un lien symbolique:
ln -s /usr/share/phpmyadmin /usr/share/nginx/htmlOn redémarre Nginx :
service nginx restartA ce stade tout est prêt, vous pouvez accéder a votre base de donnée via http://votre-site.com/phpmyadmin.
Création d'une base de donnée
Accéder à PhpMyAdmin avec votre navigateur.
http://votredomaine.net/phpmyadmin
Hotlinking
Je vous conseil fortement de mettre en place cette astuce si votre bande passante est limitée, ceci empêchera tout webmaster de prendre le lien de vos images.
Deux exemples, bien entendu, vous pouvez modifier cet exemple:
location ~ .(gif|png|jpe?g|tga|bmp)$ { valid_referers none blocked .nomdudomaine.com; if ($invalid_referer) { return 403; } }Ici, le "voleur" aura une joli erreur 403.
Vous pouvez également effectuer une redirection avec le module rewrite.
Placer l'image de votre choix dans votre FTP puis insérer ce code dans votre vhost :
location ~ .(gif|png|jpe?g|tga|bmp)$ { valid_referers none blocked .nomdudomaine.com; if ($invalid_referer) { rewrite (.*)\.(jpg|jpeg|png|gif)$ http://nomdudomaine.com/chemin_de_votre_images/no-hotlink.jpg; } }
Ici, le "voleur" aura votre image qui s'affichera sur son site à la place de l'image.
Protéger un répertoire ?
Il nous faudra installer l'outil d'apache :
aptitude install apache2-utilsCréation du fichier .htpasswd dans le dossier test
htpasswd -c /usr/share/nginx/html/test/.htpasswd free4funsNew password: Re-type new password: Adding password for user free4funs
On déclare à nginx :
nano /etc/nginx/sites-enabled/defaultA ajouter dans le block server { :
location /test {
index index.html index.htm index.php;
auth_basic "Accès Restreint !";
auth_basic_user_file /usr/share/nginx/html/test/.htpasswd;
autoindex on; #Affiche l'index du dossier si aucun fichier, a retirer si vous voulez cacher vos fichiers
}
On redémarre Nginx :
service nginx restartMaintenant, dans votre navigateur, essayer d'entrer dans votre dossier :
et si vous n'indiquez pas le bon identifiant :
URL rewriting
Nous n'allons pas expliquer en détails mais vous montrez quelques exemples de réécriture d'URL.
Créer une page test.html avec un peu de contenu :
<html><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Test rewrite Nginx</title> </head> <body> Test du module rewrite </body></html>
Maintenant, éditons notre vhost :
nano /etc/nginx/sites-enabled/defaultAjouter après server { :
location /trouver { rewrite ^/trouver\.html$ /test.html break; }Sauvegarder la modification puis redémarrer nginx.
Maintenant, dans votre navigateur, entrer votredomaine.net/trouver.html
Il devrait afficher Test du module rewrite. Si toutefois, cela ne fonctionnais pas, vider le cache du navigateur et actualiser la page.
EN COURS D'ÉDITION...
F.A.Q
Q J'ai l'erreur 24: Too many open files, que faire ?
R Vous devez augmenter la valeur worker_rlimit_nofile en conséquence.
Q Vous avez un problème lors de l'upload d'un fichier ?
R Si vous avez modifié upload_max_filesize et post_max_size dans php, il vous faudra augmenter la variable client_max_body_size;
Q J'ai l'erreur Headers and client library minor version mismatch, que faire ?
R Vous devez installer le paquet php5-mysqlnd Source.
R Siege, Weighttp et bien d'autres présent sur la toile.
Q Comment tester les performances de Nginx ?



