Apache

Créer un virtual host avec Apache

Créer un virtual host avec Apache avec WAMP

Qu’est ce qu’un virtual host?

Les virtual hosts ne sont pas seulement sur votre poste de développement, ils sont utilisé dans les environnements de production, ainsi votre site qui est accessible via un nom de domaine, et qui est hébergé sur un hébergement mutualisé par exemple, tournent dans un virtual host.

Pourquoi est-il intéressant de faire un virtualhost?

Comment configurer un virtual host avec Apache?

Apache est l’un des serveurs web les plus populaires au monde, et la création de virtual hosts est une fonctionnalité puissante qui permet de servir plusieurs sites web à partir d’un seul serveur. Dans cet article, nous allons vous guider à travers le processus de création d’un virtual host sur un système Windows utilisant Apache.

Il y a le fichier httpd.conf, qui est le fichier de configuration d’Apache. Ce fichier contient les inclusions d’autres fichiers .conf pour ne pas alourdir le fichier principal. Et vous verrez souvent qu’il y a un fichier httpd-vhost.conf, un par fichier virtual host.

Les principales directives Apaches

<VirtualHost *:80>
    ServerAdmin webmaster@monsite.local
    DocumentRoot "chemin/vers/votre/site"
    ServerName monsite.local
    ErrorLog "logs/monsite-error.log"
    CustomLog "logs/monsite-access.log" common
</VirtualHost>

DocumentRoot « chemin/vers/votre/site » cette ligne indique où se trouvent les fichiers qui propulsent le site web, et c’est la racine. Du coup vous pouvez le placer n’importe où. Apache se charge de rediriger la requête HTTP au bon endroit.

Ce virtualhost écoute sur le port 80, pour les https, vous devez faire une seconde directive VirtualHost avec le port 443.

ServerAdmin est l’email du webmaster, vous n’êtes pas obligé de l’indiquer.

ServerName est LA directive importante, puisque c’est le nom de domaine, vous pouvez avoir plusieurs noms de domaine qui pointent vers la même racine. Ainci en ajoutant via la directive ServerAlias seconddomaine.com, vous créez un second mapping nom de domaine <-> répertoire.

ErrorLog et CustomLog pointent vers les fichiers de journalisation, qui sont important du point de vue administration, puisque vous pouvez voir toutes les requêtes HTTP et les erreur PHP (si vous codez en PHP). Le fichier ErrorLog peut vous aider en dernier recours à débugger vos scripts. Pour en savoir plus sur les logs Apache.

Vous vous souvenez vous du fichier .htaccess?, il vous permet de surcharger votre fichier httpd.conf même quand vous n’avez pas les droits d’accès sur le fichier httpd.conf (souvent le cas)

Après avoir configuré avec succès votre virtualhost, vous pouvez le partager en local ou en global avec Ngrok sur internet même si votre site n’est que sur votre ordinateur.

