最近在学习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网站应用完成配置!
Recent Comments