LINQ体验系列文章

总体来说,Visual Studio 2008和.NET 3.5是建立在.NET2.0核心的基础之上,.NET2.0核心本身将不再变化(如果不了解.NET2.0的朋友,请参看MSDN或者一些经典的书籍),C# 3.0新语言特性在.NET2.0基础上进行了改进,这些改进的功能可以大大简化我们编写程序。关于C# 3.0新语言特性在博客园里的很多朋友都介绍了,我在这里简单介绍一下,记录自己所学的东西,也为后面的LINQ打下基础。

C# 3.0新语言特性和改进包括:

  • 自动属性(Auto-Implemented Properties)
  • 隐含类型局部变量(Local Variable Type Inference)
  • 匿名类型(Anonymous Types)
  • 对象与集合初始化器(Object and Collection Initializers)
  • 扩展方法(Extension Methods)
  • Lambda表达式和Lambda表达式树 (Lambda Expression and Lambda Expression Trees)

自动属性(Auto-Implemented Properties)

自动属性可以避免原来这样我们手工声明一个私有成员变量以及编写get/set逻辑,在VS2008中可以像下面这样编写一个类,编译器会自动地生成私有变量和默认的get/set 操作。你也可以分别定义get和set的“protected”等访问级别。

在.Net2.0框架下,我们可以这样写一个User类:

public class 
User

{
    private int 
_id;
    private string 
_name;
    private int 
_age;
    public int 
Id
    {
        get 
{ return 
_id; }
        set 
{ _id = value
; }
    }
    public string 
Name
    {
        get 
{ return 
_name; }
        set 
{ _name = value
; }
    }
    public int 
Age
    {
        get 
{ return 
_age; }
        set 
{ _age = value
; }
    }
}

现在,可以这样简化:

public class 
User

{
    public int 
Id { get
; set
; }
    public string 
Name { get
; set
; }
    public int 
Age { get
; set
; }
}

像上面这样的空的get/set属性的话,它会自动为你在类中生成一个私有成员变量,对这个变量实现一个公开的getter 和setter。我们可以使用.NET开发环境所提供的ildasm.exe(IL代码反汇编器)工具来分析程序集或者模块的内容。我就不贴图了。

隐含类型局部变量(Local Variable Type Inference)

C#3.0引进了var这个新关键字,在声明局部变量时可用于替代原先的类型名,即当一个变量声明标识为var类型并且该范围域中没有var名称类型存在,那么这个声明就称为隐含类型局部变量。如下(等同于//后面的显式声明):

var 
i = 5;//int

var 
j = 23.56;//double

var 
k = "C Sharp"
;//string

var 
x;//错误

var 
y = null
;//错误

var 
z = { 1, 2, 3 };//错误

在调试状态下,编译器解释如下

隐含类型局部变量调试

隐含类型局部变量要点

  1. var为关键字,可以根据后面的初始化语句自动推断类型,这个类型为强类型。
  2. 初始化语句必须为表达式,不可以为空。且编译时可以推断类型。一旦初始化之后,只可以存储这种类型。
  3. var声明的仅限于局部变量,不可用于字段。亦可以用于for,foreach,using 等语句中。
  4. 数组也可以作为隐含类型。
  5. 初始化语句不能是一个自身的对象或者集合初始化器,但是他可以是包含一个对象或者初始化器的一个new表达式。
  6. 如果局部变量声明包含了多个声明符,其类型必须相同。

匿名类型(Anonymous Types)

匿名类型允许定义行内类型,无须显式定义类型。常和var配合使用来声明匿名类型。

var 
p1 = new 
{ Id = 1, Name = "YJingLee"
, Age = 22 };//属性也不需要申明

var 
p2 = new 
{ Id = 2, Name = "XieQing"
, Age = 25 };
p1 = p2;//p1,p2结构相同,可以互相赋值

匿名类型调试

在这里编译器会认为p1,p2相当于:

public class 
SomeType

{
    public int 
Id { get
; set
; }
    public string 
Name { get
; set
; }
    public int 
Age { get
; set
; }
}

那么数组怎么定义呢?使用"new[]"关键字来声明数组,加上数组的初始值列表。像这样:

var 
intArray = new
[] { 2, 3, 5, 6 };
var 
strArray = new
[] { "Hello"
, "World" 
};
var 
anonymousTypeArray = new
[] 
{ 
    new 
{ Name = "YJingLee"
, Age = 22 }, 
    new 
{ Name = "XieQing"
, Age = 25 } 
};
var 
a = intArray[0];
var 
b = strArray[0];
var 
c = anonymousTypeArray[1].Name;

匿名数组调试

匿名类型要点

  1. 可以使用new关键字调用匿名初始化器创建一个匿名类型的对象。
  2. 匿名类型直接继承自System. Object。
  3. 匿名类型的成员是编译器根据初始化器推断而来的一些读写属性。

对象与集合初始化器(Object and Collection Initializers)

对象初始化器 (Object Initializers) :

.NET2.0框架中的类型非常依赖于属性。当生成对象实例和使用新的类型时,在.Net2.0时候我们像这样写:

User 
user = new 
User
();
user.Id = 1;
user.Name = "YJingLee"
;
user.Age = 22;

在VS2008中,编译器会自动地生成合适的属性setter代码,使得原来几行的属性赋值操作可以在一行完成。我们可以这样简化:像这样,对象初始化器由一系列成员对象组成,其对象必须初始化,用逗号间隔,使用{}封闭。

User 
user = new 
User 
{ Id = 1, Name = "YJingLee"
, Age = 22 };

又例如,我把二个人加到一个基于泛型的类型为User的List集合中:

List<User
> user = new 
List<User
>{
    new 
User
{Id=1,Name="YJingLee"
,Age=22},
    new 
User
{Id=2,Name="XieQing"
,Age=25},
};

对象初始化器调试

如果有相同名字和类型的两个对象初始化器将会产生相同的实例,可以相互赋值。例如:

User 
user = new 
User 
{ Id = 1, Name = "YJingLee"
, Age = 22 };
User 
user2 = new 
User 
{ Id = 2, Name = "XieQing"
, Age = 25 };
user = user2; 

除了在初始化类时设置简单的属性值外,对象初始化器特性也允许我们设置更复杂的嵌套(nested)属性类型。例如我们可以在上面定义的User类型同时拥有一个属于Address类型的叫“Address”的属性:

User
 user = new
 User

{
    Id = 1,
    Name = "YJingLee"
,
    Age = 22,
    Address
 = new
 Address

    {
        City = "NanJing"
,
        Zip = 21000
    }
};

集合初始化器(Collection Initializers):

集合初始化器由一系列集合对象组成,用逗号间隔,使用{}封闭。

集合初始化器可以简化把几个对象一起添加到一个集合,编译器会自动为你做集合插入操作。例如我把七个数加到一个基于泛型的类型为int的List集合中

List
<int
> num = new 
List
<int
> { 0, 1, 2, 6, 7, 8, 9 };

对象与集合初始化器要点

  1. 对象初始化器实际上利用了编译器对对象中对外可见的字段和属性进行按序赋值。
  2. 对象初始化器允许只给一部分属性赋值,包括internal访问级别
  3. 对象初始化器可以结合构造函数一起使用,并且构造函数初始化先于对象初始化器执行。
  4. 集合初始化器会对初始化器中的元素进行按序调用ICollection<T>.Add(T)方法。
  5. 注意对象初始化器和集合初始化器中成员的可见性和调用顺序。
  6. 对象与集合初始化器同样是一种编译时技术。

C# 3.0新语言特性和改进包括:

  • 自动属性(Auto-Implemented Properties)
  • 隐含类型局部变量(Local Variable Type Inference)
  • 匿名类型(Anonymous Types)
  • 对象与集合初始化器(Object and Collection Initializers)
  • 扩展方法(Extension Methods)
  • Lambda表达式和Lambda表达式树 (Lambda Expression and Lambda Expression Trees)

扩展方法(Extension Methods)

往往我们需要对CLR类型进行一些操作,但苦于无法扩展CLR类型的方法,只能创建一些helper方法,或者继承类。我们来修改上面的User类:

public class 
User

{
    public int 
Id { get
; set
; }
    public string 
Name { get
; set
; }
    public int 
Age { get
; set
; }
    public string 
Read()
    {
        return 
"Id:" 
+ Id + "姓名:" 
+ Name + "年龄:" 
+ Age;
    }
}

然后调用

var 
user = new 
{ Id = 1, Name = "YJingLee"
, Age = 22 };
var 
str = user.Read();

现在有了扩展方法就方便多了。

扩展方法允许开发人员往一个现有的CLR类型的公开契约(contract)中添加新的方法,而不用生成子类或者重新编译原来的类型。扩展方法有助于把今天动态语言中流行的对duck typing的支持之灵活性,与强类型语言之性能和编译时验证融合起来。——引用Scott博文

扩展方法是可以通过使用实例方法语法调用的静态方法。效果上,使得附加的方法扩展已存在类型和构造类型成为可能。他可以对现有类功能进行扩充,从而使该类型的实例具有更多的方法(功能)。
扩展方法允许我们在不改变源代码的情况下扩展(即添加不能修改)现有类型中的实例方法。

扩展方法给我们一个怎样的思路呢?我们一步一步做一下!
首先声明扩展方法:通过指定关键字this修饰方法的第一个参数。注意扩展方法仅可声明在静态类中。扩展方法具备所有常规静态方法的所有能力,可以使用实例方法语法来调用。接着就可以调用扩展方法了。下面通过一个具体的实例分析一下:
例如我们要检查一个字符串变量是否是合法的电子邮件地址?在.Net2.0框架下像这样:

var 
email = "leeyongjing@gmail.com"
;
if 
(EmailValidator.IsValid(email))
{
    Response.Write("YJingLee提示:这是一个正确的邮件地址"
);
}

而使用扩展方法的话,我可以添加“IsValidEmailAddress()”方法到string类本身中去,该方法返回当前字符串实例是否是个合法的字符串。

if 
(email.IsValidEmailAddress())
{
    Response.Write("YJingLee提示:这是一个正确的邮件地址"
);
}

我们是怎么把这个IsValidEmailAddress()方法添加到现有的string类里去的呢?先定义一个静态类,再定义“IsValidEmailAddress”这个静态的法来实现的。

public static class 
Extensions
//静态类

{
    public static bool 
IsValidEmailAddress(this string 
s)
    //静态方法和this
    
{
        Regex 
regex = new 
Regex
(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$"
);
        return 
regex.IsMatch(s);
    }
}

注意,上面的静态方法在第一个类型是string的参数变量前有个“this”关键词,这告诉编译器,这个特定的扩展方法应该添加到类型为“string”的对象中去。然后在IsValidEmailAddress()方法实现里,我可以访问调用该方法的实际string实例的所有公开属性/方法/事件,取决于它是否是合法电子邮件地址来返回true/false。

扩展方法不仅能够应用到个别类型上,也能应用到.NET框架中任何基类或接口上。即可用于整个.NET框架丰富的可组合的框架层扩展。

扩展方法要点

  1. 扩展方法的本质为将实例方法调用在编译期改变为静态类中的静态方法调用。事实上,它确实拥有静态方法所具有的所有功能。
  2. 扩展方法的作用域是整个namespace可见的,并且可以通过using namespace来导入其它命名空间中的扩展方法。
     
  3. 扩展方法的优先级:现有实例方法优先级最高,其次为最近的namespace下的静态类的静态方法,最后为较远的namespace下的静态类的静态方法。
     
  4. 扩展方法是一种编译时技术,注意与反射等运行时技术进行区别,并慎重使用。

Lambda表达式和Lambda表达式树 (Lambda Expression and Lambda Expression Trees)

Lambda表达式

我们从“所有字符串查找包含YJingLee子字符串”说起。在C# 2.0中,匿名方法允许我们以内联的方式来实现委托实例,它提供强大的函数式编程语言,但是标记显得相当的冗长和带有强制性。我们使用C# 2.0 中的匿名方法查找,代码如下:

var 
inString = list.FindAll(delegate
(string 
s)
{ return 
s.Indexof("YJingLee"
) >= 0; });

现在可以使用C# 3.0带来的Lambda表达式允许我们使用一种更接近人的思维、更自然的方式来实现类似于匿名方法同样的效果,看下面的代码多么简洁:

var 
inString = list.FindAll(s => s.Indexof("YJingLee"
) >= 0);

Lambda表达式格式:(参数列表)=>表达式或语句块
具体意义:定义Lambda接受参数列表,运行表达式或语句块返回表达式或语句块的值传给这个参数列表。

Lambda表达式参数类型可以是隐式类型或显式类型。在显式列表中,每个参数的类型是显式指定的,在隐式列表中,参数的类型由Lambda表达式出现的语境自动推断类型。
Lambda表达式的参数列表可以有一个或多个参数,或者无参数。在有单一的隐型参数的lambda表达式中,圆括号可以从参数列表中省略。
例如:

(x, y) => x * y;//多参数,隐式类型=>表达式

x => x * 10;//单参数,隐式类型=>表达式

x => { return 
x * 10; }; //单参数,隐式类型=>语句块

(int 
x) => x * 10;//单参数,显式类型=>表达式

(int 
x) => { return 
x * 10; };//单参数,显式类型=>语句块

() => Console
.WriteLine(); //无参数

下面看这个例子:
在前面的帖子中,我们写了一个User类及增加了2个人,接下来,我们使用由LINQ提供的新的Where和Average方法来返回集合中的人的一个子集,以及计算这个集合中的人的平均年龄:

List
<User
> user = new 
List
<User
>{
    new 
User
{Id=1,Name="YJingLee"
,Age=22},
    new 
User
{Id=2,Name="XieQing"
,Age=25},
};
//获取特定人时所用的过滤条件,p参数属于User类型

var 
results = user.Where(p => p.Name == "YJingLee"
).ToList();
//用User对象的Age值计算平均年龄

var 
average = user.Average(p => p.Age);

效果图如下:

Lambda表达式

对这个Lambda表达式做个简要分析:

var 
resultsdelegate = user.Where(delegate
(User 
p)
{
    return 
p.Name == "YJingLee"
;// 返回一个布尔值

});
var 
averagedelegate = user.Average(delegate
(User 
p)
{
    return 
p.Age;
});

Lambda表达式简要分析

Lambda表达式L可以被转换为委托类型D,需要满足以下条件:
L的参数类型要与D的参数个数相等,类型相同,返回类型相同,无论是表达式,还是语句块。注意隐式类型要参与类型辨析。

Lambda表达式树

Lambda表达式树允许我们像处理数据(比如读取,修改)一样来处理Lambda表达式。我以一个例子简单说明:

Expression
<Func
<int
, bool
>> filter = n => (n * 3) < 5;
BinaryExpression 
lt = (BinaryExpression
)filter.Body;
BinaryExpression 
mult = (BinaryExpression
)lt.Left;
ParameterExpression 
en = (ParameterExpression
)mult.Left;
ConstantExpression 
three = (ConstantExpression
)mult.Right;
ConstantExpression 
five = (ConstantExpression
)lt.Right;
var 
One = filter.Compile();
Console
.WriteLine("Result: {0},{1}"
, One(5), One(1));
Console
.WriteLine("({0} ({1} {2} {3}) {4})"
, lt.NodeType,
         mult.NodeType, en.Name, three.Value, five.Value);

效果图如下:

Lambda表达式树

Lambda表达式和Lambda表达式树要点

  1. Lambda表达式的参数类型可以忽略,因为可以根据使用的上下文进行推断。
  2. Lambda表达式的主体(body)可以是表达式,也可以是语句块。
  3. Lambda表达式传入的实参将参与类型推断,以及方法重载辨析。
  4. Lambda表达式和表达式体可以被转换为表达式树。
  5. 表达式树允许lambda表达式能够代表数据结构替代表示为执行代码。

好了,我在这里简单的把C# 3.0新语言特性和改进说了一下,接下来,正式进入这个系列的主题部分——LINQ。为 了让大家了解,我换一种手法来写,从一条一条LINQ to SQL语句分析来贯穿LINQ的知识点。一起体验LINQ带给我们的乐趣。

发表在 article | 标签为 | 30条评论

在C#中获取如PHP函数time()一样的时间戳

在C#中获取如PHP函数time()一样的时间戳

c#中没有象PHP一样的time()时间戳函数,但有DateTime.Now.Ticks用来计算时间差。

此属性的值为自 0001 年 1 月 1 日午夜 12:00 以来所经过时间以 100 毫微秒为间隔表示时的数字。
dotnet下用DateTime.Now.Ticks能够得到精确的时间,单位是10^-7s。

经过实验,发现

long a=(DateTime.Now.Ticks-aa.Ticks)/10000000-8*60*60;
tbxUrl.Text=a.ToString();

要减去8*60*60才和time()函数得到的值一样。
什么问题?刚好是8个时区产生的差别。

DateTime aa=new DateTime(1970,1,1);
MessageBox.Show("1970   "+aa.Ticks.ToString()+"now"+DateTime.Now.Ticks.ToString());
long a=(DateTime.Now.Ticks-aa.Ticks)/10000000-8*60*60;
tbxUrl.Text=a.ToString();
同时发现c#里面DataTime有一个属性!DateTime.UtcNow已经考虑了时区问题。

ok~ 使用下面的代码即可

DateTime timeStamp=new DateTime(1970,1,1);   //得到1970年的时间戳
long a=(DateTime.UtcNow.Ticks-timeStamp.Ticks)/10000000;   //注意这里有时区问题,用now就要减掉8个小时
 

发表在 article | 标签为 | 在C#中获取如PHP函数time()一样的时间戳已关闭评论

linux下挂载ISO像镜文件

挂接命令(mount)
  首先,介绍一下挂接(mount)命令的使用方法,mount命令参数非常多,这里主要讲一下今天我们要用到的。

  命令格式:

  mount [-t vfstype] [-o options] device dir

  其中:

  1.-t vfstype 指定文件系统的类型,通常不必指定。mount 会自动选择正确的类型。常用类型有:

  光盘或光盘镜像:iso9660

  DOS fat16文件系统:msdos

  Windows 9x fat32文件系统:vfat

  Windows NT ntfs文件系统:ntfs

  Mount Windows文件网络共享:smbfs

  UNIX(LINUX) 文件网络共享:nfs

  2.-o options 主要用来描述设备或档案的挂接方式。常用的参数有:

  loop:用来把一个文件当成硬盘分区挂接上系统

  ro:采用只读方式挂接设备

  rw:采用读写方式挂接设备

  iocharset:指定访问文件系统所用字符集

  3.device 要挂接(mount)的设备。

  4.dir设备在系统上的挂接点(mount point)。

  挂接光盘镜像文件

  由于近年来磁盘技术的巨大进步,新的电脑系统都配备了大容量的磁盘系统,在Windows下许多人都习惯把软件和资料做成光盘镜像文件通过虚拟光驱来 使用。这样做有许多好处:一、减轻了光驱的磨损;二、现在硬盘容量巨大存放几十个光盘镜像文件不成问题,随用随调十分方便;三、硬盘的读取速度要远远高于 光盘的读取速度,CPU占用率大大降低。其实linux系统下制作和使用光盘镜像比Windows系统更方便,不必借用任何第三方软件包。

光盘镜像文件的挂接(mount)

   #mkdir /mnt/vcdrom

   注:建立一个目录用来作挂接点(mount point)

   #mount -o loop -t iso9660 /** /mydisk.iso /mnt/vcdrom 如:#mount -o loop -t iso9660 /usr/local/tooldisk/mydisk3.iso /mnt/vcdrom

   注:使用/mnt/vcdrom就可以访问盘镜像文件mydisk.iso里的所有文件了。在这之前要先挂载你的*.ISO文件

比如在有E盘,文件为NTFS格式,当然挂载点mkdir /mnt/vcdrom要存在,要不先建立挂载点:mkdir /mnt/vcdrom 然后挂载文件:mount -t ntfs /dev/hda6 /mnt/vcdrom

用df -lh命令查看/mnt/e是否挂载了。如果有多张ISO像镜文件要连继挂载安装。。就要先卸载文件先挂载的ISO像镜:umount /usr/local/tooldisk

再挂载mount -o loop -t iso9660 /usr/local/tooldisk/mydisk4.iso /mnt/vcdrom 依此类推...
如你现在安装在第三张光盘像镜完毕后提示放入第4张。这个时候你要先先卸载文件先挂载的ISO像镜mydisk3.iso 再挂载mount -o loop -t iso9660 /usr/local/tooldisk/mydisk4.iso /mnt/vcdrom 再确定提示对话框

发表在 article | 标签为 | linux下挂载ISO像镜文件已关闭评论

mysql字符集和整理列表

 

armscii8 (ARMSCII-8 Armenian) 
 armscii8_bin 
 亚美尼亚语, 二进制 
 armscii8_general_ci 
 亚美尼亚语, 不区分大小写 
 ascii (US ASCII) 
 ascii_bin 
 西欧 (多语言), 二进制 
 ascii_general_ci 
 西欧 (多语言), 不区分大小写 
 big5 (Big5 Traditional Chinese) 
 big5_bin 
 繁体中文, 二进制 
 big5_chinese_ci 
 繁体中文, 不区分大小写 
 binary (Binary pseudo charset) 
 binary 
 二进制 
 cp1250 (Windows Central European) 
 cp1250_bin 
 中欧 (多语言), 二进制 
 cp1250_croatian_ci 
 克罗地亚语, 不区分大小写 
 cp1250_czech_cs 
 捷克语, 区分大小写 
 cp1250_general_ci 
 中欧 (多语言), 不区分大小写 
 cp1251 (Windows Cyrillic) 
 cp1251_bin 
 西里尔语 (多语言), 二进制 
 cp1251_bulgarian_ci 
 保加利亚语, 不区分大小写 
 cp1251_general_ci 
 西里尔语 (多语言), 不区分大小写 
 cp1251_general_cs 
 西里尔语 (多语言), 区分大小写 
 cp1251_ukrainian_ci 
 乌克兰语, 不区分大小写 
 cp1256 (Windows Arabic) 
 cp1256_bin 
 阿拉伯语, 二进制 
 cp1256_general_ci 
 阿拉伯语, 不区分大小写 
 cp1257 (Windows Baltic) 
 cp1257_bin 
 巴拉克语 (多语言), 二进制 
 cp1257_general_ci 
 巴拉克语 (多语言), 不区分大小写 
 cp1257_lithuanian_ci 
 立陶宛语, 不区分大小写 
 cp850 (DOS West European) 
 cp850_bin 
 西欧 (多语言), 二进制 
 cp850_general_ci 
 西欧 (多语言), 不区分大小写 
 cp852 (DOS Central European) 
 cp852_bin 
 中欧 (多语言), 二进制 
 cp852_general_ci 
 中欧 (多语言), 不区分大小写 
 cp866 (DOS Russian) 
 cp866_bin 
 俄语, 二进制 
 cp866_general_ci 
 俄语, 不区分大小写 
 cp932 (SJIS for Windows Japanese) 
 cp932_bin 
 日语, 二进制 
 cp932_japanese_ci 
 日语, 不区分大小写 
 dec8 (DEC West European) 
 dec8_bin 
 西欧 (多语言), 二进制 
 dec8_swedish_ci 
 瑞典语, 不区分大小写 
 euckr (EUC-KR Korean) 
 euckr_bin 
 朝鲜语, 二进制 
 euckr_korean_ci 
 朝鲜语, 不区分大小写 
 gb2312 (GB2312 Simplified Chinese) 
 gb2312_bin 
 简体中文, 二进制 
 gb2312_chinese_ci 
 简体中文, 不区分大小写 
 gbk (GBK Simplified Chinese) 
 gbk_bin 
 简体中文, 二进制 
 gbk_chinese_ci 
 简体中文, 不区分大小写 
 geostd8 (GEOSTD8 Georgian) 
 geostd8_bin 
 乔治亚语, 二进制 
 geostd8_general_ci 
 乔治亚语, 不区分大小写 
 greek (ISO 8859-7 Greek) 
 greek_bin 
 希腊语, 二进制 
 greek_general_ci 
 希腊语, 不区分大小写 
 hebrew (ISO 8859-8 Hebrew) 
 hebrew_bin 
 希伯来语, 二进制 
 hebrew_general_ci 
 希伯来语, 不区分大小写 
 hp8 (HP West European) 
 hp8_bin 
 西欧 (多语言), 二进制 
 hp8_english_ci 
 英语, 不区分大小写 
 keybcs2 (DOS Kamenicky Czech-Slovak) 
 keybcs2_bin 
 捷克斯洛伐克语, 二进制 
 keybcs2_general_ci 
 捷克斯洛伐克语, 不区分大小写 
 koi8r (KOI8-R Relcom Russian) 
 koi8r_bin 
 俄语, 二进制 
 koi8r_general_ci 
 俄语, 不区分大小写 
 koi8u (KOI8-U Ukrainian) 
 koi8u_bin 
 乌克兰语, 二进制 
 koi8u_general_ci 
 乌克兰语, 不区分大小写 
 latin1 (cp1252 West European) 
 latin1_bin 
 西欧 (多语言), 二进制 
 latin1_danish_ci 
 丹麦语, 不区分大小写 
 latin1_general_ci 
 西欧 (多语言), 不区分大小写 
 latin1_general_cs 
 西欧 (多语言), 区分大小写 
 latin1_german1_ci 
 德语 (字典), 不区分大小写 
 latin1_german2_ci 
 德语 (电话本), 不区分大小写 
 latin1_spanish_ci 
 西班牙语, 不区分大小写 
 latin1_swedish_ci 
 瑞典语, 不区分大小写 
 latin2 (ISO 8859-2 Central European) 
 latin2_bin 
 中欧 (多语言), 二进制 
 latin2_croatian_ci 
 克罗地亚语, 不区分大小写 
 latin2_czech_cs 
 捷克语, 区分大小写 
 latin2_general_ci 
 中欧 (多语言), 不区分大小写 
 latin2_hungarian_ci 
 匈牙利语, 不区分大小写 
 latin5 (ISO 8859-9 Turkish) 
 latin5_bin 
 土耳其语, 二进制 
 latin5_turkish_ci 
 土耳其语, 不区分大小写 
 latin7 (ISO 8859-13 Baltic) 
 latin7_bin 
 巴拉克语 (多语言), 二进制 
 latin7_estonian_cs 
 爱沙尼亚语, 区分大小写 
 latin7_general_ci 
 巴拉克语 (多语言), 不区分大小写 
 latin7_general_cs 
 巴拉克语 (多语言), 区分大小写 
 macce (Mac Central European) 
 macce_bin 
 中欧 (多语言), 二进制 
 macce_general_ci 
 中欧 (多语言), 不区分大小写 
 macroman (Mac West European) 
 macroman_bin 
 西欧 (多语言), 二进制 
 macroman_general_ci 
 西欧 (多语言), 不区分大小写 
 sjis (Shift-JIS Japanese) 
 sjis_bin 
 日语, 二进制 
 sjis_japanese_ci 
 日语, 不区分大小写 
 swe7 (7bit Swedish) 
 swe7_bin 
 瑞典语, 二进制 
 swe7_swedish_ci 
 瑞典语, 不区分大小写 
 tis620 (TIS620 Thai) 
 tis620_bin 
 泰语, 二进制 
 tis620_thai_ci 
 泰语, 不区分大小写 
 ucs2 (UCS-2 Unicode) 
 ucs2_bin 
 Unicode (多语言), 二进制 
 ucs2_czech_ci 
 捷克语, 不区分大小写 
 ucs2_danish_ci 
 丹麦语, 不区分大小写 
 ucs2_estonian_ci 
 爱沙尼亚语, 不区分大小写 
 ucs2_general_ci 
 Unicode (多语言), 不区分大小写 
 ucs2_icelandic_ci 
 冰岛语, 不区分大小写 
 ucs2_latvian_ci 
 拉脱维亚语, 不区分大小写 
 ucs2_lithuanian_ci 
 立陶宛语, 不区分大小写 
 ucs2_persian_ci 
 波斯语, 不区分大小写 
 ucs2_polish_ci 
 波兰语, 不区分大小写 
 ucs2_roman_ci 
 西欧, 不区分大小写 
 ucs2_romanian_ci 
 罗马尼亚语, 不区分大小写 
 ucs2_slovak_ci 
 斯洛伐克语, 不区分大小写 
 ucs2_slovenian_ci 
 斯洛文尼亚语, 不区分大小写 
 ucs2_spanish2_ci 
 传统西班牙语, 不区分大小写 
 ucs2_spanish_ci 
 西班牙语, 不区分大小写 
 ucs2_swedish_ci 
 瑞典语, 不区分大小写 
 ucs2_turkish_ci 
 土耳其语, 不区分大小写 
 ucs2_unicode_ci 
 Unicode (多语言), 不区分大小写 
 ujis (EUC-JP Japanese) 
 ujis_bin 
 日语, 二进制 
 ujis_japanese_ci 
 日语, 不区分大小写 
 utf8 (UTF-8 Unicode) 
 utf8_bin 
 Unicode (多语言), 二进制 
 utf8_czech_ci 
 捷克语, 不区分大小写 
 utf8_danish_ci 
 丹麦语, 不区分大小写 
 utf8_estonian_ci 
 爱沙尼亚语, 不区分大小写 
 utf8_general_ci 
 Unicode (多语言), 不区分大小写 
 utf8_icelandic_ci 
 冰岛语, 不区分大小写 
 utf8_latvian_ci 
 拉脱维亚语, 不区分大小写 
 utf8_lithuanian_ci 
 立陶宛语, 不区分大小写 
 utf8_persian_ci 
 波斯语, 不区分大小写 
 utf8_polish_ci 
 波兰语, 不区分大小写 
 utf8_roman_ci 
 西欧, 不区分大小写 
 utf8_romanian_ci 
 罗马尼亚语, 不区分大小写 
 utf8_slovak_ci 
 斯洛伐克语, 不区分大小写 
 utf8_slovenian_ci 
 斯洛文尼亚语, 不区分大小写 
 utf8_spanish2_ci 
 传统西班牙语, 不区分大小写 
 utf8_spanish_ci 
 西班牙语, 不区分大小写 
 utf8_swedish_ci 
 瑞典语, 不区分大小写 
 utf8_turkish_ci 
 土耳其语, 不区分大小写 
 utf8_unicode_ci 
 Unicode (多语言), 不区分大小写 
发表在 db | 标签为 , | 160条评论

SELinux

SELinux(Security-Enhanced Linux) 是
美国国家安全局

(NAS)对于强制访问控制的实现,是 Linux&reg; 上最杰出的新安全子系统。NSA是在Linux社区的帮助下开发了一种访问控制体系,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件。SELinux 默认安装在 Fedora 和 Red Hat Enterprise Linux 上,也可以作为其他发行版上容易安装的包得到。

  SELinux 是 2.6 版本的 Linux 内核中提供的强制访问控制 (MAC)系统。对于目前可用的 Linux 安全模块来说,SELinux 是功能最全面,而且测试最充分的,它是在 20 年的 MAC 研究基础上建立的。SELinux 在类型强制服务器中合并了多级安全性或一种可选的多类策略,并采用了基于角色的访问控制概念。

  大部分使用 SELinux 的人使用的都是 SELinux 就绪的发行版,例如 Fedora、Red Hat Enterprise Linux (RHEL)、Debian 或 Gentoo。它们都是在内核中启用 SELinux 的,并且提供一个可定制的安全策略,还提供很多用户层的库和工具,它们都可以使用 SELinux 的功能。

  SELinux是一种基于 域-类型 模型(domain-type)的强制访问控制(MAC)安全系统,它由NSA编写并设计成内核模块包含到内核中,相应的某些安全相关的应用也被打了SELinux的补丁,最后还有一个相应的安全策略。

  众所周知,标准的UNIX安全模型是"任意的访问控制"DAC。就是说,任何程序对其资源享有完全的控制权。假设某个程序打算把含有潜在重要信息的文件扔到/tmp目录下,那么在DAC情况下没人能阻止他!

  而MAC情况下的安全策略完全控制着对所有资源的访问。这是MAC和DAC本质的区别。

  SELinux提供了比传统的UNIX权限更好的访问控制。

  1.背景

  SELinux是「Security-Enhanced Linux」的简称,是美国国家安全局「NSA=The National Security Agency」 和SCC(Secure Computing Corporation)开发的 Linux的一个扩张强制访问控制安全模块。原先是在Fluke上开发的,2000年以 GNU GPL 发布。

  现在以Linux作为因特网服务器是越来越普遍的事了。在我这几年作过的项目里,WEB的开发基本都是基于Linux的,这里有给大公司做的,也给政府部门做的,当然更多的是中小企业做的。这其中给政府做的,我们把SELinux作为一个卖点,接受了不少项目。

  2.我们需要安全操作系统的理由

  现在不论是政府还是民间企业,大家对信息安全问题是越来越关心了,因为企业的业务平台的服务器上存储着大量的商务机密,个人资料,个人资料它直接关系到个人的隐私问题。特别是我们政府的网站,作为信息公开的平台,它的安全就更显得重要了。这些连到互联网的服务器,不可避免的要受到来自世界各地的各种威胁。最坏的时候我们的服务器被入侵,主页文件被替换,机密文件被盗走。除了来自外部的威胁外,内部人员的不法访问,攻击也是不可忽视的。对于这些攻击或者说是威胁,当然有很多的办法,有防火墙,入侵检测系统,打补丁等等。因为Linux也和其他的商用UNIX一样,不断有各类的安全漏洞被发现。我们对付这些漏洞不得不花很多的人力来堵住它。在这些手段之中,提高OS系统自身的牢固性就显得非常的重要。

  2.1传统的Linux OS的不足之处

  虽然Linux 比起 Windows 来说,它的可靠性,稳定定要好得多,但是他也是和其他的UNIX 一样,有以下这些不足之处。

  1)存在特权用户root

  任何人只要得到root的权限,对于整个系统都可以为所欲为。这一点Windows也一样。

  2)对于文件的访问权的划分不够细

  在linux系统里,对于文件的操作,只有「所有者」,「所有组」,「其他」这3类的划分。

  对于「其他」这一类里的用户再细细的划分的话就没有办法了。

  3)SUID程序的权限升级

  如果设置了SUID权限的程序有了漏洞的话,很容易被攻击者所利用。

  4)DAC(Discretionary Access Control)问题

  文件目录的所有者可以对文件进行所有的操作,这给系统整体的管理带来不便。

  对于以上这些的不足,防火墙,入侵检测系统都是无能为力的。

  在这种背景下,对于访问权限大幅强化的OS SELinux来说,它的魅力的无穷的。

  2.2 SELinux的优点

  SELinux系统比起通常的Linux系统来,安全性能要高的多,它通过对于用户,进程权限的最小化,即使受到攻击,进程或者用户权限被夺去,也不会对整个系统造成重大影响。

  接下来我来介绍SELinux的一些特点。

  特点1:MAC(Mandatory Access Control)―――对访问的控制彻底化

  对于所有的文件,目录,端口这类的资源的访问,都可以是基于策略设定的,这些策略是由管理员定制的、一般用户是没有权限更改的。

  特点2: TE (Type Enforcement)――― 对于进程只付与最小的权限

  Te概念在 SELinux里非常的重要。它的特点是对所有的文件都赋予一个叫type的文件类型标签,对于所有的进程也赋予各自的一个叫 domain的 标签。Domain标签能够执行的操作也是由access vector在策略里定好的。

  我们熟悉的apache服务器,httpd进程只能在httpd_t 里运行,这个httpd_t 的domain能执行的操作,比如能读网页内容文件赋予httpd_sys_content_t, 密码文件赋予shadow_t, TCP的80端口赋予 http_port_t等等。如果在access vector里我们不允许 http_t来对http_port_t进行操作的花,Apache启动都启动不了。反过来说,我们只允许80端口,只允许读取被标为 httpd_sys_content_t的文件,httpd_t就不能用别的端口,也不能更改那些被标为httpd_sys_content_t的文件(read only)。

  特点3: domain迁移 ―― 防止权限升级

  在用户环境里运行点对点下载软件azureus,你当前的domain是fu_t, 但是,你考虑到安全问题,你打算让他在azureus_t里运行,你要是在terminal里用命令启动azureus的话,它的进程的domain就会默认继承你实行的shell的fu_t。

  有了domain迁移的话,我们就可以让azureus在我们指定的azureus_t里运行,在安全上面,这种做法更可取,它不会影响到你的fu_t。

  下面是domain迁移指示的例子:

  domain_auto_trans(fu_t, azureus_exec_t, azureus_t)

  意思就是,当在 fu_t domain里,实行了 被标为 azureus_exec_t的文件时,domain 从fu_t迁移到 azureus_t 。下面是Apache启动的迁移图。注意了,因为从哪一个domain能迁移到httpd_t是在策略里定好了,所以要是我们手动 (/etc/init.d/httpd start)启动apache的话,可能仍然留在sysadm_t里,这样就不能完成正确的迁移。要用run_init命令来手动启动。

  特点4: RBAC(role base access control) ――――― 对于用户只付与最小的权限

  对于用户来说,被划分成一些ROLE,即使是ROOT用户,你要是不在sysadm_r里,也还是不能实行sysadm_t管理操作的。因为,那些ROLE可以执行那些domain也是在策略里设定的。ROLE也是可以迁移的,但是也只能安策略规定的迁移。

  3. 控制切换

  从fedora core 2开始, 2.6内核的版本都支持selinux.我们看看 Fedora core 5 里的/etc/sysconfig/selinux标准设定吧。

  # This file controls the state of SELinux on the system.

  # SELINUX= can take one of these three values:

  # enforcing - SELinux security policy is enforced.

  # permissive - SELinux prints warnings instead of enforcing.

  # disabled - SELinux is fully disabled.

  SELINUX=enforcing

  #SELINUX=disabled

  # SELINUXTYPE= type of policy in use. Possible values are:

  # targeted - Only targeted network daemons are protected.

  # strict - Full SELinux protection.

  SELINUXTYPE=targeted

  SELINUX有「disabled」「permissive」,「enforcing」3种选择。

  Disabled就不用说了,permissive就是Selinux有效,但是即使你违反了策略的话它让你继续操作,但是把你的违反的内容记录下来。在我们开发策略的时候非常的有用。

  相当于Debug模式。

  Enforcing就是你违反了策略,你就无法继续操作下去。

  SELINUXTYPE呢,现在主要有2大类,一类就是红帽子开发的targeted,它只是对于,主要的网络服务进行保护,比如 apache ,sendmail, bind,postgresql等,不属于那些domain的就都让他们在unconfined_t里,可导入性高,可用性好但是不能对整体进行保护。

  另一类是Strict,是NAS开发的,能对整个系统进行保护,但是设定复杂,我认为虽然它复杂,但是一些基本的会了,还是可以玩得动的。

  我们除了在/etc/sysconfig/selinux设它有效无效外,在启动的时候,也可以通过传递参数selinux给内核来控制它。(Fedora 5默认是有效)

  kernel /boot/vmlinuz-2.6.15-1.2054_FC5 ro root=LABEL=/ rhgb quiet selinux=0

 

查看SELinux状态:
1、/usr/sbin/sestatus -v      ##如果SELinux status参数为enabled即为开启状态
SELinux status:                 enabled

2、getenforce                 ##也可以用这个命令检查

关闭SELinux:

1、临时关闭(不用重启机器):

setenforce 0                  ##设置SELinux 成为permissive模式

##setenforce 1 设置SELinux 成为enforcing模式

2、修改配置文件需要重启机器:

修改/etc/selinux/config 文件

将SELINUX=enforcing改为SELINUX=disabled

重启机器即可

发表在 article | 标签为 | 52条评论

开启Gzip压缩

Apache2中的实时压缩解压的模块编译在mod_deflate模块中,替换了原来的mod_gzip模块。

编译apache的时候 –enable-deflate  这个参数是默认开启的,编译完会有mod_deflate模块。

配置站点:

如果我们想使一个文件传输的时候进行加密,我们在站点配置文件里增加这样的配置

<Location />
SetOutputFilter DEFLATE
# 设置压缩频率,取值范围在 1(最低压缩率) 到 9(最高压缩率)之间
# 不建议设置太高,虽然有很高的压缩率,但是占用更多的CPU资源
# DeflateCompressionLevel 3
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
SetEnvIfNoCase Request_URI \
\.(?:gif|jpe?g|png)$ no-gzip dont-vary
Header append Vary User-Agent env=!dont-vary
</Location>
这样,/opt/httpd-2.2.9/htdocs目录下的所有mime类型为text/html的文件就可以启用

未压缩的http头

 

Date Tue, 28 Oct 2008 13:04:15 GMT
Server Apache/2.2.9 (Unix) DAV/2 PHP/5.2.6
Last-Modified Tue, 28 Oct 2008 12:51:52 GMT
Etag “30623-55fda-45a4fb62a8a00″
Accept-Ranges bytes
Content-Length 352218
Content-Type text/html
Vary Accept-Encoding,User-Agent

压缩后的http头

 

Date Tue, 28 Oct 2008 13:07:39 GMT
Server Apache/2.2.9 (Unix) DAV/2 PHP/5.2.6
Last-Modified Tue, 28 Oct 2008 12:51:52 GMT
Etag “30623-55fda-45a4fb62a8a00″-gzip
Accept-Ranges bytes
Vary Accept-Encoding,User-Agent
Content-Encoding gzip
Content-Length 2778
Keep-Alive timeout=5, max=100
Connection Keep-Alive
Content-Type text/html

------------------------------------------------------------

<Location />

# 插入过滤器
SetOutputFilter DEFLATE

# Netscape 4.x 有一些问题...
BrowserMatch ^Mozilla/4 gzip-only-text/html

# Netscape 4.06-4.08 有更多的问题
BrowserMatch ^Mozilla/4\.0[678] no-gzip

# MSIE 会伪装成 Netscape ,但是事实上它没有问题
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# 不压缩图片
SetEnvIfNoCase Request_URI \

\.(?:gif|jpe?g|png)$ no-gzip dont-vary


# 确保代理不会发送错误的内容
Header append Vary User-Agent env=!dont-vary


</Location>
http://lamp.linux.gov.cn/Apache/ApacheMenu//mod/mod_deflate.html

 

IIS 6.0中配置HTTP Gzip压缩

一. HTTP压缩概述

HTTP压缩是在Web服务器和浏览器间传输压缩文本内容的方法。HTTP压缩采用通用的压缩算法如gzip等压缩HTML、JavaScript或 CSS文件。压缩的最大好处就是降低了网络传输的数据量,从而提高客户端浏览器的访问速度。当然,同时也会增加一点点服务器的负担。Gzip是比较常见的一种HTTP压缩算法。

本文介绍的HTTP压缩方式,采用的是Windows系统设置的方式,优点是效率较高。

二. HTTP压缩工作原理

Web服务器处理HTTP压缩的工作原理如下:

Web服务器接收到浏览器的HTTP请求后,检查浏览器是否支持HTTP压缩;
如果浏览器支持HTTP压缩,Web服务器检查请求文件的后缀名;
如果请求文件是HTML、CSS等静态文件,Web服务器到压缩缓冲目录中检查是否已经存在请求文件的最新压缩文件;
如果请求文件的压缩文件不存在,Web服务器向浏览器返回未压缩的请求文件,并在压缩缓冲目录中存放请求文件的压缩文件;
如果请求文件的最新压缩文件已经存在,则直接返回请求文件的压缩文件;
如果请求文件是ASPX等动态文件,Web服务器动态压缩内容并返回浏览器,压缩内容不存放到压缩缓存目录中。

三. IIS 6.0中配置HTTP Gzip压缩的步骤:

1) 打开Internet信息服务(IIS)管理器,右击"网站"->"属性",选择"服务"。在"HTTP压缩"框中选中"压缩应用程序文件"和"压缩静态文件",按需要设置"临时目录"和"临时目录的最大限制";

2) 在Internet信息服务(IIS)管理器,右击"Web服务扩展"->"增加一个新的Web服务扩展...",在"新建Web服务扩展"框中输入扩展名"HTTPCompression",添加"要求的文件"为C:\WINDOWS\system32\inetsrv\gzip.dll,其中 Windows系统目录根据您的安装可能有所不同,选中"设置扩展状态为允许";

3) 使用文本编辑器打开C:\Windows\System32\inetsrv\MetaBase.xml(建议先备份),找到Location ="/LM/W3SVC/Filters/Compression/gzip",如果需要压缩动态文件,则将 HcDoDynamicCompression设置为"TRUE",并在HcScriptFileExtensions中增加您要压缩的动态文件后缀名,如aspx;如果需要压缩静态文件,则将HcDoStaticCompression和HcDoOnDemandCompression设置为 "TRUE",并在HcFileExtensions中增加您需要压缩的静态文件后缀名,如xml、css等; HcDynamicCompressionLevel和HcOnDemandCompLevel表示需要的压缩率,数字越小压缩率越低; HcDynamicCompressionLevel改成9,(0-10,9是性价比最高的一个)。

4) 编辑完毕后保存MetaBase.xml文件;如果文件无法保存,则可能IIS正在使用该文件。打开"开始"->"管理工具"->"服务",停止"IIS Admin Service"后,即可保存;

5) 最后,重新启动IIS。可以到HTTP压缩测试网站http://www.pipeboost.com/
验证结果。

发表在 article | 标签为 , | 开启Gzip压缩已关闭评论

htaccess

.htaccess文件(或者"分布式配置文件"提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。
 

 

  - 子目录中的指令会覆盖更高级目录或者主服务器配置文件中的指令。
 

 

  - .htaccess必须以ASCII模式上传,最好将其权限设置为644。
 

 

  错误文档的定位
 

 

  常用的客户端请求错误返回代码:
 

 

  401 Authorization Required
 

 

  403 Forbidden
 

 

  404 Not Found
 

 

  405 Method Not Allowed
 

 

  408 Request Timed Out
 

 

  411 Content Length Required
 

 

  412 Precondition Failed
 

 

  413 Request Entity Too Long
 

 

  414 Request URI Too Long
 

 

  415 Unsupported Media Type
 

 

  常见的服务器错误返回代码:
 

 

  500 Internal Server Error
 

 

  用户可以利用.htaccess指定自己事先制作好的错误提醒页面。一般情况下,人们可以专门设立一个目录,例如errors放置这些页面。然后再.htaccess中,加入如下的指令:
 

 

  ErrorDocument 404 /errors/notfound.html
 

 

  ErrorDocument 500 /errors/internalerror.html
 

 

  一条指令一行。上述第一条指令的意思是对于404,也就是没有找到所需要的文档的时候得显示页面为/errors目录下的notfound.html页面。不难看出语法格式为:
 

 

  ErrorDocument 错误代码 /目录名/文件名.扩展名
 

 

  如果所需要提示的信息很少的话,不必专门制作页面,直接在指令中使用HTML号了,例如下面这个例子:
 

 

  ErrorDocument 401 "
 

 

  你没有权限访问该页面,请放弃!
 

 

  "
 

 

  文档访问的密码保护
 

 

  要利用.htaccess对某个目录下的文档设定访问用户和对应的密码,首先要做的是生成一个.htpasswd的文本文档,例如:
 

 

  zheng:y4E7Ep8e7EYV
 

 

  这里密码经过加密,用户可以自己找些工具将密码加密成.htaccess支持的编码。该文档最好不要放在www目录下,建议放在www根目录文档之外,这样更为安全些。
 

 

  有了授权用户文档,可以在.htaccess中加入如下指令了:
 

 

  AuthUserFile .htpasswd的服务器目录
 

 

  AuthGroupFile /dev/null (需要授权访问的目录)
 

 

  AuthName EnterPassword
 

 

  AuthType Basic (授权类型)
 

 

  require user wsabstract (允许访问的用户,如果希望表中所有用户都允许,可以使用 require valid-user)
 

 

  注,括号部分为学习时候自己添加的注释
 

 

  拒绝来自某个IP的访问
 

 

  如果我不想某个政府部门访问到我的站点的内容,那可以通过.htaccess中加入该部门的IP而将它们拒绝在外。
 

 

  例如:
 

 

  order allow,deny
 

 

  deny from 210.10.56.32
 

 

  deny from 219.5.45.
 

 

  allow from all
 

 

  第二行拒绝某个IP,第三行拒绝某个IP段,也就是219.5.45.0~219.2.45.255
 

 

  想要拒绝所有人?用deny from all好了。不止用IP,也可以用域名来设定。
 

 

  保护.htaccess文档
 

 

  在使用.htaccess来设置目录的密码保护时,它包含了密码文件的路径。从安全考虑,有必要把.htaccess也保护起来,不让别人看到其中的内容。虽然可以用其他方式做到这点,比如文档的权限。不过,.htaccess本身也能做到,只需加入如下的指令:
 

 

  order allow,deny
 

 

  deny from all
 

 

  URL转向
 

 

  我们可能对网站进行重新规划,将文档进行了迁移,或者更改了目录。这时候,来自搜索引擎或者其他网站链接过来的访问就可能出错。这种情况下,可以通过如下指令来完成旧的URL自动转向到新的地址:
 

 

  Redirect /旧目录/旧文档名 新文档的地址
 

 

  或者整个目录的转向:
 

 

  Redirect 旧目录 新目录
 

 

  改变缺省的首页文件
 

 

  一般情况下缺省的首页文件名有default、index等。不过,有些时候目录中没有缺省文件,而是某个特定的文件名,比如在pmwiki中是pmwiki.php。这种情况下,要用户记住文件名来访问很麻烦。在.htaccess中可以轻易的设置新的缺省文件名:
 

 

  DirectoryIndex 新的缺省文件名
 

 

  也可以列出多个,顺序表明它们之间的优先级别,例如:
 

 

  DirectoryIndex filename.html index.cgi index.pl default.htm
 

 

  防止盗链
 

 

  如果不喜欢别人在他们的网页上连接自己的图片、文档的话,也可以通过htaccess的指令来做到。
 

 

  所需要的指令如下:
 

 

  RewriteEngine on
 

 

  RewriteCond % !^$
 

 

  RewriteCond % !^http://(www.)?mydomain.com...*$ [NC]
 

 

  RewriteRule .(gif|jpg)$ - [F]
 

 

  如果觉得让别人的页面开个天窗不好看,那可以用一张图片来代替:
 

 

  RewriteEngine on
 

 

  RewriteCond % !^$
 

 

  RewriteCond % !^http://(www.)?mydomain.com...*$ [NC]
 

 

  RewriteRule .(gif|jpg)$ http://www.mydomain.com/替代图片文件名 [R,L]
 

 

  source:http://wsabstract.com/howt...

 

 

.htaccess实现网址规范化

  网址规范化在SEO中是一个比较重要的环节,同时存在不同的网址版本,不但可能造成复制,还不能正确的集中权重。
 

 

  目前大多数网站,绑定域名都有带WWW和不带两个版本,甚至很多网站同时绑定多个域名。经过处理(跳转、CNAME……),对于访问者来说可能没有任何影响,看到的都是同样的内容;但对于搜索引擎,就无法确定哪一个网址是真正的主页。
 

 

  可控因素,网站内容链接应该保持同一个版本,比如整站中,返回首页的地址为固定的一个版本。但还有一个不可控的因素,就是别人链到你的网站,所使用的网址。很多自发链接或交换链接时,别人可能会省略掉WWW,或采用绑定的另一域名。
 

 

  外界因素不可控,我们可以从网站内部来控制。利用Apache的.htaccess,使用301重定向,规范网址。
 

 

  新建一个空文件,文件名.htaccess,填入重定向规则后,上传到网站根目录。
 

 

  用301将不带WWW的域名重定向
 

 

  rewriteEngine on
 

 

  rewriteCond % ^379.cc [NC]
 

 

  rewriteRule ^(.*)$ http://www.379.cc/$1 [R=301,L]
 

 

  用301将绑定的其他多个域名重定向到主域名
 

 

  RewriteEngine on
 

 

  RewriteCond % ^379.cc$ [OR]
 

 

  RewriteCond % ^bbs.379.cc$ [OR]
 

 

  RewriteCond % ^luoyang.cc$ [OR]
 

 

  RewriteCond % ^www.luoyang.cc$ [OR]
 

 

  RewriteCond % ^bbs.luoyang.cc$
 

 

  RewriteRule ^(.*)$ http://www.379.cc/$1 [R=301,L]
 

 

  当然,也可以再扩展一下,将index.html、index.php等也重定向一下:
 

 

  RewriteEngine on
 

 

  RewriteCond % ^[A-Z]{3,9}\ /index\.php\ HTTP/
 

 

  RewriteRule ^index\.php$ http://www.379.cc/ [R=301,L]
 

 

  Enabling SSI Via htaccess 通过htaccess允许SSI(Server Side Including)功能
 

 

  AddType text/html .shtml
 

 

  AddHandler server-parsed .shtml
 

 

  Options Indexes FollowSymLinks Includes
 

 

  DirectoryIndex index.shtml index.html
 

 

  Blocking users/sites by referrer 根据referrer阻止用户/站点访问
 

 

  需要mod_rewrite模块
 

 

  例1. 阻止单一referrer: badsite.com
 

 

  RewriteEngine on
 

 

  # Options +FollowSymlinks
 

 

  RewriteCond % badsite\.com [NC]
 

 

  RewriteRule .* - [F]
 

 

  例2. 阻止多个referrer: badsite1.com, badsite2.com
 

 

  RewriteEngine on
 

 

  # Options +FollowSymlinks
 

 

  RewriteCond % badsite1\.com [NC,OR]
 

 

  RewriteCond % badsite2\.com
 

 

  RewriteRule .* - [F]
 

 

  [NC] - 大小写不敏感(Case-insensite)
 

 

  [F] - 403 Forbidden
 

 

  注意以上代码注释掉了”Options +FollowSymlinks”这个语句。如果服务器未在 httpd.conf 的 段落设置 FollowSymLinks, 则需要加上这句,否则会得到”500 Internal Server error”错误。
 

 

  Blocking bad bots and site rippers (aka offline browsers) 阻止坏爬虫和离线浏览器
 

 

  需要mod_rewrite模块
 

 

  坏爬虫? 比如一些抓垃圾email地址的爬虫和不遵守robots.txt的爬虫(如baidu?)
 

 

  可以根据 HTTP_USER_AGENT 来判断它们
 

 

  (但是对于一些搜索引擎把自己的agent设置为 “Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)” ,就无能为力了)
 

 

  RewriteEngine On
 

 

  RewriteCond % ^BlackWidow [OR]
 

 

  RewriteCond % ^Bot\ mailto:craftbot@yahoo.com [OR]
 

 

  RewriteCond % ^ChinaClaw [OR]
 

 

  RewriteCond % ^Custo [OR]
 

 

  RewriteCond % ^DISCo [OR]
 

 

  RewriteCond % ^Download\ Demon [OR]
 

 

  RewriteCond % ^eCatch [OR]
 

 

  RewriteCond % ^EirGrabber [OR]
 

 

  RewriteCond % ^EmailSiphon [OR]
 

 

  RewriteCond % ^EmailWolf [OR]
 

 

  RewriteCond % ^Express\ WebPictures [OR]
 

 

  RewriteCond % ^ExtractorPro [OR]
 

 

  RewriteCond % ^EyeNetIE [OR]
 

 

  RewriteCond % ^FlashGet [OR]
 

 

  RewriteCond % ^GetRight [OR]
 

 

  RewriteCond % ^GetWeb! [OR]
 

 

  RewriteCond % ^Go!Zilla [OR]
 

 

  RewriteCond % ^Go-Ahead-Got-It [OR]
 

 

  RewriteCond % ^GrabNet [OR]
 

 

  RewriteCond % ^Grafula [OR]
 

 

  RewriteCond % ^HMView [OR]
 

 

  RewriteCond % HTTrack [NC,OR]
 

 

  RewriteCond % ^Image\ Stripper [OR]
 

 

  RewriteCond % ^Image\ Sucker [OR]
 

 

  RewriteCond % Indy\ Library [NC,OR]
 

 

  RewriteCond % ^InterGET [OR]
 

 

  RewriteCond % ^Internet\ Ninja [OR]
 

 

  RewriteCond % ^JetCar [OR]
 

 

  RewriteCond % ^JOC\ Web\ Spider [OR]
 

 

  RewriteCond % ^larbin [OR]
 

 

  RewriteCond % ^LeechFTP [OR]
 

 

  RewriteCond % ^Mass\ Downloader [OR]
 

 

  RewriteCond % ^MIDown\ tool [OR]
 

 

  RewriteCond % ^Mister\ PiX [OR]
 

 

  RewriteCond % ^Navroad [OR]
 

 

  RewriteCond % ^NearSite [OR]
 

 

  RewriteCond % ^NetAnts [OR]
 

 

  RewriteCond % ^NetSpider [OR]
 

 

  RewriteCond % ^Net\ Vampire [OR]
 

 

  RewriteCond % ^NetZIP [OR]
 

 

  RewriteCond % ^Octopus [OR]
 

 

  RewriteCond % ^Offline\ Explorer [OR]
 

 

  RewriteCond % ^Offline\ Navigator [OR]
 

 

  RewriteCond % ^PageGrabber [OR]
 

 

  RewriteCond % ^Papa\ Foto [OR]
 

 

  RewriteCond % ^pavuk [OR]
 

 

  RewriteCond % ^pcBrowser [OR]
 

 

  RewriteCond % ^RealDownload [OR]
 

 

  RewriteCond % ^ReGet [OR]
 

 

  RewriteCond % ^SiteSnagger [OR]
 

 

  RewriteCond % ^SmartDownload [OR]
 

 

  RewriteCond % ^SuperBot [OR]
 

 

  RewriteCond % ^SuperHTTP [OR]
 

 

  RewriteCond % ^Surfbot [OR]
 

 

  RewriteCond % ^tAkeOut [OR]
 

 

  RewriteCond % ^Teleport\ Pro [OR]
 

 

  RewriteCond % ^VoidEYE [OR]
 

 

  RewriteCond % ^Web\ Image\ Collector [OR]
 

 

  RewriteCond % ^Web\ Sucker [OR]
 

 

  RewriteCond % ^WebAuto [OR]
 

 

  RewriteCond % ^WebCopier [OR]
 

 

  RewriteCond % ^WebFetch [OR]
 

 

  RewriteCond % ^WebGo\ IS [OR]
 

 

  RewriteCond % ^WebLeacher [OR]
 

 

  RewriteCond % ^WebReaper [OR]
 

 

  RewriteCond % ^WebSauger [OR]
 

 

  RewriteCond % ^Website\ eXtractor [OR]
 

 

  RewriteCond % ^Website\ Quester [OR]
 

 

  RewriteCond % ^WebStripper [OR]
 

 

  RewriteCond % ^WebWhacker [OR]
 

 

  RewriteCond % ^WebZIP [OR]
 

 

  RewriteCond % ^Wget [OR]
 

 

  RewriteCond % ^Widow [OR]
 

 

  RewriteCond % ^WWWOFFLE [OR]
 

 

  RewriteCond % ^Xaldon\ WebSpider [OR]
 

 

  RewriteCond % ^Zeus
 

 

  RewriteRule ^.* - [F,L]
 

 

  [F] - 403 Forbidden
 

 

  [L] - 连接(Link)
 

 

  Discuz!论坛静态化配置规则如下:
 

 

  # 将 RewriteEngine 模式打开
 

 

  RewriteEngine On
 

 

  # 修改以下语句中的 /discuz 为你的论坛目录地址,如果程序放在根目录中,请将 /discuz 修改为 /
 

 

  RewriteBase /
 

 

  # Rewrite 系统规则请勿修改
 

 

  RewriteRule ^archiver/((fid|tid)-[\w\-]+\.html)$ archiver/index.php?$1
 

 

  RewriteRule ^forum-([0-9]+)-([0-9]+)\.html$ forumdisplay.php?fid=$1&page=$2
 

 

  RewriteRule ^thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ viewthread.php?tid=$1&extra=page\%3D$3&page=$2
 

 

  RewriteRule ^space-(username|uid)-(.+)\.html$ space.php?$1=$2
 

 

  RewriteRule ^tag-(.+)\.html$ tag.php?name=$1

发表在 article | 标签为 | 318条评论

Apache之Options

Options指令

Options指令控制了在特定目录中将使用哪些服务器特性。

可选项能设置为None,在这种情况下,将不启用任何额外特性。或设置为以下选项中的一个或多个:

All
除MultiViews之外的所有特性。这是默认设置。
ExecCGI
允许执行CGI脚本.
FollowSymLinks
服务器会在此目录中使用符号连接。
注意:即便服务器会使用符号连接,但它不会改变用于匹配<Directory>配置段的路径名。
注意:如果此配置位于<Location>配置段中,则此设置会被忽略。
Includes
允许服务器端包含。
IncludesNOEXEC
允许服务器端包含,但禁用#exec命令和#exec CGI。但仍可以从ScriptAliase目录使用#include 虚拟CGI脚本。
Indexes
如果一个映射到目录的URL被请求,而此目录中又没有DirectoryIndex(例如:index.html),那么服务器会返回一个格式化后的目录列表。
MultiViews
允许内容协商的多重视图。
服务器仅在符号连接与其目的目录或文件拥有者具有同样的用户id时才使用它。
注意:如果此配置出现在<Location>配置段中,此选项将被忽略。
SymLinksIfOwnerMatch

一般来说,如果一个目录被多次设置了Options,则最特殊的一个会被完全接受,而各个可选项的设定彼此并不融合。然而,如果所有施用于Options指令的可选项前都加有+或-符号,此可选项将被合并。所有前面加有+号的可选项将强制覆盖当前可选项设置,而所有前面有-号的可选项将强制从当前可选项设置中去除。

比如说,没有任何+和-符号:

<Directory /web/docs>
Options Indexes FollowSymLinks
</Directory>
<Directory /web/docs/spec>
Options Includes
</Directory>

则只有Includes设置到/web/docs/spec目录上。然而如果第二个Options指令使用了+和-符号:

<Directory /web/docs>
Options Indexes FollowSymLinks
</Directory>
<Directory /web/docs/spec>
Options +Includes -Indexes
</Directory>

那么就会有FollowSymLinks和Includes设置到/web/docs/spec目录上。

请注意:使用-IncludesNOEXEC或是-Includes时,不论前面如何设置,都会完全禁用服务器端包含。

没有其它设置时,默认设置为All。

发表在 web server | 标签为 | Apache之Options已关闭评论

LAMP安装

安装apache2。
# cd /home/xiutuo/software/
进入目录/home/xiutuo/software/
# tar -zvxf httpd-2.2.0.tar.gz
解压httpd-2.2.0.tar.gz
# cd httpd-2.2.0
进入httpd-2.2.0目录
# mkdir -p /usr/local/apache2
生成/usr/local/apache2目录
# ./configure --prefix=/usr/local/apache
或者
# ./configure --prefix=/usr/local/apache --enable-modules=so --enable-rewrite
# make; make install
安装apache
# vi /usr/local/apache/conf/httpd.conf
#ServerName www.example.com:80
在其下增加
ServerName www.xiutuo.com:80

保存退出,现在就这么简单配置apache。

# /usr/local/apache/bin/apachectl -k start
启动apahce,
用浏览器查看http://www.xiutuo.com
,得到it works,说明apache已经配置成功了。
# /usr/local/apache/bin/apachectl -k stop
停止apache。

三:安装mysql
# cd /home/xiutuo/software/
# tar -zvxf mysql-max-5.0.21-linux-i686-glibc23.tar.gz
# mkdir -p /usr/local/mysql (省略也可)
# cp -r mysql-max-5.0.21-linux-i686-glibc23.tar.gz /usr/local/mysql
# cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf

添加mysql用户及用户组
# groupadd mysql
# useradd -g mysql mysql
修改mysql目录权限
# chown -R root /usr/local/mysql
# chgrp -R mysql /usr/local/mysql
# chown -R mysql /usr/local/mysql/data
生成mysql系统数据库
dao mysql mulu yunxing
# ./scripts/mysql_install_db --user=mysql&
启动mysql服务
# /usr/local/mysql/bin/mysqld_safe --user=mysql&
如出现 Starting mysqld daemon with databases from /usr/local/mysql/data
代表正常启动mysql服务了, 按Ctrl + C 跳出
修改 mysql 的 root 密码
# /usr/local/mysql/bin/mysqladmin -u root -p password "123456"
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

四:安装GD库(让PHP支持GIF,PNG,JPEG)
a.安装 jpeg6
建立目录:
# mkdir -p /usr/local/jpeg6
# mkdir -p /usr/local/jpeg6/bin
# mkdir -p /usr/local/jpeg6/lib
# mkdir -p /usr/local/jpeg6/include
# mkdir -p /usr/local/jpeg6/man
# mkdir -p /usr/local/jpeg6/man1
# mkdir -p /usr/local/jpeg6/man/man1

# cd /home/xiutuo/software/
# tar -zvxf jpegsrc.v6b.tar.gz
# cd jpeg-6b
# ./configure --prefix=/usr/local/jpeg6/ --enable-shared --enable-static
# make; make install

b.安装libpng
# cd /home/xiutuo/software/
# tar -zvxf libpng-1.2.8.tar.gz
# cd libpng-1.2.8
# cp scripts/makefile.std makefile
# make; make install

c.安装 freetype
# cd /home/xiutuo/software/
# tar -zvxf freetype-2.1.10.tar.gz
# cd freetype-2.1.10
# mkdir -p /usr/local/freetype
# ./configure --prefix=/usr/local/freetype
# make;make install

d.:安装zlib
# cd /home/xiutuo/software/
#tar -zxvf zlib-1.2.3.tar.gz
#cd zlib.1.2.3
# ./configure
# make;make install

e.安装GD库
# cd /home/xiutuo/software/
# tar -zvxf gd-2.0.33.tar.gz
# mkdir -p /usr/local/gd2
# cd gd-2.0.33
# ./configure --prefix=/usr/local/gd2 --with-jpeg=/usr/local/jpeg6/ --with-png=/usr/local/lib/ --with-zlib=/usr/local/lib/ --with-freetype=/usr/local/freetype/
# make; make install

e.安装Curl库
# cd /home/xiutuo/software/
# tar -zxf curl-7.15.0.tar.gz
# mkdir -p /usr/local/curl
# ./configure --prefix=/usr/local/curl
# make; make install

五:安装php5,php5必须有libxml2支持!
a.安装libxml2
# cd /home/xiutuo/software/
# tar -zxf libxml2-2.6.19.tar.gz
# cd libxml2-2.6.19
# mkdir -p /usr/local/libxml2
# ./configure --prefix=/usr/local/libxml2
# make; make install

b.安装 libxslt(可选安装,你可以不安装)
# cd /home/xiutuo/software/
# tar -zxf libxslt-1.1.15.tar.gz
# mkdir -p /usr/local/libxslt
# cd libxslt-1.1.15
# ./configure --prefix=/usr/local/libxslt --with-libxml-prefix=/usr/local/libxml2
# make; make install

c.安装php5
# cd /home/xiutuo/software/
# tar -zvxf php-5.1.2.tar.gz
# mkdir -p /usr/local/php
# cd php-5.05
# ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql-dir=/usr/local/mysql/ --with-libxml-dir=/usr/local/libxml2/ --with-gd=/usr/local/gd2/ --with-jpeg-dir=/usr/local/jpeg6/ --with-png=/usr/local/lib --with-zlib-dir=/usr/lib/ --with-freetype-dir=/usr/local/freetype --with-curl=/usr/local/curl/ --enable-ftp --enable-soap --with-xsl=/usr/local/libxslt --enable-xslt --enable-sockets --enable-mbstring
# make
# make install
# cp php.ini-dist /usr/local/php/lib/php.ini (别忘记了呵呵)

其中./configure 后的
--prefix=/usr/local/php
--with-apxs2=/usr/local/apache/bin/apxs
--with-mysql=/usr/local/mysql/
--with-libxml-dir=/usr/local/libxml2
是必要的选项

--with-gd=/usr/local/gd2/
--with-jpeg-dir=/usr/local/jpeg6/
--with-png=/usr/local/lib
--with-zlib-dir=/usr/lib
--with-freetype-dir=/usr/local/freetype
这是让PHP支持GD库的配置选项

--with-curl=/usr/local/curl 支持CURL库
--enable-ftp 打开FTP库函数支持

--enable-soap --with-xsl=/usr/local/libxslt --enable-xslt
让PHP支持SOAP, 上面这些一般用得少, 可以去掉

 

六:重新配置apache2让他支持php。

配置 httpd.conf 让apache支持PHP
# vi /usr/local/apache/conf/httpd.conf
找到 AddType application/x-gzip .gz .tgz 在其下添加如下内容
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

重启apache
# /usr/local/apache/bin/apachectl restart
在htdocs目录里建一内容为 PHP文件, 输入URL地址查看PHP配置是否正确

ok,web环境apache2+mysql5+php5就介绍到这里。
更详细的apache2的配置和mysql配置和php.ini的配置参考相应文档。
--------------------------------------------------------
安装时候遇到的问题:

由于本人的系统是redhat9,自定义安装了php,mysql,apache。
所以在安装最新的php,mysql,apache版本时候,本人对相关的rpm进行了
卸载,忽略依赖关系强制卸载apache;由于php,mysql与perl的bt依赖关系,
一气之下删除了所有的相关文件。

问题

1.当你看到mysql有很多版本,如:
mysql-max-5.0.21-linux-i686-glibc23.tar.gz和
mysql-max-5.0.21-linux-i686.tar.gz
这俩个到底选哪个呢,请你使用如下命令来决定
# rpm -qa | grep glibc
glibc-kernheaders-2.4-8.10
glibc-common-2.3.2-11.9
glibc-2.3.2-11.9
glibc-devel-2.3.2-11.9
如果出现以上信息,请选择mysql-max-5.0.21-linux-i686-glibc23.tar.gz版本

2:编译php时出现

./configure: /usr/local/apache2/bin/apxs: /replace/with/path/to/perl/interpreter:
bad interpreter: No such file or directory
这是找不到perl解释器的缘故。
修改/usr/local/apache2/bin/apxs文件中:
/replace/with/path/to/perl/interpreter
把他替换成perl所在的路径如/opt/ActivePerl-5.8/bin/perl,
(如果你下载的是active perl5.8的rpm,他默认安装路径是/opt/ActivePerl-5.8/bin/perl)

3.安装了perl后,发现所有的文本编辑器都不能用了。
运行vi或者gedit时候,提示找不到libperl.so
到perl的安装目录下找一个libperl.so放到/usr/lib目录下就解决问题了
我的libperl.so在/opt/ActivePerl-5.8/lib/5.8.8/i686-linux-thread-multi-CORE/目录下。
如果不知道libperl.so在什么地方,可以用
# locate libperl.so
查找,或者用find命令

4.当我使用mysql-standard-5.0.20,编译php时出现mysql错误:

checking for mSQL support... no
checking for MSSQL support via FreeTDS... no
checking for MySQL support... yes
checking for specified location of the MySQL UNIX socket... no
checking for MySQL UNIX socket location... /tmp/mysql.sock
checking for mysql_close in -lmysqlclient... no
checking for mysql_error in -lmysqlclient... no
configure: error: mysql configure failed. Please check config.log for more information.

网查找说:安装PHP的时候没有指定一下mysql的安装目录。但是我已经指定了,所以这个说法是错误的,其实主要原因是 mysql-level没有装,也就是mysql的版本不对,应该换
mysql-max-5.0.21版本(包含所有mysql相关内容的软件包)

5.编译php时出现
configure: error: freetype2 not found!
没有安装freetype-level

configure: error: libpng.(a|so) not found.
没有安装libpng-devel

6忘了mysql的root口令怎么办
# /usr/local/mysql/support-files/mysql.server stop
# cd /usr/local/mysql/bin/
# mysqld_safe --skip-grant-tables &
# mysqladmin -u user password 'newpassword'
# mysqladmin flush-privileges

-----------------------------------------------------------------

#!/bin/sh

# http://lfs.linuxsir.org/htdocs/blfscvs/general/libxslt.html

# http://curl.haxx.se/

 

#- a.安装 jpeg6
#- 建立目录:
mkdir -p /usr/local/jpeg6
mkdir -p /usr/local/jpeg6/bin
mkdir -p /usr/local/jpeg6/lib
mkdir -p /usr/local/jpeg6/include
mkdir -p /usr/local/jpeg6/man
mkdir -p /usr/local/jpeg6/man1
mkdir -p /usr/local/jpeg6/man/man1

cd jpeg-6b
./configure --prefix=/usr/local/jpeg6/ --enable-shared --enable-static
make; make install

#-----------------------------------------------------
#- b.install libpng
cd ../libpng
cp scripts/makefile.std makefile
make; make install

#-----------------------------------------------------
#- c.install freetype
cd ../freetype
mkdir -p /usr/local/freetype
./configure --prefix=/usr/local/freetype
make;make install

#-----------------------------------------------------
#- d.:install zlib
cd ../zlib
./configure
make;make install

#-----------------------------------------------------
#- e.install gd lib
mkdir -p /usr/local/gd2
cd ../gd2
./configure --prefix=/usr/local/gd2 --with-jpeg=/usr/local/jpeg6/ --with-png=/usr/local/lib/ --with-zlib=/usr/local/lib/ --with-freetype=/usr/local/freetype/
make; make install

#- install cUrl lib
mkdir -p /usr/local/curl
cd ../curl
./configure --prefix=/usr/local/curl
make; make install

#- a.install libxml2
cd ../libxml2
mkdir -p /usr/local/libxml2
./configure --prefix=/usr/local/libxml2
make; make install

#- b.install libxslt
mkdir -p /usr/local/libxslt
cd ../libxslt
./configure --prefix=/usr/local/libxslt --with-libxml-prefix=/usr/local/libxml2
make; make install

#- install php5
mkdir -p /usr/local/php
cd ../php
./configure --prefix=/usr/local/php --with-apxs2=/usr/sbin/apxs --with-mysql-dir=/usr/local/mysql/ --with-libxml-dir=/usr/local/libxml2/ --with-gd=/usr/local/gd2/ --with-jpeg-dir=/usr/local/jpeg6/ --with-png=/usr/local/lib --with-zlib-dir=/usr/lib/ --with-freetype-dir=/usr/local/freetype --with-curl=/usr/local/curl/ --enable-ftp --enable-soap --with-xsl=/usr/local/libxslt --enable-xslt --enable-sockets --enable-mbstring
make
make install
#- cp php.ini-dist /usr/local/php/lib/php.ini (别忘记了呵呵)

发表在 article | 标签为 | LAMP安装已关闭评论

rpm命令参数详解

1. rpm 常用命令

(01)安装一个包:# rpm -ivh

(02) 升级一个包:# rpm -Uvh

(03) 移走一个包:# rpm -e

(04) 安装参数:
        --force 即使覆盖属于其它包的文件也强迫安装
      
--nodeps 如果该RPM包的安装依赖其它包,即使其它包没装,也强迫安装。
(05) 查询一个包是否被安装:# rpm -q < rpm package name>

(06) 得到被安装的包的信息:# rpm -qi < rpm package name>

(07) 列出该包中有哪些文件:# rpm -ql < rpm package name>

(08) 列出服务器上的一个文件属于哪一个RPM包:#rpm -qf

(09) 可综合好几个参数一起用:

# rpm -qil < rpm package name>

(10) 列出所有被安装的rpm package:# rpm -qa

(11) 列出一个未被安装进系统的RPM包文件中包含有哪些文件:# rpm -qilp < rpm package name>
 
 
2. rpm参数详解
(1) 安装命令


命令格式:# rpm -i(or --install) [options] file1.rpm ... fileN.rpm

参数列表:file1.rpm ... fileN.rpm(将要安装的RPM包的文件名)
详细选项:
-h (或 --hash) 安装时输出hash记号 (``#'')
--test 只对安装进行测试,并不实际安装。
--percent 以百分比的形式输出安装的进度。
--excludedocs 不安装软件包中的文档文件
--includedocs 安装文档
--replacepkgs 强制重新安装已经安装的软件包
--replacefiles 替换属于其它软件包的文件
--force 忽略软件包及文件的冲突
--noscripts 不运行预安装和后安装脚本
--prefix 将软件包安装到由 指定的路径下
--ignorearch 不校验软件包的结构
--ignoreos 不检查软件包运行的操作系统
--nodeps 不检查依赖性关系
--ftpproxy 用 作为 FTP代理
--ftpport 指定FTP的端口号为
通用选项:
-v 显示附加信息
-vv 显示调试信息
--root 让RPM将指定的路径做为“根目录”,这样预安装程序和后安装程序都会安装到这个目录下
--rcfile 设置rpmrc文件为
--dbpath 设置RPM 资料库存所在的路径为
 
(2)

删除命令


命令格式:# rpm -e(or --erase) [options] pkg1 ... pkgN

参数列表:pkg1 ... pkgN (要删除的软件包)
详细选项:
--test 只执行删除的测试
--noscripts 不运行预安装和后安装脚本程序
--nodeps 不检查依赖性
通用选项:
-vv 显示调试信息
--root 让RPM将指定的路径做为"根目录",这样预安装程序和后安装程序都会安装到这个目录下
--rcfile 设置rpmrc文件为
--dbpath 设置RPM 资料库存所在的路径为
 
(3) 升级命令


命令格式:# rpm -U(or --upgrade) [options] file1.rpm ... fileN.rpm

参数列表:file1.rpm ... fileN.rpm (软件包的名字)
详细选项:
-h (or --hash) 安装时输出hash记号 (``#'')
--oldpackage 允许"升级"到一个老版本
--test 只进行升级测试
--excludedocs 不安装软件包中的文档文件
--includedocs 安装文档
--replacepkgs 强制重新安装已经安装的软件包
--replacefiles 替换属于其它软件包的文件
--force 忽略软件包及文件的冲突
--percent 以百分比的形式输出安装的进度
--noscripts 不运行预安装和后安装脚本
--prefix 将软件包安装到由 指定的路径下
--ignorearch 不校验软件包的结构
--ignoreos 不检查软件包运行的操作系统
--nodeps 不检查依赖性关系
--ftpproxy 用 作为 FTP代理
--ftpport 指定FTP的端口号为
通用选项:
-v 显示附加信息
-vv 显示调试信息
--root 让RPM将指定的路径做为"根目录",这样预安装程序和后安装程序都会安装到这个目录下
--rcfile 设置rpmrc文件为
--dbpath 设置RPM 资料库存所在的路径为
 
(4) 查询命令


命令格式:# rpm -q(or --query) [options]

参数列表:pkg1 ... pkgN (查询已安装的软件包)
详细选项:
-p (or ``-'') 查询软件包的文件
-f 查询属于哪个软件包
-a 查询所有安装的软件包
-g 查询属于组的软件包
--whatprovides 查询提供了 功能的软件包
--whatrequires 查询所有需要 功能的软件包
信息选项:
显示软件包的全部标识
-i 显示软件包的概要信息
-l 显示软件包中的文件列表
-c 显示配置文件列表
-d 显示文档文件列表
-s 显示软件包中文件列表并显示每个文件的状态
--scripts 显示安装、卸载、校验脚本
--queryformat (or --qf) 以用户指定的方式显示查询信息
--dump 显示每个文件的所有已校验信息
--provides 显示软件包提供的功能
--requires (or -R) 显示软件包所需的功能
通用选项:
-v 显示附加信息
-vv 显示调试信息
--root 让RPM将指定的路径做为"根目录",这样预安装程序和后安装程序都会安装到这个目录下
--rcfile 设置rpmrc文件为
--dbpath 设置RPM 资料库存所在的路径为
 
(5) 校验已安装的软件包


命令格式: # rpm -V(or --verify, or -y) [options]

参数列表:pkg1 ... pkgN (将要校验的软件包名)
软件包选项:
-p 校验包文件
-f 校验所属的软件包
-a 校验所有的软件包
-g 校验所有属于组 的软件包
详细选项:
--noscripts 不运行校验脚本
--nodeps 不校验依赖性
--nofiles 不校验文件属性
通用选项:
-v 显示附加信息
-vv 显示调试信息
--root 让RPM将指定的路径做为"根目录",这样预安装程序和后安装程序都会安装到这个目录下
--rcfile 设置rpmrc文件为
--dbpath 设置RPM 资料库存所在的路径为
 
(6) 校验软件包中的文件


语法:# rpm -K(or --checksig) [options] file1.rpm ... fileN.rpm

参数:file1.rpm ... fileN.rpm (软件包的文件名)
详细选项:
--nopgp 不校验PGP签名
通用选项:
-v 显示附加信息
-vv 显示调试信息
--rcfile 设置rpmrc文件为
 

(7) 其它参数选项


--rebuilddb 重建RPM资料库
--initdb 创建一个新的RPM资料库
--quiet 尽可能的减少输出
--help 显示帮助文件
--version 显示RPM的当前版本

发表在 article | 标签为 | rpm命令参数详解已关闭评论

新型的大型bbs架构(squid+nginx)

这个架构基于squid、nginx和lvs等技术,从架构上对bbs进行全面优化和保护,有如下特点:

1、高性能:所有的点击基本上全部由前端缓存负责,提供最快速的处理。

2、高保障度:不需考虑应用程序稳定与否、程序语言是何种、数据库是何种,都能从架构上保证稳定。

3、高可用性:对应用程序的修改达到最简化:在程序的某些地方加入清缓存的语句即可,当然还需要做页面静态化的工作和统计工作。

首先看图,这个图比较大:

点击查看原图

这个架构的特点和一些流程的说明:

1、主域名和图片域名分离

域名分离可以使流量分离,缓存策略分离等等,好处诸多。bbs初期一定要做好规划,将图片用另外的域名独立服务,即使没有足够机器,域名也要先分开。另外,图片服务器可以使用有别于主域名的另一个域名,一个好处是可以减少读取cookie对图片服务器的压力,另一个是提高安全性,避免cookie泄露。

2、使用LVS作为前端、二级代理和数据库的访问入口

使用LVS作为入口,比其他任何一种方式都来得更优质。首先LVS的负载能力很强,因为它工作在网络协议的第4层,使用虚拟ip技术,所以它本身并不担负任何流量的处理,仅仅是一个封包转发的功能;第二,LVS的配置相对简单而且稳定,一般去调整的几率比较低,也减少了因人为等因素而出现故障;第三,LVS可以处理任何端口的负载均衡,所以它基本可以做所有服务的负载均衡和容错。在这个架构中,除了处理http的80端口之外,LVS也处理了数据库mysql的3306端口,在数据库这个应用中是采用的双机热备策略。

3、使用nginx+squid作为最前端的缓存组合

在这个架构中,是最能体现app_nginx_squid_nginx架构的优势的。在这个架构中的bbs运行在缓存上,用户每发布一张帖子,都需要使用purge指令清除该帖子的缓存,如果是squid在最前端,那么每次发布一张帖子,都需要在所有的squid中调用purge指令,这样在机器比较多的时候,purge将成为一个巨大的压力。

所以在这里将nginx放在最前端并使用手工url_hash的方式分流,将经常需要purge的帖子页面和列表页面按一个url对应一台squid的策略,分布到各台squid上,并提供了一台或一组backup的squid,个别squid出现异常时将自动使用backup的机器继续提供一段时间的服务直到其正常。在这样的架构下,purge就不再是关键问题,因为一个url只会对应到一台机器上,所以purge的时候,后端app_server找到对应的机器就可以了。

可以看到在前端中还有一台nginx(purge)的机器,这台机器是专用于purge的,只要发送purge指令和需要清除的url到这台机器,就可以找到相应的服务器并清除缓存了。另外,purge时还需要清理backup机器上的缓存,所以无论前端机器增加到多少,purge指令只会在2台机器上执行,如果backup机器使用到2-3台,purge指令就会在3-4台机器上执行,仍然在可接受范围之内。

nginx作为前端,另有的好处:

1/使用nginx的日志统计点击量非常方便
2/nginx也可作为缓存,一般可以直接负责favicon.ico和logo等固定的小图片

4、基于nginx的中层代理

nginx中层代理的优势,在:

nginx和squid配合搭建的web服务器前端系统

这篇文章中有解释。

在这个架构中,假如后端的app_server上把帖子页和列表页直接生成了静态页面,那么使用中层代理再做一次url_hash,将可以解决后端app_server的硬盘容量的压力,但是如果使用到url_hash的话,那做容错就相对麻烦了。所以建议不要采用生成静态页的方式,后端的压力一般不会非常的大,所以没有必要生成静态页。假如前端squid的命中率实在太低下,造成大量穿透,可以考虑使用二级代理暂顶。

5、基于LVS的数据库双机热备

在这个架构中,因为大量的并发和访问量都由前端的缓存处理掉了,所以后端的mysql主要压力来自于数据的写入,所以压力并不是非常大,并且负载比较稳定,一般不会随着访问量上升而提高过快,估计目前一台64位的机器,加满内存并使用高速的硬盘,前端负载数亿访问量时数据库都不会出现性能问题。在数据库这方面应主要考虑故障恢复,因为数据库崩溃的话,按照一般使用备份恢复的做法,耗时很长而且难免丢失数据,是很棘手的问题。使用双机热备的方案,出现故障时首先可由一台时刻同步着的备用数据库即刻充当主数据库,然后卸下的数据库可以有充分的时间对其进行维修,所以是个很安全有效的办法。

当然,数据库的优化还是要细心做的,参考:

mysql性能的检查和调优方法

细心地调一遍,性能会好很多。

6、图片服务器

图片服务器我在这个架构中没有特别详细的介绍,在大型的bbs系统下,图片常常会出现容灾现象——图片数量严重超过了单台前端服务器容纳能力,导致前端服务器命中率低下。处理容灾问题也是非常棘手的,往后会有更详细的介绍。

7、简单的点击量统计办法

1/使用js的script标签访问另一(台)组服务器的空文件,然后定期向数据库更新
2/在前端的nginx上直接开启日志功能,按需要统计点击量的链接规则进行记录,然后定期更新数据库

发表在 web server | 标签为 , | 新型的大型bbs架构(squid+nginx)已关闭评论

eaccelerator 应用之“使用共享内存存储Session”

eaccelerator的功能除了对php预编译代码进行优化、缓存之外,还提供了php开发下的共享内存操作、session内存存储、内容缓存等功能。
php默认的session存储方式是在磁盘,虽然可以配置php生成的文件目录到内存盘中,但最终还是需要依赖于文件系统,势必产生文件操纵的开销。当 网站并发请求很高的时候,还会产生另为一个性能问题:session目录下的文件数目过多,达到操纵系统瓶颈,虽然这时也可以通过配置为多级目录,但依旧 无法摆脱文件系统的魔爪。
“session.save_path = “N;/path””
eaccelerator专门针对PHP的这个Session存储效率问题,通过使用共享内存技术为我们提供了高效的解决方案。注意,要启用对 session支持,再编译安装eaccelerator时需要启用-with-eaccelerator-sessions选项,例如:
./configure –with-php-config=/usr/local/bin/php-config –enable-eaccelerator=shared –with-eaccelerator-shared-memory –with-eaccelerator-sessions
–with-eaccelerator-content-caching –with-eaccelerator-disassembler –with-eaccelerator-debug
然后我们便可以在php.ini中修改配置来启用它:
session.save_handler = eaccelerator
最后重启apache,并执行如下测试:session.php
<?php


/**
* new session hander test.
* by lowell from www.zhongguowen.com

*/


if
(

!function_exists

(

“eaccelerator_set_session_handlers”
)

)


{


die

(

“eaccelerator is in trouble!”
)

;
}

switch
(

$_GET
[

"act"
]

)


{


case
“logout”
:
session_unset

(

)

;
session_destroy

(

)

;
header

(

“Location: “
. $_SERVER
[

"PHP_SELF"
]

)

;
break
; case
“login”
:
$_SESSION
[

"user"
]

= “Lowell Zhong”
;
header

(

“Location: “
. $_SERVER
[

"PHP_SELF"
]

)

;
break
;
}


if
(

isset

(

$_SESSION
[

"user"
]

)

&& $_SESSION
[

"user"
]

!= “”
)


{


echo

“Welcome “
. $_SESSION
[

"user"
]

.
[logout
]\n

“;
}

else
{


echo

Click me
for logining”

;
}


?>

这里再推荐另外还一个php session的共享内存存储模块:http://www.ossp.org/pkg/lib/mm/

 

-------------------------------------------------------------------------

eAccelerator是一个自由开放源码php加速器,优化
和动态内容缓存,提高了性能php脚本的缓存性能,使得PHP脚本在编译的状态下,对服务器的开销几乎完全消除。 它还有对脚本起优化
作用,以加快其执行效率。使您的PHP程序代码执效率能提高1-10倍;

 

【开始加载 eAccelerator 操作前提 - 必须且重要】

1. 安装好PHP
2. 安装好Zend
3. 选择下载对应您的系统和PHP版本的eAccelerator(这里只提供 php5.2.2 — php5.2.6的eAccelerator版本,过早的PHP版本也比较少人用了,个人觉得)
下载地址:(压缩包内有包含 php5.2.2-6 的eAccelerator版本,如PHP为5.2.5,则要选择压缩包内标识的5.2.5即可)
    http://www.zzchn.com/08/eAccelerator_for_win_php5.x.rar

4. 检验是否成功,可以建立一个文本,输入内容:

<?php
phpinfo();
?>

然后保存为 test.php ,并放入任意可访问的网站下,输入网址或IP访问。
配置成功的话,会看到如下提示:

 

5. 如果你要配置或研究,请务必仔细阅读每一个字进行安装!

 

【开始配置】

进入PHP所在 目录,打开 php.ini 输入 [zend] 搜索(一般就是在尾端)
然后就会看到
[Zend]
zend_extension_ts = "你自己的路径"
zend_extension_manager.optimizer_ts = "你自己的路径"

然后在下方增加:(重要说明:第一个值 zend_extension_ts 则是上面提到的加速器,把它放入你自己建立的目录中,在下列填入路径即可。)

zend_extension_ts="输入你自己的路径"
;eAccelerator加速器路径部分,请修改为自己的正确路径,加载方式为 zend 扩展

eaccelerator.cache_dir="输入你自己的路径"
;eAccelerator缓冲目录,记得给目录可读写权限(User权限)。

zend_optimizer.optimization_level="512"
;优化
过程,建议最高不超过1024

eaccelerator.shm_size="64"
;eAccelerator 可以使用的共享内存的数量 (以兆为单位) . “0″ 是指操作系统的默认值. 默认值是 “0″.可根据服务器的实际情况来调整,16,32,64,128都是可以的。

eaccelerator.enable="1"
;开启或关闭 eAccelerator。”1″ 为开启,”0″ 为关闭。默认值为 “1″

eaccelerator.optimizer="1"
;启或关闭内部优化
器,可以提升代码执行速度。”1″ 为开启,”0″ 为关闭。默认值为 “1″

eaccelerator.check_mtime="1"
;打开或者关闭 PHP 的文件修改检查. “1″ 是指打开, “0″ 是指关闭. 如果您在修改以后重新编译 PHP 的文件,那么您应当设置为 “1″. 默认值是 “1″.

eaccelerator.debug="0"
;开启或关闭调试日志记录。”1″ 为开启,”0″ 为关闭。默认值为 “0″。

eaccelerator.filter=""
;判断哪些 PHP 文件必须缓存。您可以指定缓存和不缓存的文件类型(如 “*.php *.phtml”等)
如果参数以 “!” 开头,则匹配这些参数的文件被忽略缓存。默认值为 “”,即,所有 PHP 文件
都将被缓存。

eaccelerator.shm_max="0"
;当使用 ” eaccelerator_put() ” 函数时禁止其向共享内存中存储过大的文件。该参数指定允许
存储的最大值,单位:字节 (10240, 10K, 1M)。”0″ 为不限制。默认值为 “0″。

eaccelerator.shm_ttl="0"
;当 eAccelerator 获取新脚本的共享内存大小失败时,它将从共享内存中删除所有在
最后 “shm_ttl” 秒内无法存取的脚本缓存。默认值为 “0″,即:不从共享内春中删除
任何缓存文件。

eaccelerator.shm_prune_period="0"
;当 eAccelerator 获取新脚本的共享内存大小失败时,他将试图从共享内存中删除早于
“shm_prune_period” 秒的缓存脚本。默认值为 “0″,即:不从共享内春中删除
任何缓存文件。

eaccelerator.shm_only="0"
;允许或禁止将已编译脚本缓存在磁盘上。该选项对 session 数据和内容缓存无效。默认
值为 “0″,即:使用磁盘和共享内存进行缓存。

eaccelerator.compress="1"
;允许或禁止压缩内容缓存。默认值为 “1″,即:允许压缩。

eaccelerator.compress_level="9"
;指定内容缓存的压缩等级。默认值为 “9″,为最高等级。

;以下禁止的功能,避免冲突。
;zend_optimizer.enable_loader = 1
;开启Zend Loader以解析Zend混淆器加密过的PHP代码。默认开启,此行配置只是起到说明作用。
;zend_optimizer.optimization_level=15
;zend_optimizer.license_path =

最后,一定要重启IIS,即可通过文章开头检查了是否加载了。
网上翻阅了许多资料,许多都不详细,特此整理了一下。

有问题可回复:)

发表在 article | 标签为 | eaccelerator 应用之“使用共享内存存储Session”已关闭评论

nginx负载均衡

Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,它已经在该站点运行超过两年半了。Igor 将源代码以类BSD许可证的形式发布。尽管还是测试版,但是,Nginx 已经因为它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名了。

首先是配置十分的简单,而且功能非常强大。

worker_processes 1;
events {
worker_connections 1024;
}
http{
upstream myproject {
#这里指定多个源服务器,ip:端口,80端口的话可写可不写
server 192.168.43.158:80;
server 192.168.41.167;
}

server {
listen 8080;
location / {
proxy_pass http://myproject;
}
}
}

nginx的负载均衡有哪些功能呢?
 

  • 如果后面的服务器其中一台坏了,它能自动识别,更牛的是它好了之后nginx可以马上识别
  • 服务器A和B,如果A的响应时间为3,B的响应时间为1,那么nginx会自动调整访问B的概率是A的3倍,真正做到负载均衡

在这里还是想说说nginx的安装及运行
先到http://www.nginx.net/下载最新的源码包。
我下载到的是nginx-0.5.33.tar.gz
解压:tar zxvf nginx-0.5.33.tar.gz
接着:./configure
再接着:make
最后:make install
好的,安装完成了。我在make的时候报了个错,说HTTP Rewrite 模块 有问题,我就./configure --without-http_rewrite_module
然后再make,make install就可以了。
安装好了之后新建一个配置文件,把上面的配置文件内容拷进去,当然要修改你的IP,保存为比如 load_balance.conf

然后启动:
/usr/local/nginx/sbin/nginx -c load_balence.conf

如果上面的步骤走下来有问题的话,可以参考:
nginx的中文维基
http://wiki.codemongers.com/NginxChs
当然也可以到官方网站
www.nginx.net
www.nginx.com
-------------------------------------------------------------------------------------------------------
 

一、) 安装Nginx
1.) 安装
Nginx发音为[engine x],是由俄罗斯人Igor Sysoev建立的项目,基于BSD许可。据说他当初是F5的成员之一,英文主页:http://nginx.net 。俄罗斯的一些大网站已经使用它超过两年多了,一直表现不凡。
Nginx的编译参数如下:

./configure --prefix=/usr/local/nginx \

--user=apache \

--group=apache \

--with-http_ssl_module \

--with-http_gzip_static_module;

[root@localhost]#./configure --prefix=/usr/local/server/nginx --with-openssl=/usr/include \
--with-pcre=/usr/include/pcre/ --with-http_stub_status_module --without-http_memcached_module \
--without-http_fastcgi_module --without-http_rewrite_module --without-http_map_module \
--without-http_geo_module --without-http_autoindex_module

在这里,需要说明一下,由于Nginx的配置文件中我想用到正则,所以需要pcre模块的支持。我已经安装了pcre及pcre-devel的rpm包,但是 Ngxin 并不能正确找到 .h/.so/.a/.la 文件,因此我稍微变通了一下:

[root@localhost]#mkdir /usr/include/pcre/.libs/
[root@localhost]#cp /usr/lib/libpcre.a /usr/include/pcre/.libs/libpcre.a
[root@localhost]#cp /usr/lib/libpcre.a /usr/include/pcre/.libs/libpcre.la

然后,修改objs/Makefile大概在908行的位置上,注释掉以下内容:

./configure --disable-shared

接下来,就可以正常执行make及make install了。

2.) 修改配置文件/usr/local/server/nginx/conf/nginx.conf
以下是我的nginx.conf内容,仅供参考:

#运行用户
user  nobody nobody;

#启动进程
worker_processes  2;

#全局错误日志及PID文件
error_log  logs/error.log notice;
pid        logs/nginx.pid;

#工作模式及连接数上限
events {
        use epoll;
        worker_connections      1024;
}

#设定http服务器,利用它的反向代理功能提供负载 均衡支持
http {
        #设定mime类型
        include       conf/mime.types;
        default_type  application/octet-stream;

        #设定日志格式
        log_format main         '$remote_addr - $remote_user [$time_local] '
                                                '"$request" $status $bytes_sent '
                                                '"$http_referer" "$http_user_agent" '
                                                '"$gzip_ratio"';

        log_format download '$remote_addr - $remote_user [$time_local] '
                                                '"$request" $status $bytes_sent '
                                                '"$http_referer" "$http_user_agent" '
                                                '"$http_range" "$sent_http_content_range"';

        #设定请求缓冲
        client_header_buffer_size    1k;
        large_client_header_buffers  4 4k;

        #开启gzip模块
        gzip on;
        gzip_min_length  1100;
        gzip_buffers     4 8k;
        gzip_types       text/plain;

        output_buffers   1 32k;
        postpone_output  1460;

        #设定access log
        access_log  logs/access.log  main;

        client_header_timeout  3m;
        client_body_timeout    3m;
        send_timeout           3m;

        sendfile                on;
        tcp_nopush              on;
        tcp_nodelay             on;

        keepalive_timeout  65;

        #设定负载均衡的服务器列表
        upstream mysvr {
                #weigth参数表示权值,权值越高被分配到的几率越大
                #本机上的Squid开启3128端口
                server 192.168.8.1:3128 weight=5;
                server 192.168.8.2:80   weight=1;
                server 192.168.8.3:80   weight=6;
        }

        #设定虚拟主机
        server {
                listen          80;
                server_name     192.168.8.1 www.yejr.com;

                charset gb2312;

                #设定本虚拟主机的访问日志
                access_log  logs/www.yejr.com.access.log  main;

                #如果访问 /img/*, /js/*, /css/* 资源,则直接取本地文件,不通过squid
                #如果这些文件较多,不推荐这种方式,因为通过squid的缓存效果更好
                location ~ ^/(img|js|css)/  {
                        root    /data3/Html;
                        expires 24h;
                }

                #对 "/" 启用负载均衡
                location / {
                        proxy_pass      http://mysvr;

                        proxy_redirect          off;
                        proxy_set_header        Host $host;
                        proxy_set_header        X-Real-IP $remote_addr;
                        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                        client_max_body_size    10m;
                        client_body_buffer_size 128k;
                        proxy_connect_timeout   90;
                        proxy_send_timeout      90;
                        proxy_read_timeout      90;
                        proxy_buffer_size       4k;
                        proxy_buffers           4 32k;
                        proxy_busy_buffers_size 64k;
                        proxy_temp_file_write_size 64k;
                }

                #设定查看Nginx状态的地址
                location /NginxStatus {
                        stub_status             on;
                        access_log              on;
                        auth_basic              "NginxStatus";
                        auth_basic_user_file  conf/htpasswd;
                }
        }
}

运行以下命令检测配置文件是否无误:

如果没有报错,那么就可以开始运行Nginx了,执行以下命令即可:
备注:conf/htpasswd 文件的内容用 apache 提供的 htpasswd 工具来产生即可,内容大致如下:
3.) 查看 Nginx 运行状态
  输入地址 http://192.168.8.1/NginxStatus/,输入验证帐号密码,即可看到类似如下内容:
Active connections: 328
server accepts handled requests
9309 8982 28890
Reading: 1 Writing: 3 Waiting: 324

第一行表示目前活跃的连接数 第三行的第三个数字表示Nginx运行到当前时间接受到的总请求数,如果快达到了上限,就需要加大上限值了。

 
 
 
其它:

Nginx负载均衡一些基础知识:

nginx 的 upstream目前支持 4 种方式的分配 
1)、轮询(默认) 
      每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 
2)、weight 
      指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 
2)、ip_hash 
      每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。  
3)、fair(第三方) 
      按后端服务器的响应时间来分配请求,响应时间短的优先分配。  
4)、url_hash(第三方)

配置:

在http节点里添加:

#定义负载均衡设备的 Ip及设备状态 

upstream myServer {   

    server 127.0.0.1:9090 down; 
    server 127.0.0.1:8080 weight=2; 
    server 127.0.0.1:6060; 
    server 127.0.0.1:7070 backup; 
}

在需要使用负载的Server节点下添加

proxy_pass http://myServer;

upstream 每个设备的状态:

down 表示单前的server暂时不参与负载 
weight  默认为1.weight越大,负载的权重就越大。 
max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误 
fail_timeout:max_fails 次失败后,暂停的时间。 
backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

Nginx还支持多组的负载均衡,可以配置多个upstream  来服务于不同的Server.

配置负载均衡比较简单,但是最关键的一个问题是怎么实现多台服务器之间session的共享

下面有几种方法(以下内容来源于网络,第四种方法没有实践.)

1) 不使用session,换作cookie

能把session改成cookie,就能避开session的一些弊端,在从前看的一本J2EE的书上,也指明在集群系统中不能用session,否则惹出祸端来就不好办。如果系统不复杂,就优先考虑能否将session去掉,改动起来非常麻烦的话,再用下面的办法。

2) 应用服务器自行实现共享

asp.net可以用数据库或memcached来保存session,从而在asp.net本身建立了一个session集群,用这样的方式可以令 session保证稳定,即使某个节点有故障,session也不会丢失,适用于较为严格但请求量不高的场合。但是它的效率是不会很高的,不适用于对效率 要求高的场合。

以上两个办法都跟nginx没什么关系,下面来说说用nginx该如何处理:

3) ip_hash

nginx中的ip_hash技术能够将某个ip的请求定向到同一台后端,这样一来这个ip下的某个客户端和某个后端就能建立起稳固的session,ip_hash是在upstream配置中定义的:

upstream backend {
  server 127.0.0.1:8080 ;
  server 127.0.0.1:9090 ;
   ip_hash;
}

ip_hash是容易理解的,但是因为仅仅能用ip这个因子来分配后端,因此ip_hash是有缺陷的,不能在一些情况下使用:

1/ nginx不是最前端的服务器。ip_hash要求nginx一定是最前端的服务器,否则nginx得不到正确ip,就不能根据ip作hash。譬如使用的是squid为最前端,那么nginx取ip时只能得到squid的服务器ip地址,用这个地址来作分流是肯定错乱的。

2/ nginx的后端还有其它方式的负载均衡。假如nginx后端又有其它负载均衡,将请求又通过另外的方式分流了,那么某个客户端的请求肯定不能定位到同一台session应用服务器上。这么算起来,nginx后端只能直接指向应用服务器,或者再搭一个squid,然后指向应用服务器。最好的办法是用location作一次分流,将需要session的部分请求通过ip_hash分流,剩下的走其它后端去。

4) upstream_hash

为了解决ip_hash的一些问题,可以使用upstream_hash这个第三方模块,这个模块多数情况下是用作url_hash的,但是并不妨碍将它用来做session共享:

假如前端是squid,他会将ip加入x_forwarded_for这个http_header里,用upstream_hash可以用这个头做因子,将请求定向到指定的后端:

可见这篇文档:http://www.sudone.com/nginx/nginx_url_hash.html

在文档中是使用$request_uri做因子,稍微改一下:

hash   $http_x_forwarded_for;

这样就改成了利用x_forwarded_for这个头作因子,在nginx新版本中可支持读取cookie值,所以也可以改成:

hash   $cookie_jsessionid;

假如在php中配置的session为无cookie方式,配合nginx自己的一个userid_module模块就可以用nginx自发一个cookie,可参见userid模块的英文文档:
http://wiki.nginx.org/NginxHttpUserIdModule
另可用姚伟斌编写的模块upstream_jvm_route:http://code.google.com/p/nginx-upstream-jvm-route/

发表在 web server | 标签为 | nginx负载均衡已关闭评论

Squid配置详解

安装

从源中安装

源中自带稳定版本,执行下面的命令进行安装

是大家也许不知道,Squid有一个for Windows的版本,下载地址为: http://www.acmeconsulting.it/pagine/opensource/squid/SquidNT.htm

sudo apt-get install squid squid-common

源码编译安装

当然你也可以到下面的官方网站下载最新的版本进行编译安装:

http://www.squid-cache.org/

其中STABLE稳定版、DEVEL版通常是提供给开发人员测试程序的,假定下载了最新 的稳定版squid-2.5.STABLE2.tar.gz,用以下命令解开压缩包:

tar xvfz squid-2.5.STABLE.tar.gz

用bz2方式压缩的包可能体积更小,相应的命令是:

tar xvfj squid-2.5.STABLE.tar.bz2 

然后,进入相应目录对源代码进行配置和编译,命令如下:

cd squid-2.5.STABLE2

配置命令configure有很多选项,如果不清楚可先用“-help”查看。通常情况下,用到的选项有以下几个:

--prefix=/web/squid

指定Squid的安装位置,如果只指定这一选项,那么该目录下会有bin、sbin、man、conf等目录,而主要的配置文件此时在conf子目录中。为便于管理,最好用参数--sysconfdir=/etc把这个文件位置配置为/etc。

--enable-storeio=ufs,null

使用的文件系统通常是默认的ufs,不过如果想要做一个不缓存任何文件的代理服 务器,就需要加上null文件系统。

--enable-arp-acl

这样可以在规则设置中直接通过客户端的MAC地址进行管理,防止客户使用IP欺骗。

--enable-err-languages="Simplify_Chinese"
--enable-default-err-languages="Simplify_Chinese"

上面两个选项告诉Squid编入并使用简体中文错误信息。

--enable-linux-netfilter

允许使用Linux的透明代理功能。

--enable-underscore

允许解析的URL中出现下划线,因为默认情况下Squid会认为带下划线的URL是 非法的,并拒绝访问该地址。 整个配置编译过程如下:

./configure --prefix=/var/squid 
--sysconfdir=/etc 
--enable-arp-acl 
--enable-linux-netfilter 
--enable-pthreads 
--enable-err-language="Simplify_Chinese" 
--enable-storeio=ufs,null 
--enable-default-err-language="Simplify_Chinese" 
--enable-auth="basic" 
--enable-baisc-auth-helpers="NCSA" 
--enable-underscore 

其中一些选项有特殊作用,将在下面介绍它们。 最后执行下面两条命令,将源代码编译为可执行文件,并拷贝到指定位置。

make
sudo make install

基本配置

安装完成后,接下来要对Squid的运行进行配置(不是前面安装时的配置)。所有项目都在squid.conf中完成。Squid自带的squid.conf包括非常详尽的说明,相当于一篇用户手册,对配置有任何疑问都可以参照解决。

在这个例子中,代理服务器同时也是网关,内部网络接口eth0的IP地址为192.168.0.1,外部网络接eth1的IP地址为202.103.x.x。下面是一个基本的代理所需要配置选项:

http_port 192.168.0.1:3128

默认端口是3128,当然也可以是任何其它端口,只要不与其它服务发生冲突即可。为了安全起见,在前面加上IP地址,Squid就不会监听外部的网络接口。 下面的配置选项是服务器管理者的电子邮件,当错误发生时,该地址会显示在错误页面上,便于用户联系:

cache_mgr start@soocol.com

以下这些参数告诉Squid缓存的文件系统、位置和缓存策略:

cache_dir ufs /var/squid 
cache_mem 32MB 
cache_swap_low 90 
cache_swap_high 95 

在这里,Squid会将/var/squid目录作为保存缓存数据的目录,每次处理的缓存大小是32兆字节,当缓存空间使用达到95%时,新的内容将 取代旧的而不直接添加到目录中,直到空间又下降到90%才停止这一活动。

如果不想Squid缓存任何文件,如某些存储空间有限的专有系统,可以使用 null文件系统(这样不需要那些缓存策略):

cache_dir null /tmp

下面的几个关于缓存的策略配置中,较主要的是第一行,即用户的访问记录,可以通过分析它来了解所有用户访问的详尽地址:

cache_access_log /var/squid/access.log 
cache_log /var/squid/cache.log 
cache_store_log /var/squid/store.log 

下面这行配置是在较新版本中出现的参数,告诉Squid在错误页面中显示的服务器名称:

visible_hostname No1.proxy

以下配置告诉Squid如何处理用户,对每个请求的IP地址作为单独地址处理:

client_netmask 255.255.255.255

如果是普通代理服务器,以上的配置已经足够。但是很多Squid都被用来做透明代理。

所谓透明代理,就是客户端不知道有代理服务器的存在,当然也不需要进行任何与代理有关的设置,从而大大方便了系统管理员。相关的选项有以下几个:

httpd_accel_host virtual 
httpd_accel_port 80 
httpd_accel_with_proxy on 
httpd_accel_user_host_header on 

在Linux上,可以用iptables/ipchains直接将对Web端口80的请求直接转发到Squid端口3128,由Squid接手,而用户浏览器仍然认为它访问的是对方的80端口。例如以下这条命令:

iptables -t nat -A PREROUTING -s 192.168.0.200/32 -p tcp --dport 80 -j REDIRECT 3128 

就是将192.168.0.200的所有针对80端口的访问重定向到3128端口。

所有设置完成后,关键且重要的任务是访问控制。Squid支持的管理方式很多,使用起来也非常简单(这也是有人宁愿使用不做任何缓存的Squid,也 不愿意单独使用iptables的原因)。

Squid可以通过IP地址、主机名、MAC地址、用户/密码认证等识别用户,也可以通过域名、域后缀、文件类 型、IP地址、端口、URL匹配等控制用户的访问,还可以使用时间区间对用户进行管理,所以访问控制是Squid配置中的重点。

Squid用ACL (Access Control List,访问控制列表)对访问类型进行划分,用http_access deny 或allow进行控制。根据需求首先定义两组用户advance和normal,还有代表所有未指明的用户组all及不允许上网的baduser,配置代 码如下:

acl advance 192.168.0.2-192.168.0.10/32 
acl normal src 192.168.0.11-192.168.0.200/32 
acl baduser src 192.168.0.100/32 
acl baddst dst www.soocol.com 
acl all src 0.0.0.0/0 

http_access deny baduser 
http_access allow advance 
http_access allow normal 

可以看出,ACL的基本格式如下: acl 列表名称 控制方式 控制目标 比如acl all src 0.0.0.0/0,其名称是all,控制方式是src源IP地址,控制目标是0.0.0.0/0的IP地址,即所有未定义的用户。出于安全考虑,总是在最后禁止这个列表。 下面这个列表代表高级用户,包括IP地址从192.168.0.2到192.168.0.10的所有计算机:

acl advance 192.168.0.2-192.168.0.20/32

下面这个baduser列表只包含一台计算机,其IP地址是192.168.0.100:

acl baduser 192.168.0.100/32 

ACL写完后,接下来要对它们分别进行管理,代码如下:

http_access deny baduser 
http_access allow advance 
http_access allow normal 

上面几行代码告诉Squid不允许baduser组访问Internet,但advance、normal组允许(此时还没有指定详细的权限)。由于 Squid是按照顺序读取规则,会首先禁止baduser,然后允许normal。如果将两条规则顺序颠倒,由于baduser在normal范围中, Squid先允许了所有的normal,那么再禁止baduser就不会起作用。

特别要注意的是,Squid将使用allow-deny-allow-deny……这样的顺序套用规则。例如,当一个用户访问代理服务器时, Squid会顺序测试Squid中定义的所有规则列表,当所有规则都不匹配时,Squid会使用与最后一条相反的规则。

就像上面这个例子,假设有一个用户 的IP地址是192.168.0.201,他试图通过这台代理服务器访问Internet,会发生什么情况呢?我们会发现,他能够正常访问,因为 Squid找遍所有访问列表也没有和192.168.0.201有关的定义,便开始应用规则,而最后一条是deny,那么Squid默认的下一条处理规则 是allow,所以192.168.0.201反而能够访问Internet了,这显然不是我们希望的。所以在所有squid.conf中,最后一条规则 永远是http_access deny all,而all就是前面定义的“src 0.0.0.0”。

高级控制

前面说过,Squid的控制功能非常强大,只要理解Squid的行为方式,基本上就能够满足所有的控制要求。下面就一步一步来了解Squid是如何进行控制管理的。

通过IP地址来识别用户很不可靠,比IP地址更好的是网卡的MAC物理地址。要在Squid中使用MAC地址识别,必须在编译时加上“--enable-arp-acl”选项,然后可以通过以下的语句来识别用户:

acl advance arp 00:01:02:1f:2c:3e 00:01:02:3c:1a:8b ...

它直接使用用户的MAC地址,而MAC地址一般是不易修改的,即使有普通用户将自己的IP地址改为高级用户也无法通过,所以这种方式比IP地址可靠得多。

假如不想让用户访问某个网站应该怎么做呢?可以分为两种情况:一种是不允许访问某个站点的某个主机,比如ok的主机是ok.sina.com.cn,而其它的新浪资源却是允许访问的,那么ACL可以这样写:

acl sinapage dstdomain ok.sina.com.cn 
... ... 
http_access deny ok 
... ...

由此可以看到,除了ok,其它如http://www.sina.com.cn、news.sina.c...��常访问。

另一种情况是整个网站都不许访问,那么只需要写出这个网站共有的域名即可,配置如下:

acl qq dstdomain .tcccent.com.cn

注意tcccent前面的“.”,正是它指出以此域名结尾的所有主机都不可访问,否则就只有tcccent.com.cn这一台主机不能访问。

如果想禁止对某个IP地址的访问,如202.118.2.182,可以用dst来控制,代码如下:

acl badaddr dst 202.118.2.182

当然,这个dst也可以是域名,由Squid查询DNS服务器将其转换为IP。

还有一种比较广泛的控制是文件类型。如果不希望普通用户通过代理服务器下载MP3、AVI等文件,完全可以对他们进行限制,代码如下:

acl mmxfile urlpath_regex \.mp3$ \.avi$ \.exe$ 
http_access deny mmxfile 

看到regex,很多读者应该心领神会,因为这条语句使用了标准的规则表达式(又叫正则表达式)。它将匹配所有以.mp3、.avi等结尾的URL请求,还可以用-i参数忽略大小写,例如以下代码:

acl mmxfile urlpath_regex -i \.mp3$

这样,无论是.mp3还是.MP3都会被拒绝。当然,-i参数适用于任何可能需要区分大小写的地方,如前面的域名控制。

如果想让普通用户只在上班时间可以上网,而且是每周的工作日,用Squid应当如何处理呢?看看下面的ACL定义:

acl worktime time MTWHF 8:30-12:00 14:00-18:00 
http_access deny !worktime 

首先定义允许上网的时间是每周工作日(星期一至星期五)的上午和下午的固定时段,然后用http_access 定义所有不在这个时间段内的请求都是不允许的。

或者为了保证高级用户的带宽,希望每个用户的并发连接不能太多,以免影响他人,也可以通过Squid控制,代码如下:

acl conncount maxconn 3 
http_access deny conncount normal 
http_access allow normal

这样,普通用户在某个固定时刻只能同时发起三个连接,从第四个开始,连接将被拒绝。

总之,Squid的ACL配置非常灵活、强大,更多的控制方式可以参考squid.conf.default。

认证

用户/密码认证为Squid管理提供了更多便利,最常用的认证方式是NCSA。从Squid 2.5版本开始,NCSA认证包含在了basic中,而非以前单独的认证模块。下面来看看实现认证的具体操作。

首先在编译时配置选项应包括以下配置:

--enable-auth="basic" --enable-basic-auth-helpers="NCSA" 

“make install”以后,需要将“helpers/basic_auth/NCSA/ncsa_auth”拷贝到用户可执行目录中,如/usr/bin(如 果在该目录中找不到这个执行文件,在编译时请使用make all而不是make,或者直接在该目录中执行make),然后需要借助Apache的密码管理程序htpasswd来生成用户名/密码对应的文件,就像 下面这行代码:

htpasswd -c /var/squid/etc/password guest

在输入两遍guest用户的密码后,一个guest用户就生成了。如果以后需要添加用户,把上面的命令去掉-c参数再运行即可。

Squid 2.5在认证处理上有了较大的改变,这里就只讨论2.5版本的处理方法,2.4及以下版本请参考squid.conf.default。在2.5版的squid.conf中,包括以下几个相关选项:

该选项指出了认证方式(basic)、需要的程序(ncsa_auth)和对应的密码文件(password)

auth_param basic program /usr/bin/ncsa_auth /var/squid/etc/password 

指定认证程序的进程数

auth_param basic children 5

浏览器显示输入用户/密码对话框时的领域内容

auth_param basic realm My Proxy Caching Domain

基本的认证有效时间

auth_param basic credentialsttl 2 hours

普通用户需要通过认证才能访问Internet

acl normal proxy_auth REQUIRED 
http_access allow normal

通过以上的配置即可完成认证工作。有的读者可能要问:认证只针对普通用户,而高级用户是直接上网的,该怎么处理呢?其实,这两种用户是可以共存的。

如 前所述,Squid是顺序处理http_access的,所以在http_access处理过程中,如果先处理normal用户,那么当前用户无论是否属 于高级用户,都会被要求进行认证;相反如果先处理高级用户,剩下的就只有需要认证的普通用户了。例如以下配置代码:

... 
http_access allow normal (需要认证) 
http_access allow advance (不需要认证) 
...

不管是否为noauth用户,都要求进行用户名/密码验证。正确的方法是将二者位置交换,代码如下:

... 
http_access allow advance 
http_access allow normal 
...

这时,高级用户不会受到任何影响。

总结

下面把整个squid.conf总结一下:

服务器配置

http_port 192.168.0.1:3128 
cache_mgr start@soocol.com 
cache_dir null /tmp 
cache_access_log /var/squid/access.log 
cache_log /var/squid/cache.log 
cache_store_log /var/squid/store.log 
visible_hostname No1.proxy 
client_mask 255.255.255.255 
httpd_accel_host virtual 
httpd_accel_port 80 
httpd_accel_with_proxy on 
httpd_accel_user_host_header on

用户分类

acl advance arp 00:01:02:1f:2c:3e 00:01:02:3c:1a:8b ... 
acl normal proxy_auth REQUIED 
acl all src 0.0.0.0

行为分类

acl mmxfile urlpath_regex \.mp3$ \.avi$ \.exe$ 
acl conncount maxconn 3 
acl worktime time MTWHF 8:30-12:00 14:00-18:00 
acl sinapage dstdomain ok.sina.com.cn 
acl qq dstdomain .tcccent.com.cn

处理

http_access allow advance 
http_access deny conncount normal 
http_access deny !worktime 
http_access deny mmxfile 
http_access deny sinapage 
http_access deny qq 
http_access allow normal

配置后的状况是,advance组可以不受任何限制地访问Internet,而normal组则只能在工作时间上网,而且不能下载多媒体文件,不能访问某些特定的站点,而且发送请求不能超过3个。

通过本文的介绍,它可以了解Squid的基本能力。当然,它的能力远不止此,可以建立强大的代理服务器阵列,可以帮助本地的Web服务器提高性能,可以提高本地网络的安全性等。要想发挥它的功效,还需要进一步控制。

----------------------------------------------------------------------------------------

其实主要就是refresh_pattern的一些理解和建议.

概念LM,LM就是页面Header里时间(Date)和Last-Modified时间的差。Date一般是Squid从后面取页面的时间,Last-Modified 一般是页面生成时间。
refresh_pattern 的语法是
refresh_pattern [-i] regexp min percent max [options]

min, max的单位是分钟,percent就是百分比。
refresh_pattern 的算法如下:(当前时间定义为CURRENT_DATE)
1) If ((CURRENT_DATE-DATE(就是LM里定义的时间)) < min),cache是新鲜的
2) else if ((CURRENT_DATE-DATE) < (min + (max-min)*percent),cache是新鲜的
3) else cache是过期的
cache过期就需要从后面server取新鲜内容。

常用的几个参数的意思

override-expire
该选项导致squid在检查Expires头部之前,先检查min值。这样,一个非零的min时间让squid返回一个未确认的cache命中,即使该响应准备过期。

override-lastmod
改选项导致squid在检查LM-factor百分比之前先检查min值。

reload-into-ims
该选项让squid在确认请求里,以no-cache指令传送一个请求。换句话说,squid在转发请求之前,对该请求增加一个If-Modified- Since头部。注意这点仅仅在目标有Last-Modified时间戳时才能工作。外面进来的请求保留no-cache指令,以便它到达原始服务器。
一般情况可以使用 reload-into-ims。它其实是强行控制对象的超时时间,这违反了http协议的精神,但是在带宽较窄的场合,可以提高明显系统相应时间。
举例:
refresh_pattern -i \.css$ 1440 50% 129600 reload-into-ims
refresh_pattern -i \.xml$ 1440 50% 129600 reload-into-ims
refresh_pattern -i \.html$ 1440 90% 129600 reload-into-ims-
refresh_pattern -i \.shtml$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.hml$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.jpg$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.png$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.gif$ 1440 90% 129600 ignore-reload
refresh_pattern -i \.bmp$ 1440 90% 129600 reload-into-ims
refresh_pattern -i \.js$ 1440 90% 129600 reload-into-ims

ignore-reload
该选项导致squid忽略请求里的任何no-cache指令。
所以。如果希望内容一进入cache就不删除,直到被主动purge掉为止,可以加上ignore-reload选项,这个我们常用在mp3,wma,wmv,gif之类。
Examples:

refresh_pattern -i \.mp3$ 1440 50% 2880 ignore-reload
refresh_pattern -i \.wmv$ 1440 50% 2880 ignore-reload
refresh_pattern -i \.rm$ 1440 50% 2880 ignore-reload
refresh_pattern -i \.swf$ 1440 50% 2880 ignore-reload
refresh_pattern -i \.mpeg$ 1440 50% 2880 ignore-reload
refresh_pattern -i \.wma$ 1440 50% 2880 ignore-reload
resource age =对象进入cache的时间-对象的last_modified
response age =当前时间-对象进入cache的时间
LM-factor=(response age)/(resource age)

--------------------------------------------------------------------------------------

经过这两天测试,提出下面的改进:[asp.net]

<%
Response.Cache.SetNoServerCaching();
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetAllowResponseInBrowserHistory(true);
Response.Cache.SetExpires( DateTime.Now.AddMinutes(10) );
Response.Cache.SetMaxAge( new TimeSpan(0,10,0) );
Response.Cache.SetLastModified( DateTime.Now.AddMinutes(-5) );
Response.Cache.SetValidUntilExpires(true);
%>

第一句是清理掉当前 IIS 端的 Cache ,其实际作用是防止由于域名,参数带来的串页。

 

第二句是设置 cache 可以作用在 squid 上。
第三句是允许浏览器端可以缓存,其实第二句 public 就是已经包含这个,但是避免 squid 上有其他设置,还是把这句话加上。
第四句是设置页面的过期时间是 10 分钟以后。
第五句是设置页面的最大生存时间是 300 秒,就是 5 分钟。
第六句是设置页面的最后修改时间是 5 分钟以前。
第七句是设置页面的缓存一直不要失效,其实这句话没有用途。

<%
Response.Cache.SetNoServerCaching();
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetAllowResponseInBrowserHistory(true);
Response.Cache.SetExpires( DateTime.Now.AddMinutes(10) );
Response.Cache.SetMaxAge( new TimeSpan(0,10,0) );
Response.Cache.SetLastModified( DateTime.Now.AddMinutes(-5) );
Response.Cache.SetValidUntilExpires(true);
%>

第一句是清理掉当前 IIS 端的 Cache ,其实际作用是防止由于域名,参数带来的串页。

 

第二句是设置 cache 可以作用在 squid 上。
第三句是允许浏览器端可以缓存,其实第二句 public 就是已经包含这个,但是避免 squid 上有其他设置,还是把这句话加上。
第四句是设置页面的过期时间是 10 分钟以后。
第五句是设置页面的最大生存时间是 300 秒,就是 5 分钟。
第六句是设置页面的最后修改时间是 5 分钟以前。
第七句是设置页面的缓存一直不要失效,其实这句话没有用途。

<%
Response.Cache.SetNoServerCaching();
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetAllowResponseInBrowserHistory(true);
Response.Cache.SetExpires( DateTime.Now.AddMinutes(10) );
Response.Cache.SetMaxAge( new TimeSpan(0,10,0) );
Response.Cache.SetLastModified( DateTime.Now.AddMinutes(-5) );
Response.Cache.SetValidUntilExpires(true);
%>

第一句是清理掉当前 IIS 端的 Cache ,其实际作用是防止由于域名,参数带来的串页。

 

第二句是设置 cache 可以作用在 squid 上。
第三句是允许浏览器端可以缓存,其实第二句 public 就是已经包含这个,但是避免 squid 上有其他设置,还是把这句话加上。
第四句是设置页面的过期时间是 10 分钟以后。
第五句是设置页面的最大生存时间是 300 秒,就是 5 分钟。
第六句是设置页面的最后修改时间是 5 分钟以前。
第七句是设置页面的缓存一直不要失效,其实这句话没有用途。

<%
Response.Cache.SetNoServerCaching();
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetAllowResponseInBrowserHistory(true);
Response.Cache.SetExpires( DateTime.Now.AddMinutes(10) );
Response.Cache.SetMaxAge( new TimeSpan(0,10,0) );
Response.Cache.SetLastModified( DateTime.Now.AddMinutes(-5) );
Response.Cache.SetValidUntilExpires(true);
%>

第一句是清理掉当前 IIS 端的 Cache ,其实际作用是防止由于域名,参数带来的串页。

 

第二句是设置 cache 可以作用在 squid 上。
第三句是允许浏览器端可以缓存,其实第二句 public 就是已经包含这个,但是避免 squid 上有其他设置,还是把这句话加上。
第四句是设置页面的过期时间是 10 分钟以后。
第五句是设置页面的最大生存时间是 300 秒,就是 5 分钟。
第六句是设置页面的最后修改时间是 5 分钟以前。
第七句是设置页面的缓存一直不要失效,其实这句话没有用途。

<%
Response.Cache.SetNoServerCaching();
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetAllowResponseInBrowserHistory(true);
Response.Cache.SetExpires( DateTime.Now.AddMinutes(10) );
Response.Cache.SetMaxAge( new TimeSpan(0,10,0) );
Response.Cache.SetLastModified( DateTime.Now.AddMinutes(-5) );
Response.Cache.SetValidUntilExpires(true);
%>

第一句是清理掉当前 IIS 端的 Cache ,其实际作用是防止由于域名,参数带来的串页。

 

第二句是设置 cache 可以作用在 squid 上。
第三句是允许浏览器端可以缓存,其实第二句 public 就是已经包含这个,但是避免 squid 上有其他设置,还是把这句话加上。
第四句是设置页面的过期时间是 10 分钟以后。
第五句是设置页面的最大生存时间是 300 秒,就是 5 分钟。
第六句是设置页面的最后修改时间是 5 分钟以前。
第七句是设置页面的缓存一直不要失效,其实这句话没有用途。

<%
Response.Cache.SetNoServerCaching();
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetAllowResponseInBrowserHistory(true);
Response.Cache.SetExpires( DateTime.Now.AddMinutes(10) );
Response.Cache.SetMaxAge( new TimeSpan(0,10,0) );
Response.Cache.SetLastModified( DateTime.Now.AddMinutes(-5) );
Response.Cache.SetValidUntilExpires(true);
%>

第一句是清理掉当前 IIS 端的 Cache ,其实际作用是防止由于域名,参数带来的串页。

 

第二句是设置 cache 可以作用在 squid 上。
第三句是允许浏览器端可以缓存,其实第二句 public 就是已经包含这个,但是避免 squid 上有其他设置,还是把这句话加上。
第四句是设置页面的过期时间是 10 分钟以后。
第五句是设置页面的最大生存时间是 300 秒,就是 5 分钟。
第六句是设置页面的最后修改时间是 5 分钟以前。
第七句是设置页面的缓存一直不要失效,其实这句话没有用途。

<%
Response.Cache.SetNoServerCaching();
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetAllowResponseInBrowserHistory(true);
Response.Cache.SetExpires( DateTime.Now.AddMinutes(10) );
Response.Cache.SetMaxAge( new TimeSpan(0,10,0) );
Response.Cache.SetLastModified( DateTime.Now.AddMinutes(-5) );
Response.Cache.SetValidUntilExpires(true);
%>

第一句是清理掉当前 IIS 端的 Cache ,其实际作用是防止由于域名,参数带来的串页。

 

第二句是设置 cache 可以作用在 squid 上。
第三句是允许浏览器端可以缓存,其实第二句 public 就是已经包含这个,但是避免 squid 上有其他设置,还是把这句话加上。
第四句是设置页面的过期时间是 10 分钟以后。
第五句是设置页面的最大生存时间是 300 秒,就是 5 分钟。
第六句是设置页面的最后修改时间是 5 分钟以前。
第七句是设置页面的缓存一直不要失效,其实这句话没有用途。

<%
Response.Cache.SetNoServerCaching();
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetAllowResponseInBrowserHistory(true);
Response.Cache.SetExpires( DateTime.Now.AddMinutes(10) );
Response.Cache.SetMaxAge( new TimeSpan(0,10,0) );
Response.Cache.SetLastModified( DateTime.Now.AddMinutes(-5) );
Response.Cache.SetValidUntilExpires(true);
%>

第一句是清理掉当前 IIS 端的 Cache ,其实际作用是防止由于域名,参数带来的串页。

 

第二句是设置 cache 可以作用在 squid 上。
第三句是允许浏览器端可以缓存,其实第二句 public 就是已经包含这个,但是避免 squid 上有其他设置,还是把这句话加上。
第四句是设置页面的过期时间是 10 分钟以后。
第五句是设置页面的最大生存时间是 300 秒,就是 5 分钟。
第六句是设置页面的最后修改时间是 5 分钟以前。
第七句是设置页面的缓存一直不要失效,其实这句话没有用途。<%
Response.Cache.SetNoServerCaching();
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetAllowResponseInBrowserHistory(true);
Response.Cache.SetExpires( DateTime.Now.AddMinutes(10) );
Response.Cache.SetMaxAge( new TimeSpan(0,10,0) );
Response.Cache.SetLastModified( DateTime.Now.AddMinutes(-5) );
Response.Cache.SetValidUntilExpires(true);
%>

第一句是清理掉当前 IIS 端的 Cache ,其实际作用是防止由于域名,参数带来的串页。

 

第二句是设置 cache 可以作用在 squid 上。
第三句是允许浏览器端可以缓存,其实第二句 public 就是已经包含这个,但是避免 squid 上有其他设置,还是把这句话加上。
第四句是设置页面的过期时间是 10 分钟以后。
第五句是设置页面的最大生存时间是 300 秒,就是 5 分钟。
第六句是设置页面的最后修改时间是 5 分钟以前。
第七句是设置页面的缓存一直不要失效,其实这句话没有用途。

-----------------------------------------------------------------------------------------

1. 首先强调一下视频文件的特点
视频文件的尺寸比起普通 HTTP 请求的文件要大得多
视频文件上传以后就不会被修改
视频文件被播放器下载时,存在大量多线程下载

2. 为了跟踪你的命中率和观察你的文件里的 TCP_MISS 的类型,请增加 squid cache manager 和 access.log 的输出。在配置文件中增加以下内容
acl managerip src [HOSTIP]
acl manager proto cache_object
http_access allow manager managerip

logformat analyse %&gt;a &quot;%rm %ru HTTP/%rv&quot; %Ss:%Sh/%Hs
access_log /usr/local/squid/var/logs/access.log analyse
分别增加了 manager 的访问和 access.log 的跟踪

3. 优化前,先关注你当前的 squid 运行情况
squidclient -h[SQUIDIP] -p[PORT] mgr:info
mgr 的其他选项,用 squidclient mgr: 查看
Request Hit Ratios 和 Byte Hit Ratios 这两项重要指标就是我们要追求的结果。他的指标高地直接说明了 squid 的起到的 cache 效果
Memory accounted for: 项中的 Total accounted 指标表示你所允许 squid 使用的 cache 内存有多少空间已经存储了 cache 文件
File descriptor usage for squid: 项里面的指标指明了你的文件描述符数量是否 cache 瓶颈,如果你的 FD 不足请你重新设置并安装 squid
tail -10000 access.log | awk '{printf $5;}' | sort -rn | uniq -c | sort -rn
用此命令跟踪访问客户端命中率,下面列出日志的名种字段的含义
http://www.maycode.com/index.php/forum.html?func=view&amp;id=809&amp;catid=10

通过日志来观察哪类文件的命中率低,追查根源。
以上两项无论是否视频命中率的优化都要熟练使用

4. 介绍过分析方法后,说下关键的设置参数
maximum_object_size 最大磁盘缓存文件尺寸
maximum_object_size_in_memory 最大内存缓存文件尺寸
默认都是 8K ,如果不改变这两个值,出现的问题不用我多说了
range_offset_limit -1
Sets a upper limit on how far into the the file a Range request
may be to cause Squid to prefetch the whole file. If beyond this
limit Squid forwards the Range request as it is and the result
is NOT cached.
This is to stop a far ahead range request (lets say start at 17M
from making Squid fetch the whole object up to that point before
sending anything to the client.
A value of -1 causes Squid to always fetch the object from the
beginning so it may cache the result. (2.0 style)
A value of 0 causes Squid to never fetch more than the
client requested. (default)
上面是官方的解释,含义就是这个值限制多大的 range request 会触发缓存整个文件,如果这个值过大,会导致小的 range 请求,无法被缓存,会导致大量的不命中。对于视频设置为 -1 就可以了。
quick_abort_min -1 KB
The cache by default continues downloading aborted requests
which are almost completed (less than 16 KB remaining). This
may be undesirable on slow (e.g. SLIP) links and/or very busy
caches. Impatient users may tie up file descriptors and
bandwidth by repeatedly requesting and immediately aborting
downloads.
含义就是在用户突然中断请求时,还差多少大小的时候,继续完成全文件的缓存工作。此值对于性能的影响不是非常明显。
refresh_pattern -i \.flv$ 1440 50% 2880 ignore-reload
这个参数的各项含义不详细解释了, ignore-reload 很重要,很多浏览器发来的请求都带着 no-cache 头,所以造成了大量的不命中,这些 no- cache 毫无疑义,视频文件被修改的几率非常小,如果你的播放器请求又都带着 no-cache 头。因此增加 ignore-reload 对于性能提升有非常大的作用
cache_dir aufs /cache/squid 102400 16 256
另外我启用了 aufs 作为缓存存储,启用了异步 IO ,我认为对于优化 IO 有些效果。

5. 最后强调一下,如果你要给视频文件做 squid 请准备好足够的物理内存,并且让 squid 充分的 cache 视频于内存,会对你的服务相应有巨大帮助的。

 

-----------------------------------------------------------------------------------------

1. 首先强调一下视频文件的特点
视频文件的尺寸比起普通 HTTP 请求的文件要大得多
视频文件上传以后就不会被修改
视频文件被播放器下载时,存在大量多线程下载

2. 为了跟踪你的命中率和观察你的文件里的 TCP_MISS 的类型,请增加 squid cache manager 和 access.log 的输出。在配置文件中增加以下内容
acl managerip src [HOSTIP]
acl manager proto cache_object
http_access allow manager managerip

logformat analyse %&gt;a &quot;%rm %ru HTTP/%rv&quot; %Ss:%Sh/%Hs
access_log /usr/local/squid/var/logs/access.log analyse
分别增加了 manager 的访问和 access.log 的跟踪

3. 优化前,先关注你当前的 squid 运行情况
squidclient -h[SQUIDIP] -p[PORT] mgr:info
mgr 的其他选项,用 squidclient mgr: 查看
Request Hit Ratios 和 Byte Hit Ratios 这两项重要指标就是我们要追求的结果。他的指标高地直接说明了 squid 的起到的 cache 效果
Memory accounted for: 项中的 Total accounted 指标表示你所允许 squid 使用的 cache 内存有多少空间已经存储了 cache 文件
File descriptor usage for squid: 项里面的指标指明了你的文件描述符数量是否 cache 瓶颈,如果你的 FD 不足请你重新设置并安装 squid
tail -10000 access.log | awk '{printf $5;}' | sort -rn | uniq -c | sort -rn
用此命令跟踪访问客户端命中率,下面列出日志的名种字段的含义
http://www.maycode.com/index.php/forum.html?func=view&amp;id=809&amp;catid=10

通过日志来观察哪类文件的命中率低,追查根源。
以上两项无论是否视频命中率的优化都要熟练使用

4. 介绍过分析方法后,说下关键的设置参数
maximum_object_size 最大磁盘缓存文件尺寸
maximum_object_size_in_memory 最大内存缓存文件尺寸
默认都是 8K ,如果不改变这两个值,出现的问题不用我多说了
range_offset_limit -1
Sets a upper limit on how far into the the file a Range request
may be to cause Squid to prefetch the whole file. If beyond this
limit Squid forwards the Range request as it is and the result
is NOT cached.
This is to stop a far ahead range request (lets say start at 17M

from making Squid fetch the whole object up to that point before
sending anything to the client.
A value of -1 causes Squid to always fetch the object from the
beginning so it may cache the result. (2.0 style)
A value of 0 causes Squid to never fetch more than the
client requested. (default)
上面是官方的解释,含义就是这个值限制多大的 range request 会触发缓存整个文件,如果这个值过大,会导致小的 range 请求,无法被缓存,会导致大量的不命中。对于视频设置为 -1 就可以了。
quick_abort_min -1 KB
The cache by default continues downloading aborted requests
which are almost completed (less than 16 KB remaining). This
may be undesirable on slow (e.g. SLIP) links and/or very busy
caches. Impatient users may tie up file descriptors and
bandwidth by repeatedly requesting and immediately aborting
downloads.
含义就是在用户突然中断请求时,还差多少大小的时候,继续完成全文件的缓存工作。此值对于性能的影响不是非常明显。
refresh_pattern -i \.flv$ 1440 50% 2880 ignore-reload
这个参数的各项含义不详细解释了, ignore-reload 很重要,很多浏览器发来的请求都带着 no-cache 头,所以造成了大量的不命中,这些 no- cache 毫无疑义,视频文件被修改的几率非常小,如果你的播放器请求又都带着 no-cache 头。因此增加 ignore-reload 对于性能提升有非常大的作用
cache_dir aufs /cache/squid 102400 16 256
另外我启用了 aufs 作为缓存存储,启用了异步 IO ,我认为对于优化 IO 有些效果。

5. 最后强调一下,如果你要给视频文件做 squid 请准备好足够的物理内存,并且让 squid 充分的 cache 视频于内存,会对你的服务相应有巨大帮助的。

 

-----------------------------------------------------------------------------------------

1. 首先强调一下视频文件的特点
视频文件的尺寸比起普通 HTTP 请求的文件要大得多
视频文件上传以后就不会被修改
视频文件被播放器下载时,存在大量多线程下载

2. 为了跟踪你的命中率和观察你的文件里的 TCP_MISS 的类型,请增加 squid cache manager 和 access.log 的输出。在配置文件中增加以下内容
acl managerip src [HOSTIP]
acl manager proto cache_object
http_access allow manager managerip

logformat analyse %&gt;a &quot;%rm %ru HTTP/%rv&quot; %Ss:%Sh/%Hs
access_log /usr/local/squid/var/logs/access.log analyse
分别增加了 manager 的访问和 access.log 的跟踪

3. 优化前,先关注你当前的 squid 运行情况
squidclient -h[SQUIDIP] -p[PORT] mgr:info
mgr 的其他选项,用 squidclient mgr: 查看
Request Hit Ratios 和 Byte Hit Ratios 这两项重要指标就是我们要追求的结果。他的指标高地直接说明了 squid 的起到的 cache 效果
Memory accounted for: 项中的 Total accounted 指标表示你所允许 squid 使用的 cache 内存有多少空间已经存储了 cache 文件
File descriptor usage for squid: 项里面的指标指明了你的文件描述符数量是否 cache 瓶颈,如果你的 FD 不足请你重新设置并安装 squid
tail -10000 access.log | awk '{printf $5;}' | sort -rn | uniq -c | sort -rn
用此命令跟踪访问客户端命中率,下面列出日志的名种字段的含义
http://www.maycode.com/index.php/forum.html?func=view&amp;id=809&amp;catid=10

通过日志来观察哪类文件的命中率低,追查根源。
以上两项无论是否视频命中率的优化都要熟练使用

4. 介绍过分析方法后,说下关键的设置参数
maximum_object_size 最大磁盘缓存文件尺寸
maximum_object_size_in_memory 最大内存缓存文件尺寸
默认都是 8K ,如果不改变这两个值,出现的问题不用我多说了
range_offset_limit -1
Sets a upper limit on how far into the the file a Range request
may be to cause Squid to prefetch the whole file. If beyond this
limit Squid forwards the Range request as it is and the result
is NOT cached.
This is to stop a far ahead range request (lets say start at 17M

from making Squid fetch the whole object up to that point before
sending anything to the client.
A value of -1 causes Squid to always fetch the object from the
beginning so it may cache the result. (2.0 style)
A value of 0 causes Squid to never fetch more than the
client requested. (default)
上面是官方的解释,含义就是这个值限制多大的 range request 会触发缓存整个文件,如果这个值过大,会导致小的 range 请求,无法被缓存,会导致大量的不命中。对于视频设置为 -1 就可以了。
quick_abort_min -1 KB
The cache by default continues downloading aborted requests
which are almost completed (less than 16 KB remaining). This
may be undesirable on slow (e.g. SLIP) links and/or very busy
caches. Impatient users may tie up file descriptors and
bandwidth by repeatedly requesting and immediately aborting
downloads.
含义就是在用户突然中断请求时,还差多少大小的时候,继续完成全文件的缓存工作。此值对于性能的影响不是非常明显。
refresh_pattern -i \.flv$ 1440 50% 2880 ignore-reload
这个参数的各项含义不详细解释了, ignore-reload 很重要,很多浏览器发来的请求都带着 no-cache 头,所以造成了大量的不命中,这些 no- cache 毫无疑义,视频文件被修改的几率非常小,如果你的播放器请求又都带着 no-cache 头。因此增加 ignore-reload 对于性能提升有非常大的作用
cache_dir aufs /cache/squid 102400 16 256
另外我启用了 aufs 作为缓存存储,启用了异步 IO ,我认为对于优化 IO 有些效果。

5. 最后强调一下,如果你要给视频文件做 squid 请准备好足够的物理内存,并且让 squid 充分的 cache 视频于内存,会对你的服务相应有巨大帮助的。

 

-----------------------------------------------------------------------------------------

1. 首先强调一下视频文件的特点
视频文件的尺寸比起普通 HTTP 请求的文件要大得多
视频文件上传以后就不会被修改
视频文件被播放器下载时,存在大量多线程下载

2. 为了跟踪你的命中率和观察你的文件里的 TCP_MISS 的类型,请增加 squid cache manager 和 access.log 的输出。在配置文件中增加以下内容
acl managerip src [HOSTIP]
acl manager proto cache_object
http_access allow manager managerip

logformat analyse %&gt;a &quot;%rm %ru HTTP/%rv&quot; %Ss:%Sh/%Hs
access_log /usr/local/squid/var/logs/access.log analyse
分别增加了 manager 的访问和 access.log 的跟踪

3. 优化前,先关注你当前的 squid 运行情况
squidclient -h[SQUIDIP] -p[PORT] mgr:info
mgr 的其他选项,用 squidclient mgr: 查看
Request Hit Ratios 和 Byte Hit Ratios 这两项重要指标就是我们要追求的结果。他的指标高地直接说明了 squid 的起到的 cache 效果
Memory accounted for: 项中的 Total accounted 指标表示你所允许 squid 使用的 cache 内存有多少空间已经存储了 cache 文件
File descriptor usage for squid: 项里面的指标指明了你的文件描述符数量是否 cache 瓶颈,如果你的 FD 不足请你重新设置并安装 squid
tail -10000 access.log | awk '{printf $5;}' | sort -rn | uniq -c | sort -rn
用此命令跟踪访问客户端命中率,下面列出日志的名种字段的含义
http://www.maycode.com/index.php/forum.html?func=view&amp;id=809&amp;catid=10

通过日志来观察哪类文件的命中率低,追查根源。
以上两项无论是否视频命中率的优化都要熟练使用

4. 介绍过分析方法后,说下关键的设置参数
maximum_object_size 最大磁盘缓存文件尺寸
maximum_object_size_in_memory 最大内存缓存文件尺寸
默认都是 8K ,如果不改变这两个值,出现的问题不用我多说了
range_offset_limit -1
Sets a upper limit on how far into the the file a Range request
may be to cause Squid to prefetch the whole file. If beyond this
limit Squid forwards the Range request as it is and the result
is NOT cached.
This is to stop a far ahead range request (lets say start at 17M

from making Squid fetch the whole object up to that point before
sending anything to the client.
A value of -1 causes Squid to always fetch the object from the
beginning so it may cache the result. (2.0 style)
A value of 0 causes Squid to never fetch more than the
client requested. (default)
上面是官方的解释,含义就是这个值限制多大的 range request 会触发缓存整个文件,如果这个值过大,会导致小的 range 请求,无法被缓存,会导致大量的不命中。对于视频设置为 -1 就可以了。
quick_abort_min -1 KB
The cache by default continues downloading aborted requests
which are almost completed (less than 16 KB remaining). This
may be undesirable on slow (e.g. SLIP) links and/or very busy
caches. Impatient users may tie up file descriptors and
bandwidth by repeatedly requesting and immediately aborting
downloads.
含义就是在用户突然中断请求时,还差多少大小的时候,继续完成全文件的缓存工作。此值对于性能的影响不是非常明显。
refresh_pattern -i \.flv$ 1440 50% 2880 ignore-reload
这个参数的各项含义不详细解释了, ignore-reload 很重要,很多浏览器发来的请求都带着 no-cache 头,所以造成了大量的不命中,这些 no- cache 毫无疑义,视频文件被修改的几率非常小,如果你的播放器请求又都带着 no-cache 头。因此增加 ignore-reload 对于性能提升有非常大的作用
cache_dir aufs /cache/squid 102400 16 256
另外我启用了 aufs 作为缓存存储,启用了异步 IO ,我认为对于优化 IO 有些效果。

5. 最后强调一下,如果你要给视频文件做 squid 请准备好足够的物理内存,并且让 squid 充分的 cache 视频于内存,会对你的服务相应有巨大帮助的。

 

-----------------------------------------------------------------------------------------

1. 首先强调一下视频文件的特点
视频文件的尺寸比起普通 HTTP 请求的文件要大得多
视频文件上传以后就不会被修改
视频文件被播放器下载时,存在大量多线程下载

2. 为了跟踪你的命中率和观察你的文件里的 TCP_MISS 的类型,请增加 squid cache manager 和 access.log 的输出。在配置文件中增加以下内容
acl managerip src [HOSTIP]
acl manager proto cache_object
http_access allow manager managerip

logformat analyse %&gt;a &quot;%rm %ru HTTP/%rv&quot; %Ss:%Sh/%Hs
access_log /usr/local/squid/var/logs/access.log analyse
分别增加了 manager 的访问和 access.log 的跟踪

3. 优化前,先关注你当前的 squid 运行情况
squidclient -h[SQUIDIP] -p[PORT] mgr:info
mgr 的其他选项,用 squidclient mgr: 查看
Request Hit Ratios 和 Byte Hit Ratios 这两项重要指标就是我们要追求的结果。他的指标高地直接说明了 squid 的起到的 cache 效果
Memory accounted for: 项中的 Total accounted 指标表示你所允许 squid 使用的 cache 内存有多少空间已经存储了 cache 文件
File descriptor usage for squid: 项里面的指标指明了你的文件描述符数量是否 cache 瓶颈,如果你的 FD 不足请你重新设置并安装 squid
tail -10000 access.log | awk '{printf $5;}' | sort -rn | uniq -c | sort -rn
用此命令跟踪访问客户端命中率,下面列出日志的名种字段的含义
http://www.maycode.com/index.php/forum.html?func=view&amp;id=809&amp;catid=10

通过日志来观察哪类文件的命中率低,追查根源。
以上两项无论是否视频命中率的优化都要熟练使用

4. 介绍过分析方法后,说下关键的设置参数
maximum_object_size 最大磁盘缓存文件尺寸
maximum_object_size_in_memory 最大内存缓存文件尺寸
默认都是 8K ,如果不改变这两个值,出现的问题不用我多说了
range_offset_limit -1
Sets a upper limit on how far into the the file a Range request
may be to cause Squid to prefetch the whole file. If beyond this
limit Squid forwards the Range request as it is and the result
is NOT cached.
This is to stop a far ahead range request (lets say start at 17M
from making Squid fetch the whole object up to that point before
sending anything to the client.
A value of -1 causes Squid to always fetch the object from the
beginning so it may cache the result. (2.0 style)
A value of 0 causes Squid to never fetch more than the
client requested. (default)
上面是官方的解释,含义就是这个值限制多大的 range request 会触发缓存整个文件,如果这个值过大,会导致小的 range 请求,无法被缓存,会导致大量的不命中。对于视频设置为 -1 就可以了。
quick_abort_min -1 KB
The cache by default continues downloading aborted requests
which are almost completed (less than 16 KB remaining). This
may be undesirable on slow (e.g. SLIP) links and/or very busy
caches. Impatient users may tie up file descriptors and
bandwidth by repeatedly requesting and immediately aborting
downloads.
含义就是在用户突然中断请求时,还差多少大小的时候,继续完成全文件的缓存工作。此值对于性能的影响不是非常明显。
refresh_pattern -i \.flv$ 1440 50% 2880 ignore-reload
这个参数的各项含义不详细解释了, ignore-reload 很重要,很多浏览器发来的请求都带着 no-cache 头,所以造成了大量的不命中,这些 no- cache 毫无疑义,视频文件被修改的几率非常小,如果你的播放器请求又都带着 no-cache 头。因此增加 ignore-reload 对于性能提升有非常大的作用
cache_dir aufs /cache/squid 102400 16 256
另外我启用了 aufs 作为缓存存储,启用了异步 IO ,我认为对于优化 IO 有些效果。

5. 最后强调一下,如果你要给视频文件做 squid 请准备好足够的物理内存,并且让 squid 充分的 cache 视频于内存,会对你的服务相应有巨大帮助的。

 

-----------------------------------------------------------------------------------------

1. 首先强调一下视频文件的特点
视频文件的尺寸比起普通 HTTP 请求的文件要大得多
视频文件上传以后就不会被修改
视频文件被播放器下载时,存在大量多线程下载

2. 为了跟踪你的命中率和观察你的文件里的 TCP_MISS 的类型,请增加 squid cache manager 和 access.log 的输出。在配置文件中增加以下内容
acl managerip src [HOSTIP]
acl manager proto cache_object
http_access allow manager managerip

logformat analyse %&gt;a &quot;%rm %ru HTTP/%rv&quot; %Ss:%Sh/%Hs
access_log /usr/local/squid/var/logs/access.log analyse
分别增加了 manager 的访问和 access.log 的跟踪

3. 优化前,先关注你当前的 squid 运行情况
squidclient -h[SQUIDIP] -p[PORT] mgr:info
mgr 的其他选项,用 squidclient mgr: 查看
Request Hit Ratios 和 Byte Hit Ratios 这两项重要指标就是我们要追求的结果。他的指标高地直接说明了 squid 的起到的 cache 效果
Memory accounted for: 项中的 Total accounted 指标表示你所允许 squid 使用的 cache 内存有多少空间已经存储了 cache 文件
File descriptor usage for squid: 项里面的指标指明了你的文件描述符数量是否 cache 瓶颈,如果你的 FD 不足请你重新设置并安装 squid
tail -10000 access.log | awk '{printf $5;}' | sort -rn | uniq -c | sort -rn
用此命令跟踪访问客户端命中率,下面列出日志的名种字段的含义
http://www.maycode.com/index.php/forum.html?func=view&amp;id=809&amp;catid=10

通过日志来观察哪类文件的命中率低,追查根源。
以上两项无论是否视频命中率的优化都要熟练使用

4. 介绍过分析方法后,说下关键的设置参数
maximum_object_size 最大磁盘缓存文件尺寸
maximum_object_size_in_memory 最大内存缓存文件尺寸
默认都是 8K ,如果不改变这两个值,出现的问题不用我多说了
range_offset_limit -1
Sets a upper limit on how far into the the file a Range request
may be to cause Squid to prefetch the whole file. If beyond this
limit Squid forwards the Range request as it is and the result
is NOT cached.
This is to stop a far ahead range request (lets say start at 17M

from making Squid fetch the whole object up to that point before
sending anything to the client.
A value of -1 causes Squid to always fetch the object from the
beginning so it may cache the result. (2.0 style)
A value of 0 causes Squid to never fetch more than the
client requested. (default)
上面是官方的解释,含义就是这个值限制多大的 range request 会触发缓存整个文件,如果这个值过大,会导致小的 range 请求,无法被缓存,会导致大量的不命中。对于视频设置为 -1 就可以了。
quick_abort_min -1 KB
The cache by default continues downloading aborted requests
which are almost completed (less than 16 KB remaining). This
may be undesirable on slow (e.g. SLIP) links and/or very busy
caches. Impatient users may tie up file descriptors and
bandwidth by repeatedly requesting and immediately aborting
downloads.
含义就是在用户突然中断请求时,还差多少大小的时候,继续完成全文件的缓存工作。此值对于性能的影响不是非常明显。
refresh_pattern -i \.flv$ 1440 50% 2880 ignore-reload
这个参数的各项含义不详细解释了, ignore-reload 很重要,很多浏览器发来的请求都带着 no-cache 头,所以造成了大量的不命中,这些 no- cache 毫无疑义,视频文件被修改的几率非常小,如果你的播放器请求又都带着 no-cache 头。因此增加 ignore-reload 对于性能提升有非常大的作用
cache_dir aufs /cache/squid 102400 16 256
另外我启用了 aufs 作为缓存存储,启用了异步 IO ,我认为对于优化 IO 有些效果。

5. 最后强调一下,如果你要给视频文件做 squid 请准备好足够的物理内存,并且让 squid 充分的 cache 视频于内存,会对你的服务相应有巨大帮助的。

 

-----------------------------------------------------------------------------------------

1. 首先强调一下视频文件的特点
视频文件的尺寸比起普通 HTTP 请求的文件要大得多
视频文件上传以后就不会被修改
视频文件被播放器下载时,存在大量多线程下载

2. 为了跟踪你的命中率和观察你的文件里的 TCP_MISS 的类型,请增加 squid cache manager 和 access.log 的输出。在配置文件中增加以下内容
acl managerip src [HOSTIP]
acl manager proto cache_object
http_access allow manager managerip

logformat analyse %&gt;a &quot;%rm %ru HTTP/%rv&quot; %Ss:%Sh/%Hs
access_log /usr/local/squid/var/logs/access.log analyse
分别增加了 manager 的访问和 access.log 的跟踪

3. 优化前,先关注你当前的 squid 运行情况
squidclient -h[SQUIDIP] -p[PORT] mgr:info
mgr 的其他选项,用 squidclient mgr: 查看
Request Hit Ratios 和 Byte Hit Ratios 这两项重要指标就是我们要追求的结果。他的指标高地直接说明了 squid 的起到的 cache 效果
Memory accounted for: 项中的 Total accounted 指标表示你所允许 squid 使用的 cache 内存有多少空间已经存储了 cache 文件
File descriptor usage for squid: 项里面的指标指明了你的文件描述符数量是否 cache 瓶颈,如果你的 FD 不足请你重新设置并安装 squid
tail -10000 access.log | awk '{printf $5;}' | sort -rn | uniq -c | sort -rn
用此命令跟踪访问客户端命中率,下面列出日志的名种字段的含义
http://www.maycode.com/index.php/forum.html?func=view&amp;id=809&amp;catid=10

通过日志来观察哪类文件的命中率低,追查根源。
以上两项无论是否视频命中率的优化都要熟练使用

4. 介绍过分析方法后,说下关键的设置参数
maximum_object_size 最大磁盘缓存文件尺寸
maximum_object_size_in_memory 最大内存缓存文件尺寸
默认都是 8K ,如果不改变这两个值,出现的问题不用我多说了
range_offset_limit -1
Sets a upper limit on how far into the the file a Range request
may be to cause Squid to prefetch the whole file. If beyond this
limit Squid forwards the Range request as it is and the result
is NOT cached.
This is to stop a far ahead range request (lets say start at 17M
from making Squid fetch the whole object up to that point before
sending anything to the client.
A value of -1 causes Squid to always fetch the object from the
beginning so it may cache the result. (2.0 style)
A value of 0 causes Squid to never fetch more than the
client requested. (default)
上面是官方的解释,含义就是这个值限制多大的 range request 会触发缓存整个文件,如果这个值过大,会导致小的 range 请求,无法被缓存,会导致大量的不命中。对于视频设置为 -1 就可以了。
quick_abort_min -1 KB
The cache by default continues downloading aborted requests
which are almost completed (less than 16 KB remaining). This
may be undesirable on slow (e.g. SLIP) links and/or very busy
caches. Impatient users may tie up file descriptors and
bandwidth by repeatedly requesting and immediately aborting
downloads.
含义就是在用户突然中断请求时,还差多少大小的时候,继续完成全文件的缓存工作。此值对于性能的影响不是非常明显。
refresh_pattern -i \.flv$ 1440 50% 2880 ignore-reload
这个参数的各项含义不详细解释了, ignore-reload 很重要,很多浏览器发来的请求都带着 no-cache 头,所以造成了大量的不命中,这些 no- cache 毫无疑义,视频文件被修改的几率非常小,如果你的播放器请求又都带着 no-cache 头。因此增加 ignore-reload 对于性能提升有非常大的作用
cache_dir aufs /cache/squid 102400 16 256
另外我启用了 aufs 作为缓存存储,启用了异步 IO ,我认为对于优化 IO 有些效果。

5. 最后强调一下,如果你要给视频文件做 squid 请准备好足够的物理内存,并且让 squid 充分的 cache 视频于内存,会对你的服务相应有巨大帮助的。

 

-----------------------------------------------------------------------------------------

1. 首先强调一下视频文件的特点
视频文件的尺寸比起普通 HTTP 请求的文件要大得多
视频文件上传以后就不会被修改
视频文件被播放器下载时,存在大量多线程下载

2. 为了跟踪你的命中率和观察你的文件里的 TCP_MISS 的类型,请增加 squid cache manager 和 access.log 的输出。在配置文件中增加以下内容
acl managerip src [HOSTIP]
acl manager proto cache_object
http_access allow manager managerip

logformat analyse %&gt;a &quot;%rm %ru HTTP/%rv&quot; %Ss:%Sh/%Hs
access_log /usr/local/squid/var/logs/access.log analyse
分别增加了 manager 的访问和 access.log 的跟踪

3. 优化前,先关注你当前的 squid 运行情况
squidclient -h[SQUIDIP] -p[PORT] mgr:info
mgr 的其他选项,用 squidclient mgr: 查看
Request Hit Ratios 和 Byte Hit Ratios 这两项重要指标就是我们要追求的结果。他的指标高地直接说明了 squid 的起到的 cache 效果
Memory accounted for: 项中的 Total accounted 指标表示你所允许 squid 使用的 cache 内存有多少空间已经存储了 cache 文件
File descriptor usage for squid: 项里面的指标指明了你的文件描述符数量是否 cache 瓶颈,如果你的 FD 不足请你重新设置并安装 squid
tail -10000 access.log | awk '{printf $5;}' | sort -rn | uniq -c | sort -rn
用此命令跟踪访问客户端命中率,下面列出日志的名种字段的含义
http://www.maycode.com/index.php/forum.html?func=view&amp;id=809&amp;catid=10

通过日志来观察哪类文件的命中率低,追查根源。
以上两项无论是否视频命中率的优化都要熟练使用

4. 介绍过分析方法后,说下关键的设置参数
maximum_object_size 最大磁盘缓存文件尺寸
maximum_object_size_in_memory 最大内存缓存文件尺寸
默认都是 8K ,如果不改变这两个值,出现的问题不用我多说了
range_offset_limit -1
Sets a upper limit on how far into the the file a Range request
may be to cause Squid to prefetch the whole file. If beyond this
limit Squid forwards the Range request as it is and the result
is NOT cached.
This is to stop a far ahead range request (lets say start at 17M
from making Squid fetch the whole object up to that point before
sending anything to the client.
A value of -1 causes Squid to always fetch the object from the
beginning so it may cache the result. (2.0 style)
A value of 0 causes Squid to never fetch more than the
client requested. (default)
上面是官方的解释,含义就是这个值限制多大的 range request 会触发缓存整个文件,如果这个值过大,会导致小的 range 请求,无法被缓存,会导致大量的不命中。对于视频设置为 -1 就可以了。
quick_abort_min -1 KB
The cache by default continues downloading aborted requests
which are almost completed (less than 16 KB remaining). This
may be undesirable on slow (e.g. SLIP) links and/or very busy
caches. Impatient users may tie up file descriptors and
bandwidth by repeatedly requesting and immediately aborting
downloads.
含义就是在用户突然中断请求时,还差多少大小的时候,继续完成全文件的缓存工作。此值对于性能的影响不是非常明显。
refresh_pattern -i \.flv$ 1440 50% 2880 ignore-reload
这个参数的各项含义不详细解释了, ignore-reload 很重要,很多浏览器发来的请求都带着 no-cache 头,所以造成了大量的不命中,这些 no- cache 毫无疑义,视频文件被修改的几率非常小,如果你的播放器请求又都带着 no-cache 头。因此增加 ignore-reload 对于性能提升有非常大的作用
cache_dir aufs /cache/squid 102400 16 256
另外我启用了 aufs 作为缓存存储,启用了异步 IO ,我认为对于优化 IO 有些效果。

5. 最后强调一下,如果你要给视频文件做 squid 请准备好足够的物理内存,并且让 squid 充分的 cache 视频于内存,会对你的服务相应有巨大帮助的。

-----------------------------简单一例--------------------------------------

 

Squid 3.0 反向代理(加速模式)配置

visible_hostname squid1 . ihompy . com
#设定squid的主机名,如无此项squid将无法启动
http_port 80 accel vhost vport
#设定squid为accel加速模式,vhost必须要加.否则将无法将主机头转发至后端服务器,访问时就会出现无法找到主机头的错误
cache_peer www . contentchina . com parent 80 0 no - query originserver name = contentchina
cache_peer bbs . contentchina . com parent 80 0 no - query originserver name = bbs
cache_peer www . ihompy . com parent 80 0 no - query originserver name = ihompy
#定义不同的父节点,将节点设为no-query以及originserver说明这些节点是实际服务器
cache_peer_domain contentchina www . contentchina . com
cache_peer_domain bbs bbs . contentchina . com
cache_peer_domain ihompy www . ihompy . com
#设定不同域名转发到不同的cache_peer上,如果没有这项.不同域名的域名可能被分发到同一台服务器上.
acl all src 0.0.0.0 / 0.0.0.0
http_access allow all
#允许所有客户端访问
cache_log / var / log / squid / cache . log
#记录日志
#***********ACL存取控制*************
acl QueryString url_regex \. php ?
#***********缓冲存取控制*************
no_cache deny QueryString
#不对符合QueryString的ACL内容进行缓冲
#***********性能优化配置*************
maximum_object_size 320010 KB
#大于此容量的对象将不会被保存在磁盘上,默认大小是4M,如果squid服务器用于缓冲flash等大型文件,建议将此值变大.否则过大的文件在下次重启后将需要重新获取
maximum_object_size_in_memory 100 KB
#最大位于内存中的对象的大小,默认大小是8K,如果服务器内存很大.可以适当提高此值的大小,建议根据网站的80%图片的大小来定.或者根据WEB服务器实际存取文件中最常访问的文件大小来定制
#***********其他可选配置*************
dns_nameservers 10.0.0.1 192.172.0.4
#配置DNS服务器地址.获取后端时将从此dns获取IP地址
cache_mgr code_tin @ msn . com
#在错误日志中出现的webmaster地址.

Squid 3.0与2.6一样.相较2.5的accel模式下配置要简单许多
只要设置不同的后端,cache_peer parent originserver
就可以进行反向代理
而不再需要httpd_accel系列参数的配置.
配置squid时最好制定内部dns,或者修改/etc/hosts文件
否则squid可能会回环访问其自身而出现问题.

---------------------------------------------------------------------------------------------------------------

修改Linux提高Squid服务器并发 Linux下高并发的Squid服务器,TCP TIME_WAIT套接字数量经常达到两、三万,服务器很容易被拖死。通过修改Linux内核参数,可以减少Squid服务器的TIME_WAIT套接字数量。

vi /etc/sysctl.conf

增加以下几行:
引用
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000

说明:
net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout = 30 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
net.ipv4.tcp_keepalive_time = 1200 表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
net.ipv4.ip_local_port_range = 1024 65000 表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。
net.ipv4.tcp_max_syn_backlog = 8192 表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_tw_buckets = 5000 表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为5000。对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。

执行以下命令使配置生效:

/sbin/sysctl -p

----------------------------------------------------------------

13.2.5 access.log分析工具

access.log包含很多信息,远不止你简单的浏览该文件所见。为了完整的浏览,必须使用第三方的日志文件分析包。你可在Squid的web页面的链接里,找到它们的列表。或者直接访问:http://www.squid-cache.org/Scripts/
.

最流行的工具之一是Calamaris -- 一个Perl脚本,解析日志文件并产生基于文本的或HTML的报告。它提供关于会话的详细分类包括请求方式、客户端IP地址、原始服务器域名、内容类型、文件名扩展、响应size、以及更多。Calamaris也报告ICP查询会话,甚至其他cache产品的日志分析。其站点是:http://calamaris.cord.de
.

Squeezer以及它的派生Squeezer2,是Squid专有的分析工具。它们提供许多统计,能帮助你了解Squid的性能,特别是在有邻居cache时。两者都产生HTML文件作为输出。squid-cache.org站点的Logfile Analysis页有这些程序的链接。

Webalyzer是另一个有用工具。它运行快速,并且产生带表格和柱形统计表的HTML页面。它原始是设计成分析原始服务器的访问日志的。尽管它能解析Squid的日志,但不会报告诸如命中率和响应时间的事件。它使用的某些条款不同于我的做法。例如,Webalyzer把任何请求叫做一个"命中",这不同于cache命中。它也把"页面"和"文件"加以区别。更多信息请访问Webalyzer的主页:http://www.mrunix.net/webalyzer/.

 

13.3 store.log

store.log记录Squid关于存储或删除cache目标的决定。对每个存在cache里的目标、每个不可cache的目标、以及每个被轮换策略删除的目标,Squid都会创建相应的日志条目。该日志文件内容既包含了内存cache又包含了磁盘cache。

store.log提供了下述不能从access.log获取的内容:

  • 1)某个特定的响应是否被cache。
  • 2)cache目标的文件号。对UFS基础的存储机制,你可转换该文件号到路径名,并且检查cache文件的内容。
  • 3)响应的内容长度:包括Content-Length值和实际的body大小。
  • 4)Date, Last-Modified, 和Expires头部的值。
  • 5)响应的cache关键字(例如MD5哈希值)。

如你所见,这些都是相对低级的信息,在日常管理中可能用不上。除非你要做专业的分析,或打算debug某程序,否则store.log可有可无。可以如下来禁止它:

cache_store_log none

跟其他日志文件一样,Squid将最新的日志条目写到该文件的末尾。某个给定的URI可能出现在日志文件里多次。例如,它先被cache,然后删除,接着又cache住。仅仅最近来的日志条目才反映目标的当前值。

store.log是文本基础的,看起来如下:

1067299212.411 RELEASE -1 FFFFFFFF A5964B32245AC98592D83F9B6EA10B8D 206

    1067299212 1064287906 -1 application/octet-stream 6840/6840

    GET http://download.windowsupdate.com/msdownload/update/v3-19990518/cab...

1067299212.422 SWAPOUT 02 0005FD5F 6F34570785CACABC8DD01ABA5D73B392 200

    1067299210 1057899600 -1 image/gif 1125/1125

    GET http://forum.topsportsnet.com/shf./images/nav_members1.gif

1067299212.641 RELEASE -1 FFFFFFFF B0616CB4B7280F67672A40647DD08474 200

    1067299212 -1 -1 text/html -1/67191

    GET http://www.tlava.com/

1067299212.671 RELEASE -1 FFFFFFFF 5ECD93934257594825659B596D9444BC 200

    1067299023 1034873897 1067299023 image/jpeg 3386/3386

    GET http://ebiz0.ipixmedia.com/abc/ebiz/_EBIZ_3922eabf57d44e2a4c3e7cd234a...

1067299212.786 RELEASE -1 FFFFFFFF B388F7B766B307ADEC044A4099946A21 200

    1067297755 -1 -1 text/html -1/566

    GET http://www.evenflowrocks.com/pages/100303pic15.cfm

1067299212.837 RELEASE -1 FFFFFFFF ABC862C7107F3B7E9FC2D7CA01C8E6A1 304

    1067299212 -1 1067299212 unknown -1/0

    GET http://ebiz0.ipixmedia.com/abc/ebiz/_EBIZ_3922eabf57d44e2a4c3e7cd234a...

1067299212.859 RELEASE -1 FFFFFFFF 5ED2726D4A3AD83CACC8A01CFDD6082B 304

    1066940882 1065063803 -1 application/x-javascript -1/0

    GET http://www.bellsouth.com/scripts/header_footer.js

每个日志条目包含如下13个域:

  • 1. 时间戳

    事件何时发生,表现为Unix纪元以来的秒数,它是毫秒级的。

     

  • 2. 动作

     

  • cache目标发生的动作。该域有3个可能值:SWAPOUT,RELEASE,和SO_FAIL。

     

    • 1)SWAPOUT在Squid成功的存储目标到磁盘时发生。某些目标例如那些消极cache的,仅保存在内存而不是磁盘,Squid不会在store.log里记录它们。

       

    • 2)SO_FAIL表明Squid不能完整的存储目标到磁盘。多半意味着存储机制拒绝以写方式打开新的磁盘文件。

       

    • 3)RELEASE在Squid从cache里删除目标,或首先就决定响应不可存储时发生。

     

  • 3. 目录号

     

  • 目录号是十进制小数形式,它是个到cache目录的7位索引。对没有存储到磁盘的目标,该域包含-1值。

     

  • 4. 文件号

     

  • 文件号是25位的标识符,内在的被squid使用。它被写成8字符的十六进制号。对UFS基础的存储机制,有算法可以转换文件号到路径名(见13.3.1节)。没有存储到磁盘的目标,没有有效的文件号。对这些目标,该域的值是FFFFFFFF。仅仅在RELEASE和SO_FAIL情况下才会出现这个值。

     

  • 5. cache关键字

    Squid使用MD5哈希值作为主要的索引来定位目标。该关键字基于请求方式、URI、和其他可能的信息计算得来。可以从cache关键字来查找store.log条目。然而请注意,目标的cache关键字可能改变。当Squid在access.log里记录TCP_REFRESH_MISS请求时,这点会发生。情况类似如下:

    1065837334.045 SWAPOUT ... 554BACBD2CB2A0C38FF9BF4B2239A9E5 ... http://blah
    
    1066031047.925 RELEASE ... 92AE17121926106EB12FA8054064CABA ... http://blah
    
    1066031048.074 SWAPOUT ... 554BACBD2CB2A0C38FF9BF4B2239A9E5 ... http://blah

    发生了什么呢?该目标原本cache在某个关键字下(554B...)。一段时间后,Squid接受到对该目标的另一请求,并转发确认请求到原始服务器。当响应以新内容返回时,Squid改变旧目标的cache关键字(92AE...),以便它能授予新目标正确的关键字(554B...)。然后旧目标删除,新目标存储到磁盘。

     

  • 6. 状态码

     

  • 该域显示响应的HTTP状态码,跟access.log一样。表13.1是状态码列表。

     

  • 7. 日期

     

  • HTTP响应的Date头部值,表现为Unix纪元以来的秒数。值-1表示Date头部不可解析,-2意味着头部完缺。

     

  • 8. 最后修改时间

     

  • HTTP响应的Last-Modified头部值,表现为Unix纪元以来的秒数。值-1表示Last-Modified头部不可解析,-2意味着头部完缺。

     

  • 9. 过期时间

     

  • HTTP响应的Expires头部值,表现为Unix纪元以来的秒数。值-1表示Expires头部不可解析,-2意味着头部完缺。

     

  • 10. 内容类型

     

  • HTTP响应的Content-Type头部值,排除了任何media-type参数。假如Content-Type丢失了,Squid插入值unknown。

     

  • 11. 内容长度/大小

     

  • 该域包含2个数字,以斜杠分开。第一个是Content-Length头部值。-1表明Content-Length头部不存在。第二个是HTTP消息body的实际大小。你可使用这2个数字来部分的验证接受到的响应,并验证原始服务器是否不正确的计算了内容长度。大多数情形下,这2个数字相等。

     

  • 12. 方式

     

  • 请求目标的HTTP方式,跟access.log里的一样。

     

  • 13. URI

     

  • 最后一个域是请求URI,跟access.log里的一样。该域也有前述章节提到的空格问题。然而,这里不必为此担忧,因为你可安全的忽略任何多余的域。

     

  • 对许多RELEASE的条目,在最后8个域出现的是疑问号(?)。这是因为这些域的大部分值来自squid称为MemObject的结构。该结构仅在目标已被接受时,或目标被完整存储在内存时,才会出现。Squid cache里的大部分目标没有MemObject结构,因为它们仅存在于磁盘。对这些情况,Squid在相应域放置一个疑问号。

 

13.3.1 转换文件号到路径名

假如想要检查某个特定的cache文件,你可稍费工夫将文件号转换到路径名。另外目录号和L1和L2值也是必需的。在squid的源代码里,storeUfsDirFullPath( )函数做这个事情。可在src/fs/ufs/store_dir_ufs.c文件里找到它。如下短小的perl脚本模拟了当前算法:

#!/usr/bin/perl

$L1 = 16;

$L2 = 256;

while (<>) {

    $filn = hex(

第13章 日志文件

13.1 cache.log

cache.log包含多种消息,例如Squid的配置信息、性能警告、以及严重错误。如下是cache.log的

输出样本:

2003/09/29 12:09:45| Starting Squid Cache version 2.5.STABLE4 for i386-unknown-freebsd4.8...    
2003/09/29 12:09:45| Process ID 18990    
2003/09/29 12:09:45| With 1064 file descriptors available    
2003/09/29 12:09:45| Performing DNS Tests...    
2003/09/29 12:09:45| Successful DNS name lookup tests...    
2003/09/29 12:09:45| DNS Socket created at 0.0.0.0, port 1154, FD 5    
2003/09/29 12:09:45| Adding nameserver 24.221.192.5 from /etc/resolv.conf    
2003/09/29 12:09:45| Adding nameserver 24.221.208.5 from /etc/resolv.conf    
2003/09/29 12:09:45| helperOpenServers: Starting 5 'redirector.pl' processes    
2003/09/29 12:09:45| Unlinkd pipe opened on FD 15    
2003/09/29 12:09:45| Swap maxSize 10240 KB, estimated 787 objects    
2003/09/29 12:09:45| Target number of buckets: 39    
2003/09/29 12:09:45| Using 8192 Store buckets    
2003/09/29 12:09:45| Max Mem  size: 8192 KB    
2003/09/29 12:09:45| Max Swap size: 10240 KB    
2003/09/29 12:09:45| Rebuilding storage in /usr/local/squid/var/cache (CLEAN)    
2003/09/29 12:09:45| Using Least Load store dir selection    
2003/09/29 12:09:45| Set Current Directory to /usr/local/squid/var/cache    
2003/09/29 12:09:45| Loaded Icons.    
2003/09/29 12:09:45| Accepting HTTP connections at 0.0.0.0, port 3128, FD 16.    
2003/09/29 12:09:45| Accepting ICP messages at 0.0.0.0, port 3130, FD 17.    
2003/09/29 12:09:45| WCCP Disabled.    
2003/09/29 12:09:45| Ready to serve requests.

每个cache.log条目以时间戳开始,指示消息何时产生。本示例里的日志报告了squid的版本

(2.5.STABLE4),以及squid所运行的操作系统标识符(i386-unknown-freebsd4.8)。接下来

是进程ID(18990)。许多cache.log条目看起来含义不明(例如Target number of buckets: 39)。

大多数正常情形下,可以忽略这些不易理解的条目。另一方面,你也许该仔细看一下本质的配置细节,

例如名字服务器的地址,或HTTP服务器地址。本示例日志最后陈述了Squid准备接受请求。此时

Squid可以接受来自客户端的HTTP连接。

通常,cache.log增长缓慢。然而,不正常的HTTP事务或类似的事件可以导致squid发布一个debug

消息。假如这样的事件经常发生(例如DOS攻击、新的病毒、磁盘意外等),日志文件会增长很快。

定期轮转日志减少了用光磁盘的风险。

主要的错误和异常条件最可能报告在cache.log里。我推荐存档这些日志,以便以后回查事件的源头。

当在Squid的邮件列表或类似论坛描述这些故障时,相应的cache.log非常有用。某些情形下,你也

许应该调大日志的debug级别,以便其他人能更好的理解和修正你的问题。

 

13.1.1 debug级别

debug_options指令控制cache.log的日志级别。默认值(ALL,1)通常是最佳选择。在更高级别上,

不重要的消息会混淆视线。请参考16.2节关于debug_options指令的完整描述。

请注意最高级别的debug(9或10)会对每个请求产生数千行日志,快速消耗磁盘空间和显著影响

squid的性能。

可以使用squid的-X命令行选项来对所有情形激活完整的debug。假如squid拒绝启动,并且

squid.conf里的debug级别不足以诊断问题时,该模式特别有用。这也是在配置文件解析器解析到

debug_options指令之前,激活它的完整debug的好方法。在squid运行正常时,请勿使用-X。

对运行的squid进程,可使用squid的-k debug命令行选项来立刻激活完整debug。这个命令是循环

使用的:第一次调用打开完整debug,第二次调用则关闭它。请见第5章关于-k选项的通用讨论。

如前所述,完整debug会产生难以控制的日志增长。这会使squid和操作系统运行缓慢。在极端情形

下,你会发现终端session在运行第一个squid -k debug命令后,变得没有响应。在squid狂写日志

 

的同时让操作无法进行,这情形并不好。如下技巧也许有用,它获取5秒钟的debug数据快照:

% squid -k debug; sleep 5; squid -k debug

 

13.1.2 转发cache.log消息到系统日志

为了让squid发送cache.log消息的拷贝到系统日志,请使用-s命令行选项。仅仅在debug级别0和1

的消息会被转发。级别0的消息以syslog级别LOG_WARNING记录,级别1的消息以syslog级别

LOG_NOTICE记录。所有消息使用LOCAL4的syslog设备。如下是配置syslogd的一个方法,以便这

些消息能保存下来:

local4.warning                           /var/log/squid.log

在维护多个squid主机时,使用syslog来记录cache.log特别方便。可以配置每个本地syslog进程,

转发这些消息到中央日志主机,这样就可在一个地方统一浏览所有cache日志。例如,可在

/etc/syslogd.conf里使用如下接口:

---------------------------------------------------------------------------

squid的日志很重要。常常要了解的,其中最重要的就是命中率啦,不然反向代理做的用就不大。

#cat access.log|gawk ‘{print $4}’|sort|uniq -c|sort -nr

9568 TCP_IMS_HIT/304
6313 TCP_HIT/200
2133 TCP_MISS /200
1568 TCP_MISS/206
587 TCP_MEM_HIT/200
531 TCP_MISS/304
207 TCP_REFRESH_HIT/200
152 TCP_REFRESH_HIT/304
86 TCP_NEGATIVE_HIT/404
69 TCP_MISS/404
9 TCP_MISS/000
4 TCP_MISS/503
1 TCP_REFRESH_MISS/000
1 TCP_DENIED/400

可以使用上面的方法,大约的分析一下命令中比。什么意思就看下面的详解.

#cat /var/log/squid/access.log |grep TCP_MEM_HIT

如果看到很多的TCP_MEM_HIT ,这表明该文件是从内存缓存读取的,squid已经起作用了!你再用浏览器打开该文件,应该是快如闪电了。。呵呵,大功告成了!还有其他类型的HIT,如TCP_HIT等等,这些是从磁盘 读取的,我觉得加速的意义不大,只不过缓解了apache的压力而已。

相应于HTTP请求,下列标签可能出现在access.log文件的第四个域。

TCP_HIT

Squid发现请求资源的貌似新鲜的拷贝,并将其立即发送到客户端。

TCP_MISS

Squid没有请求资源的cache拷贝。

TCP_REFERSH_HIT

Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器 。原始服务器 返回304(未修改)响应,指示squid的拷贝仍旧是新鲜的。

TCP_REF_FAIL_HIT

Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器。然而,原始服务器响应失败,或者返回的响应Squid不能理解。在此情形下,squid发送现有cache拷贝(很可能是陈旧的)到客户端。

TCP_REFRESH_MISS

Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器。原始服务器响应新的内容,指示这个cache拷贝确实是陈旧的。

TCP_CLI ENT_REFRESH_MISS

Squid发现了请求资源的拷贝,但客户端的请求包含了Cache-Control: no-cache指令。Squid转发客户端的请求到原始服务器,强迫cache确认。

TCP_IMS_HIT

客户端发送确认请求,Squid发现更近来的、貌似新鲜的请求资源的拷贝。Squid发送更新的内容到客户端,而不联系原始服务器。

TCP_SWAPFAIL_MISS

Squid发现请求资源的有效拷贝,但从磁盘装载它失败。这时squid发送请求到原始服务器,就如同这是个cache丢失一样。

TCP_NEGATIVE_HIT

在对原始服务器的请求导致HTTP错误时,Squid也会cache这个响应。在短时间内对这些资源的重复请求,导致了否命中。 negative_ttl指令控制这些错误被cache的时间数量。请注意这些错误只在内存cache,不会写往磁盘。下列HTTP状态码可能导致否定 cache(也遵循于其他约束): 204, 305, 400, 403, 404, 405, 414, 500, 501, 502, 503, 504。

TCP_MEM_HIT

Squid在内存cache里发现请求资源的有效拷贝,并将其立即发送到客户端。注意这点并非精确的呈现了所有从内存服务的响应。例如,某些cache在内存里,但要求确认的响应,会以TCP_REFRESH_HIT, TCP_REFRESH_MISS等形式记录。

TCP_DENIED

因为http_access或http_reply_access规则,客户端的请求被拒绝了。注意被http_access拒绝的请求在第9域的值是NONE/-,然而被http_reply_access拒绝的请求,在相应地方有一个有效值。

TCP_OFFLINE_HIT

当offline_mode激活时,Squid对任何cache响应返回cache命中,而不用考虑它的新鲜程度。

TCP_REDIRECT

重定向程序告诉Squid产生一个HTTP重定向到新的URI(见11.1节)。正常的,Squid不会记录这些重定向。假如要这样做,必须在编译squid前,手工定义LOG_TCP_REDIRECTS预处理指令。

NONE

无分类的结果用于特定错误,例如无效主机名。

相应于ICP查询,下列标签可能出现在access.log文件的第四域。

UDP_HIT

Squid在cache里发现请求资源的貌似新鲜的拷贝。

UDP_MISS

Squid没有在cache里发现请求资源的貌似新鲜的拷贝。假如同一目标通过HTTP请求,就可能是个cache丢失。请对比UDP_MISS_NOFETCH。

UDP_MISS_NOFETCH

跟UDP_MISS类似,不同的是这里也指示了Squid不愿去处理相应的HTTP请求。假如使用了-Y命令行选项,Squid在启动并编译其内存索引时,会返回这个标签而不是UDP_MISS。

UDP_DENIED

因为icp_access规则,ICP查询被拒绝。假如超过95%的到某客户端的ICP响应是UDP_DENIED,并且客户端数据库 激活了(见附录A),Squid在1小时内,停止发送任何ICP响应到该客户端。若这点发生,你也可在cache.log里见到一个警告。

UDP_INVALID

Squid接受到无效查询(例如截断的消息、无效协议版本、URI里的空格等)。Squid发送UDP_INVALID响应到客户端。

---------------------------------------------------------------------------------------------

squid反向代理对后端进行负载均衡

八月 6th, 2008 Posted in Squid
< by Johnny Woo >

修改squid.conf文件
cache_peer 10.11.12.151 parent 80 0 no-query originserver name=web1 round-robin
cache_peer 10.11.12.146 parent 80 0 no-query originserver name=web2 round-robin
cache_peer_domain web1 web2 .test.com

这样访问squid时,
squid会从后端的实际服务器中挑选一台进行抓取
例子中使用的是RR的方法轮询
squid同时会对后端的健康状态进行检查
如果后端服务器down了
那么squid会从剩余的origin服务器中抓取数据

发表在 article | 标签为 | 418条评论

大型高负载的网站的体系结构和web2.0时代的网站高负载解决方案

从事发布系统(web publish system)的研究和开发快两年了,从小型应用到中型应用,基本上没有参与大型应用(千万pv/day)的部署,网络上这种技术
的探讨都不是特别全面,有的提及发布系统对分布式部署,以及海量负载,有的干脆只层网络层面进行讲解,我感觉这是个系统工程,不仅要考虑到应用层面(user layer or app layer),也要考虑到系统层面(kernel layer or system layer),还要考虑到数据库
层面(database layer),否则可能有失偏颇。

       我现在从三个层面就我的理解说一些我的一些看法,碍于知识和实践的局限性,也会相当有限。

       所谓应用层面指的是前端应用,因为对网站来说,网友接触最多的就是前端页面,影响负载的很大程度上也是每天上千万的page view带来的visit,对web1.0的网站来说,前端页面往往都是静态化的,即html化的,这也是为了降低负载,因为web应用服务器解析 html页面的速度是最快的,而页面的静态化一般都是由web级的(主要)和桌面局域网级别的(很少)发布平台发布的,基于分布式的考虑,发布系统最好能够分发产生的html页,分发到光纤或者高速局域网中的不同host上,以便分散访问压力。当然也可以使用系统层的同步工具完成这个工作
,注意要对页面的域名对应信息进行保存,防止产生404 error。我个人比较喜欢系统层的网络同步,速度比较快,稳定性也比较高。应用层的分发一般借助ftp的方式,速度不是特别快,容易产生拥塞,稳定性自然下降。

       如果分布式的分发静态页面仍然存在瓶颈,怎么办?国内大型的门户网站往往采取可缓存的反向代理方式部署的负载均衡技术来解决,一般都是squid做前端 cache和反向代理。负载均衡也有软件级的(dns 轮询)负载均衡和硬件上的负载均衡甚至两者的结合进行实现,具体实施细则将在下一篇中进行阐述。说到静态化,也不只是web1.0的传统新闻门户采用, web2.0的应用前端也可静态化,或者部分静态化,比如:社区型门户,帖子就可以静态化,可以采取即时静态或者异步静态的方式,也可以触发静态化。这种静态化可以降低数据库层的压力,数据库服务器如果始终工作在大负载的访问压力下,很容易崩溃,尽可能的将经常用到的数据静态化,缓存起来会极大的降低压力。(猫扑、网易、搜狐等社区都是采用的这种方式)

        上文提到了静态化能减轻数据库服务器的压力,可是却影响了更新的即时性,有些应用需要数据的即时显示,不允许缓存或者静态化,这就需要对数据库服务器的结构进行合理部署。除了要在设计应用之初,很好的设计数据库结构,使用好的模式之外,还要对数据库服务器进行分布式部署甚至库表散列。在数据库集群 (database culuster)方面,很多数据库都有不错的解决方案,包括Oracle、Sybase甚至mysql,只不过mysql采用的是master+ slave的结构,选用了何种数据库,就参照相应的解决方案进行部署。除了在数据库选择上进行负载均衡之外,也可以在单数据库本身进行考虑,比如库表的散列,根据应用的特点,将大的、影响性能的数据库或者数据库的单表进行散列、拆分。比如:按用户id进行散列,按分类进行散列,或者按地区进行散列。

         说到系统层,可能就是OS和Web Server了,大型应用的OS基本都是Unix(包括freebsd或者HP Unix等)或者类Unix(各种linux
版本,redhat居多),这不是说Microsoft的OS就不合理了,合理的应用也可部署大型应用,只不过效能会很受限制。Web Server层面,还是apache当家,尤其是静态页和图片,当然也可以根据具体的需求,根据内容的特殊性选择Lighttpd(比较适合做纯静态、图片服务器、视频服务器等)、甚至iis(windows
下用的居多),系统层的web服务器的配置还是很有讲究的,比如对cache的配置,反向代理的配置等。比较好的web加速和代理服务器有:Squid、Nginx、HAProxy、Lighttpd,这四个可能是用的比较多的了。其中业内比较出名的 Flickr、tudou用的是lighttpd,sina和51.com使用了,至少部分使用了Nginx。

        缓存系统对高负载的重要性是不言而喻的,前面提到的静态化,需要进行有效缓存,经常用到的查询和结果需要进行缓存,只要设定好更新缓存的规则,对性能的提升是n个数量级的。Linux下,有内存级别的缓存,高速缓存,很多应用都是用tmpfs来进行数据中转,php上用的最多的是memcached, apache有文件系统级别的cache,squid也是做前端cache的主要手段。腾讯、网易等都是用了squid做前端cache server。

       前面提到的负载均衡,有软件级别的,比如LVS、HAProxy、Linux-HA项目等,硬件层面的诸如:f5的BigIp、3DNS,alton的解决方案,北电的方案等,都是比较成熟的,不过都需要付出相当可观的¥。

 

       以前谈到过关于高负载、大访问量的门户型web1.0网站的体系结构,提到了许多诸如front-end cache,clustered database,proxy server,cdn等技术,随着web2.0
的温度越来越high,web2.0的一些代表性网站的体系结构也被晒了出来,我在这里进行简单的整理,呈现给大家。

       案例1:豆瓣

      豆瓣是由阿北
(杨勃) 花4个多月时间(很神速,关键是胸有成竹),基于linux+lighttpd+fastcgi+python+quixote+mysql架构部署的 web2.0网站,豆瓣的搜索引擎使用twisted,这个是豆瓣的后台,书的价格以及比较信息都是在此之上搜索各大购物网站而来的,mysql用了 innodb和myisam两种引擎,读/写频繁的用innodb,读多写少、写多读少(比如log)或者需要full text index的用myisam,replication/cluster做数据复制和集群,晚上用mysqldump做backup。

        案例2:youtube

       出于开发效率的考虑,youtube的大部分代码都是python
的, web server有两种,一种是apache+fastcgi,另一种是lighttpd(主要做为视频内容服务器),youtube可能是lighttpd 最好的案例。youtube每一个视频都有4个缩略图(Thumbnails),这个缩略图的产生对服务器的负载是个极大的考验,每一秒都给disk的 i/o带来压力,youtube采用了独立的服务器culuster来应对这方面的压力,也对操作系统
和缓存做了优化。另外,缩略图的request也导致了lighttpd性能下降,通过 Hack Lighttpd 增加更多的 worker thread很大程度解决了这个问题,被google收购以后,开始使用google的存储法宝bigtable,一下子提升了在 performance、redundancy、cache等方面的表现。(看来这次收购还是效果颇大)出于redundancy的考虑,每一个 video都放到一组mini cluster上,这组mini cluster上存储了相同内容的视频,the hotest video放在了cdn上,使压力分布到不同的节点上,非热门的,访问量不高的自己进行单独处理。维护的工具也是常见的rsync(同步工具)、ssh (远程登录)等。数据库上,youtube跟很多web2.0的站点一样,偏向使用mysql,主要是存储一些meta data,诸如视频信息、图片信息、用户信息等。youtube通过删除swap交换分区来解决数据库遇到的swap颠簸问题。

         youtube最初的 DB 只有 10 块硬盘,后来追加了一组 RAID1。在扩展性方面,采用的是主流的方式,master/slave复制(replication),分散IO。最终的解决之道是是业务层面的分区(在用户名字或者 ID 上做文章,应用程序控制查找机制),而不是物理上的数据库层面的表分区。youtube也用了memcached

       案例3:myspace

       myspace有6500万的订阅者(还在上升),是因特网上增长最快的网站之一,每天还有260,000新用户注册。它经常因为性能问题而受指责, MySpace不得不处理其他
网站很少碰到的或大或小的一些问题。它们是怎么做的呢? 使用的平台是 ASP.NET 2.0 + Windows + IIS + SQL
Server ,myspace 每天处理15亿的页面查看,白天处理230万并发的用户,在50万用户的时候,采用简单的磕磕绊绊的体系结构,100万用户时进行了痛苦的垂直分割解决伸缩性,300万用户时Scale-Out 胜过Scale-Up(按比例增加), 900万用户的时候,站点迁移到ASP.NET,增加了虚拟存储,260万用户的时候myspace采用了64位技术,当小于300万个帐号的时候,他们使用了一种数据库体系结构,围绕着垂直分割的概念,提供不同服务比如界面登录,用户资料和博客等的网站的各部分都有单独的数据库。垂直分割方案有助于分开数据库读和写的工作量,并且当用户需要一个新特征时,MySpace 将会加入一个新的在线数据库来支持它。MySpace 从直接使用附着于它的数据库的服务器的存储设备转换到一个存储区域网络(SAN),里面大量的磁盘存储设备由一个高速,专用网络联系到一块,同时数据库连接到SAN。到SAN的改变提高了性能,正常运行时间和可靠性。 当超过300万个帐号的时候,垂直分割解决方案就不好使了,因为它们重复了一些水平的信息像跨过所有垂直片的用户帐号。有这么多的重复它会使系统变慢,肯定要失败。个人应用比如Web 站点子部分上的博客将会增长到对于单独一个数据库服务器来说太大的程度,在逻辑上重组所有核心数据到一个数据库里
,把它的用户基本信息分成100万帐号一个的块,然后把所有有键的数据放到SQL Server不同实例的这些帐号中,在 900万-1700万帐号这个阶段,迁移到ASP.NET后,使用了比先前的体系结构更少的资源。150个服务器运行新的代码就能够做原来246个服务器做的同样的工作。再看看存储瓶颈,实施SAN解决了原来的一些性能问题,但是现在Web站点的需求开始间歇性地超过了SAN的I/O能力,它从磁盘存储读写的速度,使用每个数据库100个帐号的分开方式达到了极限,因为这已经超过了极限;迁移到一个虚拟存储体系结构,那里整个SAN被当作一个大的存储池来对待,不需要特定的磁盘为特定的应用服务。现在MySpace在设备上从相对新的SAN厂商,3PARdata方面已经标准化了。增加了一个高速缓存层,服务器放在Web服务器和数据库服务器之间,它唯一的工作就是捕获内存中频繁访问的数据对象的副本,然后把它们用于Web应用,不需要数据库查询。超过2600万注册帐号后,开始迁移到64位SQL server以解决它们的内存瓶颈问题。它们的标准数据库服务器配置使用64GB的RAM。

      Myspace的经验告诉我们:你可以使用微软
的技术构建大型网站;从一开始就应该使用缓存;高速缓存是一个更好的地方存储临时数据,比如Web站点上跟踪一个特定用户的会话产生的临时文
件,就不再需要记录到数据库里;嵌入OS特征来检测拒绝服务攻击会产生无法解释的错误;把数据分布到地理位置不同的数据中心,以免发生断电事故。从开始就考虑使用虚拟存储/簇文件系统。它能让你大量并行IO访问,而且不需要任何重组就能够增加所需要的磁盘。

发表在 article | 大型高负载的网站的体系结构和web2.0时代的网站高负载解决方案已关闭评论