Topic: Problema django e apache  (Letto 1003 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline barbezuan

  • python habilis
  • **
  • Post: 61
  • Punti reputazione: 0
    • Mostra profilo
Problema django e apache
« il: Aprile 08, 2018, 15:37 »
Ho un problema che riesco a capire in un applicazione per la gestione di dati.
Comincio con la descrizione dell'ambiente:

ubuntu server 16.04
apache 2.4
mysql  5.7.21
django 1.11.12

Il server fà solo questo ed è una macchina virtuale di vmware infrastructure.

L'applicazione vorrebbe gestire dati di produzione relativi a clienti ma non inerenti alla gestione amministrativa.
Il gestionale gira su un win ed è basato su mssql.
L'applicazione deve recuperare i dati anagrafici del cliente dal gestionale su mssql creando, di fatto, una relazione fra mysql e mssql.
Ora stò procedendo allo sviluppo a casa e simulo i dati ricevuti da mssql e tutto gira al meglio.
In azienda se faccio recuperare i dati dal gestionale funziona a 'random', mi spiego, sembra senza ragione si pianta 'django' facendo andare in timeout apache obbligando un restart del servizio.
Premetto che il modulo del recupero dati da mssql gira senza problemi, da shell python non crea nessun problema e, come detto prima, con i dati simulati anche django non dà problemi.
Il problema si presenta a caso, non sempre nello stesso punto e non riesco a capire come fare un debug della cosa perche ne apache ne django segnala problemi (a parte il timeout di apache)
Potrebbe essere un problema del mod_wsgi o del wsgi di django?
Vorrei qualche consiglio su come capire dove si crea il problema.

Grazie anticipate per l'attenzione

Barbezuan

Offline barbezuan

  • python habilis
  • **
  • Post: 61
  • Punti reputazione: 0
    • Mostra profilo
Re:Problema django e apache
« Risposta #1 il: Aprile 09, 2018, 22:49 »
Come test ho provato ad usare Postgresql al posto di Mysql ed il risultato non è cambiato.
Boh

Offline riko

  • python deus
  • *
  • moderatore
  • Post: 7.453
  • Punti reputazione: 12
    • Mostra profilo
    • RiK0 Tech Temple
Re:Problema django e apache
« Risposta #2 il: Aprile 09, 2018, 23:59 »
Mancano informazioni. Come parlano django e apache? Esattamente cosa dice la configurazione?
Etc etc etc.

Ma e' anche uno di quei problemi che o si ha la macchina sotto mano oppure si ha avuto quel problema o qualcosa di molto simile nel passato (e quindi si individua da pochissimi dettagli)

Offline barbezuan

  • python habilis
  • **
  • Post: 61
  • Punti reputazione: 0
    • Mostra profilo
Re:Problema django e apache
« Risposta #3 il: Aprile 10, 2018, 22:19 »
Grazie per la risposta Riko, si, sicuramente un pò carente d'informazioni,
Ne aggiungo qualcuna.

Questa è la configurazione di apache
________________________

Alias /static /home/www/static
<Directory /home/www/static>
Require all granted
</Directory>
<Directory /home/www/www>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
WSGIDaemonProcess www python-path=/home/www
WSGIProcessGroup www
WSGIScriptAlias / /home/www/www/wsgi.py


Questo è il settings di django:
___________________


INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'www.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'www.wsgi.application'


# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'db_name',
        'USER': 'user',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '',
    }
}


# Password validation
# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/1.11/topics/i18n/

LANGUAGE_CODE = 'it-IT'

TIME_ZONE = 'Europe/Rome'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/


STATIC_URL = '/static/'
STATIC_ROOT = '/home/www/static'


Così interrogo mssql:
______________

class cursore:
    def __enter__(self):
        self.conn = pymssql.connect(SERV, USR, PSW, DB_NAME, port='1433', timeout=2)
        return self.conn.cursor(as_dict=True)
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.conn.close()
......
    try:
        with cursore() as c:
            c.execute(querry)
            righe = c.fetchall()
    except:
        return False


Non picchiatemi per la fantasia dei nomi  :embarrassed:

Spero chiarisca un po di più l'ambiente.
Mi piacerebbe ricevere qualche consiglio su come condurre un debug per capire dove si trova il problema, non ricevendo nessuna info dal debug di django

Grazie del tempo che mi dedicate.
« Ultima modifica: Aprile 11, 2018, 08:55 da barbezuan »

Offline riko

  • python deus
  • *
  • moderatore
  • Post: 7.453
  • Punti reputazione: 12
    • Mostra profilo
    • RiK0 Tech Temple
Re:Problema django e apache
« Risposta #4 il: Aprile 15, 2018, 21:41 »
Guarda, ci ho guardato un po'. Nella tua configurazione non c'e' nulla che mis sembri particolarmente off (ma non lavoro con django da un po').
Da quello che vedo mi viene il sospetto che semplicemente possa essere una questione di db.

