nginx + python2.6 + tornado2 部署方案

  1. 安装nginx
    tar -zxvf nginx-1.0.4.tar.gz
    cd nginx-1.0.4.tar.gz
    ./configure --prefix=/opt/nginx
    make
    make install
  2. 安装python
    tar -zxvf Python-2.*.*.tgz
    cd Python-2.*.*
    ./configure --prefix=/opt/python2.*
    make
    make install

    安装完执行,需要将/opt/python2.6/bin加入$PATH中

    echo "export PATH=/opt/python2.6/bin:\$PATH" > /etc/profile.d/python.sh

    重启终端,查看$PATH是否已经生效,并确保python是/opt/python2.6/bin/python

    echo $PATH
    which python

    另外,启动服务时,可能会报/root/.python-eggs没有写权限:

    mkdir ~/.python-eggs
    chmod +w ~/.python-eggs
  3. 安装setuptools
    tar -zxvf setuptools-0.6c11.tar.gz
    cd setuptools-0.6c11.tar.gz
    python setup.py install
  4. 安装pycurl
    pycurl基于libcurl, 比python标准的urllib2.urlopen效率高

    • 安装curl-7.21.6
      tar -zxvf curl-7.21.6.tar.gz
      cd curl-7.21.6
      ./configure
      make
      make install
      ln -s /usr/local/lib/libcurl.so.4 /usr/lib/
      ldconfig
    • 安装pycurl
      tar -zxvf pycurl-7.19.0.tar.gz
      cd pycurl-7.19.0
      python setup.py install --curl-config=/usr/local/bin/curl-config
  5. 安装pylibmc
    pylibmc为memcached的python客户端,底层为c实现的libmemcached,效率比较高 安装libmemcached需要本机安装了memcached,包依赖

    • 安装memcached
      1.先安装libevent
       tar -zxvf libevent-2.0.10-stable.tar.gz
       ./configure -prefix=/usr
       make
       make install
       测试libevent是否安装成功:
       # ls -al /usr/lib | grep libevent
      2.安装memcahed
       tar -zxvf memcached-1.4.5.tar.gz
       ./configure -with-libevent=/usr
       make
       make install
       测试是否成功安装memcached:
       # ls -al /usr/local/bin/mem*
    • 安装libmemcached
      ./configure
      make
      make install
      ln -s /usr/local/lib/libmemcached.so.7 /usr/lib/
      ldconfig
      可能遇到的问题:
      1.gcc版本过低解决:
          yum  install gcc4
          cd /usr/bin/
          cp gcc4 gcc
      2.libmemcached参数错误:
          vi configure
          注释掉-fdiagnostics-show-option
    • 安装pylibmc
      tar -zxvf pylibmc-1.2.2.tar.gz
      cd pylibmc-1.2.2
      python setup.py install
      ldconfig
  6. 安装数据库驱动
    python-mysql驱动
    目前,ipad主界面推荐还用到了数据据,所有需要安装

    tar -zxvf MySQL-python-1.2.3.tar.gz
    cd MySQL-python-1.2.3
    python setup.py build
    python setup.py install

    pymongo驱动

    tar -zxvf mongodb-mongo-python-driver-2.0.1-6-g5948ed9.tar.gz
    cd mongodb-mongo-python-driver-5948ed9/
    python setup.py install
  7. 安装tornado web框架
    tar -zxvf tornado-2.1.1.tar.gz
    cd tornado-2.1.1
    python setup.py install
  8. 配置nginx
    略, nginx listen 80, upstream 9000-9003
    参考 /opt/app/python/openapi-wireless/others/nginx/nginx.conf

    mkdir -p /opt/logs/nginx/access
    mkdir -p /opt/logs/nginx/error
    mkdir -p /opt/logs/nginx/statis
    mkdir -p /opt/logs/tornado

    /etc/hosts中添加以下内容:

    10.10.18.2 wp.kuaiyilin.com
  9. 启动应用
    • 真实服务器(40*4=160 workers):

      bin/tornado.sh start
      bin/tornado.sh stop
    • 测试环境(only 1 worker):
      ./main.py -logging=debug -debug=true
  10. 定时切割日志文件
    crontab -e
    添加
    0 0 * * * /opt/app/python/openapi-wireless/bin/logrotate-nginx.sh > /dev/null 2>&1
    5 0 * * * /opt/app/python/openapi-wireless/bin/logrotate.sh > /dev/null 2>&1
    
    给这几个脚本添加执行权限
    
    chmod +x /opt/app/python/openapi-wireless/bin/*
  11. 自动启动服务
    vi /etc/rc.local
    添加
    /opt/app/python/openapi-wireless/bin/tornado.sh start

ubuntu12.04 11.10安装雅黑字体

从哪个网站上看到的。 忘记了。 亲测很好用。记录一下。

wget -O get-fonts.sh.zip http://files.cnblogs.com/DengYangjun/get-fonts.sh.zip
unzip -o get-fonts.sh.zip 1>/dev/null
chmod a+x get-fonts.sh
./get-fonts.sh

删除下载的字体安装脚本文件:

rm get-fonts.sh get-fonts.sh.zip 2>/dev/null

恢复以前的字体设置:

cd /etc/fonts/conf.avail
sudo mv 51-local.conf.old 51-local.conf 2>/dev/null
sudo mv 69-language-selector-zh-cn.conf.old 69-language-selector-zh-cn.conf 2>/dev/null
sudo rm -f -r /usr/share/fonts/truetype/myfonts 2>/dev/null
cd -

Shell 脚本编写指南(一)

1。 脚本以

#!/bin/sh

或者

#!/bin/bash

开始

2. if 语句可以使用与&&和或||, 表达式:

if [ -z $1 ] || [ -z $2 ]

then

echo “如果$1或者$2都不为null的情况下进入”

fi

3. if语句注意空格,判断变量相等需要用双引号包含变量 :

if [ "$1" = "$2" ]; then

echo "注意[]号里面左右都要有空格, 不然会报[: missing `]'错误"

fi

4. 可以自定义函数:

function help(){
        echo "Example:"
        echo "  sh Stat_tree_android.sh 20111001 20111002 /v3/LogTrees/"
        return 0
}

return 必须写, 不然会已最后一行命令的结果返回。

调用时, 不用加括号

if [ "$1" = "--help" ]
then
        help
        exit
fi
  1. 必须在调用函数地方之前,声明函数,shell脚本是逐行运行。不会像其它语言一样先预编译。一次必须在使用函数前先声明函数。
  2. 可以用total=$(help 3 2);这样调用,通过这种调用方法,我们清楚知道,在shell 中 单括号里面,可以是:命令语句。 因此,我们可以将shell中函数,看作是定义一个新的命令,它是命令,因此 各个输入参数直接用 空格分隔。 一次,命令里面获得参数方法可以通过:$0…$n得到。 $0代表函数本身。
  3. 函数返回值,只能通过$? 系统变量获得,直接通过=,获得是空值。其实,我们按照上面一条理解,知道函数是一个命令,在shell获得命令返回值,都需要通过$?获得。

ruby on rails 学习笔记(二)

一、rails 创建数据库

rails创建项目时,默认支持sqlite3,需要修改成mysql支持:
先安装mysql for ruby模块:

# gem install mysql
# gem install mysql2

然后修改config/database.yml来支持mysql,编辑database.yml,修改成如下代码:

development:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: rubytest_development
  pool: 5
  username: root
  password: '1'
  socket: /var/run/mysqld/mysqld.sock
 
test:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: rubytest_test
  pool: 5
  username: root
  password: '1'
  socket: /var/run/mysqld/mysqld.sock
 
production:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: rubytest_production
  pool: 5
  username: root
  password: '1'
  socket: /var/run/mysqld/mysqld.sock

注意: 如果password为数字时,用单引号包含,最好不管字母还是数字都用引号包含。password:后面有一个空格

还有一种方式是直接在创建项目时用-d选项来改变数据库,例如:

# rails new rubutest -d mysql

下面创建数据库,确保你的database.yml信息填写正确:

# rake db:create

rails默认创建两个数据库, 一个是开发用,一个测试用
命名 项目名称_development(test)

接下来启动web server:

# rails s

打开浏览器访问http://localhost:3000

应该可以看到默认的项目首页。

二、rails修改首页

修改项目首页,先创建一个控制器home

# rails generate controller home index

删除原来默认页面:

# rm public/index.html

接下来, 你需要告诉rails你新的首页的地址,方法就是修改路由文件

# vi config/routes.rb

替换原来的:
get “home/index”
改为:
root :to => “home#index”

然后重新刷新浏览器, 应该就是你的home界面了。 你可以编辑
app/views/home/index.html.erb
文件来修改内容

三、创建表 完成增删改查

# rails g scaffold Post id:integer name:string content:string

上面命令创建了一个名为Post,字段有id name content的表
执行到数据库中:

# rake db:migrate

这样, 简单的表就建立了。

修改app/views/home/index.html.erb页面, 加入表的controller地址:

<h1>Test Posts</h1>
<%= link_to "Test Post", posts_path %>

刷新http://localhost:3000/ , 可以看到Test Post的链接,点击就可以看到表Post中的数据,可以新增数据,可以删除数据, 可以修改数据, rails都已经帮你实现了,

接下来的事情, 就是要读代码了,看看rails都帮你做了什么事情

ruby on rails 学习笔记(一)

一 、ubuntu11.04下安装ruby on rails

# sudo apt-get install ruby

验证:

# ruby -v
 
# ruby 1.8.7 (2010-08-16 patchlevel 302) [x86_64-linux]

不要安装debian自带的gem,很多莫名其妙的错误,例如报“file ‘lib’ not found”错误,对于我这个菜鸟来说有点麻烦,所以建议还是从官网下载gem

# wget http://production.cf.rubygems.org/rubygems/rubygems-1.8.10.tgz

解压目录, 然后里面有个setup.rb
用ruby setup.rb运行就可以了。

# sudo ruby setup.rb
# sudo gem1.8 install rails

安装一个javascript运行环境, 我也不知道为啥要安装!

#sudo apt-get install nodejs

这样, rails就安装完成了。

rails没有加入到环境变量里, 所以需要在~/.bashrc加入/var/lib/gems/1.8/bin

 

二、创建rails工程

# rails new rubytest

在当前目录下创建一个rubytest的目录, 目录的结构按照rails规定,会建立很多文件

      create
      create  README
      create  Rakefile
      create  config.ru
      create  .gitignore
      create  Gemfile
      create  app
      create  app/assets/images/rails.png
      create  app/assets/javascripts/application.js
      create  app/assets/stylesheets/application.css
      create  app/controllers/application_controller.rb
      create  app/helpers/application_helper.rb
      create  app/mailers
      create  app/models
      create  app/views/layouts/application.html.erb
      create  app/mailers/.gitkeep
      create  app/models/.gitkeep
      create  config
      ....

简单说明几个目录,
app: 应用程序目录,包含了view、controller、models (mvc记得吗?)
components: 存放组件
config: 配置代码, yml 文件, 环境结构environment.rb , 进来的web请求路由routes.rb等
db: 数据库数据模型
doc: 文档
lib: 链接库
log: 日志
public: 放web中不会改变的文件,例如javascript images css 及html
script: 存放一些rails一些工具, 生成程序代码的generate 以及启动web服务器 server
test: 编写的以及rails替你传间的测试都在这里
tmp: 临时文件
vendor: 第三方链接库

三、启动web server
运行命令:

# rails s

没有什么问题的话, 在浏览器中键入http://localhost:3000/就可以看到Welcome aboard的页面了。

ssh自动登录多台服务器

本博客有篇怎么样生成公共私有密钥,来登录一台服务器的文章,

见《linux 底下 让 ssh不用输入密码访问

现在我手上有10多台服务器, 每台服务器的密码都是没有规则的大小写字母特殊符号数字加载一起的字符串,记都没法记。

所以我在每台机子上都生成了密钥。 发送密钥到我的邮箱。

以后不用怕密码丢失。

密钥文件基本上都在用户的主目录下面,文件为

#~/.ssh/id_rsa

你可以给他重新命名:

#cp id_rsa root@10.10.10.01

命名规则就是哪个用户的哪台服务器, 很直观。也可移按照其他习惯自己定义。

下面就是拷贝这些root@10.10.10.* 的文件到我的机子上, 我的机子需要的功能是不用输入密码访问多台服务器。

下面的命令是在本地运行

#cp ~/Downloads/PassWord/root@10.10.10.* ~/.ssh/

新建一个配置文档:

#vi config

将下列内容写入:

本博客有篇怎么样生成公共私有密钥,来登录一台服务器的文章,

见《linux 底下 让 ssh不用输入密码访问

现在我手上有10多台服务器, 每台服务器的密码都是没有规则的大小写字母特殊符号数字加载一起的字符串,记都没法记。

所以我在每台机子上都生成了密钥。 发送密钥到我的邮箱。

以后不用怕密码丢失。

密钥文件基本上都在用户的主目录下面,文件为

#~/.ssh/id_rsa

你可以给他重新命名:

#cp id_rsa root@10.10.10.01

命名规则就是哪个用户的哪台服务器, 很直观。也可移按照其他习惯自己定义。

下面就是拷贝这些root@10.10.10.* 的文件到我的机子上, 我的机子需要的功能是不用输入密码访问多台服务器。

下面的命令是在本地运行

#cp ~/Downloads/PassWord/root@10.10.10.* ~/.ssh/

新建一个配置文档:

#vi config

将下列内容写入:

Host 10.10.10.01
Port 22
identityFile /home/leeray/.ssh/root@10.10.10.01

保存退出后, 设置权限

#chmod 600 config

#chmod 600 root@10.10.10.01

OK, 现在本地访问10.10.10.01已经不许要密码了。

我们再加一台机子,

还是拷贝密钥文件,

#cp ~/Downloads/PassWord/root@10.10.10.* ~/.ssh/

编辑已有的config文件,并且加入内容:

#vi config

Host 10.10.10.02
Port 22
identityFile /home/leeray/.ssh/root@10.10.10.02

好了, 现在我本地登录01 和 02这两台服务器都不需要输入密码了。

 

 

MongoDB 配置 Cluster, 使用多个磁盘做集群

一个mongodb的集群中包括一些shards(mongod进程),mongos的路由进程,一个或多个config服务器。

sharding:它是一种对大规模数据存储的一种策略。

mongos:它可以被看作是一个路由和协调的过程,因为它可以使得每个单一的各个节点组成一个集群系统。需要强调一点mongos进程没有持久状态,每个实例都需要一定的数据存储的内存空间。

客户端对集群的MongoDB插入一条数据,客户端并不知道刚刚插入的数据被分配到具体哪个MongoDB节点上了,因为当一条数据被传入MongoDB集群中通过mongos路由,所以我们并感觉不到是数据存放在哪个shard的chunk上,但是通过后台的Sharding的管理命令可以看到插入的数据存放在哪个节点上

#mkdir  dir-a

#mkdir  dir-b

#mkdir  config

#cd ~/下载/Database/mongodb-linux-x86_64-1.8.2/bin

#./mongod -shardsvr -dbpath /home/leeray/下载/Database/db/dir-a -port 10000  -logpath /tmp/mongodir-a.log &

#./mongod -shardsvr -dbpath /home/leeray/下载/Database/db/dir-b -port 10001  -logpath /tmp/mongodir-b.log &

注意上面是两个不同的dbpath, 两个不同的port, 日志文件也不同,具体存放的路径由mongos去决定。

#./mongod -configsvr -dbpath /home/leeray/下载/Database/db/config -port 20000 -logpath /tmp/mongo-config.log &

#./mongos -configdb 10.10.116.71:20000 -fork -logpath /tmp/mongos.log &

配置shard:

#./mongo

#>use admin

switched to db admin

#> db.runCommand({addshard:"10.10.116.71:10000",allowLocal:true})

{ "shardAdded" : "shard0000", "ok" : 1 }

#> db.runCommand({addshard:"10.10.116.71:10001",allowLocal:true})

{ "shardAdded" : "shard0001", "ok" : 1 }

#> db.runCommand({enablesharding:"userdb"})
{ "ok" : 1 }
#> db.runCommand({shardcollection:"userdb.posts", key:{_id : 1}, unique:true})
{ "ok" : 1 }
#> db.runCommand({listshards:1})
{
"shards" : [
{
"_id" : "shard0000",
"host" : "10.10.116.71:10000"
},
{
"_id" : "shard0001",
"host" : "10.10.116.71:10001"
}
],
"ok" : 1
}

用python去连接mongodb测试一下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pymongo
import time

if __name__=="__main__":
	print "connection database"
	connection = pymongo.Connection("10.10.116.71",27017)
	db = connection.userdb
	collection = db.posts
	for i in xrange(100000):
		tests = {
			'a':time.time(),
			'b':"2222",
			'c':"3333",
			'd':4444,
			'e':"test"
		}
		print "insert database."
		collection.save(tests)

运行这个python文件:

#python testdb.py

去后台看看数据被存放到那个shard上面:

#mongo

#>use userdb

#>db.posts.stats()
{
	"sharded" : true,
	"ns" : "userdb.posts",
	"count" : 530000,
	"size" : 40280068,
	"avgObjSize" : 76.00012830188679,
	"storageSize" : 59004928,
	"nindexes" : 1,
	"nchunks" : 4,
	"shards" : {
		"shard0000" : {
			"ns" : "userdb.posts",
			"count" : 488944,
			"size" : 37159780,
			"avgObjSize" : 76.00007362806375,
			"storageSize" : 47822848,
			"numExtents" : 9,
			"nindexes" : 1,
			"lastExtentSize" : 14495232,
			"paddingFactor" : 1,
			"flags" : 1,
			"totalIndexSize" : 20348928,
			"indexSizes" : {
				"_id_" : 20348928
			},
			"ok" : 1
		},
		"shard0001" : {
			"ns" : "userdb.posts",
			"count" : 41056,
			"size" : 3120288,
			"avgObjSize" : 76.00077942322682,
			"storageSize" : 11182080,
			"numExtents" : 6,
			"nindexes" : 1,
			"lastExtentSize" : 8388608,
			"paddingFactor" : 1,
			"flags" : 1,
			"totalIndexSize" : 1712128,
			"indexSizes" : {
				"_id_" : 1712128
			},
			"ok" : 1
		}
	},
	"ok" : 1
}

ubuntu 11.04 安装 Cairo Dock

sudo -v

echo "deb http://repository.glx-dock.org/ubuntu $(lsb_release -sc) cairo-dock ## Cairo-Dock-Stable" | sudo tee -a /etc/apt/sources.list 

wget -q http://repository.glx-dock.org/cairo-dock.gpg -O- | sudo apt-key add - 

sudo apt-get update 

sudo apt-get install cairo-dock cairo-dock-plug-ins

为Nginx安装gridFS模块访问MongoDb (二)

下载nginx-gridfs,下载mongodb-mongo-c-driver源码

并且解压,还要改名

下载链接:mongo-c-driver nginx-gridfs

我下载的是

mdirolf-nginx-gridfs-v0.8-0-gb5f8113.tar.gz

mongodb-mongo-c-driver-v0.3.1-0-g9b4b232.zip

解压mdirolf-nginx-gridfs-v0.8-0-gb5f8113.tar.gz, 将文件夹改名为mdirolf-nginx-gridfs

解压mongodb-mongo-c-driver-v0.3.1-0-g9b4b232.zip, 将文件夹改名为mongo-c-driver, 并且,将mongo-c-driver目录拷贝到mdirolf-nginx-gridfs下面

给nginx添加gridfs模块,需要重新编译nginx,去nginx源码目录下

~#./configure --add-module=/home/leeray/下载/nginx服务器/mdirolf-nginx-gridfs

~#make

~#sudo make install

这就完成gridfs模块的添加了。

接下来就是最重要的配置环节了。

为Nginx安装gridFS模块访问MongoDb (一)

开始前首先说下mongodb

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似 json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几 乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

Mongo主要解决的是海量数据的访问效率问题,根据官方的文档,当数据量达到50GB以上的时候,Mongo的数据库访问速度是MySQL的10倍以上。Mongo的并发读写效率不是特别出色,根据官方提供的性能测试表明,大约每秒可以处理0.5万-1.5次读写请求。

因为Mongo主要是支持海量数据存储的,所以Mongo还自带了一个出色的分布式文件系统GridFS,可以支持海量的数据存储,但我也看到有些评论认为GridFS性能不佳,这一点还是有待亲自做点测试来验证了。

最后由于Mongo可以支持复杂的数据结构,而且带有强大的数据查询功能,因此非常受到欢迎,很多项目都考虑用MongoDB来替代MySQL来实现不是特别复杂的Web应用,MongoDB也有一个ruby的项目MongoMapper,是模仿Merb的DataMapper编写的MongoDB的接口,使用起来非常简单,几乎和DataMapper一模一样,功能非常强大易用。

MongoDB的安装非常简单, 下载官方包,解压就可以用了:

我下载的是mongodb-linux-x86_64-1.8.2.tgz

~#cd mongodb-linux-x86_64-1.8.2

~#cd bin/

~#./mongod --dbpath=/home/leeray/data/db

/home/leeray/data/db就是你数据库的目录了.