Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
Prochaine révisionLes deux révisions suivantes
technique:adminsys:sites:website [2020/09/04 15:10] qduchemitechnique:adminserv:sites:website [2022/04/17 11:39] qduchemi
Ligne 1: Ligne 1:
-====== Ajouter un site web sur le domaine Picasoft ======+{{indexmenu_n>1}} 
 +Ajouter un site web sur le domaine Picasoft
  
-===== Généralités =====+## Généralités
  
-Les sites sont hébergés sur ''pica02'' et propulsé par Ngnix dans un container Docker.+Historiquement, nous utilisions une image Nginx maison intégrant PHP afin de publier nos sites. Nous avons décidé de changer pour utiliser les images officielles Nginx et PHP afin d'avoir moins d'images à maintenir ainsi que pour respecter les philosophie Docker.
  
-Le lancement d'un nouveau site peut s'expérimenter sur ''pica01-test''.+> Deploy your applications in separate containers independently and in different languages. Reduce the risk of conflict between languages, libraries or frameworks.
  
-===== Procédure d'ajout d'un nouveau site web ''example'' =====+Il faut donc créer un nouveau projet sur [le groupe Gitlab dédié aux services](https://gitlab.utc.fr/picasoft/projets/services/sites-statiques). On pourra se baser sur les exemples existants (`website`, `culture`, `uploads` et `stiegler` par exemple).
  
-Mettre à jour le fichier [docker-compose.yml](https://gitlab.utc.fr/picasoft/projets/dockerfiles/-/tree/master/pica-nginx) du dépôt à l'aide de la documentation.+Le lancement d'un nouveau site peut [[technique:docker:picasoft:test|s'expérimenter sur la machine de test]].
  
 +## Déploiement d'un site de base
  
-===== Ajout du sous domaine example.picasoft.net =====+Un site de base peut être déployé à partir de ce docker-compose :
  
-Sur la machine de test, le site sera directement disponible (sous ''example.test.picasoft.net''), en revanche pour activer ''example.picasoft.net'' en production, il faut modifier le fichier de zone DNS.+```yaml 
 +version: "3.7"
  
-  * Récupérer le fichier ''db.picasoft.net'' disponible sur Git ''git clone git@gitlab.utc.fr:picasoft/projets/zonefile-picasoft.git .'' +volumes
-  * Faire les modifications (cf après) sur une nouvelle branche ''git branch example ; git checkout example'' +  monbeausite
-  * Valider les modifications sur le serveur Git : ''git add db.picasoft.net ; git commit ; git push'' +    namemonbeausite
-  * Faire une *merge request* (adressée aux responsables techniques) : https://gitlab.utc.fr/picasoft/projets/zonefile-picasoft/merge_requests+
  
-===== Éditer le fichier de zone =====+networks: 
 +  proxy: 
 +    external: true
  
-  * Incrémenter le numéro de version du fichier cf https://wiki.picasoft.net/doku.php?id=technique:dns +services: 
-  * Ajouter sous-domaine+  web: 
 +    container_name: monbeausite 
 +    image: nginx:1.21-alpine 
 +    volumes: 
 +      - monbeausite:/usr/share/nginx/html:ro 
 +    labels: 
 +      traefik.http.routers.monbeausite.entrypoints: websecure 
 +      traefik.http.routers.monbeausite.rule: Host(`monbeausite.picasoft.net`) 
 +      traefik.http.services.monbeausite.loadbalancer.server.port80 
 +      traefik.enable: true 
 +    networks: 
 +      proxy 
 +    restart: unless-stopped 
 +```
  
 +## Personnaliser la configuration
 +
 +La configuration de Nginx se trouve dans le fichier `/etc/nginx/nginx.conf`, pour la modifier nous créons le fichier dans le dossier du service et nous montons ce fichier dans le conteneur :
 +```yaml
 +version: "3.7"
 +
 +volumes:
 +  monbeausite:
 +    name: monbeausite
 +
 +networks:
 +  proxy:
 +    external: true
 +
 +services:
 +  web:
 +    container_name: monbeausite
 +    image: nginx:1.21-alpine
 +    volumes:
 +      - ./nginx.conf:/etc/nginx/nginx.conf:ro
 +      - culture:/var/www/html:ro
 +    labels:
 +      traefik.http.routers.monbeausite.entrypoints: websecure
 +      traefik.http.routers.monbeausite.rule: Host(`culture.picasoft.net`)
 +      traefik.http.services.monbeausite.loadbalancer.server.port: 80
 +      traefik.enable: true
 +    networks:
 +      - proxy
 +    restart: unless-stopped
 ``` ```
-  example IN A 91.224.148.60 ; Serveur web d'exemple + 
-  example IN AAAA 2a03:7220:8080:3c00::1 ; Serveur web d'exemple+Une première chose que nous pouvons faire, c'est de changer l'emplacement de la racine du contenu webEn effet, il se trouve par défaut dans `/usr/share/nginx/html`, or l'emplacement traditionnellement utilisé est `/var/www/html`Pour cela nous pouvons donc utiliser la configuration suivante :
 ``` ```
 +worker_processes auto;
 +
 +error_log  /var/log/nginx/error.log warn;
 +pid        /var/run/nginx.pid;
 +
 +events {
 +    worker_connections  1024;
 +}
 +
 +http {
 +    include       /etc/nginx/mime.types;
 +    default_type  application/octet-stream;
 +
 +    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
 +                      '$status $body_bytes_sent "$http_referer" '
 +                      '"$http_user_agent" "$http_x_forwarded_for"';
 +
 +    access_log  /var/log/nginx/access.log  main;
 +
 +    server {
 +        listen 80;
 +
 +        root /var/www/html;
 +        index index.html index.htm;
 +    }
 +}
 +```
 +
 +<bootnote warning>Il faudra bien penser à changer le point de montage du volume dédié au contenu web pour `/var/www/html`</bootnote>
 +
 +Ici, la directive `root /var/www/html;` indique que le contenu web se trouve dans le dossier `/var/www/html`.
 +
 +### Activer la compression
 +
 +La compression permet de réduire la taille des réponses du serveur web, cela permet donc d'améliorer les vitesses de communications. Nous pouvons donc vouloir activer cette compression, pour cela nous modifier le fichier `nginx.conf`
 +
 +```
 +worker_processes auto;
 +
 +error_log  /var/log/nginx/error.log warn;
 +pid        /var/run/nginx.pid;
 +
 +events {
 +    worker_connections  1024;
 +}
 +
 +http {
 +    include       /etc/nginx/mime.types;
 +    default_type  application/octet-stream;
 +
 +    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
 +                      '$status $body_bytes_sent "$http_referer" '
 +                      '"$http_user_agent" "$http_x_forwarded_for"';
 +
 +    access_log  /var/log/nginx/access.log  main;
 +
 +    gzip on;
 +    gzip_vary on;
 +    gzip_comp_level 4;
 +    gzip_min_length 256;
 +    gzip_types application/pdf application/octet-stream application/atom+xml application/javascript audio/mpeg application/rss+xml image/bmp image/png image/jpeg image/svg+xml image/x-icon text/css text/plain text/html;
 +
 +    server {
 +        listen 80;
 +
 +        root /var/www/html;
 +        index index.html index.htm;
 +    }
 +}
 +```
 +
 +La directive `gzip on;` permet d'activer le module de compression. Les autres directives permettent de configurer cette compression (niveau, comportement avec les caches, taille minimum pour activer la compression et types compressés).
 +
 +### Activer l'indexation
 +
 +Par défaut, l'indexation des fichiers sur le serveur n'est pas activée. Cela pourrait en effet permettre de parcourir les dossiers et éventuellement en cas de mauvaise configuration, d'erreur lors de la publication ou de faille, de découvrir des fichiers qui ne devraient pas être publics. Nous pouvons néanmoins vouloir activer cette indexation pour un serveur offrant du contenu culturel par exemple. Dans ce cas nous pouvons modifier notre configuration comme suit.
 +
 +```
 +worker_processes auto;
 +
 +error_log  /var/log/nginx/error.log warn;
 +pid        /var/run/nginx.pid;
 +
 +events {
 +    worker_connections  1024;
 +}
 +
 +http {
 +    include       /etc/nginx/mime.types;
 +    default_type  application/octet-stream;
 +
 +    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
 +                      '$status $body_bytes_sent "$http_referer" '
 +                      '"$http_user_agent" "$http_x_forwarded_for"';
 +
 +    access_log  /var/log/nginx/access.log  main;
 +
 +    gzip on;
 +    gzip_vary on;
 +    gzip_comp_level 4;
 +    gzip_min_length 256;
 +    gzip_types application/pdf application/octet-stream application/atom+xml application/javascript audio/mpeg application/rss+xml image/bmp image/png image/jpeg image/svg+xml image/x-icon text/css text/plain text/html;
 +
 +    server {
 +        listen 80;
 +
 + autoindex on;
 +
 +        root /var/www/html;
 +        index index.html index.htm;
 +    }
 +}
 +```
 +
 +La directive `autoindex on;` permet de dire à Nginx, que quand le client demande un dossier, il ne faut pas lui répondre que la demande est interdite mais lui afficher une liste du contenu disponible dans le dossier.
 +
 +## Configurer PHP
 +
 +Finalement, il arrive que nous voulions servir des pages dynamiques avec PHP, pour cela il faut ajouter un conteneur qui se chargera d'exécuter le code PHP. Ce conteneur doit pouvoir communiquer avec notre serveur web pour recevoir les demande et envoyer le contenu, il faut donc aussi créer un réseau qu'ils partageront. Enfin le conteneur PHP doit pouvoir accéder au code PHP à exécuter, dans ce cas il faut lui donner le contenu web et donc monter le volume. Nous obtenons donc un fichier docker-compose comme le suivant :
 +```yaml
 +version: "3.7"
 +
 +volumes:
 +  monbeausite:
 +    name: monbeausite
 +
 +networks:
 +  app:
 +    name: "monbeausite"
 +  proxy:
 +    external: true
 +
 +services:
 +  app:
 +    container_name: monbeausite-app
 +    image: php:8-fpm-alpine
 +    volumes:
 +      - monbeausite:/opt/monbeausite:ro
 +    networks:
 +      - app
 +    restart: unless-stopped
 +
 +  web:
 +    container_name: monbeausite-web
 +    image: nginx:1.21-alpine
 +    volumes:
 +      - ./nginx.conf:/etc/nginx/nginx.conf:ro
 +      - monbeausite:/var/www/html:ro
 +    labels:
 +      traefik.http.routers.monbeausite.entrypoints: websecure
 +      traefik.http.routers.monbeausite.rule: Host(`monbeausite.picasoft.net`)
 +      traefik.http.services.monbeausite.loadbalancer.server.port: 80
 +      traefik.enable: true
 +    networks:
 +      - proxy
 +      - app
 +    restart: unless-stopped
 +```
 +
 +Il faut ensuite indiquer à Nginx qu'il faut contacter le serveur PHP lorsqu'il rencontre un fichier PHP, nous modifions donc le fichier `nginx.conf` :
 +```
 +worker_processes auto;
 +
 +error_log  /var/log/nginx/error.log warn;
 +pid        /var/run/nginx.pid;
 +
 +events {
 +    worker_connections  1024;
 +}
 +
 +http {
 +    include       /etc/nginx/mime.types;
 +    default_type  application/octet-stream;
 +
 +    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
 +                      '$status $body_bytes_sent "$http_referer" '
 +                      '"$http_user_agent" "$http_x_forwarded_for"';
 +
 +    access_log  /var/log/nginx/access.log  main;
 +
 +    keepalive_timeout  65;
 +
 +    set_real_ip_from  10.0.0.0/8;
 +    set_real_ip_from  172.16.0.0/12;
 +    set_real_ip_from  192.168.0.0/16;
 +    real_ip_header    X-Real-IP;
 +
 +    upstream php-handler {
 +        server monbeausite-app:9000;
 +    }
 +
 +    server {
 +        listen 80;
 +
 +        root /var/www/html;
 + index index.php index.html index.htm;
 +
 +        client_max_body_size 1M;
 +        fastcgi_buffers 64 4K;
 +
 +        location ~ \.php$ {
 +            try_files $uri =404;
 +            fastcgi_param SCRIPT_FILENAME /opt/monbeausite/$fastcgi_script_name;
 +            include fastcgi_params;
 +            fastcgi_index index.php;
 +            fastcgi_pass php-handler;
 +        }
 +    }
 +}
 +```
 +
 +La directive `upstream php-handler` définit le serveur qui peut être utilisé pour exécuter le code PHP (il peut en contenir plusieurs), il contient la directive `server monbeausite-app:9000;` qui indique comment accéder à ce serveur.
 +
 +Finalement `location ~ \.php$` indique comment traiter tous les fichiers ayant l'extension `.php`.
 +
 +## Ajout du contenu
 +
 +On synchronise le contenu du site dans `/tmp/site`, sur la machine exécutant le conteneur, par exemple.
 +Ensuite, on copie simplement les fichiers dans le conteneur :
 +
 +```bash
 +docker cp /tmp/site/* monbeausite:/var/www/html
 +```
 +
 +À ce stade, le site est prêt à être servi, il ne reste plus qu'à ajouter l'entrée DNS.
  
-Mettre ensuite à jour le serveur DNS sur Alice.+## Ajout du sous domaine
  
-===== Mise à jour =====+En filant l'exemple `monbeausite`, il faut ajouter une entrée pour `monbeausite.picasoft.net` dans le fichier de zone DNS.
  
-* Placer le nouveau contenu du site dans son `Home` +Pour ce faire, on se référera à la [[technique:adminsys:dns:picasoft|documentation sur la gestion des noms de domaine de Picasoft]], en particulier sur la partie d'ajout de sous-domaine.
-* `cd` dans ce dossier +
-* `docker cp . nom_conteneur:/var/www/html && docker exec nom_conteneur chown -R www-data:www-data /var/www/html+
  • technique/adminserv/sites/website.txt
  • de ppom