在做这学期的Project时需要部署djangoproject到aws上,在用现有的教程时遇到很多问题,所以写下这篇文章记录我的部署过程。
Python version: 3.6.6
Django version: 2.0.7
Apache version: 2.4.29
Ubuntu version: 18.04
Server platfom: AWS EC2
1. 准备工作
1.1 导出project的所用的packages
a.在project根目录下运行pip freeze
# Assume the name of project is RM
# .../RM
pip freeze > requirements.txt
b. 将project打包,并发送到服务器
这里介绍一下怎样将文件传送到AWS EC2 instance。
- 在server里建立一个目录用于接收文件, 并修改目录权限
mkdir /home/upload # 根据的自己的需要配置权限,这里为了方便演示,设置了最高权限 chmod 777 /home/upload
- 使用scp上传文件到server
scp -i xxxxx.pem uploadfile [user]@[ec2ip]:/home/upload
2. 配置server环境
2.1 安装Apache2 & mod_wsgi
sudo apt-get install apache2
# python2
sudo apt-get install libapache2-mod-wsgi
# python3
sudo apt-get install libapache2-mod-wsgi-py3
2.2 设置virtual environment
(rm) ubuntu:~$ python3.6 -m venv /home/ubuntu/venv/rm
(rm) ubuntu:~$ source /home/ubuntu/venv/rm/bin/activate
这里推荐使用
python -m venv
或pyvenv
建立虚拟环境.
如果使用virtualenv
或virtualenvwrapper
也是可以的, 但是需要额外设置WSGI script。具体怎样设置,由于本人也是初涉Apache2, 暂时不能给出设置方法。请参见链接里的方法。
在虚拟环境里安装project依赖包。
# Assume we have already put the uncompressed project file in /home/ubuntu
(rm) ubuntu:~$ cd /home/ubuntu/RM/
# install all dependency packages
(rm) ubuntu:~/RM$ pip install -r requirements.txt
测试project能否正常运行,若无问题,进行下一步。
(rm) ubuntu:~$ python manage.py makemigrations
(rm) ubuntu:~$ python manage.py migrate
(rm) ubuntu:~$ python manage.py collectstatic
(rm) ubuntu:~$ python manage.py runserver
3. 配置Apache2
(rm) ubuntu:~$ sudo vi /etc/apache2/sites-available/rm.conf
下面是一个简单的配置示范*.conf
。
<VirtualHost *:8000>
ServerName rm.platypus.com
WSGIScriptAlias / /home/ubuntu/RM/RM/wsgi.py
# adjust the following line to match your Python path
WSGIDaemonProcess rm.platypus.com python-home=/home/ubuntu/venv/rm
WSGIProcessGroup rm.platypus.com
<Directory /home/ubuntu/RM/RM>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
Alias /static/ /home/ubuntu/RM/static/
<Directory /home/ubuntu/RM/static>
Require all granted
</Directory>
</VirtualHost>
4. 修改 wsgi.py 文件
# Common route is myProject/myProject/wsgi.py
(rm) ubuntu:~$ sudo vim /home/ubuntu/RM/RM/wsgi.py
添加下面两行代码到 wsgi.py
:
sys.path.append('/home/ubuntu/RM')
sys.path.append('/home/ubuntu/RM/RM')
5. 配置文件权限
(rm) ubuntu:/$ cd /home/ubuntu/
(rm) ubuntu:~$ sudo chmod -R 644 RM
(rm) ubuntu:~$ sudo find RM -type d | xargs chmod 755
如果使用sqlite3数据库,需要给数据库设置权限。
(rm) ubuntu:~$ sudo chgrp www-data RM
(rm) ubuntu:~$ sudo chmod g+w RM
(rm) ubuntu:~$ sudo chgrp www-data RM/db.sqlite3 # the name of your database
(rm) ubuntu:~$ sudo chmod g+w RM/db.sqlite3
6.激活网站
执行 sudo a2ensite rm
或 sudo a2ensite rm.conf
现在可以直接在浏览器通过ip:port
访问的方式访问网站.
-
ip
: 即AWS的公有IPv4 -
port
即在
7. 错误排查
浏览apache2的错误日志
cat /var/log/apache2/error.log
遇到的问题:
- Fatal Python error: Py_Initialize: Unable to get the locale encoding
ModuleNotFoundError: No module named 'encodings'
造成这个问题的原因有多种
- WSGI配置的原因,主要是因为使用了虚拟环境导致的。参见step2.2, 使用
python -m venv
而不是virtualenv
;- 可能是虚拟环境中python的路径问题。 reset the virtual environment files
rm -rf venv virtualenv -p /usr/bin/python3 venv/ source env/bin/activate pip install -r requirements.txt
Reference:
- https://code.ziqiangxuetang.com/django/django-deploy.html
- https://modwsgi.readthedocs.io/en/develop/user-guides/virtual-environments.html
- https://stackoverflow.com/questions/42973991/djangoapache-modulenotfounderror-no-module-named-myproject
- https://www.jianshu.com/p/d6f9138fab7b
- https://stackoverflow.com/a/39097003/9454325