前言
之前在Django那篇文章中讲过,Django内置了一个服务程序,可以直接以python manage.py runserver 0.0.0.0:8080这样的形式来启动一个http服务。那应该就够了。我有了前端,又有了后端,可以直接开搞了。
但是,包括Django的官方文档都说明了,Django的server仅仅是用于开发debug使用,它并不稳定和可靠。
我们知道,网站做出来是被人访问的。被人访问就需要建立网络连接,要知道,管理连接可是一个大学问。最容易考虑到的问题就是并发问题,先不考虑硬件层面,我们的软件服务能不能承受得住多并发访问这是一个重要考量因素。正所谓专业的人干专业的事情,管理访问和链接的问题交给Apache,而访问到了之后,Apache把访问请求交给Django去处理,处理完再把结果给Apache发送到客户端。这样看起来才是比较合适的分工。
Apache+Django的部署
这部分我是按照多篇教程来的。话不多说,直接贴出来。
https://www.jianshu.com/p/b40a4a12fff1www.jianshu.com 在Apache上部署Django项目vra.github.io在对着帖子部署中,也去试着理解每一步的作用,在这里说一下我对一些操作的理解。
- 环境部分:我使用的是Apache2.4,Python2。但Django用的是最新版本也没啥问题。
- 关于Apache与Python的连接:这其实没那么玄乎,首先要知道什么是wsgi。wsgi全称是Web Server Gateway Interface,他是干嘛用的呢?试想想,Apache用来处理http请求,但我们得把html页面和资源给Apache它才能发给客户端。请求-->资源的这一过程就是我们后台开发的重头戏,比如现在,我们用Django。也就是Apache收到请求了,它调用Django的API获得返回,然后再把这个返回推给客户端。WSGI可以理解为这两者的中间桥梁,只要Django按照WSGI的规范实现了一些接口,Apache就可以通过这些接口启动Django的一些功能。然而,Apache它看不懂Python代码。也就无法调用Django的API了。于是乎,就出现了帖子中的 sudo apt-get install libapache2-mod-wsgi 这一步了。这等于给Apache一个Python的解析器,它就可以读懂Python了。
- 为Django安家这一步:刚才只是让Apache看得懂Python,我们还得告诉他我们的Django工程在哪里。这一部就是搞这个的。可以看到,我们在这一步操作了Django的wsgi模块。这个模块就是Apache和Django之间的桥梁。
Apache参数配置
Apache是一个很方便的http服务程序,需要不同的功能只需要修改参数配置并重启生效即可。
- 关于网站信息配置,上面两篇文章都有写到。我想多写的一点是VirtualHost部分,如果没有域名,但是想用ip地址直接访问(如果有测试环境,测试服中会用到),那么ServerName那里是可以直接填ip地址的。
- 多并发设置。Apache是支持多并发的(虽然大家都说处理的不如Nginx,我也不知道,我也不敢说。。),配置一下就好了。按照以下帖子去做。Apache2.4默认已经是event mpm了,就是支持多进程并发了,我们只需调对应参数即可。
关于Apache+Django的一些坑
Apache是多进程+多线程的方式运作的。也就是说,当我们在做Django开发的时候,要考虑到这个问题。比如我们做登录状态的维护,多进程就势必会涉及数据一致性问题。比如一个用户从一个进程退出登录,但是另外一个进程并不知道这件事。解决方法有二:
- 将Apache event mpm的设置改成进程只有一个,这样就可想而知了,效率必然大打折扣。
- 采取一些方法保持数据一致。比如起一个第三方进程,account_manager.py,所有账户信息都由他管理。登录下线操作都通过他来搞就OK了。由此诞生问题就是进程间的通讯问题,这也好办,搞个tcp 连接,把异步IO使上,进程数不多的情况下大概率搞得定。
关于多线程问题。。Python多线程的坑相信使用Python的都知道,有多线程的表面而没有多线程的内在,还搞出一堆数据不一致的问题。那其实,Python自身就有一套不错的方案可以解决,就是异步。使用yeild可以在单线程达到切换运行时栈(更准确点,python中应该是frame)的效果。想要深入理解,可以看廖雪峰老师关于异步IO的章节。
异步IOwww.liaoxuefeng.com