{"version":"1.1","schema_version":"1.1.0","plugin_version":"1.1.2","url":"https://tutos-gameserver.fr/2020/04/11/kisscache-cachant-le-baiser-serveur-dimpression-4/","llm_html_url":"https://tutos-gameserver.fr/2020/04/11/kisscache-cachant-le-baiser-serveur-dimpression-4/llm","llm_json_url":"https://tutos-gameserver.fr/2020/04/11/kisscache-cachant-le-baiser-serveur-dimpression-4/llm.json","manifest_url":"https://tutos-gameserver.fr/llm-endpoints-manifest.json","language":"fr-FR","locale":"fr_FR","title":"KissCache, cachant le baiser\n\n &#8211; Serveur d&rsquo;impression","site":{"name":"Tutos GameServer","url":"https://tutos-gameserver.fr/"},"author":{"id":1,"name":"Titanfall","url":"https://tutos-gameserver.fr/author/titanfall/"},"published_at":"2020-04-10T23:58:37+00:00","modified_at":"2020-04-10T23:58:37+00:00","word_count":1173,"reading_time_seconds":352,"summary":"Résumé présentation Récemment, une dépêche a présenté &quot;kisscache&quot;, un serveur de cache HTTP (S). Particularité, il ne lance qu&#39;un seul téléchargement simultané pour la même ressource. efficacité du réseau Cette fonctionnalité permet, si plusieurs clients viennent de télécharger la même ressource, avant qu&#39;elle ne soit mise en cache, de ne pas envoyer plusieurs fois la [&hellip;]","summary_points":["Résumé\nprésentation\nRécemment, une dépêche a présenté &quot;kisscache&quot;, un serveur de cache HTTP (S).","Particularité, il ne lance qu&#39;un seul téléchargement simultané pour la même ressource.","efficacité du réseau\nCette fonctionnalité permet, si plusieurs clients viennent de télécharger la même ressource, avant qu&#39;elle ne soit mise en cache, de ne pas envoyer plusieurs fois la même requête au serveur et donc d&#39;économiser de la bande passante côté client et serveur.","Au final, tous les clients seront servis plus rapidement."],"topics":["Serveur d'impression"],"entities":[],"entities_metadata":[{"id":10,"name":"Serveur d'impression","slug":"serveur-dimpression","taxonomy":"category","count":3907,"url":"https://tutos-gameserver.fr/category/serveur-dimpression/"}],"tags":["Serveur d'impression"],"content_hash":"18deea01a4b60a7fccde94eac51064ad","plain_text":"Résumé\nprésentation\nRécemment, une dépêche a présenté &quot;kisscache&quot;, un serveur de cache HTTP (S). Particularité, il ne lance qu&#39;un seul téléchargement simultané pour la même ressource.\nefficacité du réseau\nCette fonctionnalité permet, si plusieurs clients viennent de télécharger la même ressource, avant qu&#39;elle ne soit mise en cache, de ne pas envoyer plusieurs fois la même requête au serveur et donc d&#39;économiser de la bande passante côté client et serveur. Au final, tous les clients seront servis plus rapidement.\nCache HTTPS\nDe plus, l&#39;outil propose de résoudre le problème de mise en cache des ressources proposées en HTTPS. En effet, un cache server agit comme un &quot;homme au milieu&quot; et est donc difficilement compatible avec un transport sécurisé dont le but est, entre autres, de ne pas permettre la modification de la réponse du serveur sans que le client ne le détecte. Une solution courante &#8211; en particulier dans les entreprises pour inspecter le flux client-serveur, plus que pour la mise en cache &#8211; consiste à usurper le certificat du serveur, en le remplaçant par un certificat provenant d&#39;une autorité de confiance interne déployée sur les clients des machines. Il faut encore mener à bien ce déploiement.\nBAISER?\nL&#39;outil est présenté comme suivant le principe KISS. Il est vrai que le nombre de fonctionnalités est limité et que la quantité de code est petite, environ mille lignes de python. Cependant, les dépendances d&#39;exploitation sont importantes: django pour l&#39;API, postgres pour la base de données, céleri pour le traitement asynchrone, redis pour le bus de données, docker pour l&#39;infrastructure. La réécriture d&#39;URL rend son utilisation difficile.\nune analyse\nCache HTTPS\nLa solution proposée consiste à réécrire les URL de toutes les ressources demandées. Il est donc beaucoup plus intrusif et non standard que d&#39;utiliser un proxy conventionnel. Un proxy demande des variables d&#39;environnement, des paramètres de ligne de commande ou une modification du fichier de configuration. Un proxy transparent demande une configuration au réseau local ou au routeur. Concrètement, aucun gestionnaire de progiciel (apt, pip, etc.) ne permet la réécriture d&#39;URL. Et par conséquent, vous devez disposer d&#39;outils spécialement écrits pour être compatible avec kisscache.\nBAISER\nDe toute évidence, la gestion d&#39;un cache HTTP (S) n&#39;est pas ne pas Facile. Le protocole HTTP est compliqué, avec de nombreux scénarios, notamment sur la gestion du cycle de vie des ressources, influencés par de nombreux en-têtes. L&#39;outil kisscache ne le gère pas vraiment.Quelles autres pistes pouvons-nous suivre?\nnginx\nNginx n&#39;est pas un logiciel simple. Mais sa mise en œuvre l&#39;est. Avec un fichier de configuration relativement court &#8211; moins de vingt lignes &#8211; il gère correctement un cache HTTP (S) avec les mêmes fonctionnalités que celles attendues pour kisscache:\n                serveur \nécouter 3128;\n\nexpire max;\nproxy_cache on;\nproxy_cache_path / var / cache / proxy-nginx inactive = 1w; # une semaine\nproxy_cache_key &quot;$ schéma: // $ host $ request_uri&quot;;\nproxy_pass $ schéma: // $ host $ request_uri;\nproxy_set_header Host $ http_host;\nproxy_ignore_headers &quot;Set-Cookie&quot;;\n\nproxy_ignore_client_abort on;\nproxy_cache_lock activé;\nproxy_cache_lock_age 10m;\nproxy_cache_valid 200 301 1w; # une semaine\nproxy_cache_valid any 1m;\nerreur proxy_cache_use_stale;\n\n\nLa directive &quot;proxy_cache_lock&quot; permet de n&#39;avoir qu&#39;un seul client à la fois téléchargeant une ressource. La directive &quot;proxy_ignore_client_abort&quot; permet de terminer le téléchargement même si le client interrompt la connexion. La directive &quot;inactive = 1w&quot; permet de nettoyer les ressources non consultées depuis un certain temps.\nPython asynchrone\nS&#39;il s&#39;agit d&#39;écrire un serveur en python qui cache les URL qui lui sont soumises, une approche simple consiste à connecter deux bibliothèques logicielles entre elles: un serveur HTTP et un client HTTP. Et pour plus d&#39;efficacité, allez voir le côté des capacités AsyncIO de Python. En collant l&#39;exemple de serveur et l&#39;exemple de client de la page d&#39;accueil aiohttp, nous arrivons rapidement à un prototype fonctionnel. Nous ajoutons entre les deux une gestion de fichiers (cache) et un mécanisme pour empêcher les téléchargements multiples et nous obtenons les quarante lignes de code suivantes:\nimporter asyncio\ndepuis le site d&#39;import aiohttp, ClientSession\nde hashlib import md5\nimporter os\ndepuis aiofile import AIOFile\n\nD = \n\nasync def dl_and_cache (url, dirname, basename):\nasync avec ClientSession () en tant que session:\nasync avec session.get (url) comme réponse:\ncontent = attendre réponse.read ()\nos.makedirs (dirname, exist_ok = True)\npath = dirname + &quot;/&quot; + basename\nasynchrone avec AIOFile (chemin, &amp; # 39; wb &amp; # 39;) comme afp:\nattendre afp.write (contenu)\n\n\nPoignée async def (demande):\nurl = request.match_info.get (&amp; # 39; url &amp; # 39;)\nimprimer (url)\nh = md5 (octets (url, &quot;ascii&quot;)). hexdigest ()\ndirname = &quot;.cache /&quot; + h[0:2]+ &quot;/&quot; + h[2:4]\n    nom de base = h[4:]\n    path = dirname + &quot;/&quot; + basename\nsinon os.path.exists (chemin):\n# si le téléchargeur est marqué, attendez-le\nsi l&#39;URL en D:\ntandis que l&#39;URL en D:\nattendre asyncio.sleep (1)\n# else, marquer comme téléchargement et commencer le téléchargement\nautre:\nré[url] = Aucun\n# utiliser le bouclier pour empêcher l&#39;annulation de la déconnexion du client\nattendre asyncio.shield (dl_and_cache (url, dirname, basename))\ndel D[url]\n    retourne web.FileResponse (chemin)\n\n\nsi __name__ == &amp; # 39; __ main __ &amp; # 39 ;:\napp = web.Application ()\napp.add_routes ([web.get('/url', handle)]) # l&#39;url doit être encodée en url\nweb.run_app (application)\n\nLes dépendances sont résolues avec un pip install aiohttp[speedups] aiofile.A tester avec wget http://0.0.0.0:8080/$(urlencode &amp; # 39; http: //dl-cdn.alpinelinux.org/alpine/v3.11/main/x86_64/APKINDEX.tar.gz&amp;#39;) par exemple.\nPour atteindre le niveau fonctionnel de l&#39;outil proposé, il faudrait ajouter la gestion du TTL et la suppression des ressources non utilisées depuis un certain temps. Cela devrait être possible en restant sous les cent lignes de code.Ensuite, PyInstaller regroupe tout dans un binaire autoportant &#8211; c&#39;est-à-dire: incorporant l&#39;interpréteur python et les dépendances &#8211; de moins de 11 Mo.\nJe vous remercie\nJe remercie l&#39;auteur de son envoi. Cela m&#39;a permis de réfléchir au problème de la mise en cache des ressources proposé dans https et qui me pose également des problèmes pour les tâches de construction de logiciels, de regarder dans aiohttp qui est une très bonne surprise, de revenir sur nginx qui est définitivement un outil très puissant, pour voir une bonne intégration de django + celery qui est un bon modèle pour construire des API pour l&#39;automatisation de l&#39;infrastructure.\n\nClick to rate this post!\r\n                                   \r\n                               [Total: 0  Average: 0]","paragraphs":["Résumé\nprésentation\nRécemment, une dépêche a présenté &quot;kisscache&quot;, un serveur de cache HTTP (S). Particularité, il ne lance qu&#39;un seul téléchargement simultané pour la même ressource.\nefficacité du réseau\nCette fonctionnalité permet, si plusieurs clients viennent de télécharger la même ressource, avant qu&#39;elle ne soit mise en cache, de ne pas envoyer plusieurs fois la même requête au serveur et donc d&#39;économiser de la bande passante côté client et serveur. Au final, tous les clients seront servis plus rapidement.\nCache HTTPS\nDe plus, l&#39;outil propose de résoudre le problème de mise en cache des ressources proposées en HTTPS. En effet, un cache server agit comme un &quot;homme au milieu&quot; et est donc difficilement compatible avec un transport sécurisé dont le but est, entre autres, de ne pas permettre la modification de la réponse du serveur sans que le client ne le détecte. Une solution courante &#8211; en particulier dans les entreprises pour inspecter le flux client-serveur, plus que pour la mise en cache &#8211; consiste à usurper le certificat du serveur, en le remplaçant par un certificat provenant d&#39;une autorité de confiance interne déployée sur les clients des machines. Il faut encore mener à bien ce déploiement.\nBAISER?\nL&#39;outil est présenté comme suivant le principe KISS. Il est vrai que le nombre de fonctionnalités est limité et que la quantité de code est petite, environ mille lignes de python. Cependant, les dépendances d&#39;exploitation sont importantes: django pour l&#39;API, postgres pour la base de données, céleri pour le traitement asynchrone, redis pour le bus de données, docker pour l&#39;infrastructure. La réécriture d&#39;URL rend son utilisation difficile.\nune analyse\nCache HTTPS\nLa solution proposée consiste à réécrire les URL de toutes les ressources demandées. Il est donc beaucoup plus intrusif et non standard que d&#39;utiliser un proxy conventionnel. Un proxy demande des variables d&#39;environnement, des paramètres de ligne de commande ou une modification du fichier de configuration. Un proxy transparent demande une configuration au réseau local ou au routeur. Concrètement, aucun gestionnaire de progiciel (apt, pip, etc.) ne permet la réécriture d&#39;URL. Et par conséquent, vous devez disposer d&#39;outils spécialement écrits pour être compatible avec kisscache.\nBAISER\nDe toute évidence, la gestion d&#39;un cache HTTP (S) n&#39;est pas ne pas Facile. Le protocole HTTP est compliqué, avec de nombreux scénarios, notamment sur la gestion du cycle de vie des ressources, influencés par de nombreux en-têtes. L&#39;outil kisscache ne le gère pas vraiment.Quelles autres pistes pouvons-nous suivre?\nnginx\nNginx n&#39;est pas un logiciel simple. Mais sa mise en œuvre l&#39;est. Avec un fichier de configuration relativement court &#8211; moins de vingt lignes &#8211; il gère correctement un cache HTTP (S) avec les mêmes fonctionnalités que celles attendues pour kisscache:\n                serveur \nécouter 3128;","expire max;\nproxy_cache on;\nproxy_cache_path / var / cache / proxy-nginx inactive = 1w; # une semaine\nproxy_cache_key &quot;$ schéma: // $ host $ request_uri&quot;;\nproxy_pass $ schéma: // $ host $ request_uri;\nproxy_set_header Host $ http_host;\nproxy_ignore_headers &quot;Set-Cookie&quot;;","proxy_ignore_client_abort on;\nproxy_cache_lock activé;\nproxy_cache_lock_age 10m;\nproxy_cache_valid 200 301 1w; # une semaine\nproxy_cache_valid any 1m;\nerreur proxy_cache_use_stale;","La directive &quot;proxy_cache_lock&quot; permet de n&#39;avoir qu&#39;un seul client à la fois téléchargeant une ressource. La directive &quot;proxy_ignore_client_abort&quot; permet de terminer le téléchargement même si le client interrompt la connexion. La directive &quot;inactive = 1w&quot; permet de nettoyer les ressources non consultées depuis un certain temps.\nPython asynchrone\nS&#39;il s&#39;agit d&#39;écrire un serveur en python qui cache les URL qui lui sont soumises, une approche simple consiste à connecter deux bibliothèques logicielles entre elles: un serveur HTTP et un client HTTP. Et pour plus d&#39;efficacité, allez voir le côté des capacités AsyncIO de Python. En collant l&#39;exemple de serveur et l&#39;exemple de client de la page d&#39;accueil aiohttp, nous arrivons rapidement à un prototype fonctionnel. Nous ajoutons entre les deux une gestion de fichiers (cache) et un mécanisme pour empêcher les téléchargements multiples et nous obtenons les quarante lignes de code suivantes:\nimporter asyncio\ndepuis le site d&#39;import aiohttp, ClientSession\nde hashlib import md5\nimporter os\ndepuis aiofile import AIOFile","D =","async def dl_and_cache (url, dirname, basename):\nasync avec ClientSession () en tant que session:\nasync avec session.get (url) comme réponse:\ncontent = attendre réponse.read ()\nos.makedirs (dirname, exist_ok = True)\npath = dirname + &quot;/&quot; + basename\nasynchrone avec AIOFile (chemin, &amp; # 39; wb &amp; # 39;) comme afp:\nattendre afp.write (contenu)","Poignée async def (demande):\nurl = request.match_info.get (&amp; # 39; url &amp; # 39;)\nimprimer (url)\nh = md5 (octets (url, &quot;ascii&quot;)). hexdigest ()\ndirname = &quot;.cache /&quot; + h[0:2]+ &quot;/&quot; + h[2:4]\n    nom de base = h[4:]\n    path = dirname + &quot;/&quot; + basename\nsinon os.path.exists (chemin):\n# si le téléchargeur est marqué, attendez-le\nsi l&#39;URL en D:\ntandis que l&#39;URL en D:\nattendre asyncio.sleep (1)\n# else, marquer comme téléchargement et commencer le téléchargement\nautre:\nré[url] = Aucun\n# utiliser le bouclier pour empêcher l&#39;annulation de la déconnexion du client\nattendre asyncio.shield (dl_and_cache (url, dirname, basename))\ndel D[url]\n    retourne web.FileResponse (chemin)","si __name__ == &amp; # 39; __ main __ &amp; # 39 ;:\napp = web.Application ()\napp.add_routes ([web.get('/url', handle)]) # l&#39;url doit être encodée en url\nweb.run_app (application)","Les dépendances sont résolues avec un pip install aiohttp[speedups] aiofile.A tester avec wget http://0.0.0.0:8080/$(urlencode &amp; # 39; http: //dl-cdn.alpinelinux.org/alpine/v3.11/main/x86_64/APKINDEX.tar.gz&amp;#39;) par exemple.\nPour atteindre le niveau fonctionnel de l&#39;outil proposé, il faudrait ajouter la gestion du TTL et la suppression des ressources non utilisées depuis un certain temps. Cela devrait être possible en restant sous les cent lignes de code.Ensuite, PyInstaller regroupe tout dans un binaire autoportant &#8211; c&#39;est-à-dire: incorporant l&#39;interpréteur python et les dépendances &#8211; de moins de 11 Mo.\nJe vous remercie\nJe remercie l&#39;auteur de son envoi. Cela m&#39;a permis de réfléchir au problème de la mise en cache des ressources proposé dans https et qui me pose également des problèmes pour les tâches de construction de logiciels, de regarder dans aiohttp qui est une très bonne surprise, de revenir sur nginx qui est définitivement un outil très puissant, pour voir une bonne intégration de django + celery qui est un bon modèle pour construire des API pour l&#39;automatisation de l&#39;infrastructure.","Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]"],"content_blocks":[{"id":"text-1","type":"text","heading":"","plain_text":"Résumé\nprésentation\nRécemment, une dépêche a présenté &quot;kisscache&quot;, un serveur de cache HTTP (S). Particularité, il ne lance qu&#39;un seul téléchargement simultané pour la même ressource.\nefficacité du réseau\nCette fonctionnalité permet, si plusieurs clients viennent de télécharger la même ressource, avant qu&#39;elle ne soit mise en cache, de ne pas envoyer plusieurs fois la même requête au serveur et donc d&#39;économiser de la bande passante côté client et serveur. Au final, tous les clients seront servis plus rapidement.\nCache HTTPS\nDe plus, l&#39;outil propose de résoudre le problème de mise en cache des ressources proposées en HTTPS. En effet, un cache server agit comme un &quot;homme au milieu&quot; et est donc difficilement compatible avec un transport sécurisé dont le but est, entre autres, de ne pas permettre la modification de la réponse du serveur sans que le client ne le détecte. Une solution courante &#8211; en particulier dans les entreprises pour inspecter le flux client-serveur, plus que pour la mise en cache &#8211; consiste à usurper le certificat du serveur, en le remplaçant par un certificat provenant d&#39;une autorité de confiance interne déployée sur les clients des machines. Il faut encore mener à bien ce déploiement.\nBAISER?\nL&#39;outil est présenté comme suivant le principe KISS. Il est vrai que le nombre de fonctionnalités est limité et que la quantité de code est petite, environ mille lignes de python. Cependant, les dépendances d&#39;exploitation sont importantes: django pour l&#39;API, postgres pour la base de données, céleri pour le traitement asynchrone, redis pour le bus de données, docker pour l&#39;infrastructure. La réécriture d&#39;URL rend son utilisation difficile.\nune analyse\nCache HTTPS\nLa solution proposée consiste à réécrire les URL de toutes les ressources demandées. Il est donc beaucoup plus intrusif et non standard que d&#39;utiliser un proxy conventionnel. Un proxy demande des variables d&#39;environnement, des paramètres de ligne de commande ou une modification du fichier de configuration. Un proxy transparent demande une configuration au réseau local ou au routeur. Concrètement, aucun gestionnaire de progiciel (apt, pip, etc.) ne permet la réécriture d&#39;URL. Et par conséquent, vous devez disposer d&#39;outils spécialement écrits pour être compatible avec kisscache.\nBAISER\nDe toute évidence, la gestion d&#39;un cache HTTP (S) n&#39;est pas ne pas Facile. Le protocole HTTP est compliqué, avec de nombreux scénarios, notamment sur la gestion du cycle de vie des ressources, influencés par de nombreux en-têtes. L&#39;outil kisscache ne le gère pas vraiment.Quelles autres pistes pouvons-nous suivre?\nnginx\nNginx n&#39;est pas un logiciel simple. Mais sa mise en œuvre l&#39;est. Avec un fichier de configuration relativement court &#8211; moins de vingt lignes &#8211; il gère correctement un cache HTTP (S) avec les mêmes fonctionnalités que celles attendues pour kisscache:\n                serveur \nécouter 3128;","html":"<p>Résumé\nprésentation\nRécemment, une dépêche a présenté &quot;kisscache&quot;, un serveur de cache HTTP (S). Particularité, il ne lance qu&#039;un seul téléchargement simultané pour la même ressource.\nefficacité du réseau\nCette fonctionnalité permet, si plusieurs clients viennent de télécharger la même ressource, avant qu&#039;elle ne soit mise en cache, de ne pas envoyer plusieurs fois la même requête au serveur et donc d&#039;économiser de la bande passante côté client et serveur. Au final, tous les clients seront servis plus rapidement.\nCache HTTPS\nDe plus, l&#039;outil propose de résoudre le problème de mise en cache des ressources proposées en HTTPS. En effet, un cache server agit comme un &quot;homme au milieu&quot; et est donc difficilement compatible avec un transport sécurisé dont le but est, entre autres, de ne pas permettre la modification de la réponse du serveur sans que le client ne le détecte. Une solution courante &#8211; en particulier dans les entreprises pour inspecter le flux client-serveur, plus que pour la mise en cache &#8211; consiste à usurper le certificat du serveur, en le remplaçant par un certificat provenant d&#039;une autorité de confiance interne déployée sur les clients des machines. Il faut encore mener à bien ce déploiement.\nBAISER?\nL&#039;outil est présenté comme suivant le principe KISS. Il est vrai que le nombre de fonctionnalités est limité et que la quantité de code est petite, environ mille lignes de python. Cependant, les dépendances d&#039;exploitation sont importantes: django pour l&#039;API, postgres pour la base de données, céleri pour le traitement asynchrone, redis pour le bus de données, docker pour l&#039;infrastructure. La réécriture d&#039;URL rend son utilisation difficile.\nune analyse\nCache HTTPS\nLa solution proposée consiste à réécrire les URL de toutes les ressources demandées. Il est donc beaucoup plus intrusif et non standard que d&#039;utiliser un proxy conventionnel. Un proxy demande des variables d&#039;environnement, des paramètres de ligne de commande ou une modification du fichier de configuration. Un proxy transparent demande une configuration au réseau local ou au routeur. Concrètement, aucun gestionnaire de progiciel (apt, pip, etc.) ne permet la réécriture d&#039;URL. Et par conséquent, vous devez disposer d&#039;outils spécialement écrits pour être compatible avec kisscache.\nBAISER\nDe toute évidence, la gestion d&#039;un cache HTTP (S) n&#039;est pas ne pas Facile. Le protocole HTTP est compliqué, avec de nombreux scénarios, notamment sur la gestion du cycle de vie des ressources, influencés par de nombreux en-têtes. L&#039;outil kisscache ne le gère pas vraiment.Quelles autres pistes pouvons-nous suivre?\nnginx\nNginx n&#039;est pas un logiciel simple. Mais sa mise en œuvre l&#039;est. Avec un fichier de configuration relativement court &#8211; moins de vingt lignes &#8211; il gère correctement un cache HTTP (S) avec les mêmes fonctionnalités que celles attendues pour kisscache:\n                serveur \nécouter 3128;</p>"},{"id":"text-2","type":"text","heading":"","plain_text":"expire max;\nproxy_cache on;\nproxy_cache_path / var / cache / proxy-nginx inactive = 1w; # une semaine\nproxy_cache_key &quot;$ schéma: // $ host $ request_uri&quot;;\nproxy_pass $ schéma: // $ host $ request_uri;\nproxy_set_header Host $ http_host;\nproxy_ignore_headers &quot;Set-Cookie&quot;;","html":"<p>expire max;\nproxy_cache on;\nproxy_cache_path / var / cache / proxy-nginx inactive = 1w; # une semaine\nproxy_cache_key &quot;$ schéma: // $ host $ request_uri&quot;;\nproxy_pass $ schéma: // $ host $ request_uri;\nproxy_set_header Host $ http_host;\nproxy_ignore_headers &quot;Set-Cookie&quot;;</p>"},{"id":"text-3","type":"text","heading":"","plain_text":"proxy_ignore_client_abort on;\nproxy_cache_lock activé;\nproxy_cache_lock_age 10m;\nproxy_cache_valid 200 301 1w; # une semaine\nproxy_cache_valid any 1m;\nerreur proxy_cache_use_stale;","html":"<p>proxy_ignore_client_abort on;\nproxy_cache_lock activé;\nproxy_cache_lock_age 10m;\nproxy_cache_valid 200 301 1w; # une semaine\nproxy_cache_valid any 1m;\nerreur proxy_cache_use_stale;</p>"},{"id":"text-4","type":"text","heading":"","plain_text":"La directive &quot;proxy_cache_lock&quot; permet de n&#39;avoir qu&#39;un seul client à la fois téléchargeant une ressource. La directive &quot;proxy_ignore_client_abort&quot; permet de terminer le téléchargement même si le client interrompt la connexion. La directive &quot;inactive = 1w&quot; permet de nettoyer les ressources non consultées depuis un certain temps.\nPython asynchrone\nS&#39;il s&#39;agit d&#39;écrire un serveur en python qui cache les URL qui lui sont soumises, une approche simple consiste à connecter deux bibliothèques logicielles entre elles: un serveur HTTP et un client HTTP. Et pour plus d&#39;efficacité, allez voir le côté des capacités AsyncIO de Python. En collant l&#39;exemple de serveur et l&#39;exemple de client de la page d&#39;accueil aiohttp, nous arrivons rapidement à un prototype fonctionnel. Nous ajoutons entre les deux une gestion de fichiers (cache) et un mécanisme pour empêcher les téléchargements multiples et nous obtenons les quarante lignes de code suivantes:\nimporter asyncio\ndepuis le site d&#39;import aiohttp, ClientSession\nde hashlib import md5\nimporter os\ndepuis aiofile import AIOFile","html":"<p>La directive &quot;proxy_cache_lock&quot; permet de n&#039;avoir qu&#039;un seul client à la fois téléchargeant une ressource. La directive &quot;proxy_ignore_client_abort&quot; permet de terminer le téléchargement même si le client interrompt la connexion. La directive &quot;inactive = 1w&quot; permet de nettoyer les ressources non consultées depuis un certain temps.\nPython asynchrone\nS&#039;il s&#039;agit d&#039;écrire un serveur en python qui cache les URL qui lui sont soumises, une approche simple consiste à connecter deux bibliothèques logicielles entre elles: un serveur HTTP et un client HTTP. Et pour plus d&#039;efficacité, allez voir le côté des capacités AsyncIO de Python. En collant l&#039;exemple de serveur et l&#039;exemple de client de la page d&#039;accueil aiohttp, nous arrivons rapidement à un prototype fonctionnel. Nous ajoutons entre les deux une gestion de fichiers (cache) et un mécanisme pour empêcher les téléchargements multiples et nous obtenons les quarante lignes de code suivantes:\nimporter asyncio\ndepuis le site d&#039;import aiohttp, ClientSession\nde hashlib import md5\nimporter os\ndepuis aiofile import AIOFile</p>"},{"id":"text-5","type":"text","heading":"","plain_text":"D =","html":"<p>D =</p>"},{"id":"text-6","type":"text","heading":"","plain_text":"async def dl_and_cache (url, dirname, basename):\nasync avec ClientSession () en tant que session:\nasync avec session.get (url) comme réponse:\ncontent = attendre réponse.read ()\nos.makedirs (dirname, exist_ok = True)\npath = dirname + &quot;/&quot; + basename\nasynchrone avec AIOFile (chemin, &amp; # 39; wb &amp; # 39;) comme afp:\nattendre afp.write (contenu)","html":"<p>async def dl_and_cache (url, dirname, basename):\nasync avec ClientSession () en tant que session:\nasync avec session.get (url) comme réponse:\ncontent = attendre réponse.read ()\nos.makedirs (dirname, exist_ok = True)\npath = dirname + &quot;/&quot; + basename\nasynchrone avec AIOFile (chemin, &amp; # 39; wb &amp; # 39;) comme afp:\nattendre afp.write (contenu)</p>"},{"id":"text-7","type":"text","heading":"","plain_text":"Poignée async def (demande):\nurl = request.match_info.get (&amp; # 39; url &amp; # 39;)\nimprimer (url)\nh = md5 (octets (url, &quot;ascii&quot;)). hexdigest ()\ndirname = &quot;.cache /&quot; + h[0:2]+ &quot;/&quot; + h[2:4]\n    nom de base = h[4:]\n    path = dirname + &quot;/&quot; + basename\nsinon os.path.exists (chemin):\n# si le téléchargeur est marqué, attendez-le\nsi l&#39;URL en D:\ntandis que l&#39;URL en D:\nattendre asyncio.sleep (1)\n# else, marquer comme téléchargement et commencer le téléchargement\nautre:\nré[url] = Aucun\n# utiliser le bouclier pour empêcher l&#39;annulation de la déconnexion du client\nattendre asyncio.shield (dl_and_cache (url, dirname, basename))\ndel D[url]\n    retourne web.FileResponse (chemin)","html":"<p>Poignée async def (demande):\nurl = request.match_info.get (&amp; # 39; url &amp; # 39;)\nimprimer (url)\nh = md5 (octets (url, &quot;ascii&quot;)). hexdigest ()\ndirname = &quot;.cache /&quot; + h[0:2]+ &quot;/&quot; + h[2:4]\n    nom de base = h[4:]\n    path = dirname + &quot;/&quot; + basename\nsinon os.path.exists (chemin):\n# si le téléchargeur est marqué, attendez-le\nsi l&#039;URL en D:\ntandis que l&#039;URL en D:\nattendre asyncio.sleep (1)\n# else, marquer comme téléchargement et commencer le téléchargement\nautre:\nré[url] = Aucun\n# utiliser le bouclier pour empêcher l&#039;annulation de la déconnexion du client\nattendre asyncio.shield (dl_and_cache (url, dirname, basename))\ndel D[url]\n    retourne web.FileResponse (chemin)</p>"},{"id":"text-8","type":"text","heading":"","plain_text":"si __name__ == &amp; # 39; __ main __ &amp; # 39 ;:\napp = web.Application ()\napp.add_routes ([web.get('/url', handle)]) # l&#39;url doit être encodée en url\nweb.run_app (application)","html":"<p>si __name__ == &amp; # 39; __ main __ &amp; # 39 ;:\napp = web.Application ()\napp.add_routes ([web.get(&#039;/url&#039;, handle)]) # l&#039;url doit être encodée en url\nweb.run_app (application)</p>"},{"id":"text-9","type":"text","heading":"","plain_text":"Les dépendances sont résolues avec un pip install aiohttp[speedups] aiofile.A tester avec wget http://0.0.0.0:8080/$(urlencode &amp; # 39; http: //dl-cdn.alpinelinux.org/alpine/v3.11/main/x86_64/APKINDEX.tar.gz&amp;#39;) par exemple.\nPour atteindre le niveau fonctionnel de l&#39;outil proposé, il faudrait ajouter la gestion du TTL et la suppression des ressources non utilisées depuis un certain temps. Cela devrait être possible en restant sous les cent lignes de code.Ensuite, PyInstaller regroupe tout dans un binaire autoportant &#8211; c&#39;est-à-dire: incorporant l&#39;interpréteur python et les dépendances &#8211; de moins de 11 Mo.\nJe vous remercie\nJe remercie l&#39;auteur de son envoi. Cela m&#39;a permis de réfléchir au problème de la mise en cache des ressources proposé dans https et qui me pose également des problèmes pour les tâches de construction de logiciels, de regarder dans aiohttp qui est une très bonne surprise, de revenir sur nginx qui est définitivement un outil très puissant, pour voir une bonne intégration de django + celery qui est un bon modèle pour construire des API pour l&#39;automatisation de l&#39;infrastructure.","html":"<p>Les dépendances sont résolues avec un pip install aiohttp[speedups] aiofile.A tester avec wget http://0.0.0.0:8080/$(urlencode &amp; # 39; http: //dl-cdn.alpinelinux.org/alpine/v3.11/main/x86_64/APKINDEX.tar.gz&amp;#39;) par exemple.\nPour atteindre le niveau fonctionnel de l&#039;outil proposé, il faudrait ajouter la gestion du TTL et la suppression des ressources non utilisées depuis un certain temps. Cela devrait être possible en restant sous les cent lignes de code.Ensuite, PyInstaller regroupe tout dans un binaire autoportant &#8211; c&#039;est-à-dire: incorporant l&#039;interpréteur python et les dépendances &#8211; de moins de 11 Mo.\nJe vous remercie\nJe remercie l&#039;auteur de son envoi. Cela m&#039;a permis de réfléchir au problème de la mise en cache des ressources proposé dans https et qui me pose également des problèmes pour les tâches de construction de logiciels, de regarder dans aiohttp qui est une très bonne surprise, de revenir sur nginx qui est définitivement un outil très puissant, pour voir une bonne intégration de django + celery qui est un bon modèle pour construire des API pour l&#039;automatisation de l&#039;infrastructure.</p>"},{"id":"text-10","type":"text","heading":"","plain_text":"Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]","html":"<p>Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]</p>"}],"sections":[{"id":"text-1","heading":"Text","content":"Résumé\nprésentation\nRécemment, une dépêche a présenté &quot;kisscache&quot;, un serveur de cache HTTP (S). Particularité, il ne lance qu&#39;un seul téléchargement simultané pour la même ressource.\nefficacité du réseau\nCette fonctionnalité permet, si plusieurs clients viennent de télécharger la même ressource, avant qu&#39;elle ne soit mise en cache, de ne pas envoyer plusieurs fois la même requête au serveur et donc d&#39;économiser de la bande passante côté client et serveur. Au final, tous les clients seront servis plus rapidement.\nCache HTTPS\nDe plus, l&#39;outil propose de résoudre le problème de mise en cache des ressources proposées en HTTPS. En effet, un cache server agit comme un &quot;homme au milieu&quot; et est donc difficilement compatible avec un transport sécurisé dont le but est, entre autres, de ne pas permettre la modification de la réponse du serveur sans que le client ne le détecte. Une solution courante &#8211; en particulier dans les entreprises pour inspecter le flux client-serveur, plus que pour la mise en cache &#8211; consiste à usurper le certificat du serveur, en le remplaçant par un certificat provenant d&#39;une autorité de confiance interne déployée sur les clients des machines. Il faut encore mener à bien ce déploiement.\nBAISER?\nL&#39;outil est présenté comme suivant le principe KISS. Il est vrai que le nombre de fonctionnalités est limité et que la quantité de code est petite, environ mille lignes de python. Cependant, les dépendances d&#39;exploitation sont importantes: django pour l&#39;API, postgres pour la base de données, céleri pour le traitement asynchrone, redis pour le bus de données, docker pour l&#39;infrastructure. La réécriture d&#39;URL rend son utilisation difficile.\nune analyse\nCache HTTPS\nLa solution proposée consiste à réécrire les URL de toutes les ressources demandées. Il est donc beaucoup plus intrusif et non standard que d&#39;utiliser un proxy conventionnel. Un proxy demande des variables d&#39;environnement, des paramètres de ligne de commande ou une modification du fichier de configuration. Un proxy transparent demande une configuration au réseau local ou au routeur. Concrètement, aucun gestionnaire de progiciel (apt, pip, etc.) ne permet la réécriture d&#39;URL. Et par conséquent, vous devez disposer d&#39;outils spécialement écrits pour être compatible avec kisscache.\nBAISER\nDe toute évidence, la gestion d&#39;un cache HTTP (S) n&#39;est pas ne pas Facile. Le protocole HTTP est compliqué, avec de nombreux scénarios, notamment sur la gestion du cycle de vie des ressources, influencés par de nombreux en-têtes. L&#39;outil kisscache ne le gère pas vraiment.Quelles autres pistes pouvons-nous suivre?\nnginx\nNginx n&#39;est pas un logiciel simple. Mais sa mise en œuvre l&#39;est. Avec un fichier de configuration relativement court &#8211; moins de vingt lignes &#8211; il gère correctement un cache HTTP (S) avec les mêmes fonctionnalités que celles attendues pour kisscache:\n                serveur \nécouter 3128;"},{"id":"text-2","heading":"Text","content":"expire max;\nproxy_cache on;\nproxy_cache_path / var / cache / proxy-nginx inactive = 1w; # une semaine\nproxy_cache_key &quot;$ schéma: // $ host $ request_uri&quot;;\nproxy_pass $ schéma: // $ host $ request_uri;\nproxy_set_header Host $ http_host;\nproxy_ignore_headers &quot;Set-Cookie&quot;;"},{"id":"text-3","heading":"Text","content":"proxy_ignore_client_abort on;\nproxy_cache_lock activé;\nproxy_cache_lock_age 10m;\nproxy_cache_valid 200 301 1w; # une semaine\nproxy_cache_valid any 1m;\nerreur proxy_cache_use_stale;"},{"id":"text-4","heading":"Text","content":"La directive &quot;proxy_cache_lock&quot; permet de n&#39;avoir qu&#39;un seul client à la fois téléchargeant une ressource. La directive &quot;proxy_ignore_client_abort&quot; permet de terminer le téléchargement même si le client interrompt la connexion. La directive &quot;inactive = 1w&quot; permet de nettoyer les ressources non consultées depuis un certain temps.\nPython asynchrone\nS&#39;il s&#39;agit d&#39;écrire un serveur en python qui cache les URL qui lui sont soumises, une approche simple consiste à connecter deux bibliothèques logicielles entre elles: un serveur HTTP et un client HTTP. Et pour plus d&#39;efficacité, allez voir le côté des capacités AsyncIO de Python. En collant l&#39;exemple de serveur et l&#39;exemple de client de la page d&#39;accueil aiohttp, nous arrivons rapidement à un prototype fonctionnel. Nous ajoutons entre les deux une gestion de fichiers (cache) et un mécanisme pour empêcher les téléchargements multiples et nous obtenons les quarante lignes de code suivantes:\nimporter asyncio\ndepuis le site d&#39;import aiohttp, ClientSession\nde hashlib import md5\nimporter os\ndepuis aiofile import AIOFile"},{"id":"text-5","heading":"Text","content":"D ="},{"id":"text-6","heading":"Text","content":"async def dl_and_cache (url, dirname, basename):\nasync avec ClientSession () en tant que session:\nasync avec session.get (url) comme réponse:\ncontent = attendre réponse.read ()\nos.makedirs (dirname, exist_ok = True)\npath = dirname + &quot;/&quot; + basename\nasynchrone avec AIOFile (chemin, &amp; # 39; wb &amp; # 39;) comme afp:\nattendre afp.write (contenu)"},{"id":"text-7","heading":"Text","content":"Poignée async def (demande):\nurl = request.match_info.get (&amp; # 39; url &amp; # 39;)\nimprimer (url)\nh = md5 (octets (url, &quot;ascii&quot;)). hexdigest ()\ndirname = &quot;.cache /&quot; + h[0:2]+ &quot;/&quot; + h[2:4]\n    nom de base = h[4:]\n    path = dirname + &quot;/&quot; + basename\nsinon os.path.exists (chemin):\n# si le téléchargeur est marqué, attendez-le\nsi l&#39;URL en D:\ntandis que l&#39;URL en D:\nattendre asyncio.sleep (1)\n# else, marquer comme téléchargement et commencer le téléchargement\nautre:\nré[url] = Aucun\n# utiliser le bouclier pour empêcher l&#39;annulation de la déconnexion du client\nattendre asyncio.shield (dl_and_cache (url, dirname, basename))\ndel D[url]\n    retourne web.FileResponse (chemin)"},{"id":"text-8","heading":"Text","content":"si __name__ == &amp; # 39; __ main __ &amp; # 39 ;:\napp = web.Application ()\napp.add_routes ([web.get('/url', handle)]) # l&#39;url doit être encodée en url\nweb.run_app (application)"},{"id":"text-9","heading":"Text","content":"Les dépendances sont résolues avec un pip install aiohttp[speedups] aiofile.A tester avec wget http://0.0.0.0:8080/$(urlencode &amp; # 39; http: //dl-cdn.alpinelinux.org/alpine/v3.11/main/x86_64/APKINDEX.tar.gz&amp;#39;) par exemple.\nPour atteindre le niveau fonctionnel de l&#39;outil proposé, il faudrait ajouter la gestion du TTL et la suppression des ressources non utilisées depuis un certain temps. Cela devrait être possible en restant sous les cent lignes de code.Ensuite, PyInstaller regroupe tout dans un binaire autoportant &#8211; c&#39;est-à-dire: incorporant l&#39;interpréteur python et les dépendances &#8211; de moins de 11 Mo.\nJe vous remercie\nJe remercie l&#39;auteur de son envoi. Cela m&#39;a permis de réfléchir au problème de la mise en cache des ressources proposé dans https et qui me pose également des problèmes pour les tâches de construction de logiciels, de regarder dans aiohttp qui est une très bonne surprise, de revenir sur nginx qui est définitivement un outil très puissant, pour voir une bonne intégration de django + celery qui est un bon modèle pour construire des API pour l&#39;automatisation de l&#39;infrastructure."},{"id":"text-10","heading":"Text","content":"Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]"}],"media":{"primary_image":""},"relations":[{"rel":"canonical","href":"https://tutos-gameserver.fr/2020/04/11/kisscache-cachant-le-baiser-serveur-dimpression-4/"},{"rel":"alternate","href":"https://tutos-gameserver.fr/2020/04/11/kisscache-cachant-le-baiser-serveur-dimpression-4/llm","type":"text/html"},{"rel":"alternate","href":"https://tutos-gameserver.fr/2020/04/11/kisscache-cachant-le-baiser-serveur-dimpression-4/llm.json","type":"application/json"},{"rel":"llm-manifest","href":"https://tutos-gameserver.fr/llm-endpoints-manifest.json","type":"application/json"}],"http_headers":{"X-LLM-Friendly":"1","X-LLM-Schema":"1.1.0","Content-Security-Policy":"default-src 'none'; img-src * data:; style-src 'unsafe-inline'"},"license":"CC BY-ND 4.0","attribution_required":true,"allow_cors":false}