这一篇教程,我们一起来了解如何在Ubuntu系统中将Django2的Web项目部署到Apache服务器。
这里环境搭建的内容包括:
- 操作系统:Ubuntu16.04:
- Web服务器:Apache2.4
- 解释器:Python3.6
- 框架:Django2.0.3
在进行正式操作之前,我先做下总结。
就这样一个组合,整整虐待了我三天半的时间,大大小小的坑层出不穷。
不过,正是因为有坑才能学到本领。
想学会跑,就不能怕摔倒,而且还要有勇气爬起来。
在这三天半的时间里,我参照网上的各种相关资料,几乎没有一个行得通。
不是使用的Python或Django版本较低,就是缺乏实践验证的抄袭之作。
特别是有些错误,根本没有资料可查,全靠自己分析。
在接下来的教程中,我会对各种坑给出说明,希望能够为初学者以及开发人员提供帮助。
好了!接下来,进入正题。
首先,我们先来看一下使用的系统以及相关的软件程序。
在上图中,包含了我们要安装的所有系统支持程序和应用程序。
注意:橘黄色线段指出的是安装顺序,不按照顺序安装就会掉到坑里。
然后,我们分五个步骤来完成Django的部署。
- 添加系统支持
- 添加软件包支持
- 创建配置文件
- 使用虚拟环境
- 权限设置
提示:我会边做边写,所以可以保证这篇教程的有效性!
这一篇教程,我们先完成前两个步骤。
一、添加系统支持
1、安装系统
关于如何安装系统,这里省略,大家可以参考网上的一些资料,基本上都能安装完成。
安装系统有几种方式:
- 直接安装在电脑上。(应该很少有人这么干)
- 使用VMware或者VirtualBox安装在虚拟机中。(这个不错)
- 使用阿里云或者腾讯云的云主机(云服务器)。(有钱可以用这种,比如我,主要是重装系统省心省时间)
提示:腾讯云和阿里云都提供了面向个人用户的免费体验云主机(有时限)。
我用的是腾讯云服务器,安装完系统就能够进入命令行模式的界面了。
2、基本命令
既然是命令行模式,我们就要掌握一些基本命令:
- sudo:系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具。
- sudo -i:获取root权限。
- rm -f [文件路径]:删除文件指令。
- rm -r [目录路径]:删除非空文件夹指令。
- mv [文件路径] [目标路径]:移动文件命令。
- cp [文件路径] [目标路径]:复制文件指令。
- cd [目标路径]:进入目标文件夹指令。
- cd /:返回根目录指令。(注意空格)
- cd ..:进入上级目录。(注意空格)
- cd -:返回最近一次打开的目录。(注意空格)
了解了这些基础的操作指令,对于我们完成任务已经够用了。
3、安装启动程序
安装命令:
sudo apt install xinit
命令中的apt是指高级软件包工具(Advanced Package Tool),本身集成了大量软件程序,能够快速帮助我们完成软件程序的安装。(也可以使用apt-get代替apt,但是不建议这样做,apt是友好版的apt-get,提供进度条和彩色字符等功能)
而安装的“Xinit”通常用在启动 X (图形架构)时执行窗口管理器 和其他程序。
第1个坑:这个如果不安装,后面的有些程序会安装失败。
4、安装图形界面
有些操作还是在图形界面中比较方便。
这里我选择安装的是Xubuntu-desktop。
这个桌面环境基于桌面环境Xfce,主要面向旧式电脑的用户和寻求更快捷的桌面环境的用户。
因为毕竟是服务器,图形界面会带来大量的资源消耗,没有必要使用比较华丽的界面。
另外,Ubuntu16.04集成了LightDM(桌面显示管理器),可以很好的支持Xubuntu-desktop,所以就省略了安装与之对应的桌面显示管理器XDM。
安装命令:
sudo apt-get install xubuntu-desktop
安装过程中会提示:Do you want to continue? [Y/n]
输入“y”并按下回车键继续安装程序。
提示:很多安装程序都会出现这个提示,照此操作就可以了,后文不再赘述。
等到命令行再次出现光标闪烁,安装过程就结束了。
5、安装远程登录
安装远程登录是想通过Windows的远程桌面连接工具连接云主机,方便进行一些图形界面下的操作,如果是本机或虚拟机中安装的Ubuntu系统可以略过此步骤。
第2个坑:这里最好不要用“apt”,会出现“Sub-process /usr/bin/dpkg returned an error code (1)”错误。
安装命令:
sudo apt-get install xrdp
sudo apt-get install vnc4server tightvncserver
完成安装之后,就可以打开Windows的远程桌面连接工具,输入云服务器的公网IP进行远程连接了。
第3个坑:如果远程登录输入密码后提示“xrdp_mm_process_login_response: login failed”,可以通过命令“sudo service xrdp restart
”尝试重新启动xrdp来解决。
在打开的连接界面中,输入Ubuntu系统的用户名和密码,就进入到了云服务器主机的桌面中。
因为是第一次登录图形界面,会有一个提示,点击蓝色的按钮(使用默认配置)即可,另外一个按钮是创建一个空界面。
假如还有另外一个错误提示,不用管它,取消勾选后,点继续按钮即可。
图形界面支持中文,在桌面左上角所有应用程序【Applications】的设置【Settings】中,找到语言支持【Language Support】选项,此时会提示安装语言,点击安装按钮(Install),输入系统密码后,按回车键进行安装。安装后即可在设置界面中安装/卸载语言【Install/Remove Languages】,右侧列表中找到简体中文【Chinese(simplified)】后勾选,并点击应用【Apply】。
此时,又会提示输入系统密码,输入密码并生效按钮【Authenticate】后,开始应用过程,简体中文语言名称【汉语(中国)】就会出现在语言列表中,用鼠标指针点住名称,拖动到默认的英文【English】上方后松开,然后点击应用到系统【Apply System-Wide】。
最后,在所有应用程序【Applications】菜单中选择注销【Log Out】,再选择重启系统【Restart】就能够使用中文图形界面了。
当然,也可以使用命令行重启。
执行命令:
sudo reboot
6、更新高级软件包工具
提示:如果使用的云主机,接下来的操作建议在远程连接界面中使用命令行终端执行(桌面下方有命令行终端的图标)。
高级软件包工具包含了很多常用的软件程序,但是很多都已经不是新版本,或者有些我们需要的程序不在其中。
所以,我们要进行更新操作。
不过,我们后面再需要使用到的Python3.6-dev并不在已集成的程序中,所以我们需要添加软件更新源的地址。
执行命令:
sudo vi /etc/apt/sources.list
此时会在命令行终端通过vi编辑器打开文件“sources.list”,我们按“i”键(注意别按多了)进入编辑模式,在文件的开始我们添加一行软件源的地址:deb http://cz.archive.ubuntu.com/ubuntu bionic main
第4个坑:添加这个软件源地址,是因为这个软件源中包含我们需要的软件包“python3.6-dev”,系统中没有集成,自带软件源中也没有,所以要添加这个软件源并同步更新高级软件包工具。
添加完毕后,按“ESC”键退出编辑模式,然后输入“:wq”(屏幕左下角会出现输入的内容)保存退出。
如果编辑错了,或者不想保留编辑的内容,想要退出的话可以输入“:q!”强制退出。
如果只是查看即关闭的话,命令是“:q”。
完成了软件更新源的设置,我们升级高级软件包工具。
第5个坑:这里最好不要用“apt”,会出现一个Python3-aptdaemon不完整程序包的错误,还是使用“apt-get”比较稳妥。
先同步一下更新源。
执行命令:
sudo apt-get update
然后进行程序更新。
执行命令:
sudo apt-get upgrade
提示:安装过程漫长,但不要离开,因为有些选项提示需要输入“y”或者“n”或者提示中的其他字母或数字。
第6个坑:在执行上方命令过程中,如果意外退出命令行终端,可能会导致执行其它apt执行命令无效,提示被锁定以及其他进程正在使用。
解决办法:
- 查询进程:
sudo ps -A | grep apt
- 杀死进程:
sudo kill [进程数字编号]
- 继续执行:
sudo dpkg --configure -a
到这里需要的系统支持就操作完成了。
二、添加软件包支持
1、安装依赖文件
sudo apt install openssl
sudo apt install libssl.dev
sudo apt install zlib*
第7个坑:如果不安装“openssl”和“libssl.dev”,在线安装一些第三方库(例如Django)时,“https://”开头的下载地址无法连接,提示“SSL”相关的错误。
第8个坑:如果不安装“zlib*”,在安装之后的一些软件包时,软件包中的一些文件无法解压释放,导致安装失败。
2、安装Sqlite3和依赖
第9个坑:如果不先安装Sqlite3,而是先安装Python3.6,会导致找不到“_sqlite3”模块的错误。
安装命令:
sudo apt install sqlite3
sudo apt install libsqlite3-dev
第10个坑:如果不安装Sqlite3的依赖包“libsqlite3-dev”,在Python代码中导入“sqlite3”模块,会出现错误“ModuleNotFoundError: No module named ‘_sqlite3’”。特别注意软件包名称是“libsqlite3-dev”不是“libsqlite-dev”,后者也能安装,但不支持Python3.6。
3、安装Apache2.4和依赖
安装命令:
sudo apt install apache2
sudo apt install apache2-dev
第11个坑:如果不安装Apache2的依赖包“apache2-dev”,后面安装“mod_wsgi”时会出现“apxs: not found”的错误。
4、安装Python3.6和依赖
首先,下载Python3.6的安装包(这里是Python-3.6.5rc1.tgz),这里是放在/home/ubuntu/Downloads/目录中。
如果是远程连接云主机,可以在本地下载后,使用软件WinSCP上传到云主机的/home/ubuntu/Downloads/目录下。
如果是在图形界面中,可以在安装包上点击右键,选择解压缩到当前文件夹(Extract Here)。
也使用命令行。
执行命令:
cd /home/ubuntu/Downloads/
sudo tar xfz Python-3.6.5rc1.tgz
这里使用xfz命令,因为使用-xvzf命令释放的文件夹需要root权限才可以更改或者删除。
释放完成后,进入解压后的文件夹。
执行命令:
cd /home/ubuntu/Downloads/Python-3.6.5rc1
然后,就能进行安装了。
首先,进行安装配置。
执行命令:
sudo ./configure --enable-shared --with-ssl=openssl
第12个坑:此命令后面的参数一定要带上,如果不带“--enable-shared
”参数,将导致“mod_wsgi”安装失败,如果不带“--with-ssl=openssl
”,会导致使用pip命令在线安装下载地址为“https://”开头的第三方库时,无法连接的错误(SSL错误)。
然后,创建安装文件。
执行命令:
sudo make
第13个坑:如果之前已经进行过安装过程,这里可能会提示错误,可以通过执行“sudo make clean
”先清空之前的安装残留,再执行“sudo make
”命令。
最后,开始执行安装。
执行命令:
sudo make install
接下来,安装依赖。
执行命令:
sudo apt install python3.6-dev
第14个坑:如果没有安装这个依赖,下一步安装“mod_wdgi”,会出现“src/server/wsgi_python.h:24:20: fatal error: Python.h: No such file or directory”的错误。
5、安装mod_wdgi建立python与apache的连接
第15个坑:不能用pip命令安装mod_wdgi,原因见下一个坑。
下载安装包mod_wsgi-4.6.2.tar.gz,这个版本支持Python3.6,解压后进入文件夹。
执行命令:
cd /home/ubuntu/Downloads/mod_wsgi-4.6.2
然后,进行安装配置。
执行命令:
sudo ./configure --with-python=python3.6
第16个坑:如果不加参数“--with-python=python3.6
”,后果就是wsgi会连接系统默认的python2.7,导致错误,错误提示中有“include python2.7”的内容。这是最大的一个坑,网上很难查到资料,我是尝试使用“./configure --with-python3.6
”产生的帮助提示中找到的答案。
接下来,创建安装文件并进行安装。
执行命令:
sudo make
sudo make install
也可以写成:
sudo make && sudo make install
第17个坑:这样写有时候会执行会出错,特别注意第二个“sudo”别漏写。
6、安装Django2
可以使用pip命令安装。
第18个坑:不能直接执行pip命令,因为系统中自带Python2.7和Python3.5分别占用了“python”和“python3”这两个命令,如果想给Python3.6安装Django(也只有Python3.6才能装Django2),必须先进入Python3.6的“site-packages”目录。
执行命令:
cd /usr/local/lib/python3.6/site-packages/
pip install django
在线安装有些复杂,其实我们也可以通过安装包进行安装。
下载安装包Django-2.0.3.tar.gz,解压后进入文件夹。
执行命令:
cd /home/ubuntu/Downloads/Django-2.0.3
sudo python3.6 setup.py install
第19个坑:pytz是Django的依赖,在执行Django的安装时也会自动在线安装,但是有可能导致安装停止。可以参考在线安装的方法,先安装pytz。
再次:为Python3.6安装第三方库,一定要先进入“/usr/local/lib/python3.6/site-packages/”目录,再执行pip安装命令。
最后,我们做一下测试,看一下是否一切正常。
执行命令:
python3.6
>>>import django
>>>import sqlite3
如果没有任何错误出现,我们就完成了所需软件包的安装。
转载请注明:魔力Python » Django2:Web项目开发入门笔记(13)