2020-11-24 apache托管django项目

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安装虚拟环境下的包,逐个安装就能修复问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容