How is it possible to serve out multiple Django apps on multiple domains?
For example I have
djangoapp1.com and djangoapp2.com
I then have two separate apps in two separate locations
/srv/www/djangoapp1
/srv/www/djangoapp2
I am running Apache2 with mod_wsgi and I currently have the following in its httpd.conf
WSGIScriptAlias / /srv/www/app1/app1/wsgi.py
WSGIPythonPath /srv/www/app1
<Directory /srv/www/app1/system>
<Files wsgi.py>
Order deny,allow
Allow from all
</Files>
</Directory>
I also then obviously have the virtual host and I get the django default install page, but now I want to serve up my second app, can anybody point me in the right way to do this?
Django V: 1.4.1
There are many approaches you can take here, and no simple answer - it depends on your requirements and constraints.
The Simplest Thing That Could Possibly Work is very likely the approach suggested by #Hedde - to define the WSGI configuration per-site inside a virtualhost.
A second and possibly more flexible approach would be to run each Django application inside it's own containing application server e.g. gunicorn (hopefully in a virtualenv to isolate application specific dependencies) on different ports and then use Apache or even Nginx as a proxy for application traffic.
This involves a more complicated server environment to manage, but gives you the advantage of being able to manage your applications individually.
You can reconfigure your available workers, upgrade application versions, make changes to settings.py etc for one application at a time rather than having to restart a single monolithic process.
In addition, although it is, of course possible, monitoring virtualhosts within the same Apache process is more complex than monitoring individual application server instances separately.
YMMV
You can use Apache's VirtualHosts
There's plenty examples for Django, e.g. here
One of the ways to run multiple django apps on a single server is to run one app on one port each.
How to run two apps on two different ports?
As recommended by Django, I am using wsgi to interface between apache and Django code. Tricky thing here is that you cannot use wsgi in "embedded" mode. In embedded some os resources are shared and hence leads to race conditions. Solution is to use wsgi in daemon mode. In daemon mode, as the name suggests, wsgi runs as separate processes and hence no shared resources. Your two django apps will be unaware of each other.
This is how my configuration looks. I am running apps on port 8082 and 8083. Notice the lines with WSGIDaemonProcess and WSGIProcessGroup and process-group=pas
Listen 8082
<VirtualHost *:8082>
WSGIDaemonProcess djangoapp1 processes=2 threads=15 display-name=%{GROUP}
WSGIProcessGroup djangoapp1
WSGIScriptAlias /apis /home/apis/djangoapp1/xyz/config.wsgi process-group=djangoapp1
WSGIApplicationGroup %{GLOBAL}
<Directory /home/apis/djangoapp1>
Options +ExecCGI
<Files config.wsgi>
Require all granted
</Files>
</Directory>
</VirtualHost>
Listen 8083
<VirtualHost *:8083>
WSGIDaemonProcess djangoapp2 processes=2 threads=15 display-name=%{GROUP}
WSGIProcessGroup djangoapp2
WSGIScriptAlias /apis /home/apis/discovery_api/nykaa/config.wsgi process-group=djangoapp2
WSGIApplicationGroup %{GLOBAL}
<Directory /home/apis/djangoapp2>
Options +ExecCGI
<Files config.wsgi>
Require all granted
</Files>
</Directory>
</VirtualHost>
How to serve both the apps on port 80 ?
<VirtualHost *:80>
ProxyPreserveHost On
ProxyRequests Off
ServerName example.com
ServerAlias localhost
ProxyPassMatch "^/(apis/v1/hello$.*)" "http://127.0.0.1:8082/$1"
ProxyPassMatch "^/(apis/v1/hi$.*)" "http://127.0.0.1:8082/$1"
ProxyPassMatch "^/(apis/v1/wassup$.*)" "http://127.0.0.1:8083/$1"
ProxyPassMatch "^/(apis/v1/howdy$.*)" "http://127.0.0.1:8083/$1"
</VirtualHost>
Two ways to access wassup and hello API:
http://example.com:8083/apis/v2/wassup?q=howsitgoing
http://example.com/apis/v2/wassup?q=howsitgoing
http://example.com:8082/apis/v2/hello?q=how are you
http://example.com/apis/v2/hello?q=howareyou
Django Code
As recommended on Django website I have replaced
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name }}.settings")
to
os.environ["DJANGO_SETTINGS_MODULE"] = "{{ project_name }}.settings"
Please see if this is helpful
in apache2.conf or htppd.conf
# Virtual hosts setup
NameVirtualHost *
<VirtualHost *>
ServerName example1.com
............
WSGIScriptAlias / /..../path/to/wsgi1.py
</VirtualHost>
<VirtualHost *>
ServerName example2.com
............
WSGIScriptAlias / /..../path/to/wsgi2.py
</VirtualHost>
in wsgi1.py
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings1' # or projectnaame.settings1
in wsgi2.py
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings2' # or projectname.settings2
In settings1.py & settings2.py you can make necessary databases and other configurations
Related
I have a problem. I'm creating a server where I will host a Django project and also PGAdmin4. I configured PGAdmin to run through apache2 and WSGI with a Python 3.8 virtual environment. It was working perfectly before I set up the Django project. at the ip/pgadmin. As soon as i manage to host the Django on the virtual host. The pgadmin started not to work.
When trying to enter the "ip/pgadmin" while the django webserver is not at the root at the WSGIScriptAlias i receive this page.
Not Found
The requested URL was not found on this server.
Apache/2.4.41 (Ubuntu) Server at 192.168.0.10 Port 80
and the following log error. The pgadmin4 is installed withing the same virtualenv that runs the django project but as they are daemons thats not a problem. So i do not see why is searching under "/var/www/acas_webserver/pgadmin/"
[Tue Mar 16 00:54:22.633470 2021] [core:info] [pid 26119:tid 140348751849216] [client 192.168.0.5:63072] AH00128: File does not exist: /var/www/acas_webserver/pgadmin/
But when i place the django project at the root of the WSGIScriptAlias i reacieve this page but no log info to know what happened.
Not Found
The requested resource was not found on this server.
I'm trying to get both of them work alone and having my django at the root of the directories of the apache2 virtual hosts + wsgi. I cannot fint whats the problem an its been countless hours without figuring it out. where are the virtual hosts configurations
#django project
<VirtualHost *:80>
ServerAdmin lemanuel.colon#upr.edu
ServerName 192.168.0.10
DocumentRoot /var/www/acas_webserver
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
LogLevel info
Alias /static /var/www/acas_webserver/static
<Directory /var/www/acas_webserver/static>
Require all granted
</Directory>
Alias /media /var/www/acas_webserver/media
<Directory /var/www/acas_webserver/media>
Require all granted
</Directory>
<Directory /var/www/acas_webserver/adapts>
<Files wsgi.py>
Require all granted
</Files>
Require all granted
</Directory>
WSGIDaemonProcess acas_app python-path=/var/www/acas_webserver python-home=/var/www/acas_webserver/my_venv
WSGIProcessGroup acas_app
WSGIScriptAlias / /var/www/acas_webserver/adapts/wsgi.py
WSGIApplicationGroup %{GLOBAL}
</VirtualHost>
#Pgadming
<VirtualHost *:80>
ServerName 192.168.0.10
LogLevel debug
ErrorLog ${APACHE_LOG_DIR}/pgadmin-error.log
CustomLog ${APACHE_LOG_DIR}/pgadmin-access.log combined
DocumentRoot /var/www/acas_webserver/my_venv/lib/python3.8/site-packages/pgadmin4/
LoadModule wsgi_module modules/mod_wsgi.so
WSGIDaemonProcess pgadmin processes=1 threads=25 python-home=/var/www/acas_webserver/my_venv
WSGIScriptAlias /pgadmin /var/www/acas_webserver/my_venv/lib/python3.8/site-packages/pgadmin4/pgAdmin4.wsgi
<Directory /var/www/acas_webserver/my_venv/lib/python3.8/site-packages/pgadmin4/>
WSGIProcessGroup pgadmin
WSGIApplicationGroup %{GLOBAL}
Require all granted
</Directory>
</VirtualHost>
I just want to get them work to continue on with this projects and its been several days of headaches. Can someone be of help here? If anything is need im happy to provide. Plz help.
UPDATE:
The problem is all coming up once I enable the django webserver. As soon as i turn of my django webserver on Apache2, i can access my pgadmin page, but as soon as I turn on my django webserver on Apache2, the pgadmin again is unreachable.
I have looked at your configs ( e.x apache ) and seem fine.
I think, there are many possible ways to solve your problem.
The first way would be using some docker container that fits your needs. if you don't know about it just "GOOGLE: docker Django Postgres apache " and read the top links.
Search for it and there are many results already there. After that, you can run your project probably. I don't want to go deep into docker but surely would solve your problem.
Second, Check and monitor your services, ports, and permissions. If they are not in right place, maybe your server ports are busy or you should restart the services. (as you said worked fine before the Django installation, this idea has a low chance to solve the problem)
Furthermore, You should deploy your Django project in the right folder. the differences between those logs are rational. root folder probably is under a read-only mode.
you have mentioned that you have to work on this project and it's been several days of headaches. My first question is why do you focus on server deployment rather than coding? You can easily run Postgre, WSGI, and Django without any headache ! ( developing environment)
and pgadmin isn't a necessary tool. Also, if it's the problem and you should use it just ignore it and pass it to the final stage which you have done your coding phases. ( seems you stuck in the first place without coding)
I'm trying to host two different apps on different Virtual Hosts with different ports on Windows 10. Problem is that apache completely hangs after few requests from one app to another.
Hosting them on one Virtual Host with different paths seems to solve the problem, and so does disabling requests.
Both apps are Python Flask web servers.
httpd.conf
Listen 80
Listen 3000
ServerName localhost
<VirtualHost *:80>
WSGIScriptAlias / F:\path\to\server.wsgi
<Directory F:\path\to>
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:3000>
WSGIScriptAlias / F:\another\path\to\server.wsgi
<Directory F:\another\path\to>
Require all granted
</Directory>
</VirtualHost>
AcceptFilter http none
AcceptFilter https none
Seems that i found the solution:
If you using C modules in your apps then add this line inside VirtualHost
WSGIApplicationGroup %{GLOBAL}
Slow page loading on apache when using Flask
https://modwsgi.readthedocs.io/en/develop/user-guides/application-issues.html#python-simplified-gil-state-api
NOTE: This question is different from 'Add a prefix to all Flask routes' as I am trying to resolve this at apache level. Additional, the suggested fix for flask routes did not work!
Following on from this post, I'm trying to set up apache to serve PHP files by default, but point a given alias (i.e. /flaskapp) to a wsgi path. The wsgi file in turn routes requests to a python flask app.
Here's the apache config that I'm trying (under 000-default.conf):
<VirtualHost *:80>
ServerName localhost
ServerAdmin webmaster#localhost
Alias / /var/www/html/
<Directory "/var/www/html">
Order Deny,Allow
Allow from all
Require all granted
</Directory>
WSGIScriptAlias /flaskapp "/var/www/flaskapp/deploy.wsgi"
<Directory /var/www/flaskapp>
Options +ExecCGI
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
After doing a service apache2 restart I find that requests to http://myip/flaskapp result in a 404 error. Everything else works fine.
Things I've tried so far:
Double checking all the file and folder paths (no issues found)
Using the wsgi part of the above code to set up the wsgi app as a standalone virtualhost (works fine)
Adding app.config['APPLICATION_ROOT'] = '/flaskapp' to my app.py file, as suggested the question 'Add a prefix to all Flask routes' (Didn't have any effect)
Where could I be going wrong?
Instead of:
Alias / /var/www/html/
<Directory "/var/www/html">
Order Deny,Allow
Allow from all
Require all granted
</Directory>
use:
DocumentRoot /var/www/html/
<Directory "/var/www/html">
Order Deny,Allow
Allow from all
Require all granted
</Directory>
Using '/' with Alias takes precedence over everything else including mod_wsgi's ability to intercept requests at a sub URL. So for stuff at root of the site you need to use DocumentRoot directive.
I am having difficulty troubleshooting this issue. I have a Django app running on an Ubuntu 14.04 server (with Apache 2.4 and mod_wsgi for Python 3.4). It connects to SQL Server via pymssql.
In development, the app works fine. I query the database, and the database returns the expected results.
In production (under the Apache user), however, the script hangs at the exact point that a database query is made. My browser (Chrome or Firefox) shows a spinning wheel that continues to spin as long as the browser window is open.
I have the following in my apache2.conf file:
ServerName localhost
# WSGIDaemonProcess application
WSGIPythonPath /home/production_code/python3env/lib/python3.4/site-packages:/home/production_code/school
# WSGIProcessGroup application
WSGIScriptAlias / /home/production_code/school/school/wsgi.py
# Python virtualenv home
WSGIPythonHome /home/production_code/python3env
# Include the virtual host configurations:
IncludeOptional sites-enabled/*.conf
And the following in my sites-enabled/000-default.conf file:
<VirtualHost *:80>
ServerAdmin *****#school.edu
ServerName localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
Alias /static/ /home/production_code/school/static/
<Directory /home/production_code/school/>
Require all granted
</Directory>
<Directory /home/production_code/school/>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
<Directory /home/production_code/school/static>
Require all granted
</Directory>
</VirtualHost>
Does anyone have any idea what might be causing this or how I might troubleshoot this? The Apache error logs and access logs are not particularly helpful in this situation, since a response to the request is never rendered. Similarly, Django debugging is also not useful here.
Instead of:
# WSGIDaemonProcess application
WSGIPythonPath /home/production_code/python3env/lib/python3.4/site-packages:/home/production_code/school
# WSGIProcessGroup application
use:
WSGIDaemonProcess application python-path=/home/production_code/python3env/lib/python3.4/site-packages:/home/production_code/school
WSGIProcessGroup application
WSGIApplicationGroup %{GLOBAL}
A key part of this is the WSGIApplicationGroup directive, with it being set to %{GLOBAL}.
This is to get around faulty third party extension modules for Python that don't work in sub interpreters and which can fail with a dead lock or crash.
See:
https://code.google.com/p/modwsgi/wiki/ApplicationIssues#Python_Simplified_GIL_State_API
It is also recommend you go back to using daemon mode. It is generally not a good idea to use embedded mode.
http://blog.dscpl.com.au/2012/10/why-are-you-using-embedded-mode-of.html
I am trying to set up apache with an existing django project using the tutorial in django site here. My os is Ubuntu, and everything is installed (django apache2 libapache2-mod-wsgi)
My conf file
WSGIPythonPath /home/avlahop/development/django/rhombus2/rhombus/
<VirtualHost *:80>
ServerName myrhobmus.com
ServerAlias www.myrhombus.com
WSGIScriptAlias / /home/avlahop/development/django/rhombus2/rhombus/rhombus/wsgi.py
</VirtualHost>
After I created the conf file I ran the a2ensite Ubuntu command for enabling the site.
Putting WSGIPythonPath inside VirtualHost gives me an apache configtest failure
Files inside directive inside directory (as described in the example) gives me the same failure
If I go to www.myrhombus.com I get a Google chrome could not find the specified address message.
What am I doing wrong? Every tutorial on the Internet is using the old file.wsgi while now Django creates this for you but it is a python file with .py extension. How can I serve my django with apache? And If I wanted to go production at my own server where would you put django code and where would you put template files?
EDIT: I am only getting the Index of / page. Is there something I have to do with mysites location in terms of permissions? Could you give me a working example of an django site apache conf file?
I use Django 1.8 and I successfully deployed my project Apache server. I followed basic concept like you and enable Apache this module early.
enable module
You can my project structure this question.Refer this question to understand project structure
--------------this is my virtual host file----------------------------------
WSGIPythonPath /home/umayanga/Desktop/view_site/serialKey_gen_site:/home/umayanga/Desktop/view_site/serialKey_gen_site/myvenv/lib/python3.4/site$
<VirtualHost *:80>
ServerAdmin admin#key.com
ServerName key.com
ServerAlias www.key.com
Alias /templates/ /home/umayanga/Desktop/view_site/serialKey_gen_site/templates/
Alias /static/ /home/umayanga/Desktop/view_site/serialKey_gen_site/static/
<Directory "/home/umayanga/Desktop/view_site/serialKey_gen_site/static">
Require all granted
</Directory>
<Directory "/home/umayanga/Desktop/view_site/serialKey_gen_site/templates">
Require all granted
</Directory>
WSGIScriptAlias / /home/umayanga/Desktop/view_site/serialKey_gen_site/mysite/wsgi.py
<Directory "/home/umayanga/Desktop/view_site/serialKey_gen_site/mysite">
Options Indexes FollowSymLinks
AllowOverride all
Require all granted
<Files wsgi.py>
Require all granted
</Files>
</Directory>
</VirtualHost>
-----------------wsgi.py---------------------------------------
"""
WSGI config for mysite project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/1.8/howto/deployment/wsgi/
"""
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
application = get_wsgi_application()
I think this will be help to you.