A chaque fois que vous faites des modification de fichier .conf, il faut reloader Apache (redémarrer pour être plus sûr, mais normalement reloader suffit.

sudo /etc/init.d/apache2 reload
serveur web apache php

Les redirections web dans le fichier .htaccess

Deux façons de faire des redirections

Si vous voulez faire une redirection avec un fichier htaccess, il existe en gros deux façons de le faire, Redirect et RedirectMatch, qui ne vous permettent pas d’utiliser des expressions régulières, et RewriteRule qui vous permet d’utiliser les expressions régulières et de le faire plus finement (non détaillé ici).

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Redirection sans le module mod_rewrite

Comment faire une redirection 301 dans le .htaccess?

Lorsque vous ne voyez pas la directive RewriteEngine On dans le fichier .htaccess, vous ne pouvez pas faire de règle de redirection. La directive RewriteEngine On est utilisé dans une installation WordPress pour la réécriture d’url. En général il se présente comme suit :

Le plus souvent c’est utilisé pour faire des jolies urls, mais il permet de faire des réécritures d’url, des redirections, erreurs 404 etc. Si vous voulez faire une redirection 301 en dehors de ce snippet, vous devez utiliser une autre syntaxe. Comme nous allons voir ci-après :

#une url en particulier
Redirect 301 /ancienne_url     http://monsite.com/new_url
# url commençant par /blog
RedirectMatch 301 ^/blog  

Dans la première partie on ne mentionne pas le nom de domaine, mais la partie qui est juste après. La syntaxe est intuitive, on fait une redirection 301 point.

Comment gérer les erreurs 404 dans le .htaccess?

Ici pareillement on change le code de redirection, 404.html est une page qui va être affiché en cas d’erreur 404 :

ErrorDocument 404 /404.html

Les pages supprimées définitivement avec 410 « Gone »

Si vous avez une page que vous ne voulez plus dans l’index de Google et vous ne voulez plus que Google la crawle pour la réindexer, vous devez renvoyer un code HTTP 410 « Gone », la page n’est plus là et elle ne doit plus être considérées. Cependant avec Google en particulier, il faut veiller à ce qu’il n’y ait aucun lien interne ou externe au site qui pointe vers cette page.

#il faut ajouter cette ligne si vous voulez personnaliser le message (optionnel)
ErrorDocument 410 "Gone"
Redirect 410 /busai/

#Redirect avec expression régulière pour les urls commençant par /blog (on commence après le nom de domaine)
RedirectMatch 410 ^/blog
RedirectMatch 410 html$

Les redirections avec le module mod_rewrite

#exemple avec WordPress
ErrorDocument 404 /404.html

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

#Redirection 301
RewriteRule ^(.*)  http://www.domaine.com/$1   [QSA,L,R=301]

# Redirection 410, notez la grande variété des règles, c que nous permet le module mod_rewrite
# le [G] correspond au 410 
RewriteRule \.html - [G]

RewriteCond %{QUERY_STRING} add-to-cart
RewriteRule (.*) - [G]
RewriteCond %{REQUEST_URI} ^/debut_url
RewriteRule (.*) - [G]

#suite du fichier htaccess standar WordPress
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Redirection 410 dans Htaccess

Voici comment faire une redirection 410 dans le fichier htaccess. La redirection 410 c’est pour indiquer que la page n’existe plus, à al différence de la page 404, qui est introuvable, donc pas spécifiée comme à effacer de l’index des moteurs de recherche.

Cette recette est utilie lorsque dans l’onglet « Couverture » de Google Search Console, vous avez une masse d’url que Google crawle sans arrêt. La massse noire d’url peut être néfaste pour le référencement de votre site.

Le fichier Htaccess

La règle s’écrit avec RewriteRule, avec le flag [G] voir le Guide de référence des flags de Apache. Ce flag permet d’envoyer un 410 Gone, la page est partie en clair.

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule \.html - [G]

RewriteCond %{QUERY_STRING} add-to-cart
RewriteRule (.*) - [G]

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

Dans l’exemple ci-dessus, toutes les urls qui se terminent pat .html vont renvoyer une header 410. La seconde règle un peu plus complexe va exécuter l’envoi du header 410 si dans la partie Query string de l’url, nous avons la chaine « add-to-cart », en fait Google a la facheuse tendance à tout indexer, même le panier !

Notez le tiret avant le flag.

Mettre en place l’authentification basique HTTP

Sur ‘importe quel site web, vous pouvez mettre en place un système de login très simple sans recours à du HTML et du code PHP, cela s’appelle l’authentification basique HTTP. Il suffit de mettre dans un fichier .htaccess le code suivant :

AuthType Basic
AuthName "Restricted Content"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user

Apache logs, et Logrotate

Qu’est ce que c’est que les logs Apache?

 

Les logs ou fichiers de journalisation en français sont des fichiers texte qui enregistrentent des événements d’une application. On enregistre les événement de type erreur dans les errors log, les événement de démarrage (bootlog), et d’autres dans des fichiers plus spécifiques.

Dans le cas de notre serveur Apache, nous avons les logs des visites sur notre site web.

Qu’est ce qu’on enregistre comme information dans les visites sur Apache?

Il y a deux types de visiteurs,  les visiteurs humains et les robots des moteurs de recherche (et parfois d’autres robots de services plus spécifique).

Vous pouvez paramétrer ce que vous enregistrez dans les logs, dans le dossier de configuration httpd.conf, deux types de logs sont proposés, combined et common.

Voici un extrait :

LogFormat « %h %l %u %t \ »%r\ » %>s %b \ »%{Referer}i\ » \ »%{User-Agent}i\ » » combined
LogFormat « %h %l %u %t \ »%r\ » %>s %b » common

Une fois que les logs sont paramétrés, il faut indiquer lequel vous voulez utiliser, le combined ou le common.

C’est avec la direective CustomLog :

CustomLog « c:/wamp/logs/access.log » combined

 

Pour les sites web en général, on utilise la combined, ce dernier a la particularité d’enregistrer le Refere (qui est le site web d’origine de la visite juste avant sur votre site web), et le user agent qui donne le type de logiciel qui vous rend visite (un navigateur classique comme Firefox, Chrome pour un humain, et si c’est un moteur de recherche, vous aurez un nom de bot).

Attention aux fichiers de logs Apache qui grossissent !

Chaque visite sur votre site génère une ou plusieurs lignes de texte, et le fichiers peut grossir très vite en fonction de  l’audience de votre site web. Et quand le fichier atteint plusieurs giga octets, c’est problématique.  La solution c’est de générer un  nouveau fichier régulièrement pour éviter ce problème. Par exemple on peut généer un nouveau fichier toutes les semaine, ou tous les jours, afin d’avoir des fichiers d’une taille raisonnable.

Pour ce faire on déclarer une « rotation » des logs, avec le programme logrotate. Si vous développez sous WAMP sous Windows, le programme s’appelle toujours logrotate (rotatelogs.exe plus exactement).

Voici un exemple de configuration pour WAMP de logrotate :

ErrorLog « |bin/rotatelogs.exe -l C:/Wamp/www/votresite.com/errorlog.%Y-%m-%d.txt 86400 »
CustomLog « |bin/rotatelogs.exe -l C:/Wamp/www/votresite.com/accesslog.%Y-%m-%d.txt 86400 » combined
CustomLog « |bin/rotatelogs.exe -l C:/Wamp/www/votresite.com/deflatelog.%Y-%m-%d.txt 86400 » deflate

 

 

 

Apache mise en place d’un nouveau serveur virtuel (vhost)

Ce qui suit est ma méthode pour mettre en place un nouveau serveur virtuel pour un site web.

Il existe les panels (cPanel, Wenmin, Plesk, ISPConfig) web pour créer automatiquement tout ce qui suit, mais au cas où vous n’avez pas d’autre choix (comme l’absence d’une panel par exemple), vous passerez par cette méthode. Et puis cela ne fait pas de mal de connaître ce qui se passe sous le capot, afin d’être lus confiant quand vous rencontrerez des difficultés dans la gestion d’un serveur dédié.

Créer le répertoire qui va contenir les fichiers de votre site web:

Connecté en tant que user root

> useradd username

>passwd username

ensuite configurer le mot de passe.

Cette commande va créer (sous Centos et Debian) un répertoire pour le nouvel ustilisateur que vous venez de créer sous le répertoire home/.

 

Déclarer l’hôte virtuel (vhost) :

Tout se passe dans le fichier de configuration httpd.conf (ou apache2.conf selon les distributions de Linux). Dans ce fichier vous allez dire dans quel répertoire se trouve la racine du site web. Sous Debian c’est public_html qui est la racine. Sous CentOS, c’est www.

Utilisation de SuPHP:

SuPHP permet une gestion plus fine de qui a accès à la lecture d’un fichier php. Il est nécessaire car chaque sit web appartient à un user Linux différent. Ce qser n’est pas Apache qui a le droit d’exécuter des script php. Par contre nous allon smettre une directive dans le ficheir de configuration du vhost qui va permettre à ce user d’exécuter

En principe seul l’user apache peut exécuter les script php, le username que vous venez de créer ne peut pas exécuter el script PHP car SuPHP l’en empêche. C’est pour ça que vous devez ajouter une directive dans votre configuration du vhost pour indiquer explicitement à Apache d’exécuter à leur place.

Configurer les logs:

Ici il y a deux aspects, il y a les logs Apaches access_log et error_log, puis il y a la fréquence de journalisation. Si vous avez un site avec beaucoup de trafic, il faut un fichier de log par jour par exemple, pour les sites moins importants, c’est un par semaine.

Il est important de créer des nouveaux fichiers périodiquement, sinon le fichier risque d’être trop gros, et difficile à exploiter.

Autre chose, il y a deux écoles concernant le nombre de fichiers par site, soit un fichier pour tous les vhost, soit un fichier par vhost.

Pour ma part je préfère un fichier par vhost afin d’être plus clair et de pouvoir exploiter plus facilement les logs avec un logiciel si besoin.

 

 

 

Configurer le type de log Apache :

Typiquement dans un ficheir de configuration de log vous verrez la directive LogFormat.

Vous avec 4 à 5 type de log:

Logformat

Logformat

Logformat

Logformat

Logformat

Générer un nouveau fichier de log régulièrement se fait avec LogRotate.

 

 

serveur web apache php

Configurer un virtual host sous WAMP et le faire partager en réseau local

Pour cette manipulation simplifiée nous ne toucherons pas au fichier hosts qui se trouve dans le répertoire Windows/system32/drivers/etc/

On touchera seulement au fichier httpd.conf, qui est lu par Apache.

Attention, souvent le httpd.conf n’est pas seul en jeu, non pas parce qu’il doit y avoir plusieur fichiers mais que pour des raisons d’organisation on a fractionné en plusieurs petits fichiers qu’on va inclure dans le fichier principal qui reste httpd.conf.

Par exemple le fichier des virtual host sera inclu dans httpd.conf via :

Include conf/extra/httpd-vhosts.conf

1/Créer un point d’entrée vers le répertoire où se trouve votre solution web

Cela se fait avec la directive Directory.

Options Indexes Includes FollowSymLinks MultiViews
AllowOverride all
Require all granted

2/Créer un virtual host

DocumentRoot « C:\wamp64\www\monsite\public »
ServerName monsite

ServerName indique que vous pouvez accéder à votre application web en local en tapant http://monsite, plus de besoin de localhost.

 3/Permettre d’accéder depuis votre réseau local (en particuliers depuis le smartphone)

Super utile quend vous faite du responsive design.

Lien de l’article d’origine:Accès depuis smartphone sur WAMP

Là il faut manipuler le fichier hosts de windows mentionné plus haut. Ou l’éditer il vous faudra ouvrir votre IDE avec les droits Administrateur.

Rajoutez les lignes :

127.0.0.1 monsite
::1 monsite

Maintenant redémarez vos service Apache (vous devez le faire a chaque fois que vous modifiez un fichier
de configuration Apache)
Moi je suis sur une box Free, et l’IP du réseau est : 192.168.x.x
Pour connaitre l’IP de votre ordinateur, sous Windows faites : ipconfig
sous Linux : ip addr show
Notez l’adresse de votre ordinateur (qui est donc le serveur je le souligne !) et entrez dans le navigateur de
votre smartphone 192.168.x.x/monsite

Et Voilà !

Note : dans le 1/,     AllowOverride all et   Require all granted sont nécessaire pour que ça fonctionne.

Note concernant l’upload de fichiers trop gros dans PHPMyAdmin

Configurer les fichier php.ini (même le bon) ne suffira pas. ces varaibles ont été overridées. Il faut aller configurer les fichier phpmyadmin.conf :

<wamp_dir>/alias/phpmyadmin.conf

Lien de la solution

Connaitre les différentes configuration d Apache2

SI vous ne le savez pas encore, apache peut tourner sous différentes configurations. Et cela a des implication sur les performances de votree site web.

Le terme MPM revient souvent « multi processing method« , comment manager plusieurs connection simultanées à votre site web.

Apache en mode Prefork, à chaque nouvelle connexion, Apache crée un process.

Apache en mode Worker à chaque nouvelle connexion crée un nouveau thread dans un processus fils. En gros Worker est plus rapide.(mais certains modules peuvent être incompatibles.

C’est la plus ancienne, Apache n’a qu’un seul processus. Si deux pages web de votre site sont servies,

C’est à la compilation d’Apache que cela est décidé. Donc pour savoir comment est compilé Apache par rapport à son mode de fonctionnnement la commande à faire est :

$ apache2 -V

vous devez être sous root pour faire marcher la commande ci-dessus. le résultat peut être le suivant :

Server version: Apache/2.2.22 (Debian)
Server built:   Jun 16 2014 03:51:14
Server’s Module Magic Number: 20051115:30
Server loaded:  APR 1.4.6, APR-Util 1.4.1
Compiled using: APR 1.4.6, APR-Util 1.4.1
Architecture:   64-bit
Server MPM:     Prefork
threaded:     no
forked:     yes (variable process count)
Server compiled with….
-D APACHE_MPM_DIR= »server/mpm/prefork »
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=128
-D HTTPD_ROOT= »/etc/apache2″
-D SUEXEC_BIN= »/usr/lib/apache2/suexec »
-D DEFAULT_PIDLOG= »/var/run/apache2.pid »
-D DEFAULT_SCOREBOARD= »logs/apache_runtime_status »
-D DEFAULT_LOCKFILE= »/var/run/apache2/accept.lock »
-D DEFAULT_ERRORLOG= »logs/error_log »
-D AP_TYPES_CONFIG_FILE= »mime.types »
-D SERVER_CONFIG_FILE= »apache2.conf »

 

On voit bien que c’est prefork qui est utilisé.

serveur web apache php

Allonger la durée d’exécution d’un script php

Comment allonger la durée d’exécution d’un script PHP?

 

Il est souvent frustrant lorsqu’on débute en PHP d’avoir une erreur 500 suite à un script qui met du temps à s’exécuter.

Dans la littérature PHP, vous avez la fonction set_time_limit(int $secondes), qui permet d’aller au-delà de la valeur par défaut de 30 secondes. Mais il y a une exception, si votre installation PHP est en safe mode, ça ne marche pas. On vous recommande d’aller dans le fichier php.ini pour configurer la variable d’environnement max_execution_time.

Mais pour des raisons de configuration, il se peut que même cela ne marche pas. Il faut aller encore plus bas au niveau d’Apache, et triturer une autre variable d’environnement.

Configurer Apache si vous avez accès au fichier de configuration

Si dans les logs Apache vous avez le message  suivant :

mod_fcgid: read data timeout in 31 seconds

 

lisez ce qui suit si vous êtes sous Webmin mais à transposer pour d’autres panels:

Sous Webmin > Servers > Apache Webserver > Global configuration > Edit Config File

Il faut aller dans le fichier de configuration d’Apache et trouver la ligne qui contient :

IPCCommTimeout

au lieu de laisser la valeur par défaut à 31 passez la à 100 pour éviter des erreurs 500, dû à un dépassement des 31 secondes.

 

Pourquoi je vous dis ça? c’est parce que en googlant ce topic j’ai jamais réussi en runtime à lever cette limite, cette méthode est sûre.

Cette directive se trouve dans le le fichier de configuration Apache global ou sur chaque Vhost.

Mais devez vous toucher à cette varaible?

Il est des CMS ou l’on n’a pas envie de voir comment c’est fait, donc oui on va toucher à al configuration. Mais si vous êtes un peu plus aguerris, je vous propose en recvanche d’exévcuter vos script php en ligne de commande !

Exécuter un script php en ligne de commande

Si vous êtes sous Linux, vous pouvez exécuter n’importe quel script php de cette façon :

$ php monscript.php

En mode ligne de commande, (CLI : command line interface), vous n’avez pas de limite de durée comme en mode web. Pourquoi? parce qu’en mode web, vous avez une contrainte, en effet les internautes ne doivent pas poireauter devant votre site web, et il est donc considéré comme anormal que des scripts mettent des minute à s’exécuter.

serveur web apache php

Limites de connection sur serveur Apache

Voici une commande linux pour connaitre le nombre de connexions simultanée acceptable par votre serveur:

#ab -c 5 -n 10000 http://www/domain.com/fichier.php

il est important de spécifier le fichier, http://www.domain.com/ ne marche pas

Retour en haut