部署django 到宝塔服务器上

一、服务器安装宝塔面板并进行基础设置

宝塔面板有很多实用的功能,具体可以去宝塔官网查看。我们的服务器使用的是 centos8 的系统,所以安装 linux 免费版的宝塔。

安装方法很简单,远程到服务器,输入命令进行安装即可

1
2
# 安装命令
yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh

中途会有一次确认,按照操作提示输入 y 即可。

安装成功后,控制台会显示出宝塔面板的登录地址、用户名、密码。如下图所示,将内容记录好。

进行登录后,会提示推荐安装套件,直接关闭即可。然后点击左侧菜单栏中的面板设置,调整面板的 端口、安全入口、用户名及密码。修改完成后,记得点击最下方的保存。

注:安全入口:是拼接在登录地址之后的。之前系统会自动设置一个随机字符,更改安全入口后,将登录地址中的随机字符换成你更改后的内容。例如:安装后的登录地址为: http://10.10.10.10:8888/f5165b61 修改安全入口的内容为: /btmb 以后宝塔面板的登录地址变为:http://10.10.10.10:8888/btmb

二、安装环境包

宝塔的基础设置搞完了,接下来我们安装环境部署的一些必要软件程序:python、nginx、mysql(如果用到了就安装)
注意:这里我们用的是Django3的版本,从Django2.0起就不支持mysql5.5了,所以这里要安装高版本的mysql,推荐mysql5.6

在宝塔左侧菜单栏 点击 软件商店,第一页我们就可以看到nginx,点击安装选择急速安装即可。

与此同时,我们选择 宝塔插件 类别,在该类别下 选择 Python项目管理器 进行安装

安装成功后,会有一个 首页显示 的开关,我们打开这个开关,记得nginx也要打开这个哦。这个时候 我们在首页就可以看到了,因为后面我们会经常使用,所以最好要展示在首页。

接下来,我们该安装 python 了,在首页点击 python项目管理器,会出现一个弹窗,点击版本管理,选择一下你项目开发时使用的 python 版本。我使用的是 python 3.6.5 所以我安装这个版本。

注:python 2.7.5 显示已安装,这是系统自带的,我们不用管他。

三、上传项目文件并创建python项目

在上传项目文件的时候,我们需要先配置好项目所有的环境依赖包,所以,在本地开发的时候建议使用虚拟环境,这样我们创建依赖文件的时候,能减少引入一些不必要的包。在本地项目环境目录中(如果是虚拟环境,需要激活虚拟环境再进入项目目录)【django项目目录,即是在manage.py文件所处的路径】输入下方命令

1
2
pip freeze > requirements.txt
# 注意当前是 pip 还是 pip3

会生成一个 requirements.txt 文件,里面就会包含我们当前环境下所有的python包。

接下来,打开宝塔面板,点击 文件 ,

此时注意路径需要在/www/wwwroot/下

点击上传按钮,选择目录,将我们项目的整个目录都上传上来(可以不用上传venv目录,这个是虚拟环境目录,会自动生成)。 我的项目在电脑路径为D:/xzbcx_1.11,此时上传就选择django_test目录。上传弹窗需要加载一会才能展示出文件,之后点击弹窗底部的开始上传,在右上角有一个进度条,等上传完成后就可以关闭该弹窗。

项目文件大的话上传时间就会比较长,是的,我上传了三十多分钟。

好了,现在我们开始创建 python 项目。打开首页的 python 项目管理器,点击 添加项目。填充数据:

  • 项目名称: 自定义就行,你开心就好
  • 路径: 定位到项目目录即可
  • Python 版本: 选择你项目对应的 python 版本
  • 框架: 选择 django
  • 启动方式: uswgi(自测了一下只有uswgi启动方式可行,其他的都没用,添加后服务启动不起来,除非自己去服务器手动启动)
  • 启动文件/文件加: 定位到 wsgi.py 所在的路径
  • 端口: 自定义就行,你开心就好,注意不要和系统端口冲突,设置1024端口号之后的,不然就算你开心也没用。
  • 勾选上 是否安装模块依赖 与 开机启动

点击确定,然后等待创建。

设置配置文件

注意: 选择的框架是 django 的时候,不需要设置

