有了Nginx,对于Tomcat没有必要详细了解。

有了supervisor,再也没有必要把一个程序设置成服务、驻留进程,supervisor真是一个相见恨晚的好工具。

在Tomcat中,所有的webapp默认共享8080端口;在Python世界中,每一个web程序都要占用一个端口,要想让这些web程序共享80端口,就需要使用Nginx进行反向代理,Nginx相当于一个路由器用来转发请求。Nginx跟Tomcat、Gunicorn之间的关系是相当的松耦合,Nginx根本不负责管理这些服务器,Nginx只是一个请求转发器,当请求来临,判断一下请求的类型、重写一下请求、将请求转发向合适的处理者。即便是Tomcat、Gnicorn崩了,Nginx也是不关心。Nginx只知道向某个端口转发请求。

最简单的运行python web的方式

最简单的python web运行方式是使用nohup myCmd & 命令运行,nohup表示no hang up,关闭远程登录之后程序不挂起继续执行,&表示后台执行。

对于django,使用命令python manage.py runserver 0.0.0.0:8000

对于flask,使用命令python mine.py

使用supervisor

supervisor是用Python语言编的进程管理、监控工具,只适用于Linux。

supervisor功能虽然强大,但常用功能也就那么一点点,实在没有必要对它特别了解。

知道常用配置足矣。

安装supervisor可以采用pip install的方式,但是可能出错(supervisor与python版本的问题)。

supervisor不仅是python包,也是一个应用程序,可以通过sudo apt-get install supervisor命令进行安装,这是最佳实践。

如果一个python工具不是编程调用,那就使用apt-get进行安装

这样安装还有一个好处,可以自动把supervisor设置成一个服务,从而可以开机自启动。

下面介绍与supervisor相关的几个概念:

  • echo_supervisord_conf命令:打印supervisor常用配置,可以重定向命令将配置输出到文本文件echo_supervisord_conf > haha.conf

  • supervisord:supervisor的后台守护进程,跟mysqld、ftpd等服务一样,它是一个TCP客户端,监听某个固定端口。

  • supervisorctl:command tools,是supervisor控制台,这个控制台可以远程控制服务器上的supervisord,它们之间的通信方式为XML-RPC

  • supervisorctl常用命令:help查看全部命令

    当修改supervisord.conf之后,需要在supervisorctl中使用reload命令重新加载配置

supervisord命令加载配置的顺序:

  • 如果使用-c命令指定配置文件位置,那么就加载那个文件,否则按如下顺序查找配置文件
  • $CWD/supervisord.conf
  • $CWD/etc/supervisord.conf
  • /etc/supervisord.conf

配置文件最佳实践:

将每一个应用创建一个conf文件,放在/etc/supervisor/conf.d目录下,主配置文件/etc/supervisord.conf中默认包含了conf.d目录下的配置文件。

像这种一个主配置文件,允许自定义从配置文件的方式很常见,很多软件都是这样配置的。

