{"id":15129,"date":"2024-08-31T10:32:50","date_gmt":"2024-08-31T08:32:50","guid":{"rendered":"https:\/\/www.beseit.net\/?p=15129"},"modified":"2024-08-31T13:32:10","modified_gmt":"2024-08-31T11:32:10","slug":"configurar-mod_wsgi-per-a-la-teva-aplicacio-python","status":"publish","type":"post","link":"http:\/\/www.beseit.net\/?p=15129","title":{"rendered":"Configurar mod_wsgi per a la teva aplicaci\u00f3 Python"},"content":{"rendered":"\n<p>Aqu\u00ed et mostro com configurar Apache per servir una aplicaci\u00f3 Flask. La configuraci\u00f3 per a Django seria similar, per\u00f2 amb alguns canvis.<\/p>\n\n\n\n<div style=\"height:22px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>1 <strong>Crea run fitxer de configuraci\u00f3 per al teu projecte Flask<\/strong>. Crea un fitxer, per exemple, <code>\/etc\/apache2\/sites-available\/<mark style=\"background-color:rgba(0, 0, 0, 0);color:#2c13dc\" class=\"has-inline-color\">myflaskapp.conf<\/mark><\/code> (Ubuntu\/Debian) o <code>\/etc\/httpd\/conf.d\/myflaskapp.conf<\/code> (Red Hat\/CentOS), amb el seg\u00fcent contingut:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"499\" height=\"435\" src=\"https:\/\/www.beseit.net\/wp-content\/uploads\/2024\/08\/imatge-34.png\" alt=\"\" class=\"wp-image-15130\" srcset=\"http:\/\/www.beseit.net\/wp-content\/uploads\/2024\/08\/imatge-34.png 499w, http:\/\/www.beseit.net\/wp-content\/uploads\/2024\/08\/imatge-34-300x262.png 300w, http:\/\/www.beseit.net\/wp-content\/uploads\/2024\/08\/imatge-34-344x300.png 344w\" sizes=\"auto, (max-width: 499px) 100vw, 499px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;VirtualHost *:80&gt;\n    ServerAdmin webmaster@yourdomain.com\n    ServerName yourdomain.com\n    DocumentRoot \/var\/www\/myflaskapp\n\n    WSGIDaemonProcess myflaskapp python-path=\/var\/www\/myflaskapp:\/path\/to\/your\/venv\/lib\/python3.x\/site-packages\n    WSGIProcessGroup myflaskapp\n    WSGIScriptAlias \/ \/var\/www\/myflaskapp\/myflaskapp.wsgi\n\n    &lt;Directory \/var\/www\/myflaskapp&gt;\n        Require all granted\n    &lt;\/Directory&gt;\n\n    ErrorLog ${APACHE_LOG_DIR}\/error.log\n    CustomLog ${APACHE_LOG_DIR}\/access.log combined\n&lt;\/VirtualHost&gt;\n\n\n<\/code><\/pre>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<p><strong>Explicaci\u00f3<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>ServerName<\/code><\/strong>: El nom de domini per accedir a l&#8217;aplicaci\u00f3.<\/li>\n\n\n\n<li><strong><code>DocumentRoot<\/code><\/strong>: La ubicaci\u00f3 del teu projecte.<\/li>\n\n\n\n<li><strong><code>WSGIDaemonProcess<\/code><\/strong>: Configura l&#8217;entorn del proc\u00e9s WSGI, especificant el cam\u00ed al directori del projecte i la ubicaci\u00f3 del teu entorn virtual.<\/li>\n\n\n\n<li><strong><code>WSGIScriptAlias<\/code><\/strong>: El fitxer <code>.wsgi<\/code> que Apache utilitzar\u00e0 per comunicar-se amb la teva aplicaci\u00f3 Python.<\/li>\n\n\n\n<li>Copilot proposa:<mark style=\"background-color:rgba(0, 0, 0, 0);color:#fa0d0d\" class=\"has-inline-color\"> sudo a2ensite myflaskapp.con<\/mark>f i <mark style=\"background-color:rgba(0, 0, 0, 0);color:#f30707\" class=\"has-inline-color\">sudo systemctl restart apache2<\/mark><\/li>\n<\/ul>\n<\/div><\/div>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"356\" height=\"434\" src=\"https:\/\/www.beseit.net\/wp-content\/uploads\/2024\/08\/imatge-37.png\" alt=\"\" class=\"wp-image-15143\" srcset=\"http:\/\/www.beseit.net\/wp-content\/uploads\/2024\/08\/imatge-37.png 356w, http:\/\/www.beseit.net\/wp-content\/uploads\/2024\/08\/imatge-37-246x300.png 246w\" sizes=\"auto, (max-width: 356px) 100vw, 356px\" \/><\/figure>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<p>2 <strong>Crea el fitxer <code>.wsgi<\/code><\/strong> per a la teva aplicaci\u00f3 Flask a <code>\/var\/www\/myflaskapp\/myflaskapp.wsgi<\/code> amb el seg\u00fcent contingut:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"501\" height=\"362\" src=\"https:\/\/www.beseit.net\/wp-content\/uploads\/2024\/08\/imatge-35.png\" alt=\"\" class=\"wp-image-15137\" srcset=\"http:\/\/www.beseit.net\/wp-content\/uploads\/2024\/08\/imatge-35.png 501w, http:\/\/www.beseit.net\/wp-content\/uploads\/2024\/08\/imatge-35-300x217.png 300w, http:\/\/www.beseit.net\/wp-content\/uploads\/2024\/08\/imatge-35-415x300.png 415w\" sizes=\"auto, (max-width: 501px) 100vw, 501px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>import sys\nimport logging\nfrom pathlib import Path\n\n# Configura el directori del projecte\nproject_home = Path('\/var\/www\/myflaskapp')\nif project_home not in sys.path:\n    sys.path.insert(0, str(project_home))\n\nfrom app import app as application  # Assegura't que aquest cam\u00ed apunti a l'aplicaci\u00f3 Flask\n\nlogging.basicConfig(stream=sys.stderr)\n<\/code><\/pre>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<p>3 <strong>Habilita la nova configuraci\u00f3<\/strong> (Ubuntu\/Debian):<\/p>\n\n\n\n<p><strong>Nota<\/strong>: Canvia <code>app<\/code> a la importaci\u00f3 correcta si el teu fitxer principal de l&#8217;aplicaci\u00f3 t\u00e9 un nom diferent o si utilitzes un m\u00f2dul diferent.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"492\" height=\"77\" src=\"https:\/\/www.beseit.net\/wp-content\/uploads\/2024\/08\/imatge-36.png\" alt=\"\" class=\"wp-image-15138\" srcset=\"http:\/\/www.beseit.net\/wp-content\/uploads\/2024\/08\/imatge-36.png 492w, http:\/\/www.beseit.net\/wp-content\/uploads\/2024\/08\/imatge-36-300x47.png 300w\" sizes=\"auto, (max-width: 492px) 100vw, 492px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo a2ensite myflaskapp\n<\/code><\/pre>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<p>4 <strong>Reinicia Apache<\/strong> per aplicar els canvis:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl restart httpd\n\n\n<\/code><\/pre>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h3 class=\"wp-block-heading\">3. <strong>Prova l&#8217;Aplicaci\u00f3<\/strong><\/h3>\n\n\n\n<p>Si tens problemes, revisa els fitxers de registre d&#8217;Apache (<code>\/var\/log\/apache2\/error.log<\/code> o <code>\/var\/log\/httpd\/error_log<\/code>) per obtenir m\u00e9s informaci\u00f3 sobre els errors que puguis estar trobant.<\/p>\n\n\n\n<p>Despr\u00e9s de reiniciar Apache, intenta accedir a la teva aplicaci\u00f3 a trav\u00e9s del navegador. Si has configurat tot correctament, hauries de veure la teva aplicaci\u00f3 Python servida per Apache.<\/p>\n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Aqu\u00ed et mostro com configurar Apache per servir una aplicaci\u00f3 Flask. La configuraci\u00f3 per a Django seria similar, per\u00f2 amb alguns canvis. 1 Crea run fitxer de configuraci\u00f3 per al teu projecte Flask. Crea un fitxer, per exemple, \/etc\/apache2\/sites-available\/myflaskapp.conf (Ubuntu\/Debian) &hellip; <a href=\"http:\/\/www.beseit.net\/?p=15129\">Continua llegint <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":8179,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-15129","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-bloc-de-notes"],"_links":{"self":[{"href":"http:\/\/www.beseit.net\/index.php?rest_route=\/wp\/v2\/posts\/15129","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.beseit.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.beseit.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.beseit.net\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.beseit.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=15129"}],"version-history":[{"count":7,"href":"http:\/\/www.beseit.net\/index.php?rest_route=\/wp\/v2\/posts\/15129\/revisions"}],"predecessor-version":[{"id":15145,"href":"http:\/\/www.beseit.net\/index.php?rest_route=\/wp\/v2\/posts\/15129\/revisions\/15145"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.beseit.net\/index.php?rest_route=\/wp\/v2\/media\/8179"}],"wp:attachment":[{"href":"http:\/\/www.beseit.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=15129"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.beseit.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=15129"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.beseit.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=15129"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}