创建成功后,点击配置,增加一行wsgi.py的位置(注意此步必做,否则会爆 Internal Server Error
如果出现的是Internal Server Error,则应该是uwsgi的配置问题。
如果出现Server Error (500)则表示在其他方面出现了问题。
另外,经测试,如果数据库连接错误也会显示Server Error (500)。 )

1
wsgi-file = 你的文件路径

502 Bad Gateway nginx错误的解决方法:

这里有一个坑,改了上面的代码之后,有时会提示端口已经被占用,需要更改端口。
有时会造成这里改了端口,而nginx那里没有改,出现上面的错误。

这时只要保证二者的端口一致就可以了。

四、创建并同步数据库

4.1 MYSQL 数据库

​ 在宝塔面板左边菜单选择数据库,然后添加一个数据库:

创建完数据库后,把你项目中的数据库导出然后上传。如果你不从本地同步数据库导入,也可以直接在服务器上根据django规则来重新生成数据库。生成数据库步骤如下:

  • 打开宝塔SSH终端
  • 定位到项目目录
1
cd /var/www/wwwroot/xxx
  • 进入虚拟环境
1
source xxx_venv/bin/activate
  • 同步数据库
1
2
python manage.py makemigrations
python manage.py migrate

创建完数据库之后,宝塔会自动生成用户名和一个随机密码

为了能连接数据库,这个时候需要把项目中的数据库配置修改一下。进入setting.py文件进行编辑,将下面的NAMEUSERPASSWORD修改成上图中的对应值之后保存。

1
2
3
4
5
6
7
8
9
10
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '数据库名称',
'USER': '用户名',
'PASSWORD': '数据库密码',
'HOST': '',
'PORT': ''
}
}

4.2.sqlite3数据库

发现服务器本身的sqlite3数据库版本较低,为3.7 但django2.2版本以上的最低sqlite3版本为3.8以上,所以有两种方法解决

4.2.1 降django版本(最简单的方法)

1
2
卸载django:   pip uninstall django
安装低版本: pip install django==2.1.8

4.2.2 更新sqlite3版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#更新SQLite 3
#获取源代码(在主目录中运行)
[root@djangoServer ~]# cd ~
[root@djangoServer ~]# wget https://www.sqlite.org/2019/sqlite-autoconf-3270200.tar.gz
[root@djangoServer ~]# tar -zxvf sqlite-autoconf-3270200.tar.gz

#构建并安装
[root@djangoServer ~]# cd sqlite-autoconf-3270200
[root@djangoServer sqlite-autoconf-3270200]# ./configure --prefix=/usr/local/sqlite
[root@djangoServer sqlite-autoconf-3270200]# make && make install

#检查版本
## 最新安装的sqlite3版本
[root@djangoServer ~]# /usr/local/sqlite/bin/sqlite3 --version
3.27.2 2019-02-25 16:06:06 bd49a8271d650fa89e446b42e513b595a717b9212c91dd384aab871fc1d0f6d7
[root@djangoServer ~]#

## Centos7自带的sqlite3版本
[root@djangoServer ~]# /usr/bin/sqlite3 --version
3.7.17 2013-05-20 00:56:22 118a3b35693b134d56ebd780123b7fd6f1497668
[root@djangoServer ~]#

## 可以看到sqlite3的版本还是旧版本,那么需要更新一下。
[root@djangoServer ~]# sqlite3 --version
3.7.17 2013-05-20 00:56:22 118a3b35693b134d56ebd780123b7fd6f1497668
[root@djangoServer ~]#

## 更改旧的sqlite3
[root@djangoServer ~]# mv /usr/bin/sqlite3 /usr/bin/sqlite3_old

## 软链接将新的sqlite3设置到/usr/bin目录下
[root@djangoServer ~]# ln -s /usr/local/sqlite/bin/sqlite3 /usr/bin/sqlite3

## 查看当前全局sqlite3的版本
[root@djangoServer ~]# sqlite3 --version
3.27.2 2019-02-25 16:06:06 bd49a8271d650fa89e446b42e513b595a717b9212c91dd384aab871fc1d0f6d7
[root@djangoServer ~]#

#将路径传递给共享库
# 设置开机自启动执行,可以将下面的export语句写入 ~/.bashrc 文件中,如果如果你想立即生效,可以执行source 〜/.bashrc 将在每次启动终端时执行
[root@djangoServer ~]# export LD_LIBRARY_PATH=/usr/local/sqlite/lib
[root@djangoServer ~]# vim ~/.bashrc

# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
. "/root/.acme.sh/acme.sh.env"
# 在这里加上这一行,位置要对
export LD_LIBRARY_PATH="/usr/local/sqlite/lib"
export PATH=~/.pyenv/bin:$PATH

[root@djangoServer ~]# source ~/.bashrc
[root@djangoServer ~]# python3
Python 3.6.8 (default, Aug 7 2019, 17:28:10)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3
>>> sqlite3.sqlite_version
'3.27.2'
# 成功完成,踩坑许多,特来记录

五、检查项目是否运行成功

经过上面的操作之后,项目已经在本地服务器运行起来了,这个时候先检查一下项目运行的状况,是否有报错。

在面板中Python项目管理器 ,点击右侧的日志选项,查看你项目的运行状况,我这边项目的日志如下:

发现有报错,查阅资料发现是Django2.2之后内部的一个版本限制在作怪,相关文章在这里查看,解决方案如下:

  • 找到 venv(虚拟环境路径)/lib/python/site-packages/django/db/backends/mysql/base.py
  • 注释掉下面两行代码
1
2
3
version = Database.version_info
# if version < (1, 3, 13):
# raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
  • 重启python项目

继续观察日志,直到没有新的报错日志出现就说明项目运行成功了!

六、关闭DEBUG模式,调整静态设置

现在我们通过 侧边栏 文件 菜单 进入项目文件,找到 setting.py 文件,进行编辑。

DEBUG模式设置为False,ALLOWED_HOST 添加 ‘*’

1
2
3
DEBUG = False

ALLOWED_HOSTS = ['*']

配置静态文件地址为/home/xxx_static/static/,后面会统一把静态文件移至该目录

1
2
3
4
5
STATIC_URL = '/static/'
STATICFILES_DIR = [
os.path.join(BASE_DIR,'static'),
]
STATIC_ROOT = '/home/xxx_static/static/'

这里也有一个坑,我之前弄好之后,访问网站老是提示:Bad Request (400),后来一检查,才发现自己的ALLOWED_HOSTS这里设置有问题。修改之后,在python项目管理器中重启一下就好了。

七、设置网站服务,并配置nginx代理

上述操作,我们已经在内部启动了,接下来就是设置成网站服务,提供外部访问,并设置 nginx 代理加载静态文件。

在 python 项目管理器 中点击 映射,设置域名 或者外网IP(注意端口号要与之前的管理器上的端口号一致否则会爆400error)。映射成功后在面板侧边栏 网站 菜单中查看。(此时已经可以在外部访问了。但是是没有静态文件的)

在网站中点击我们刚才映射出的域名或ip,会出现一个弹窗,选择 反向代理-》配置文件

找个缝隙,来添加静态文件和媒体资源的配置。

关于静态文件:就是存放css,js文件的位置。django框架中以static命名的。

关于媒体资源:比如用户上传图片的存放位置,一般命名有 media。 你设置的什么名字就写什么名字。

1
2
3
4
5
6
7
location /static/ {
root /home/xzbcx1_static/;
break;
}
location /media/ {
alias /www/wwwroot/xzbcx1.11/media/;
}

按照文件路径设置即可,只需要替换红色框内的,换成你的路径,其他的不用动。如果保存的时候出现报错,就把空格啥的删除一下。

完成之后需要在项目中执行以下如下命名收集admin后台的静态文件,不然通过uwsgi服务启动的django服务,会找不到admin的样式文件导致样式失效。

  • 进入项目根目录
1
cd /var/www/wwwroot/xxx
  • 进入虚拟环境
1
source xxx_venv/bin/activate
  • 执行如下命令(该命令将收集项目中所有静态资源,转移到上面配置的/home/xxx_static/static/目录)
1
python manage.py collectstatic
  • 重启python项目和nginx服务

到此,万事大吉!可以通过你设置的域名或ip进行访问了。

如果不行尝试在虚拟环境下手动执行:

1
newsgirl-d --ini /www/wwwroot/boxdata/uwsgi.ini -w boxdata.wsgi.application

Django+Nginx+uWSGI部署到服务器Django admin后台样式消失

宝塔面板成功部署Django项目流程

-------------本文结束 感谢您的阅读-------------
点击查看