2020.11.24
把前几天服务器部署运维工作做个小结,理一下思路。
系统后台使用Django框架开发rest api接口,前台使用vue框架开发用户交互界面,并通过后台提供的api接口进行数据交互。Django和vue在生产环境下都需要部署到web服务器上,且vue中使用了反向代理功能规避HTTP跨域请求数据的问题,因此需要选用具有反向代理功能的wsgi服务器。由于熟悉php的建站过程,习惯使用apache服务器,于是决定先用它来试试。
经过前几天尝试,已经通过apache的mod_wsgi成功在windows操作系统下部署成功(具体细节可参考文末附录)。但存在一点瑕疵,配置apache wsgi时,将项目的虚拟环境指定为WSGIPythonHome时,apache无法启动,而换成python主环境则可以成功启动。但由于Django项目是在虚拟环境下开发,所以还需要将虚拟环境下安装的依赖包在主环境下依次再安装一遍。
网上搜索了相关资料,没有碰到类似问题,可能与我的虚拟环境不完整导致(查看venv下的script目录,连python39.dll文件都不存在)。在搜索资料的过程中,发现目前nigix服务器作为轻量化的wsgi服务器非常流行,遂决定尝试换用nigix服务器再试试。
将nigix服务器的windows版下载到本地,绿色软件无需安装,确实够轻量,经过简单的配置就打开了监听端口。Nigix的基本使用非常简单,当然也有高级功能,如负载均衡的自定义策略等等,以后有这方面需要时还可以再拓展。因为有了apache配置wsgi的经验,nigix应该类似,查看相关资料,Django的生产环境主流部署方式是uwsgi+nigix,于是按部就班pip install uwsgi。安装时出现os不存在uname属性的问题,原来uwsgi只能在linux环境下使用。思来想去,将来做生产环境的正式部署,离不开linux环境,linux在十几年前的操作系统课上接触过一点,后来一直没再去深入接触,看来如今还是逃不掉。
既然逃不掉,那就快乐接受吧。电脑的i7十代处理器那么多线程从来没发挥过作用,搞个虚拟机也算物尽其用。VMWare、Ubuntu依次安装配置好。关于Ubuntu、Centos的选择,我也做了一番权衡。Ubuntu的图形化界面是默认配置,Centos的服务器功能是默认配置,本质上其实差不多,在服务器的市场份额上也差不多,我又是能用鼠标不用键盘的懒人(懒在不愿记那么多指令占用有限的脑容量),于是决定托付Ubuntu。
这其中还有个小插曲,既然仅仅为了部署,那docker才是最佳实践。在下载Ubuntu的中途,又了解了下docker,在win10家庭版操作系统上只能安装docker toolbox,跟很多人一样,一开始也不信这个邪,想办法激活了win10家庭版的Hyper-V功能,结果docker还是安装不了,灰溜溜地回来装toolbox。可这时坑就从天而降,开启了Hyper-V就无法安装toolbox,请神容易送神难,又折腾一番才彻底关闭了Hyper-V,但toolbox仍无法创建虚拟机,也找不到问题根源。恰好此时Ubuntu也安装好了,一不做二不休,docker在windows下比较鸡肋,既然确定未来的生产环境部署在Ubuntu上,索性把docker也留到Ubuntu上再折腾。
Vmware下的ubuntu是英文版,也没有中文输入法,随按图索翼添加了中文语言包,并用apt命令安装了中文输入法。Apt命令默认使用国外的源,速度很慢,可以在/etc/apt/sources-list中修改为清华大学的apt源。Ubuntu的图形化界面果然甚合朕意,双击sources-list自动打开了图形化管理界面,不用再记那些命令行指令了。
接着是安装Django,最新ubuntu LTS版已经自带了python3,还需要安装pip3,通过sudo apt install python3-pip命令进行安装时,总提示要插入光盘,郁闷了半天,请教了上大学时的Linux高人,一下指出了问题根源:apt源中指定了cdrom为搜索路径,正好在安装输入法时看到过apt源的图形化管理界面中存在这个选项,将其勾选掉再试,果然成功。
有了pip就如虎添翼,安装django,setting.py中设置hosts=[‘*’],python manage.py runserver 0.0.0.0:8000,一切都很顺利,在虚拟机中也可以访问,runserver后添加的参数是为了让django可以通过ip地址访问,否则只能用localhost或127.0.0.1来访问,这个参数可以配置到pycharm的run/debug configure中,这样直接按运行或调试按钮就附带了这个参数(懒癌上身)。迫不及待到宿主机上访问一下,问题又来了,宿主机无法访问虚拟机中的这个端口。Ubuntu默认并没有开启防火墙,为了确认这一点,我还安装了一个防火墙图形化管理工具gufw,也简单好用。那问题就是宿主机和虚拟机之间的通信问题,他们之间通信主要通过三种方式,桥接模式、nat模式和仅主机模式,选择桥接模式,并在ubuntu中将IP地址设置成与宿主机同一个网段,并将DHCP服务器地址、DNS服务器地址都设定为与宿主机的一致。再试一下,从宿主机就可以访问虚拟机中的django服务了。至于宿主机上新增的三个虚拟网卡vmnet0、vmnet1和vmnet8,不要手动去修改它们,它们分别是虚拟机在主机模式、桥接模式和nat模式下使用网卡,关于它们具体的区别,网上有很多资料。
基础环境配置好了,下一步就是尝试nigix部署django和vue,并配置vue的反向代理。这些都跑通后,生产环境就基本调通了。为了避免项目向正式生产服务器迁移时带来的麻烦,通过docker打包也值得尝试。这些都待这周剩下的时间再来研究,周末再写小结梳理思路。
附录一:Django部署到Apache的方法
1. pip install mod_wsgi
# 若发生错误,则需要设置apache根目录到环境变量
Set MOD_WSGI_APACHE_ROOTDIR=C:\wamp64\bin\apache\apache2.4.37
2. 将python、mod_wsgi等路径信息配置到apache httpd.conf中(在文末添加以下四行),并重启服务器
LoadFile "C:/Python39/python39.dll"【python动态链接库路径】
LoadModule wsgi_module "d:/django_project/venv/lib/site-packages/mod_wsgi/server/mod_wsgi.cp39-win_amd64.pyd"【mod_wsgi模块的安装路径】
WSGIPythonHome "C:/Python39"【python根路径】
WSGIPythonPath D:/ django_project【类库的搜索路径,与django项目的manage.py同目录就行】
3. apache服务器中增加虚拟主机,指定一个端口(如8888),在httpd-vhosts.conf中配置这个端口的目录:
<VirtualHost *:8888>
ServerName localhost
# 项目的wsgi.py文件,注意目录前有个/
WSGIScriptAlias / D:/django_project/django_project/wsgi.py
<Directory "d:/django_project/django_project/">
<Files wsgi.py>
Require all granted
</Files>
</Directory>
# 静态文件路径,若Django仅仅用作后台api接口服务,则无需配置该路径,所有静态资源交由前端框架管理。
Alias /static D:/django_project/static
<Directory D:/django_project/static>
AllowOverride None
Options None
Require all granted
</Directory>
# 项目根路径,经测试,这个写到项目所在文件夹或者直接进入文件夹内都可以
DocumentRoot d:/django_project/django_project_item
<Directory d:/qianye_serve/django_project_item>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
# 错误日志记录文件
ErrorLog "logs/django_project_error.log"
#访问的日志记录文件
CustomLog "logs/django_project_access.log" common
</VirtualHost>
4. 重启apache服务器,访问该端口,若出现内部服务器错误,可查看所配置的错误日志,再次提醒一下,有可能是python主环境下没有pip安装虚拟环境下的包,逐个安装就能修复问题。