在Ubuntu1804上使用Apache2的部署Django配置:
1.首先安装apache2
sudo apt-get install apache2
sudo apt-get install libapache2-mod-wsgi-py3
2.目录结构
Apache2的目录结构:对三个类型的mods、conf、sites分别有available、enable两个文件夹,其中available目录中存放有效的配置文件,但不起作用,只用用ln链接到enable目录中才起作用。重点关注的是ports.conf和项目.conf两个配置文件。
/etc/apache2/
|-- apache2.conf #主配置文件,
| `-- ports.conf #监听端口配置文件
|-- mods-enabled
| |-- *.load
| `-- *.conf
|-- conf-enabled
| `-- *.conf
|-- sites-enabled #项目配置文件目录,只有一个文件
| `-- *.conf #项目配置文件,根据项目确定文件名称,例如blogs.conf
3.测试:
请先使用Django自带的server测试,保证能够顺利运行。
4.创建apache2的配置文件:
按照下面的命令在apache2的sites-available文件目录下,创建一个配置文件,其中项目名称就填写你的web项目的名称,例如blogs.conf。如果有多个虚拟主机,也在此文件中配置。
<VirtualHost *:80>
# 填写自己服务器的域名
ServerName localhost:80
# 其他域名(此处可以不填),多个域名指向同一个站点时可以使用,空格隔开 ip ServerAlias otherdomain.com # 其他域名(此处可以不填),多个域名指向同一个站点时可以使用,要多少个就加多少个,空格隔开 ServerAdmin xxx@Email.com
# 上传文件存放的路径,具体路径根据实际设定,这里只是例子 Alias /media/ /home/user/项目名称/media/
# 静态文件文件( js, css, 图片等文件)存放的路径,一般默认 Alias /static/ /home/user/项目名称/static/
# 文件授权 <Directory /home/user/项目名称/media> Require all granted </Directory> <Directory /home/user/项目名称/static> Require all granted </Directory> # 指定虚拟环境的的路径,如果使用默认系统环境可不设置,特别注意此处。
WSGIDaemonProcess http://127.0.0.1:80 python-path=/home/user/projectname:/home/user/projectname/venv/Lib/site-packages
WSGIProcessGroup http://127.0.0.1:80
#通过wsgi.py 连接apache2和你的Django项目,必须设定。
WSGIScriptAlias / /home/user/项目名称/项目名称/wsgi.py
<Directory /home/user/项目名称/项目名称> <Files wsgi.py> Require all granted </Files> </Directory> </VirtualHost>
<VirtualHost *:8000>
#其他虚拟主机
</VirtualHost>
在 ports.conf中设置监听端口号。
5.修改wsgi.py文件
找到你的Django项目路径,找到项目的wsgi.py文件并打开,在原有的基础上增加以下内容,经在Django2.2.4测试,不需要进行修改,其他Django版本未测试。
#wsgi.py 原代码
from os.path import join,dirname,abspath import sys PROJECT_DIR = dirname(dirname(abspath(__file__))) sys.path.insert(0,PROJECT_DIR)
#完整代码
import os
from os.path import join,dirname,abspath
import sys
from django.core.wsgi import get_wsgi_application
PROJECT_DIR = dirname(dirname(abspath(__file__)))
sys.path.insert(0, PROJECT_DIR)
os.environ["DJANGO_SETTINGS_MODULE"] = "mysite.settings"
#os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
application = get_wsgi_application()
6. 设置权限
apache服务器在运行的时候默认的用户是“www-data”,相关的配置文件的位置在/etc/apache2/envvars。
所以我们需要修改Django项目的权限、上传文件目录、数据库文件的权限,假如你的项目放在
/home/user/项目名称
下,可以按照以下命令进行权限修改,一般用chmod 644给目录和文件授权:
cd /home/user/
sudo chmod -R 644 项目名称
sudo find 项目名称 -type d | xargs chmod 755
sudo chgrp www-data 项目名称
sudo chmod g+w 项目名称
cd media/ #上传文件目录
sudo chgrp -R www-data uploads
sudo chmod -R g+w uploads
#数据库文件
sudo chgrp www-data 项目名称/db.sqlite3 # 更改为你的数据库名称
sudo chmod g+w 项目名称/db.sqlite3
7.启动网站
-
启动配置文件,会在site-enabled中生成链接文件:sudo a2ensite 项目名称.conf
-
测试配置:sudo apache2ctl configtest 如果返回Syntax OK,则表示配置正确;
-
最后一步,让你的网站启动:
sudo service apache2 restart
-
Apache命令:使用service命令或者systemctl命令都可以;
sudo systemctl start apache2 //启动Apache服务器
sudo service apache2 start
sudo systemctl stop apache2 //停止
sudo service apache2 stop
sudo systemctl restart apache2 //再次启动Apache服务。
sudo service apache2 restart
sudo systemctl reload apache2 //不重新启动连接的情况下应用配置更改
sudo service apache2 reload
sudo systemctl status apache2 //查看服务状态
sudo service apache2 status
8.其他事项
- 静态文件不起作用:这是常见问题,检查在项目配置文件blogs.conf、在Django中settings.py中的设置,检查静态文件目录的权限,以及是否用pythong manage.py collectstatic收集静态文件。
- 字符集错误:在
/etc/apache2/envvars中设置字符集编码类型
- 本机能够访问,用IP地址不能访问:修改settings.py中的ALLOWED_HOSTS=['*']测试,再排查故障。
- 如果报 Internal Server Error错误,查看/var/log/apache2/error.log日志文件,重点是上面第5步、第6步的设置。Django自带的wsgi.py要按照第5步进行修改。