Django在EC2上使用wsgi和Apache部署

1 投票
1 回答
1269 浏览
提问于 2025-04-18 07:38

我在EC2上有一个微型实例,里面安装了Django。我还按照几个教程安装了mod-WSGI、PostgreSQL等。最后,我从bitbucket上拉取了我的项目,并在EC2上启动了Apache。不幸的是,我看到的只有默认的Apache页面,我已经花了一整天一夜在研究和尝试找出我哪里做错了。

我的项目在/home/ubuntu目录下。在它的文件夹里,我有一个wsgi.py文件:

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_project.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
                                        

这是我存放在/etc/apache2/httpd.conf里的.conf文件:

Listen 80
NameVirtualHost *:80
WSGIPythonPath /home/ubuntu/my_project/

<VirtualHost *:80>
    DocumentRoot /home/ubuntu/my_project
    ServerName www.ec2-54-***-104-**.us-west-2.compute.amazonaws.com
    ServerAlias ec2-54-***-104-**.us-west-2.compute.amazonaws.com
    ErrorLog /home/ubuntu/my_project/apache/error_log
    CustomLog /home/ubuntu/my_project/access_log_common

    WSGIScriptAlias / /home/ubuntu/my_project/wsgi.py
    Alias /static/ /home/ubuntu/my_project/static/

    <Directory /home/ubuntu/my_project/static>
        Require all granted
    </Directory>

    <Directory /home/ubuntu/my_project>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>

</VirtualHost>

当我尝试去做某件事情时:

/etc/init.d/apache2 stop 

结果却是:

python manage.py runserver 0.0.0.0:80

这时候一切正常,我可以通过浏览器用IP地址访问我的应用。这让我明白setting.py文件是没问题的(我这样理解对吗?),问题可能出在wsgi.pyhttpd.conf文件里。

当我停止开发服务器,再重新启动Apache时,我又看到了默认的Apache页面。你能帮我找出我的文件哪里出错了吗?

Apache的权限设置:

ubuntu@ip-172-**-**-69:~$ ls -ld my_project/
drwxr-xr-x 10 www-data www-data 4096 May 26 19:51 project/

1 个回答

1

通常情况下,你不应该用IP地址来设置ServerName,应该用网站的主机名(完整域名)来访问。

你缺少一个WSGIDaemonProcess指令,这个指令是为了配合你使用的WSGIProcessGroup。

把DocumentRoot设置为你的应用程序源代码所在的位置是一个不好的安全做法。

最后,用户的主目录下的内容通常是Apache运行的用户无法访问的。

建议你回去再看看Django网站上的mod_wsgi部署文档,作为开始。

撰写回答