{"id":20284702,"url":"https://github.com/ovesco/httplab","last_synced_at":"2025-10-17T11:35:06.622Z","repository":{"id":88703837,"uuid":"135408665","full_name":"ovesco/HTTPLab","owner":"ovesco","description":"Laboratoire final cours RES","archived":false,"fork":false,"pushed_at":"2018-06-13T05:48:13.000Z","size":221,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-01-14T08:09:43.723Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ovesco.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-05-30T07:58:12.000Z","updated_at":"2018-06-12T19:05:40.000Z","dependencies_parsed_at":null,"dependency_job_id":"cbf73e8d-f68b-4d54-849f-2acdee4cacd9","html_url":"https://github.com/ovesco/HTTPLab","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ovesco%2FHTTPLab","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ovesco%2FHTTPLab/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ovesco%2FHTTPLab/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ovesco%2FHTTPLab/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ovesco","download_url":"https://codeload.github.com/ovesco/HTTPLab/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241780465,"owners_count":20019058,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-14T14:21:11.035Z","updated_at":"2025-10-17T11:35:01.587Z","avatar_url":"https://github.com/ovesco.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Labo 5 HTTP Infra\nGuillaume Hochet \u0026 Guillaume Blanco\n\n## Step 1 apache static\nbranch: step1\n\nCréer une image docker pour apache-php\n- Se mettre dans le répertoire apache-php\n- Faire un `docker build -t res/apache_php .`\n- Lancer le container avec `docker run -d -p 8090:80 res/apache_php`\n\nFichiers de configuration apache dans `/etc/apache2`. Pour y accéder dans un container qui tourne:\n- `docker exec -it \u003ccontainer\u003e /bin/bash`\n\n## Step 2 express dynamic\nbranch: step2\n\nOn se base sur l'image docker nodejs officielle LTS\n`src` contient tous les fichiers, ne pas oublier de faire un .gitignore et d'y ajouter `node_modules`\n\nPour lancer le container:\n- Se mettre dans le répertoire express-dynamic/src\n- exécuter `npm install` pour installer chance et express (`npm install --save chance express`)\n- remonter d'un niveau\n- Exécuter `docker build -t res/express_dynamic .`\n- Exécuter `docker run -d -p 8090:3000 res/express_dynamic` pour lancer le container\n\n## Step 3 static reverse proxy\nbranch: step3-apache-reverse-proxy\n\nOn va créer un container docker spécialement pour le reverse proxy.\nTout d'abord on doit lancer les deux containers requis\n- Lancer un container apache_php (port 80): `docker run -d --name apache_static res/apache_php` appelé apache_static\n- Lancer un container express_dynamic (port 3000): `docker run -d --name express_dynamic res/express_dynamic`\n- Récupérer les adresses IP des container avec `docker inspect \u003ccontainer\u003e | grep \"IPAddress\"`\n\nDans notre cas on obtient 172.17.0.2 pour apache_static et 172.17.0.3 pour express_dynamic\n\nOn peut ensuite lancer le container de reverse proxy\n- Se placer dans docker-images/apache-reverse-proxy\n- Editer le fichier /conf/sites-available/001-reverse-proxy.conf\n- Remplacer les adresses IP par celles obtenues précédemment\n- Exécuter un `docker build -t res/apache_reverse_proxy .`\n- Démarrer le container avec `docker run -d -p 8080:80 --name apache-reverse-proxy res/apache_reverse_proxy`\n- Récupérer l'adresse IP du container nouvellement créé\n- Modifier le fichier `/etc/hosts` pour mettre à jour les DNS en ajoutant la ligne `localhost demo.res.ch`\n\n## Step 4 ajax jquery\nbranch: step4-ajax-jquery\n\nPour réaliser cette étape, il faut tout d'abord fermer les containers existants.\nOn modifie ensuite le code html de l'image `apache_php` pour y inclure un fichier javascript qui s'occupera\nde pull des informations en ajax. \nL'utilisation du reverse proxy permet ainsi d'éviter de faire face au `Cross-Origin request` qui empêcherait\nde faire cet appel d'API.\n\nRelancer ensuite les containers comme dans l'étape 3, puis se rendre sur demo.res.ch:8080 pour apprécier la vue.\n\n## Step 5 Dynamic reverse proxy\nBranche: step5-dynamic-configuration\n\nIl est possible de définir des variables d'environnement pour un container donné, on y passe ainsi les adresses\nIPs afin de les utiliser dans un script au lancement du container.\n- Créer un template php permettant de générer le contenu du fichier `001-reverse-proxy.conf` et qui y écrit les\nvaleurs des variables d'environnement données\n- On crée ainsi un fichier apache2-foreground basé sur celui des auteurs de l'image docker qui exécutera ce template\n- Rendre le script exécutable `chmod 755 apache2-foreground`\n- Mettre à jour le Dockerfile pour le copier à la place de l'existant\n- Construire l'image avec un `docker build -t res/apache_reverse_proxy .`\n- Récupérer les adresses IPs des containers express_dynamic et apache_static\n- Lancer le container reverse proxy avec `docker run -d -e STATIC_APP=172.17.0.2:80 -e DYNAMIC_APP=172.17.0.3:3000 res/apache_reverse_proxy`\n\n## Additional steps\n### UI management\nOn utilise portainer pour la gestion en interface graphique\n\nIl suffit d'exécuter les commandes suivantes:\n- `docker volume create portainer_data`\n- `docker run -d -p 9000:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer`\n\nCredentials locaux: admin password\n\n### Node balancing\nbranche: BONUS-node-balancing\n\nSource: https://httpd.apache.org/docs/2.4/howto/reverse_proxy.html\nPour fonctionner, on doit modifier le reverse proxy défini précédemment. On s'appuie sur les modules mod_proxy_balancer et mod_lbmethod_byrequests pour\ny arriver.\nPour fonctionner il faut\n- Rebuild les trois images proprement\n- lancer un certain nombre de containers apache_php avec `docker run -d res/apache_php`\n- lancer un certain nombre de containers express_dynamic avec `docker run -d res/express_dynamic`\n- exécuter le script php livré `php command.php` qui construira la commande à exécuter pour lancer le container de reverse proxy node balancing\n\nNous avons concu le système pour qu'il puisse gérer un nombre indéfini de containers et générer la configuration apache à la volée.\nPour tester, rendez-vous sur `demo.res.ch:8080` où vous pourrez voir l'IP du container dynamique qui a délivré la requête s'afficher et changer au fur et à mesure\nOn peut également accéder au manager apache depuis `demo.res.ch:8080/balancer-manager`\n\n### Sticky sessions\nbranch BONUS-sticky-sessions\n\nOn se base sur le node balancing pour illustrer le concept. Dans le cas précédent, l'adresse IP du container changeait automatiquement. Le but ici est de \nconserver la même.\n\nSource: https://httpd.apache.org/docs/2.4/fr/mod/mod_proxy_balancer.html\nPour fonctionner il faut:\n- Rebuild l'image reverse-proxy\n- Relancer `php command.php` qui vous donnera la commande à exécuter\n\nOn peut ensuite observer depuis `demo.res.ch:8080` que les appels d'API se font depuis le même container à chaque fois, l'adresse IP ne change pas. On peut\nouvrir un autre naviguateur ou une fenêtre privée pour voir que l'IP est différente mais ne change pas!","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fovesco%2Fhttplab","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fovesco%2Fhttplab","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fovesco%2Fhttplab/lists"}