今天折腾了一天,来回试了 apache+mod_wsgi 跟Nginx+Gunicorn各种姿势部署自己的小博客
发现网上搜的教程各种坑
我能说打开的标签窗口数=这图*5吗?
好吧。废话不多说,这里献上我踩坑之路
apache+mod_wsgi
环境以及软件版本
- ubantu16.04
- python 3.5
- django 1.10.4
- apache 2.4
顺便扯淡一句:django我习惯用python3.x ,因为python2.X各种字符集问题(。谁用谁懂)
如果使用apt-get 安装的软件 请看清版本
1. 第一步:安装各种软件
下载apache并检查版本
sudo apt-get install apache2
apachectl -v
下载mod_wsgi建立apache与django的联系(看清楚自己python版本下载)
sudo apt-get install libapache2-mod-wsgi #Python2
sudo apt-get install libapache2-mod-wsgi-py3 #Python3
安装django
sudo pip3 install django
建立django与apache联系
具体来说,分为以下四步:
- 将django项目放在/var/www/目录下
- 修改apache虚拟主机配置文件
- 配置文件生效
- 重启apache服务
5.修改Django的wsgi.py文件
重要事情说三遍
以下配置中{$~~~ $}的内容请根据自己项目填,以及我默认你用root账号登陆服务器,权限不够请加root
以下配置中{$~~~ $}的内容请根据自己项目填,以及我默认你用root账号登陆服务器,权限不够请加root
以下配置中{$~~~ $}的内容请根据自己项目填,以及我默认你用root账号登陆服务器,权限不够请加root
apache默认网站目录是/var/www/
1.
cd /var/www/
git clone {yourproject}
好了,你的django項目順利安家了
2.
一般的,apache文件夹结构图为:
# /etc/apache2/
# |-- apache2.conf
# | `-- ports.conf
# |-- mods-enabled
# | |-- *.load
# | `-- *.conf
# |--mods-available
# |-- conf-enabled
# | `-- *.conf
# `-- sites-enabled
# `-- *.conf
#|--site-available
#|--site-enabled
你需要在site-available文件夹中新建自己项目的配置文件
vi /etc/apache/site-available/{$projectname$}.conf
填入以下信息(或者你可以复制粘贴后修改成自己的配置)
<VirtualHost *:80>
#默认监听80端口
ServerName www.yourdomain.com
#servername 填自己的域名或者ip
#ServerAlias otherdomain.com
#ServerAdmin youremail@gmail.com
# 存放用户上传图片等文件的位置,注意去掉#号
#Alias /media/ /var/www/{$ProjectName$}/media/
# 静态文件(js/css/images)的存放位置
Alias /static/ /var/www/{$ProjectName$}/static/
# 允许通过网络获取static的内容
<Directory /var/www/{$ProjectName$}/static/>
Require all granted
</Directory>
# 最重要的!通过wsgi.py让Apache识别这是一个Django工程,别漏掉前边的 /
WSGIScriptAlias / /var/www/{$ProjectName$}/{$ProjectName$}/wsgi.py
# wsgi.py文件的父级目录,第一个ProjectName为Django工程目录,第二个ProjectName为Django自建的与工程同名的目录
<Directory /var/www/{$ProjectName$}/{$ProjectName$}/>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
</VirtualHost>
编辑apache中的wsgi.conf文件
vi /etc/apache2/mods-available/wsgi.conf
#在文件中添加以下行:
WSGIPythonPath /var/www/{$projectname$} #项目所在地址
- 激活你的配置文件
sudo a2ensite /etc/apache2/ sites-available/{$projectname$}.conf
#重启服务
service apache2 reload
vi /var/www/{$projectname$}/{$projectname$}/wsgi.py
其实要增加的也就#1.#2.#3 3行代码
import os
from os.path import join,dirname,abspath#1.
PROJECT_DIR = dirname(dirname(abspath(__file__)))#2.
import sys
sys.path.insert(0,PROJECT_DIR)#3.
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "examsys.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
这时候reload一波apache服务,用你的浏览器访问 刚才设置的域名或者外网ip
就可以查看网站
调试错误:
- apache服务无法restart或者无法reload
这时候需要一个神奇的技能了:英语
根据提示输入
systemctl status apache2.service
然后把终端啦长(坑爹不拉长看不见错误信息)
想这样就好了,
一般是你的{$projectname$}.conf 某行出错
- No module named xxxx 依赖库没安装完整,请pip安装一波
- No module named django或者其他含django的错误。这说明你的环境搭错了。往上翻error.log,找到AH00489开头的错误,看看你到底用的是什么环境。一般都是你第二步Apache的Python解释器安装错误。
- 没事可以看apache错误文档
cat /var/log/apache2/error.log
3.django自带的admin页面无法加载css文件
修改django项目中project/setting.py文件
STATIC_ROOT={$static文件夹的根目录$}
比如我的static目录在 /var/www/project/
即修改如图
然后
python manage.py collectstatic #python2
python3 manage.py collectstatic #python3
会在你的static文件夹中生成admin文件夹,
问题如果还不解决,请去apache/site-available/project.conf中查看 static配置路径是否正确
4. 数据库显示只读
如这样
sqlite3.OperationalError: attempt to write a readonly database
解决办法:
因为我用python自带的sqlite3数据库
将数据库权限设置为www-data
sudo chgrp www-data project
sudo chmod g+w blog
sudo chgrp www-data project/db.sqlite3 # 更改为你的数据库名称
sudo chmod g+w project/db.sqlite3
5. template文件无法读取
在setting.py文件中
template中指明绝对路径
6. 使用域名或者外网ip的设置后无法访问
在setting.py
中修改allow_host选项
ALLOW_HOST=['{$你的域名或者IP$}']
只需要在[]中添加即可如我的为 =['www.coldsummerday.net']