1.解压工程,安装依赖包
1. [root@localhost src]# cd /usr/local/src
2. [root@localhost src]# cd Flasky/
3. [root@localhost Flasky]# tar xf /root/Flasky.tar.gz -C .
4. [root@localhost Flasky]# cd Flasky/
5. [root@localhost Flasky]# pip install -r requirements.txt
6. [root@localhost Flasky]# pip install gunicorn gevent
2.配置supervisor+gunicorn+gevent+flask
1. [root@localhost src]# yum -y install supervisor
2. [root@localhost Flasky]# yum -y install nginx
3. [root@localhost Flasky]# systemctl start supervisor
4. [root@localhost Flasky]# systemctl enable supervisord.service
5. [root@localhost Flasky]# vim /etc/supervisord.d/Flasky.ini
[program:Flasky]
command=/usr/bin/gunicorn --bind 127.0.0.1:5000 --workers 4 --worker-class gevent manage:app
directory=/usr/local/src/Flasky/Flasky
user=nginx
statrtsecs=3
autostart=true
autorestart=true
rediect_stderr=true
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=10
stdout_logfile=/var/log/Flasky.log
3.验证服务是否正常启动
1. [root@localhost Flasky]# supervisorctl reload
2. curl localhost:5000
3. 如果没起来,则:gunicorn manage:app,进行详细查看
其实这里面有个非常搞笑的问题,如果我用virtualenv了,那么python应用的根目录就为指定的路径,那么我在使用supervisor时,supervisor作为一个系统服务,那么如果它装在virtualenv下的话,就会出现无法启动这个服务,那么也就无法运行.如果以yum -y install supervisor时,这个时候supervisor是作为一个系统服务运行的,但是在启动python应用时就会出现问题,因为所写的python应用所依赖的模块全部放在virtualenv出来的目录里,在系统中找不到,所以这个时候面临一个选择:
1. 想法设法在virtualenv中启动supervisor,或者不用,写脚本实现应用高可用.
2. 将python应用放置系统中,不使用virtualenv
关于Nginx反向代理:可看一下链接
用户请求过来时,先到LVS调度器,LVS将用户的请求通过一定的算法(见1)分发给后台的Nginx集群层,由于Nginx本身在设计的时候主要为了解决C10K Problem(见2).Nginx主要用于以下两个方面:
1. 动静分离
如常见的静态文件:html,css,图片等各种静态内容,动态文件在JAVA中有.jsp/.do等文件,所有东西交给应用服务器处理,好处:省事,不需要考虑大规模应用部署.
坏处:并发能力差.主要包含动静态资源的处理和静态内容的缓存,动态资源处理的压力只能通过增加机器来解决,而在静态内容的处理上,又包含以下两个方面:
1. 用专门的web服务器处理静态内容,减轻应用服务器压力
2. 缓存,公网上使用CDN服务进行分发静态内容.
- 反向代理
静态内容的处理很好解决,如何减轻应用服务器的压力才是关键,目前认为主要包含两个方面:
- 请求的处理
在这张图片中,LVS仅用来做4层分发,这也是LVS的优势.而在web应用中,一般是7层,那么这个地方就要涉及到请求的解析与处理,Nginx处理请求内容,做7层分发,可以解析头信息,处理与分发请求. - 请求的分发
当发现是静态内容时,不交给后台的应用服务器,自己处理返回.如果是动态内容,那么就交给后台的应用服务器处理.而在更多的应用场景中,Nginx本身也可以用作负载均衡器,一个Nginx后面可接几个应用服务器,当然,根据实际情况定.
- 请求的处理
[错误]
1. 如果出现: error: class ‘socket.error’, [Errno 2] No such file or directory: file: /usr/lib64/python2.7/socket.py line: 224
[root@localhost src]# systemctl start supervisor && systemctl enable supervisor
2. 如果无法安装psycopg2
[root@localhost src]# yum -y install python-devel postgresql-devel gcc && pip install psycopg2
附录
1. LVS算法
2. C10K Problem