在本地搭建Django项目后,想部署到云服务器上,经过多次踩坑,总结如下:
一.首先安装apache2
sudo apt-get update
sudo apt-get install apache2 #安装Apache2
sudo apt-get install libapache2-mod-wsgi-py3 #让Apache2识别Python程序请求,安装mod-wsgi模块
二.安装和配置 Git(这是为了从远程文档库中推送远程仓库到本地,如需上线的 Django 项目)
sudo apt-get instasll git
三.安装 Python 的 pip 组件管理程序和虚拟机环境程序 virtualenv
sudo apt-get install python3-pip
pip3 install virtualenv
四. 配置远程的 Django 项目
Linux 操作系统中的 Apache 网页服务器一般会把网页放在 /var/www/html 中,(安装 Apache2后便生成 /var/www 目录),所以我们也将 Django 项目放在 /var/www 下。首先在 /var/www 下使用 virtualenv 创建虚拟环境并启用,然后再使用 git clone 命令推送远程 Django 项目分支到本地
cd /var/www #移动到 /var/www 目录下
virtualenv VENV #创建虚拟环境 VENV
source VENV/bin/activate #激活虚拟环境 VENV
git clone https://github.com/xxx/peoject.git #克隆远程仓库到本地
cd myProject #移动到项目目录
pip3 install -r requirements.txt #安装 requirements.txt文件中的库包
但是阿里云中git clone速度太慢,所以选择使用FileZillaClient上传文件到服务器/var/www/
文件夹下。
五.接下来我们可以使用下列命令来启动 Django 来访问看看网站内容是否完整呈现。
进入到/var/www/myProject
python manage.py runserver
按照下面的命令在apache2的sites-available文件目录下,创建一个配置文件,其中项目名称就填写你的web项目的名称,例如blogs.conf。
sudo vim /etc/apache2/sites-available/projectName.conf
#添加 wsgi.py 文件路径,通过wsgi.py连接apache2和你的Django项目
WSGIScriptAlias / /var/www/projectName/projectName/wsgi.py
#指定虚拟环境路径
WSGIDaemonProcess mblog python-path=/var/www/projectName:/var/www/VENV/lib/python3.6/site-packages
WSGIProcessGroup projectName
#添加静态文件路径
Alias /static/ /var/www/staticfiles/
#上传文件存放的路径
Alias /media/ /var/www/projectName/media/
#文件授权
Require all granted
Require all granted
#获取 wsgi.py 中内容
Require all granted
注意上述文件中,注意复制过去是否有多余的空格,有多余的空格经常会引起错误,(实在不行可以把注释什么的都删了)
七.修改wsgi.py文件
找到你的Django项目路径,找到项目的wsgi.py文件并打开,在原有的基础上增加以下内容,经在Django2.2.4测试,不需要进行修改,其他Django版本未测试。
把之前的wsgi.py文件都注释掉
#完整代码
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()
八.切换到目录:/etc/apache2/sites-available/ 运行:
sudo service apache2 reload
sudo a2dissite 000-default && sudo a2ensite projectName.conf
sudo service apache2 restart
要是restart出错,可以通过sudo apache2ctl configtest
测试配置, 如果返回Syntax OK,则表示配置正确;
到此,再在浏览器上输入ip地址就会呈现网页,但是静态文件加载不出来
九.修改setting.py文件,让静态文件正常加载:
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
STATC_ROOT = '/var/www/staticfiles'
然后运行sudo service apache2 restart
重启web服务器,让网站启动
python manage.py collectstatic
将所有STATICFILES_DIRS中所有文件夹中的文件,以及各app中static中的文件都复制到 STATIC_ROOT 指定的文件夹中,把这些文件放到一起是为了用apache等部署的时候更方便。
十.设置权限
Linux 对文件权限很敏感,我们还需要修改文件权限让 Apache2 能够正确读取到。
所以我们需要修改Django项目的权限、上传文件目录、数据库文件的权限,假如你的项目放在/var/www/projectName下,可以按照以下命令进行权限修改,一般用chmod 644给目录和文件授权:
cd /var/www/
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
十一.启动网站&其他事项
sudo service apache2 restart
1.静态文件不起作用:这是常见问题,检查在项目配置文件blogs.conf、在Django中settings.py中的设置,检查静态文件目录的权限,以及是否用pythong manage.py collectstatic收集静态文件。
2.字符集错误:在/etc/apache2/envvars中设置字符集编码类型
3.本机能够访问,用IP地址不能访问:修改settings.py中的ALLOWED_HOSTS=[’*’]测试,再排查故障。
4。如果报 Internal Server Error错误,查看/var/log/apache2/error.log日志文件,重点是上面第5步、第6步的设置。Django自带的wsgi.py要按照第5步进行修改。
参考链接:django Documentation: How to user Django with Apache and mod_wsgi
Python3 + django2.0 + apache2 + ubuntu14部署网站上线
在Ubuntu1804上使用Apache2的部署Django配置: