I need help to deploy a django project on a production server, I have done the following process:
- I have the Ubuntu server configured
- I have created the virtual environment
- I have installed django.
- I run ./manage.py runserver domain: port
But when accessing localhost the apache default page is shown, with the message "It Works".
I don't know where I should locate the files of my application and I would like to know if perhaps I am skipping an important step or should I do some additional configuration in Apache?
My configuration is:
- Web Server: Apache2
- Hosting: Strato
- Python: 3.5
- Django: 1.9
EDIT: One question I have followed the official documentation, I've read a couple of times is where you have to point the WSGIScriptAlias routes and WSGIPythonPath within the Apache2 configuration.
WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py (the first bar is what makes me doubt, I don't know if it has to point to the root like here or the vhost where I want to have the web).
WSGIPythonPath /path/to/mysite.com (and in theory this should point to where I have python installed, correct?).
(In the end I have followed apache since I cannot migrate the server to nginx).
After having configured the VirtualHost in Apache2 following the example:
Now when I access mydomain.com I get a 403 Forbidden. (What could that be due to? What do I have to give permissions to the project folder? Or is there a badly referenced directory?)
Is the VirtualHost enough or should I start a process to start django?
Do you have to redirect port 8000 to 80?
EDIT: Here I leave my VirtualHost
<VirtualHost *:80> DocumentRoot "/var/www/vhosts/dominio.com/chewbacca.dominio.com" Alias "/media" "/var/www/vhosts/dominio.com/chewbacca.dominio.com/django-project/chewbacca_project/media" Alias "/static" "/var/www/vhosts/dominio.com/chewbacca.dominio.com/django-project/chewbacca_project/static" <Directory /var/www/vhosts/dominio.com/chewbacca.dominio.com/django-project/chewbacca_project/static/> Order deny,allow Allow from all </Directory> <Directory /var/www/vhosts/dominio.com/chewbacca.dominio.com/django-project/chewbacca_project/media/> Require all granted </Directory> WSGIDaemonProcess chewie python-path=/var/www/vhosts/dominio.com/chewbacca.dominio.com/django-project/:/var/www/vhosts/dominio.com/chewbacca.dominio.com/django-env/lib/python3.5/site-packages WSGIProcessGroup chewie WSGIScriptAlias / /var/www/vhosts/dominio.com/chewbacca.dominio.com/django-project/chewbacca_project/chewbacca_project/wsgi.py WSGIPassAuthorization On <Directory /var/www/vhosts/dominio.com/chewbacca.dominio.com/django-project/chewbacca_project/chewbacca_project> <Files wsgi.py> Require all granted </Files> </Directory>
EDIT: I think one of the problems I have is that the server works with PLESK , but hey.
The Apache log gives me the following error:
- Fatal Python error: PyEval_AcquireThread: NULL new thread state
[ssl: warn] [pid 14845] AH01909: RSA certificate configured for chewbacca.mydomain.com:443 does NOT include an ID which matches the server name
EDIT: In the end I have been able to fix the problems, one of the problems I had (and important) is that I had not created the symbolic link from pip3 to pip ( ln -s / usr / bin / pip3 / usr / bin / pip ) after of all that, it has already worked for me. NOW SIIIII! 😉 The mod_python and mod_wsgi I could find it in google and I did.
Thanks a lot!
EDIT: In the end I have managed to put the project and everything perfect, but installing the dependencies ( DjangoRestFramework, Pillow, Psycopg2 ) then I have done a service apache2 restart and poof … it has stopped working it has returned to give error 500. I recommend installing all dependencies before so python script doesn't get corrupted
EDIT: After 15 days of going crazy every day, I have managed to make the WSGI work for me, the problem comes now that I am making changes in the project and they are not reflected in the part in production, now if I do a runserver and enter through port 8000 if it shows me the real project (with the changes that I have made), someone would be so kind to tell me why that happens to me? It is not enough to put all that, I leave something else?
I do not get any errors from imports, or anything, I have even done a ./manage.py check –deploy and it gives me 8 warnings (normal), what am I missing? I am doing something wrong? I have also done a ./manage.py test project and I get that there is no fault.
Regarding your doubts:
WSGIScriptAlias: it has to point to the absolute path with respect to your virtualhost i.e
/ . If you put
/miruta , your url would be, for example,
WSGIPythonPath: you must point where you have installed python surely your virtual environment, for example:
A possible configuration for your apache could be something like this:
<VirtualHost *:80> DocumentRoot /var/www/[RAIZ_DEL_APACHE/HOSTING] Alias /media /var/www/[PATH_A_CARPETA_MEDIA] Alias /static /var/www/[PATH_A_CARPETA_STATICS] <Directory /var/www/[PATH_A_CARPETA_STATICS]> Order deny,allow Allow from all </Directory> <Directory /var/www/[PATH_A_CARPETA_MEDIA]> Require all granted </Directory> WSGIDaemonProcess [NOMBRE_QUE_QUIERAS] python-path=/var/www/[PATH_AL_PROYECTO]:/var/www/[PATH_AL_PROYECTO]/venv/lib/python3.5/site-packages WSGIProcessGroup [NOMBRE_QUE_QUIERAS] WSGIScriptAlias / /var/www/[PATH_AL_PROYECTO]/[PATH_DEL_WSGI]/wsgi.py WSGIPassAuthorization On <Directory /var/www/[PATH_AL_PROYECTO]> <Files wsgi.py> Require all granted </Files> </Directory> </VirtualHost>
To better understand what you have to replace, let's assume the following:
Your project has these routes:
/var/www/htm/ |--miproyecto/ |--venv/ --> carpeta donde has creado tu entorno virtual, supongamo con virtualenv |--statics/ --> carpeta donde se almacenan los ficheros estáticos cuando haces python manage.py collectstatic |--media/ --> carpeta de los ficheros multimedia |--miapp/ | |--wsgi.py |--manage.py
With this, the apache example above would look like:
<VirtualHost *:80> DocumentRoot /var/www/html Alias /media /var/www/html/miproyecto/media/ Alias /static /var/www/html/miproyecto/statics/ <Directory /var/www/html/miproyecto/statics/> Order deny,allow Allow from all </Directory> <Directory /var/www/html/miproyecto/media/> Require all granted </Directory> WSGIDaemonProcess miproyectoweb python-path=/var/www/html/miproyecto/:/var/www/html/miproyecto/venv/lib/python3.5/site-packages WSGIProcessGroup miproyectoweb WSGIScriptAlias / /var/www/html/miproyecto/miapp/wsgi.py WSGIPassAuthorization On <Directory /var/www/html/miproyecto> <Files wsgi.py> Require all granted </Files> </Directory> </VirtualHost>
Anyway, if we talk about deployments to production in general with Django, the most preferred deployment is with Django + Gunicorn + Supervisor + Nginx .
I also recommend, if you want to carry out a continuous deployment project, take a look at libraries such as fabric