Studierei il plan della query nel db e vedere se e' stramba. Vedere se manca qualche indice o fa qualche join sospetta. Un possibile colpevole sarebbe vedere le statistiche di cpu e di io del db andare in su e vedere il worker bloccato in I/O wait.
Se vedi il worker esplodere di cpu, potrebbe essere che stanno arrivando troppi dati e il worker e' busy incredibilmente. E qui vorresti capire "a mano" da psql quanti dati ti ritorna davvero quella query.

Ma sto sparando nel buio... per esempio non mi e' chiaro quali siano i parametri di default (che essendo default non sono parte della tua configurazione). Come dicevo prima, questa e' una questione che si potrebbe risolvere velocemente essendo li con te (forse... diciamo se non e' davvero complicata, raro, ma succede). Da remoto, senza avere accesso a tutti quegli istinti che ti fanno vedere che qualcosa non e' proprio come torna nel modello mentale e fare epserimenti per validare.

Offline barbezuan

  • python habilis
  • **
  • Post: 61
  • Punti reputazione: 0
    • Mostra profilo
Re:Problema django e apache
« Risposta #5 il: Aprile 16, 2018, 22:02 »
Ciao Rico, grazie per l'attenzione. Questo fine settimana ho giocato un po con il logging per provare a capire dove si trova il problema e sono riuscito a capire che si pianta sempre nella creazione del cursor di pymssql, la querry non parte proprio. La cosa strana è che sembra che si pianti wsgi. Mi spiego,  se tento di accedere a qualche altra app, tipo admin, django non risponde mentre apache gira tranquillamente.
Cominque il modulo si richiesta dati a mssql provato a "mano" nella shell di python funziona bene, non perde un colpo.
Mah, continuerò con le indagini e spero di venirne a capo.

Offline riko

  • python deus
  • *
  • moderatore
  • Post: 7.453
  • Punti reputazione: 12
    • Mostra profilo
    • RiK0 Tech Temple
Re:Problema django e apache
« Risposta #6 il: Aprile 17, 2018, 09:41 »
Ciao Rico, grazie per l'attenzione. Questo fine settimana ho giocato un po con il logging per provare a capire dove si trova il problema e sono riuscito a capire che si pianta sempre nella creazione del cursor di pymssql, la querry non parte proprio. La cosa strana è che sembra che si pianti wsgi. Mi spiego,  se tento di accedere a qualche altra app, tipo admin, django non risponde mentre apache gira tranquillamente.

Qui non torna: non mi sembra probabile che la configurazione di default faccia partire *un e un solo worker*.
Quindi, anche se il codice che crea il cursore si piantasse, tu avresti *un* worker bloccato, ma il resto andrebbe tranquillo e pacioso (e non vedresti il comportamento che descrivi).

A meno che per qualche ragione tu non hai *solo* un worker.

Comunque, provato a leggere la documentazione?

> By default any WSGI application will run in what is called embedded mode. That is, the application will be hosted within the Apache worker processes used to handle normal static file requests.

Quanti apache hai detto di avere?

Comunque, questo documento dovresti studiarlo un po': http://modwsgi.readthedocs.io/en/develop/user-guides/quick-configuration-guide.html

Ah... quale e' la differenza fra thread e processi? Per evitare che tu faccia qualcosa che non e' davvero quello che vuoi.

Offline barbezuan

  • python habilis
  • **
  • Post: 61
  • Punti reputazione: 0
    • Mostra profilo
Re:Problema django e apache
« Risposta #7 il: Aprile 22, 2018, 18:41 »
Ciao Riko, scusa il ritardo ma ho avuto una settimana "densa".
Si, qualcosa non torna e non riesco a capire.
Apache è uno solo e la macchina virtuale fa solo quello.
Anche quelle pagine le ho lette(non sò effettivamente quanto ho capito con il mio inglese :embarrassed:).
L'applicazione l'ho fatta girare incapsulando le chiamate a mssql in un sottoprocesso, ma è come nascondere la polvere sotto il tappeto.
Mi spiego, si l'applicazione gira , ma il problema non è risolto, comunque c'è qualcosa sotto che non quadra. Non so se mi sono spiegato.
Comunque ho un clone della macchina per continuare a testare e cercare di capire

Grazie ancora dell'attenzione

Offline riko

  • python deus
  • *
  • moderatore
  • Post: 7.453
  • Punti reputazione: 12
    • Mostra profilo
    • RiK0 Tech Temple
Re:Problema django e apache
« Risposta #8 il: Aprile 22, 2018, 19:32 »
Ma guarda, se apache e' "uno solo", e' li che state sbagliando. Non ha nessun senso non potere gestire concorrenza.
Ma mi sembra piu' probabile che tu intenda altro e che tu in realta' abbia qualche forma di worker, siano poi thread o processi.

Io direi che il problema e' sulla concorrenza di qualcosa. In particolare avete una configurazione sbagliata che fa si che siate strettamente mono-flusso. E infatti poi cercate di aprire flussi paralleli con sottoprocessi. Guardate la configurazione!