+++
title = "Git: come configurare il proprio server, parte 2."
author = "Danilo M."
type = "tech"
date = "2018-12-17T07:39:08+00:00"
excerpt = "In questo articolo darò seguito a quanto scritto in precedenza su GIT e su come automatizzare la distribuzione di script Python Flask per servire un’applicazione web con Apache."
draft = true
image = "/uppies/2018/12/gitout.jpg"
categories = [ "DIY", "Code"]
tags = ["git", "linux", "python", "howto", "automation", "ssh", "flask", "do it yourself"]
+++

Questo è un seguito del [mio precedente articolo su come configurare il server][1] per gestire un repository GIT e distribuire contenuti su un server web come Apache.

Da quando ho iniziato a sperimentare con Python e la pubblicazione di contenuti web, volevo trovare un modo per caricare direttamente tutte le modifiche al mio codice sorgente su un server web, in modo simile a quanto già faccio con PHP e Apache.

> Voglio farlo da solo, nel modo che preferisco...
>
> — danix

Servire script Python è leggermente diverso dal servire file HTML o PHP; ecco uno schema che illustra cosa succede quando si utilizza Python (Flask in questo esempio) per servire contenuti web.

Come potete vedere, il server web funge da proxy inverso per il server [WSGI][2] Gunicorn. Apache riceve una richiesta da un client, la inoltra a Gunicorn, che a sua volta richiede al servizio web Python (nel nostro caso, la nostra applicazione web Flask). Oltre a fungere da proxy inverso, Apache viene utilizzato anche per servire contenuti statici che non sono generati da Python, come immagini, fogli di stile CSS o script JavaScript.

Per distribuire un'applicazione web Python, ho dovuto installare l'estensione mod_wsgi per Apache, quindi ho deciso di utilizzare una cartella nel mio sistema per installare l'ambiente virtuale per Python, in modo da poter eseguire la mia applicazione web e specificare tale directory nel file di configurazione del virtual host all'interno di Apache. Successivamente, ho creato una directory in cui archiviare tutti i file della mia applicazione web e ho indicato ad Apache di servirli utilizzando l'ambiente virtuale che avevo creato in precedenza. Ecco più o meno cosa ho fatto:

```bash
# create the virtual environment for python inside
# the folder /usr/local/virtualenvs/my-app:
virtualenv /usr/local/virtualenvs/my-app

# now create the directory inside the apache root
# to store our web app
mkdir /var/www/htdocs/my-app
```

Ora, se inseriamo tutti i file Python della nostra applicazione web Flask, possiamo eseguirla all'interno di Apache. Questa è la configurazione per il virtual host che ho utilizzato:

```apache
<VirtualHost *:80>
    ServerName my-app.mysite.ext
    ErrorLog "/var/log/httpd/my-app.error_log"
    CustomLog "/var/log/httpd/my-app.access_log" common
    WSGIDaemonProcess my-app user=apache group=apache threads=5 python-home=/usr/local/virtualenvs/my-app
    WSGIScriptAlias / /var/www/htdocs/my-app/my-app.wsgi
    WSGIProcessGroup my-app
    Alias "/static/" "/var/www/htdocs/my-app/static/"
    <Directory "/var/www/htdocs/my-app/static/">
            Order allow,deny
            Allow from all
    </Directory>
    <Directory "/var/www/htdocs/my-app/">
            Require all granted
    </Directory>
</VirtualHost>
```

Con questa configurazione, ora posso accedere alla mia applicazione web e testarla dopo aver riavviato il server web.

[1]: https://danix.xyz/2018/07/git-setup-own-server/
[2]: https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface