最近在学习Tornado编写一些小型网站应用,通常情况下在本地开发的时候,直接python main.py运行应用程序即可。但是在部署的时候,还是这样运行就不是很好了。

daemontools是一个高效率的服务管理系统,和linux系统的init.d一样,可以很方便地启动、停止后台服务,并可在服务意外退出时自动重启服务。下面就是我在一台Ubuntu Linux系统上试用daemontools管理Tornado网站应用的一点笔记:

首先,安装daemontool系统

apt-get install svtools daemontools-run

新版的Ubuntu系统可以很方便地创建服务配置,无需自己创建每个目录和配置文件,使用如下命令为一个Tornado应用创建服务

svsetup -u www-data -l www-data -e /data/www/websites/test_project -L /data/www/logs/test_project CREATE test_project

这就创建了一个名为test_project的后台服务,并且指定启动用户和用户组为www-data,其配置目录在/data/www/websites/test_project,运行的日志文件记录在/data/www/logs/test_project目录里,这样规划目录是希望所有的网站应用都存放在/data/www/websites里,同时在一个统一的目录/data/www/logs里保存所有的应用日志。

daemontools管理的服务通常都是由一个服务进程和日志进程组成的,日志进程的启动脚本存放在./test_project/log/run文件中,通常无需修改,服务进程存放在./test_project/run文件中,要根据启动Tornado应用的具体命令来修改,这两个文件的内容如下:

./test_project/log/run

#!/bin/sh
exec setuidgid www-data multilog t ./main

./test_project/run

#!/bin/bash
exec 2>&1
exec setuidgid www-data /usr/bin/python webroot/main.py

这个启动脚本会运行位于./test_project/webroot目录下的main.py主程序,所以要将我们的Tornado应用复制到webroot目录中。

以上操作完成后,就可以将这个服务安装到系统目录里,运行:

update-service --add /data/www/websites/test_project test_project

这样就在/etc/service目录里创建了一个test_project服务的符号链接,如果之前安装daemontools无误的话,这个test_project应用会在5秒钟之内自动启动,进入/data/www/logs/test_project/main目录,输入

cd /data/www/logs/test_project/main
tail -f current

即可观察启动main.py主程序是否正常,这样我们就使用daemontool为Tornado网站应用创建了一个后台服务,并自动加以了管理,相关管理命令如下:

# 查看服务进程
ps auxf

root          ...   0:00 /bin/sh /usr/bin/svscanboot
root          ...   0:25  \_ svscan /etc/service
root          ...   0:00  |   \_ supervise test_project
www-data      ...  27:11  |   |   \_ /usr/bin/python webroot/main.py
root          ...   0:00  |   \_ supervise log
www-data      ...   0:00  |       \_ multilog t ./main
root          ...   0:00  \_ readproctitle service errors: ..........

# 停止服务,daemontools会自动重启服务
svc -t /etc/service/test_project

# 停止自动重启服务,停止运行服务程序
svc -d /etc/service/test_project

# 启动服务
svc -u /etc/service/test_project

# 查看服务状态
svstat /etc/service/test_project
# 或
svinfo test_project

# 查看安装服务的帮助
man update-service

# 查看创建、卸载服务的帮助
man svsetup

网站应用通常会绑定在一个特别的端口上,前台访问可以使用nginx等web服务器软件来进行反向代理,并可对一些静态文件进行缓存,一个常用的nginx配置如下:

/etc/nginx/sites-enabled/test_project

upstream test_project-backend {
        server 127.0.0.1:8000;
}

proxy_next_upstream error;

server {
        listen   XXX.XXX.XXX.XXX:80;
        server_name  .test_project;

	root /data/www/websites/test_project/webroot;

	client_max_body_size 1M;
	keepalive_timeout 65;
	proxy_read_timeout 200;
	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	gzip on;
	gzip_min_length 1000;
	gzip_proxied any;
	gzip_types text/plain text/css text/xml application/x-javascript application/xml application/atom+xml text/javascript;

        access_log  /var/log/nginx/test_project.log;

	location ^~ /static/ {
		alias /data/www/websites/test_project/webroot/assets/;
		if ($query_string) {
			expires max;
		}
	}
	location = /favicon.ico {
		rewrite (.*) /static/favicon.ico;
	}
	location = /robots.txt {
		rewrite (.*) /static/robots.txt;
	}

        location / {
		proxy_pass_header Server;
		proxy_set_header Host $http_host;
		proxy_redirect off;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Scheme $scheme;
		proxy_pass http://test_project-backend;
        }

}

一个完整的Tornado网站应用完成配置!