设为首页 收藏本站
查看: 842|回复: 0

[经验分享] virtualenv 环境下 Nginx + Flask + Gunicorn+ Supervisor 搭建 Python Web

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-11-29 13:06:35 | 显示全部楼层 |阅读模式
  在这篇文章里,我们将搭建一个简单的 Web 应用,在虚拟环境中基于 Flask 框架,用 Gunicorn 做 wsgi 容器,用 Supervisor 管理进程,然后使用 Python 探针来监测应用性能,形成一个「闭环」 !希望能对大家有所帮助,首先简单来介绍一下环境:
  系统环境:ubuntu 14.04 Python 2.7.6

安装组件库
  第一步安装所需要的存储库,因为打算用到虚拟环境,用到 pip 安装和管理 Python 组件,所以先更新本地包,然后安装组件:
  

sudo apt-get update  
sudo apt-get install python-pip python-dev nginx
  

创建虚拟环境 virtualenv
  在一个系统中创建不同的 Python 隔离环境,相互之间还不会影响,为了使系统保持干净,遂决定用 virtualenv 跑应用程序,创建一个容易识别的目录,开始安装,再创建项目目录 super,然后激活环境:
  

sudo pip install virtualenv  
mkdir ~/supervisor && cd ~/supervisor
  
virtualenv super
  
source super/bin/activate
  

安装 Flask 框架
  好了,现在在虚拟环境里面,开始安装 Flask 框架,flask 依赖两个库 werkzeug 和 jinjia2, 采用 pip 方式安装即可, pip 是一个重要的工具,Python 用它来管理包:
  

pip install flask  

  先用 Flask 写一个简单的 Web 服务 myweb.py ,因为后面要做一些测试,所以设置了几个请求:
  

from flask import Flask  
app = Flask(__name__)
  
@app.route('/')
  
def index():
  return 'hello world  supervisor gunicorn '
  
@app.route('/1')
  
def index1():
  return 'hello world  supervisor gunicorn  ffffff'
  
@app.route('/qw/1')
  
def indexqw():
  return 'hello world  supervisor gunicorn fdfdfbdfbfb '
  
if __name__ == '__main__':
  app.debug = True
  app.run()
  

  启动 Flask 看看!
  

python myweb.py  

  在浏览器中访问 http://127.0.0.1:5000 就可以看到了「几个路径都试一试」

用 Gunicorn 部署 Python Web
  现在我们使用 Flask 自带的服务器,完成了 Web 服务的启动。生产环境下,Flask 自带的服务器,无法满足性能要求。所以我们这里采用 Gunicorn 做 wsgi 容器,用来部署 Python,首先还是安装 Gunicorn:
  

pip install gunicorn  

  当我们安装好 Gunicorn 之后,需要用 Gunicorn 启动 Flask,Flask 用自带的服务器启动时,Flask 里面的 name 里面的代码启动了 app.run()。而这里我们使用 Gunicorn,myweb.py 就等同于一个库文件,被 Gunicorn 调用,这样启动:
  

gunicorn -w 4 -b 0.0.0.0:8000 myweb:app  

  其中 myweb 就是指 myweb.py,app 就是那个 wsgifunc 的名字,这样运行监听 8000 端口,原先的 5000 端口并没有启用,-w 表示开启多少个 worker,-b 表示 Gunicorn 开发的访问地址。
  想要结束 Gunicorn 只需执行 pkill Gunicorn,但有时候还要 ps 找到 pid 进程号才能 kill。可是这对于一个开发来说,太过于繁琐,因此出现了另外一个神器 ---supervisor,一个专门用来管理进程的工具,还可以管理系统的工具进程。

安装 Supervisor
  

pip install supervisor  
echo_supervisord_conf > supervisor.conf  # 生成 supervisor 默认配置文件
  
gedit  supervisor.conf                   # 修改 supervisor 配置文件,添加 gunicorn 进程管理
  

  

  
在 supervisor.conf 底部下添加 myweb.py 的配置 `/home/wang/supervisor/super` 是我的项目目录」
  

  

  
[program:myweb]
  
command=/home/wang/supervisor/super/bin/gunicorn -w 4 -b 0.0.0.0:8000 myweb:app                                                                     
  
directory=/home/wang/supervisor                                             
  
startsecs=0                                                                  
  
stopwaitsecs=0                                                                  
  
autostart=false                                                               
  
autorestart=false                                                                 
  
user=wang                                                                     
  