/etc/supervisord.conf主配置文件包含了conf.d/*.conf

[include]
files = /etc/supervisor/conf.d/*.conf

用supervisor管理gunicorn时,需要将gunicorn的deamon参数置为false。

[program:usercenter]
directory = /home/leon/projects/usercenter ; 程序的启动目录
command = gunicorn -c gunicorn.py wsgi:app ; 启动命令,可以看出与手动在命令行启动的命令是一样的
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 5 ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = true ; 程序异常退出后自动重启
startretries = 3 ; 启动失败自动重试次数,默认是 3
user = leon ; 用哪个用户启动
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = /data/logs/usercenter_stdout.log ; 可以通过 environment 来添加需要的环境变量,一种常见的用法是修改 PYTHONPATH
; environment=PYTHONPATH=$PYTHONPATH:/path/to/somewhere

更改完supervisor配置之后,使用sudo service supervisor restart命令重启supervisor服务。输入sudo service supervisor命令,按几下tab可以看到更多可用命令。使用sudo service supervisor force-reload 重新加载配置。

在supervisorctl中可以start、stop、restart+程序名称来控制这个程序。supervisorctl是一个交互式supervisor管理工具。sudo supervisorctl stop 服务名可以停止程序。sudo supervisorctl reload可以重新加载配置。sudo supervisorctl status可以查看服务运行状态。

修改主配置文件supervisord.conf中的inet_http_server部分可以通过网页方式访问supervisor,监控服务器状态。

查看日志

在服务器上,查看日志是唯一能够看到程序运行细节的方式。大部分程序的默认日志都放在/var/log/目录下(像Nginx、supervisor等工具的日志都在这里)。如果配置完supervisor之后,发现没有达到想要的效果,有可能是配置不正确,至于哪里不正确,可以去日志/var/log/supervisor里看一下。

我们在/etc/supervisor/conf.d/xxx.conf 中配置了stdout和stderr,去对应路径下tail -f,然后尝试sudo service supervisor restart重启服务,肯定能够定位错误。

更多配置内容请使用echo_supervisord_conf|more命令慢慢查看吧。

使用gunicorn

gunicorn也是只适用于Linux,不适用于windows。

gunicorn也是采用apt-get方式安装,gunicorn当然也是一个应用,不用管它是用python2开发的还是python3开发的,直接sudo apt-get install肯定好使。

最简单的方式启动django应用:

cd到myweb/myweb目录下(myweb是django项目名称),直接运行gunicorn -b0.0.0.0:8000 wsgi:application

解释:

  • -b参数用来绑定监听端口,默认是绑定到localhost,改成0.0.0.0就变成了监听全部主机的端口,这样才能够外网访问。
  • wsgi为python文件名,application为文件中的一个变量

将gunicorn后台运行有多种方式:

  • 使用supervisor管理之,这时gunicorn一定不是守护进程
  • 使用nohup gunicorn wsgi:application&不挂起地执行
  • 使用gunicorn的--deamon参数,使之作为deamon来运行
  • 将gunicorn设置成一个服务

一旦使用了supervisor,就再也没有必要添加更多的服务、守护进程了,用supervisor就足够了。

将一个程序设置成服务,需要如下步骤:

编辑 sudo nano /etc/init/gunicorn.conf

description "The gunicorn service"

start on runlevel [2345]
stop on runlevel [!2345] respawn
setuid root
setgid www-data env PATH= /var/www/venv/bin
chdir /var/www/ exec gunicorn -w 4 -b 127.0.0.1:8080 wsgi:application

如上,设置好用户、当前路径、全局变量、要执行的命令。

sudo service gunicorn start就可以将gunicorn作为服务运行了

详细文档

supervisor官方文档

gunicorn官方文档

supervisor+gunicorn部署python web项目的更多相关文章

  1. 使用gunicorn部署python web

    gunicorn 是一款支持wsgi的web服务器, 支持gevent 首先安装setuptools.  wget https://bootstrap.pypa.io/ez_setup.py $pyt ...

  2. Linux06 /Python web项目部署

    Linux06 /Python web项目部署 目录 Linux06 /Python web项目部署 1. 部署方式 2. 纯后端代码部署/CRM为例 1. 部署方式 2. crm项目详细部署步骤 3 ...

  3. 使用Nginx+Uwsgi部署Python Flask项目

    第一次用Flask做Web(也是第一次用Python做Web),在部署的时候遇到了不少问题,现在将过程就下来,供在这方面也有疑惑的人参考.(PS:使用Apache+mod_wsgi部署模式的可以参考另 ...

  4. 阿里云部署Java web项目初体验(转)

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了如何在阿里云上安装JDK.Tomcat以及其配置过程.最后以一个实例来演示在 ...

  5. 阿里云部署Java web项目初体验(转)/linux 上配置jdk和安装tomcat

    摘要:本文主要讲了如何在阿里云上安装JDK.Tomcat以及其配置过程.最后以一个实例来演示在阿里云上部署Java web项目. 一.准备工作 购买了阿里云的云解析,和云服务器ecs. 2.下载put ...

  6. nginx上部署python web

    nginx上部署python web http://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html

  7. 在linux下用tomcat部署java web项目的过程与注意事项

    在linux下用tomcat部署java web项目的过程与注意事项 一.安装JDK 到http://www.oracle.com/technetwork/java/javase/downloads/ ...

  8. Pycharm+django新建Python Web项目

    这两天初学Python,首先是学习Python语法有PyCharm就可以运行Console程序了,因为是初学所以,尽量写的比较详细,包括参考的资料地址...   1.下载Python,并安装[本文版本 ...

  9. 部署Java Web项目报错(一)

    今天,我在部署Java Web项目时,出现错误,并且在eclipse新建一个servers,却出现多个项目. 具体错误截图如下: 然后,我又将项目部署到JBoss服务器中,却还是运行不成功 22:12 ...

随机推荐

  1. numpy转换

    csv2npy cccsv=numpy.genfromtxt('/root/c.csv', delimiter = ',') buf2npy imga=numpy.frombuffer(buf,num ...

  2. PyCharm中Python代码提示:Shadows name from outer scope

    函数内部的变量,如果和函数被调用的外部的变量一样的话,就被PyCharm中叫做shadows name 这样的话,容易引发不容易觉察到的,由于函数内部和外部的变量名一致而引发的一些问题: 比如:内部函 ...

  3. 【POJ】【2187】Beauty Contest

    计算几何/旋转卡壳 学习旋转卡壳请戳这里~感觉讲的最好的就是这个了…… 其实就是找面积最大的三角形?...并且满足单调…… 嗯反正就是这样…… 这是一道模板题 好像必须写成循环访问?我在原数组后面复制 ...

  4. Unix/Linux环境C编程新手教程(30) 字符串操作那些事儿

    函数介绍 rindex(查找字符串中最后一个出现的指定字符) 相关函数 index,memchr,strchr,strrchr 表头文件 #include<string.h> 定义函数 c ...

  5. 混沌数学之拉比诺维奇-法布里康特方程(Rabinovich-Fabrikant equations)

    拉比诺维奇-法布里康特方程(Rabinovich-Fabrikant equations)是 1979年苏联物理学家拉比诺维奇和法布里康特提出模拟非平衡介 质自激波动的非线性常微分方程组: dot{x ...

  6. 数学图形之将曲线(curve)转化成曲面管

    在我关于数学图形的博客中,一开始讲曲线的生成算法.然后在最近的章节中介绍了圆环,还介绍了螺旋管以及海螺的生成算法.一类是曲线,一类是环面,为什么不将曲线变成环的图形,毕竟曲线看上去太单薄了,这一节我将 ...

  7. HttpClient 学习整理

    HttpClient 是我最近想研究的东西,以前想过的一些应用没能有很好的实现,发现这个开源项目之后就有点眉目了,令人头痛的cookie问题还是有办法解决滴.在网上整理了一些东西,写得很好,寄放在这里 ...

  8. Windows Server上用于iSCSI的网卡的必备设置

    如下的修改是iSCSI网卡的推荐配置, 新装起来的Host不要忘记改起来哦. 其原理是强制走iSCSI通讯的网卡立即对到来的TCP报文(segment)做出acknowledge, 从而解决iSCSI ...

  9. 几行JavaScript代码搞定Iframe 自动适应

    场景:Iframe嵌入flash,希望flash能随着页面的resize而resize. 主要代码: 代码 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTM ...

  10. 让 IE6, 7和 8支持CSS3的HTC文件补丁

    让 IE6, 7和 8支持CSS3 IE6,7并不支持CSS3的属性,IE8也不能很好的支持CSS3.但是有一个小脚本能够做到,它可以让IE支持CSS3,包括:border-radius (round ...