I got a forbidden message error when I type localhost/project on windows 10. Tried suggestions with
Order allow,deny
Allow from all
Tried also the solution suggested here, without success, conf file of the apache on wamp 2.5 already listens on
Listen 0.0.0.0:80
Listen [::0]:80
Could it be because of the WSGIScriptAlias or WSGIPythonPath?
If so see how I've declared it:
WSGIScriptAlias /project "C:/project/project/code.py"
WSGIPythonPath "C:/project/"
<Directory "C:/project/project/">
<Files code.py>
Order deny,allow
Require all granted
</Files>
</Directory>
Thank you!
As I changed the Files code.py with wsgi.py it worked. The thing is that now I encounter rather different problem. Which I think is related to this one.
The picture shows the difference between the apache and Django web server. On the left is the address localhost/admin on the right is localhost:8000/admin
could that be because of the mod_wsgi not working properly?
tried to put in settings file STATIC_ROOT and use the command python manage.py collectstatic but without success. Does anybody knows how to be done in django1.8?
According to the documentation
Alias /static/ C:/project/static/
<Directory C:/project/static>
Require all granted
</Directory>
that has been required along with change in the settings.py file
STATIC_ROOT = path to your projects folder (where manage.py is located)
WSGIScriptAlias / C:/project/webpage/wsgi.py
WSGIPythonPath C:/project/
<Directory C:/project/webpage>
<Files wsgi.py>
Order deny,allow
Allow from all
Require all granted
</Files>
</Directory>
Thanks to #GrahamDumpleton and #DanielRoseman
Related
I have multiple django projects and i want to host them under same domain
eg: example.com/one<br> example.com/two
I have searched for various solutions and found the below given link which helped me alot.
Is it possible to host multiple django projects under the same domain?
From the above reading , I get to know that I need mod_wsgi for this but I am confused that where to install this mod_wsgi - Do i need to install under every project folder (seperate for every myenv) or it should be installed only once .
Please help me in how and where to install this mod_wsgi and finally how to host multiple projects under same domain name.
Some Code Tried By Another User With Same Problem But Also Not Working
<VirtualHost *:80>
ServerAdmin admin#my_domain.com
ServerName my_domain.com
ServerAlias www.my_domain.com
DocumentRoot /var/www/my_domain.com
ErrorLog ${APACHE_LOG_DIR}/my_domain.com_error.log
CustomLog ${APACHE_LOG_DIR}/my_domain.com_access.log combined
# site_1
Alias /site_1_project/static /var/www/my_domain.com/site_1_project/static
<Directory /var/www/my_domain.com/site_1_project/static>
Require all granted
</Directory>
Alias /site_1_project/media /var/www/my_domain.com/site_1_project/media
<Directory /var/www/my_domain.com/site_1_project/media>
Require all granted
</Directory>
<Directory /var/www/my_domain.com/site_1_project/site_1_project>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
WSGIDaemonProcess site_1_project python-path=/var/www/my_domain.com/site_1_project python-home=/var/www/my_domain.com/site_1_project/django_env_site_1
WSGIProcessGroup site_1_project
WSGIScriptAlias /site_1_project/ /var/www/my_domain.com/site_1_project/site_1_project/wsgi.py
# site_2
Alias /site_2_project/static /var/www/my_domain.com/site_2_project/static
<Directory /var/www/my_domain.com/site_2_project/static>
Require all granted
</Directory>
Alias /site_2_project/media /var/www/my_domain.com/site_2_project/media
<Directory /var/www/my_domain.com/site_2_project/media>
Require all granted
</Directory>
<Directory /var/www/my_domain.com/site_2_project/site_2_project>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
WSGIDaemonProcess site_2_project python-path=/var/www/my_domain.com/site_2_project python-home=/var/www/my_domain.com/site_2_project/django_env_site_2
WSGIProcessGroup site_2_project
WSGIScriptAlias /site_2_project/ /var/www/my_domain.com/site_2_project/site_2_project/wsgi.py
#RewriteEngine on
#RewriteCond %{SERVER_NAME} =my_domain.com [OR]
#RewriteCond %{SERVER_NAME} =www.my_domain.com
#RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
Installing mod_wsgi depends on what your host OS is. Check the instructions. If you're using CentOS or RedHat, I'd recommend looking at IUS Community; they provide a repository with yum installable packages for Python 3.6 and mod_wsgi. The version of mod_wsgi you install has to be compiled against the same version of Python you are running into your virtual environment.
Then you need to configure your VirtualHost properly. If you have a host at the root, it has to come last in your definition. Here's an example:
<VirtualHost *:443>
TimeOut 300
SSLEngine On
ServerName mysite.example.com
# Set to the lobal Application Group
WSGIApplicationGroup %{GLOBAL}
# Pass Authorizations through to the WSGI app for Django REST Framework Token Auth
WSGIPassAuthorization On
WSGIDaemonProcess subsite-develop-https python-home=/web/subsite-develop/venv request-timeout=300 user=apache group=apache
WSGIProcessGroup subsite-develop-https
WSGIScriptAlias /subsite /web/subsite-develop/config/wsgi.py process-group=subsite-develop-https
<Directory /web/subsite-develop/config>
Require all granted
</Directory>
Alias /subsite/static/ /web/subsite-develop/static/
<Directory /web/subsite-develop/static>
Header always set Access-Control-Allow-Origin "*"
Require all granted
</Directory>
WSGIDaemonProcess django-mysite-develop-https python-home=/web/django-mysite-develop/venv request-timeout=300 user=apache group=apache
WSGIProcessGroup django-mysite-develop-https
WSGIScriptAlias / /web/django-mysite-develop/config/wsgi.py process-group=django-mysite-develop-https
<Directory /web/django-mysite-develop/config>
Require all granted
</Directory>
Alias /static/ /web/django-mysite-develop/static/
<Directory /web/django-mysite-develop/static>
Header always set Access-Control-Allow-Origin "*"
Require all granted
</Directory>
Alias /media/ /var/media/mysite-www/
<Directory /var/media/mysite-www>
Require all granted
</Directory>
</VirtualHost>
This example will host one site at /subsite/ and another at the root, /. Notice that the root site comes last. It also means that you won't be able to use the route /subsite/ within the root project, since Apache will have diverted it to via the WSGIScriptAlias definition.
This is also for a site with TLS; you may have to switch the 443 to 80, and remove SSLEngine On if you're not using TLS. The WSGIPassAuthorization is for Django REST Framework tokens, you can probably remove it as well, but I've left it for a more complete example. This is for Apache 2.4+, when they switched to the Require all granted syntax.
IUS Community, if on RedHat/CentOS: https://ius.io/
I'll tell you how we did in our project. We have a single Django project with different routes. For example /players, /tablet. We hosted our project in two Docker containers. We have NGINX as our reverse proxy. NGINX redirects the request to the appropriate container based on the route. NGINX is exposed to the world. But, I'm not sure if it is useful for you or not.
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 get the following error when I try to access my website:
Forbidden. You don't have permission to access / on this server.
My virtual host file looks like the following:
<VirtualHost *:80>
ServerAdmin webmaster#localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
Alias /static ~/myproject/static
<Directory ~/myproject/static>
Require all granted
</Directory>
<Directory ~/myproject/myprojectapi>
Order allow,deny
Require all granted
<Files wsgi.py>
Require all granted
</Files>
</Directory>
</VirtualHost>
And my apache2.confis the default file. I am using Django 1.9 with Python 2.7 on Ubuntu 14.04
I have literally attempted most, if not all, the solutions found on the site but none of them are working for some reason. I followed this tutorial and gave these permissions:
chmod 664 ~/myproject/db.sqlite3
sudo chown :www-data ~/myproject/db.sqlite3
sudo chown :www-data ~/myproject
I am also operating as the root user.
Please let me know if you require any other information; I will be more than happy to provide it. Any help would be greatly appreciated.
Here are the WSGI lines:
WSGIDaemonProcess goggest python-path=~/myproject:/usr/lib/python2.7/dist-packages
WSGIProcessGroup goggest
WSGIScriptAlias / ~/myproject/myprojectapi/wsgi.py
Below is how I fixed (with a lot of help) the problem.
This answer assumes you have the following project structure:
~/myproject
- myproject
- ...
- settings.py
- wsgi.py
- myapp
- ...
- static
- myapp
- ...
Digression
I was facing the problem where I got an error in my apahce error.log which said it could not find settings. This issue is most likely caused by an error in your python-path. This portion assumes that you are using the daemon method (recommended by docs).
Check your wsgi.py file and make sure it says myproject.settings instead of settings in os.environ.setdefault(" ... ", " ... ")
Check and double check your python-path which should be something like
WSGIDaemonProcess [any-name] python-path=/home/[username]/myproject:/usr/lib/python2.7/site-packages
This should fix the problem (at least it did for me).
Fixing 403 Forbidden (or at least, circumventing it)
The following is the conf that did the job for me. It is not apache2.conf and there is nothing new in my apache2.conf, it remains the default one. The following is in apache2/sites-available/000-default.conf.
<VirtualHost *:80>
ServerAdmin webmaster#localhost
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
DocumentRoot /home/[username]/myproject # (1)
Alias /static path/to/your/static_root # (2)
<Directory path/to/your/static_root>
Require all granted
</Directory>
<Directory /home/[username]/myproject/myproject>
Options Indexes FollowSymLinks Includes ExecCGI
AllowOverride All
Order allow,deny
Allow from all
Require all granted
</Directory>
<Directory /home/[username]/myproject/myproject>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
WSGIDaemonProcess [any-name] python-path=/home/[username]/myproject:/usr/lib/python2.7/site-packages
WSGIProcessGroup [any-name]
WSGIScriptAlias / /home/[username]/[myproject]/[myproject]/wsgi.py
WSGIApplicationGroup %{GLOBAL}
</VirtualHost>
RE: Points (1), (2)
(1). Change the document root to the head of the directory which contains your django project files. In this case, I changed it to /home/[username]/myproject. Do not use ~/ for reference. I tried that and it didn't seem to pan out.
(2). If you are serving your static files from the same server then make sure you have set a STATIC_ROOT and STATIC_URL in your settings.py file. In my case, I set STATIC_URL to /static/ and STATIC_ROOT to /var/www/[any-name]/static/. When you decide to deploy, you will have to run sudo python manage.py collectstatic.
Also note that it should be Alias /static not Alias /static/ (note the trailing slash). The docs show /static/ but that is incorrect and will not work when you try and serve static files (apache does not complete the path).
That's it. All of these steps got my server up and running. If you have any questions, feel free to comment and I will try to help out. Good luck!
I have a directory called media in my django application. I've declared the directory in my apache conf file, and the permissions of the directory and all of its files are 755. but when I try to load an image from it's url apache says:
Forbidden
You don't have permission to access /media/foo.jpg on this server.
here is my apache conf file:
<VirtualHost *:80>
Alias /static/ /root/websites/FJSharif/static/
<Directory /root/websites/FJSharif/static>
Order deny,allow
Allow from all
Require all granted
</Directory>
Alias /media/ /root/websites/FJSharif/media/
<Directory /root/websites/fJSharif/media>
Order deny,allow
Allow from all
Require all granted
</Directory>
<Directory /root/websites/FJSharif/FJSharif>
<Files wsgi.py>
Order deny,allow
Allow from all
Require all granted
</Files>
</Directory>
WSGIDaemonProcess FJSharif python-path=/root/websites/FJSharif:/home/user/myproject/myprojectenv/lib/python2.7/site-packages:/usr/local/lib/python2.7/dist-packages:/usr/lib/python2.7/dist-packages
WSGIProcessGroup FJSharif
WSGIScriptAlias / /root/websites/FJSharif/FJSharif/wsgi.py
</VirtualHost>
when I try to load this url:
http://example.com/media/foo.img
I get the 403 Forbidden error.
EDIT:
Apache can find the files in /static/ directory but not the files in /media/ directory!
Based on our discussion, we eliminated a few possibilities, but it's still worth double-checking the config file for typos (e.g. paths are case-sensitive). A lot of people are often bit by this easily missed detail.
I have installed the following on my Windows machine (everything is 64bit):
Python 3.4.3
Apache 2.4.16
mod_wsgi 4.4.13
Then I installed Django(v1.8.3) in a virtual environment using virtualenv. Using django-admin I created two project and I created two VirtualHost for that. And everything is working perfect. Now I would like to use a different environment for the second project but though the Windows doesn't support WSGIDaemonProcess and WSGIProcessGroup I don't know how to do that.
WSGIPythonPath "C:/_pythonDev/project1;C:/_pythonDev/project2;C:/_pythonDev/env1/Lib/site-packages"
<VirtualHost *:80>
ServerName one.local.com
WSGIScriptAlias / "C:/_pythonDev/project1/project1/wsgi.py"
<Directory "C:/_pythonDev/project1/project1">
<Files wsgi.py>
Require all granted
</Files>
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName two.local.com
WSGIScriptAlias / "C:/_pythonDev/project2/project2/wsgi.py"
<Directory "C:/_pythonDev/project2/project2">
<Files wsgi.py>
Require all granted
</Files>
</Directory>
</VirtualHost>
So, If someone knows how to run Django projects in different environment please guide me.
Solution: click this link
You need to address two things.
Don't set WSGIPythonPath in the Apache configuration. Activate the Python virtual environment and set sys.path from the WSGI script file.
Change the WSGI script file so as not to use setdefault() in os.environ as that screws things up.
For reading see:
http://blog.dscpl.com.au/2012/10/requests-running-in-wrong-django.html
http://blog.dscpl.com.au/2014/09/using-python-virtual-environments-with.html