stdout_logfile=/home/wang/supervisor/log/gunicorn.log                  
  
stderr_logfile=/home/wang/supervisor/log/gunicorn.err
  

  supervisor 的基本使用命令:
  

supervisord -c supervisor.conf  
supervisorctl -c supervisor.conf status                  查看supervisor的状态                                      

  
supervisorctl -c supervisor.conf>  
supervisorctl -c supervisor.conf start [all]|[appname]   启动指定/所有 supervisor 管理的程序进程
  
supervisorctl -c supervisor.conf stop [all]|[appname]    关闭指定/所有 supervisor 管理的程序进程
  

  supervisor 还有一个 web 的管理界面,可以激活。更改下配置:
  

[inet_http_server]     ; inet (TCP) server disabled by default  
port=127.0.0.1:9001    ; (ip_address:port specifier, *:port for alliface)
  
username=wang          ; (default is no username (open server)
  
password=123           ; (default is no password (open server))
  

  
[supervisorctl]
  
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket
  
serverurl=http://127.0.0.1:9001       ; use an http:// url to specify an inet socket
  
username=wang                         ; should be same as http_username if set
  
password=123                          ; should be same as http_password if set
  
;prompt=mysupervisor                  ; cmd line prompt (default "supervisor")
  
;history_file=~/.sc_history           ; use readline history if available
  

  现在可以使用 supervsior 启动 gunicorn 啦。运行命令:
  

supervisord -c supervisor.conf  

  浏览器访问 http://127.0.0.1:9001 可以得到 supervisor 的 web 管理界面,访问 http://127.0.0.1:8000 可以看见 gunicorn 启动的返回的页面。

配置 Nginx
  前面我们已经在系统环境下安装了 Nginx, 安装好的 Nginx 二进制文件放在 /usr/sbin/ 文件夹下,接下来使用 Supervisor 来管理 Nginx。这里需要注意一个问题,权限问题。Nginx 是 sudo 的方式安装,启动的适合也是 root 用户,那么我们现在也需要用 root 用户启动 supervisor。在 supervisor.conf 下添加配置文件:
  

[program:nginx]  
command=/usr/sbin/nginx
  
startsecs=0
  
stopwaitsecs=0
  
autostart=false
  
autorestart=false
  
stdout_logfile=/home/wang/supervisor/log/nginx.log
  
stderr_logfile=/home/wang/supervisor/log/nginx.err
  

  好了,都配置完之后,启动 supervisor:
  

supervisord -c supervisor.conf  

  访问页面,也可以用 ab 进行压力测试:
  

ab -c 100 -n 100 http://127.0.0.1:8000/qw/1  

  -c 用于指定压力测试的并发数, -n 用于指定压力测试总共的执行次数。

安装 Python 探针
  搭建好了 web,想实时监控应用数据,有什么好的工具,用 OneAPM 的 Python 探针试试,
  首先也是安装 Python 探针:
  

pip install -i http://pypi.oneapm.com/simple --upgrade blueware  

  根据 License Key 生成配置文件:
  

blueware-admin generate-config (License Key) = blueware.ini  

  由于是在虚拟环境下,所以要特别注意路径,修改 supervisor.conf 里面两项:
  

[program:myapp]  
command = /home/wang/supervisor/super/bin/blueware-admin run-program /home/wang/supervisor/super/bin/gunicorn -w 4 -b 0.0.0.0:8000 myapp:app
  
environment = BLUEWARE_CONFIG_FILE=blueware.ini
  

  重启应用
  

supervisorctl    # 进入命令行
  
supervisor> >  

  向上面一样访问页面,也可以用 ab 进行压力测试
  几分钟后有下图,可以看到页面加载时间,web 事物,页面吞吐量,其中后面是设置自定义事物「Business Transaction」。
DSC0000.png
DSC0001.png
DSC0002.png

参考文章


  •   How To Serve Flask Applications with uWSGI and Nginx on Ubuntu 14.04

  •   OneAPM Python 探针安装

  •   python web 部署:nginx + gunicorn + supervisor + flask 部署笔记

  •   Tornado+nginx+supervisor 在生产环境上部署

  •   supervisor + Tornado + Nginx 使用详解

  本文系 OneAPM 工程师编译整理。想阅读更多技术文章,请访问 OneAPM 官方博客。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-144934-1-1.html 上篇帖子: [原创]Python入门学习之函数式编程 下篇帖子: Python学习总结之二
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表