Apache2 使用 Django 项目设置带有子域的虚拟主机
Posted
技术标签:
【中文标题】Apache2 使用 Django 项目设置带有子域的虚拟主机【英文标题】:Apache2 Setup Virtual Hosts with Subdomains using Django Projects 【发布时间】:2012-11-16 19:13:37 【问题描述】:我在 Ubuntu Server 12.04 上使用 Django 1.4 和 Python 2.7。我正在尝试在单个服务器上托管多个网站。我是 Apache 新手,在设置虚拟主机时似乎写错了一些东西。
我拥有 2 个域,我试图在一台服务器上托管。打电话给他们www.my_first_domain.com
和www.my_second_domain.com
。
现在,我要托管的 Django 项目超过 3 个。一个项目将指向www.my_first_domain.com
。一个项目将指向www.my_second_domain.com
。所有其他项目将指向www.my_second_domain.com
的子域。
即project3.my_second_domain.com
、project4.my_second_domain.com
等
我已管理 DNS 以使所有这些都指向正确的 IP。我已经通过`host www.my_first_domain.com
、host www.my_second_domain.com
、host project3.my_second_domain.com
等验证了这一点。它们都指向正确的 IP。
以下是我设置的 3 个文件示例,以尝试使其正常工作。
/etc/apache2/sites-enabled/project1
<VirtualHost *:80>
ServerName www.my_first_domain.com
ServerAlias *.my_first_domain.com my_first_domain.com
DocumentRoot /var/www/project1
CustomLog /var/log/apache2/www.my_first_domain.com-access.log combined
ErrorLog /var/log/apache2/www.my_first_domain.com-error.log
WSGIScriptAlias / /home/user1/website/project1/project1/wsgi.py
<Directory /home/user1/website/project1/project1>
<Files wsgi.py>
Order deny,allow
Allow from all
</Files>
</Directory>
</VirtualHost>
/etc/apache2/sites-enabled/project2
<VirtualHost *:80>
ServerName www.my_second_domain.com
ServerAlias my_second_domain.com
DocumentRoot /var/www/project2
CustomLog /var/log/apache2/www.my_second_domain.com-access.log combined
ErrorLog /var/log/apache2/www.my_second_domain.com-error.log
WSGIScriptAlias / /home/user2/website/project2/project2/wsgi.py
<Directory /home/user2/website/project2/project2>
<Files wsgi.py>
Order deny,allow
Allow from all
</Files>
</Directory>
</VirtualHost>
/etc/apache2/sites-enabled/project3
<VirtualHost *:80>
ServerName project3.my_second_domain.com
DocumentRoot /var/www/project3
CustomLog /var/log/apache2/project3.my_second_domain.com-access.log combined
ErrorLog /var/log/apache2/project3.my_second_domain.com-error.log
WSGIScriptAlias / /home/user3/website/project3/project3/wsgi.py
<Directory /home/user3/website/project3/project3>
<Files wsgi.py>
Order deny,allow
Allow from all
</Files>
</Directory>
</VirtualHost>
如果我访问 www.my_first_domain.com,一切看起来都是正确的。当我访问 www.my_second_domain.com 时,我会看到 www.my_first_domain.com 上的内容(我的第一个项目,而不是我的第二个项目)。如果我访问 project3.my_second_domain.com,我会收到 Internal Server Error
。
如果我查看 project3 的错误日志,它似乎正在尝试加载 project1 的 Django 设置。
我故意清空/etc/apache2/httpd.conf
,因为我的印象是,当我使用虚拟主机时,sites-enabled
文件将被用来代替httpd.conf
。
我认为我没有修改任何其他配置文件。关于我做错了什么有什么想法吗?
【问题讨论】:
两个 cmets:1) 您在每个配置上运行a2ensite
,对吗? 2) 确保你的 Python 路径在你的 wsgi.py 脚本中是正确的。希望有帮助。编辑:确保您的 confs 在 sites-available
中,然后运行 a2ensite
不要只在 sites-enabled
中创建文件。
@themanatuf 我确实使用了a2ensite
然后编辑它们以获得虚拟主机信息。我还仔细检查了 wsgi.py 脚本中的 Python 路径 - sys.path.append('/home/user3/website/project3')
等。此外,conf 文件也在 sites-available
中,因为它们只是符号链接。
我现在无法访问我的服务器,但我认为符号链接在sites-enabled
下,原始文件在sites-available
下。我已经完全按照您的要求完成了,没有任何问题,所以我回家后会仔细检查我的服务器。同时,请仔细检查我对应该在 sites-available
中的原始文件的想法。
是的,您说得对,可用站点是原始文件所在的位置...但是如果我编辑任一“文件”,它会在两个地方都发生变化,因为启用站点是符号链接。所以,应该没关系。除非我错过了什么。
这很重要,我会删除符号链接并将原始文件移动到可用站点下。然后运行a2ensite
。有关我的 conf 文件和 wsgi 文件的副本,请参阅下面的解决方案。
【参考方案1】:
这是我的 conf 文件的样子:
VirtualHost *:80>
ServerName www.domain.com
ServerAlias domain.com *.domain.com
DocumentRoot /var/www/domain
Alias /static/ /var/www/domain/static/
WSGIScriptAlias / /var/www/domain/django.wsgi
RewriteEngine On
RewriteCond %HTTP_HOST ^((?!www\.)[^.]+)\.domain.com$
RewriteRule ^/(.*)$ http://www.domain/invite/%1/$1 [QSA,P]
ErrorLog $APACHE_LOG_DIR/domain/error.log
LogLevel warn
CustomLog $APACHE_LOG_DIR/domain/access.log combined
<Directory /var/www/domain/static>
Order deny,allow
Allow from all
</Directory>
<Directory /var/www/domain/>
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
这是我的 .wsgi 文件:
import os
import sys
sys.path.append('/home/ubuntu/django')
sys.path.append('/home/ubuntu/django/domain')
os.environ['DJANGO_SETTINGS_MODULE'] = 'domain.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
我有许多这样的文件,它们都以我用于该站点的域名命名。确保您在sites-available
中获得了配置文件,并且在每个配置文件上都运行了 a2ensite,您应该一切顺利。
如果您还需要什么,请告诉我。
【讨论】:
感谢您的帮助,但这对我不起作用。我看没有变化。 :(以上是关于Apache2 使用 Django 项目设置带有子域的虚拟主机的主要内容,如果未能解决你的问题,请参考以下文章
Django - Apache2 - Postgresql:_psycopg 出错
Django:使用PyCharm创建django项目并发布到apache2.4
CentOS 7下使用Apache2部署Django项目,解决文件名中含有中文报错的问题