BOM–字节序标记

读代码的时候看到这样一段
$template_content = str_replace(“\xEF\xBB\xBF”, ”, $template_content);
不知道是何作用,经过一番查找资料,终于解开了这个疑问
资料如下:

在window下面用记事本编辑文件的时候,如果保存为UNICODE或UTF-8,分别会在文件的开头加上两个字节“\xFF\xFE”和三个字节“\xEF\xBB\xBF”。在读取的时候就可能会遇到问题,但是不同的环境对这几个多于字符的处理也不一样。(其他的文本编辑工具也存在这个问题,但是可以选择去除bom,如editplus的设置:参数选择->文件->utf-8, 选择总是删除签名)
如果前面三个字符“\xef\xbb\xbf”则保存格式是utf-8
如果前两个字符是“\xff\xfe”则保存格式是Unicode
Unicode规范中有一个BOM的概念。
BOM——Byte Order Mark,就是字节序标记。在这里找到一段关于BOM的说明:
在UCS 编码中有一个叫做”ZERO WIDTH NO-BREAK SPACE”的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符”ZERO WIDTH NO-BREAK SPACE”。这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little- Endian的。因此字符”ZERO WIDTH NO-BREAK SPACE”又被称作BOM。
UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符”ZERO WIDTH NO-BREAK SPACE”的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。Windows就是使用BOM来标记文本文件的编码方式的。
容易导致header session_star ob_start的问题,utf-8编码的文件中,BOM占3个字节,由于php设计时没有考虑BOM的问题,这三个字节会直接输出,如果这时在程序里调用了session函数,就会出问题了
附:文件应该使用 Unicode (UTF-8) 编码保存。同时不要使用 字节序标记(BOM) 。与 UTF-16 和 UTF-32 不同,UTF-8 编码的文件不需要指明字节序,而且 字节序标记(BOM) 在PHP中会产生预期之外的输出,阻止了应用程序设置它自己的 头信息。应该使用Unix 格式的行结束符(LF)。

freebsd下 nginx 日志每天分割

#!/bin/sh
date
today=`date +"%Y_%m_%d"`
logdir=/pub/log
daydir=/pub/log/$today
expdays=7
if [ ! -d $daydir ] ; then
 mkdir -p $daydir
fi

cp /pub/log/wwwlogs.log $daydir/wwwlogs.log

#清空当前日志
/usr/bin/true > /pub/log/wwwlogs.log
#删除7天前的过期文件
#find $daydir -type d -mtime +$expdays -maxdepth 1 | xargs rm -rf

#每天12点运行
#0      0       *       *       *       /cut_nginx_log.sh

Mysql安装&同步

mysql压缩文件格式的MySQL二进制分发版

一.   安装的软件

1.  Red Hat Enterprise Linux 4.0 update5

2.  mysql-5.0.45-linux-i686-icc-glibc23.tar.gz

二、装步骤如下:

首先检查是否安装了Red Hat Enterprise Linux 4.0中自带的mysql服务,检查系统是否安装了mysql软件包,在终端执行如下命令:

Shell> rpm –aq | grep mysql –ri

显示如下:

mysql-4.1.12-3.RHEL4.1

Mod_auth_mysql-2.6.1-2.2   等软件包

在安装mysql二进制分发版之前请先卸载mysql  rpm软件包

 

Shell> rpm e mysql-4.1.12-3.RHEL4.1 将相关的rpm包逐一掉。

 

shell> groupadd mysql

shell> useradd -g mysql mysql    mysql增加一个登录用户和组

shell> cd /usr/local

shell> tar –zxvf mysql-5.0.45-linux-i686-icc-glibc23.tar.gz

shell> ln -s mysql-5.0.45-linux-i686-icc-glibc23  mysql

shell> cd mysql

shell> scripts/mysql_install_db –user=mysql

 /*如果你用root运行命令,应当使用–user选项。选项的值应与你在第一步为运行服务器所创建的登录账户相同。如果你用该用户登录来运行命令,可以省略–user选项。*/

shell> chown -R root  .

shell> chown -R mysql data

shell> chgrp -R mysql .

 /* 第一个命令将文件的所有属性改为root用户。第二个命令将数据目录的所有属性改为mysql用户。第三个命令将组属性改为mysql  */

shell> cp support-files/my-medium.cnf  /etc/my.cnf

shell> cp support-files/mysql.server    /etc/init.d/mysql

shell> chmod +x    /etc/init.d/mysql

shell> chkconfig –add mysql

shell> chkconfig  – -level 345 mysql on  /* mysql添加为服务*/

shell> chkconfig  – -list mysql          /* mysql level服务状态*/

shell> bin/mysqld_safe –user=mysql &   /* 命令启动MySQL服务器  */

 或者shell> service mysql start  /* 启动mysql */

shell> service mysql stop /* 停止mysql*/

至此,mysql的安装基本完成!

 

三、优化:对以下参数进行调整

show variables like ‘key_buffer_size’;

show variables like ‘max_allowed_packet’;

show variables like ‘table_cache’;

show variables like ‘sort_buffer_size’;

show variables like ‘read_buffer_size’;

show variables like ‘read_rnd_buffer_size’;

show variables like ‘myisam_sort_buffer_size’;

show variables like ‘thread_cache_size’;

show variables like ‘query_cache_size’;

 

set global key_buffer_size=384000000;

set global max_allowed_packet = 1000000;

set global table_cache = 512;

set global sort_buffer_size = 2000000;

set global read_buffer_size = 2000000;

set global read_rnd_buffer_size = 8000000;

set global myisam_sort_buffer_size = 64000000;

set global thread_cache_size = 8;

set global query_cache_size = 32000000;

 

low_priority_updates

show variables like ‘%low_priority_u%’;

SET LOW_PRIORITY_UPDATES=1

Start mysqld with –low-priority-updates

 

添加:/etc/my.cnf/ 

long_query_time = 1

log_slow_queries=mydatabase-slwqry

 

修改:max_connection=1500  默认:max_connection=100

三、Mysql数据库数据同步实现

    两台安装一样的系统,都是linux as4Mysql的版本是5.0.45,都是目前最新的版本。

A服务器: 192.168.1.13主服务器master
B
服务器: 192.168.1.14 副服务器slave
Master
服务器设置:
shell>to_path/ bin/mysql  –uroot  –p
mysql>grant replication slave on *.* to ‘slaver’@‘192.168.1.14’ identified by ‘password’;

/* 在主服务器上为服务器设置一个连接账slaver,连接密码是password该账户必须授予REPLICATION SLAVE权限。如果账户仅用于复制(推荐这样做),则不需要再授予任何其它权限。*/

mysql>flush tables with read lock;    //停止数据库的写状态


导出Master的数据库到slave的机器,可以选择导出需要同步的数据库或者打包需要同步的数据库

Shell>tar zcvf  mydatabase.slave.tar.gz  /usr/local/mysql/data/mydatabase

movivi1.slave.tar.gz传输到slave /usr/local/mysql/data/并且释放
Master机器上修改/etc/my.cnf
[mysqld]区段内加入参数
log-bin=mysql-bin
server-id=1
binlog_do_db = mydatabase   //
要同步的数据库
binlog_ignore_db = mysql,test,information_schema
recommendation                           // 不需要同步的库,5.0 information_schema这个库
sql-bin-update-same  //同步形式 该参数在很多方案中都有用到, 我在测试过程中使用该参数,发现数据库启动时会报错,故没有使用该参数,具体不会影响数据库主从同步。
重启Master服务器的mysql服务或者

Shell> unlock tables   //解除数据库表的写状态

Shell>show master status//查看主数据库的状态

 

B服务器设置
设定/etc/my.cnf
[mysqld]区段加入

server-id = 2 (如果还有slave用户,他们的ID也随之增加,如server-id=3
master-host = 192.168.13      //
同步的master IP
master-user = slaver          //
同步用的用户名
master-password =password   //
同步用的密码

replicate-do-db =mydatabase     //设置同步的数据库,如果多个库,再重新添加一行

log_err =movivi-err.log      //设置错误日志文件名
log-slave-updates           //
同步的形式
master-port=3306           //
同步端口
master-connect-retry = 60    //
同步时间

–slave-skip-errors=1062,1053 //跳过出错的信息

–slave-skip-errors=all


//在从服务器上执行下面的语句,用你的系统的实际值替换选项值:

mysql> CHANGE MASTER TO

 ->     MASTER_HOST=’192.168.1.13′,

     ->     MASTER_USER=’slaver’,

     ->     MASTER_PASSWORD=’password’,

    ->     MASTER_LOG_FILE=’recorded_log_file_name’,//mysql-bin.0002

     ->     MASTER_LOG_POS=recorded_log_position;//show master status;

最后两行参数可以不选。或者show master status;获取主数据库binlog日志在当前时间点的状态。
重启B服务器的MYSQL
在数据库的文件夹里有master.info文件,用来查看同步信息。如果同步参数设置不正确,导致数据库不能同步,在修改了/etc/my.cnf后重启mysqlshell>stop slave Shell>start slave;它不会覆盖master.info的内容,必须先手动删除master.info再重新启动slave服务。

mysql> show processlist;   //看到两个 system user 就是正常的

Mysql> stop slave  //停止slave服务器

Mysql>start slave  //启动slave服务器,开启了slave就可以同步了

Mysql> show slave status;  //看看同步的状态

 

mysql> show slave status\G

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.1.13

Master_User: slaver

Master_Port: 3306

Connect_Retry: 60

 Master_Log_File: mysql-bin.000021

Read_Master_Log_Pos: 67406

Relay_Log_File: master-relay-bin.000117

Relay_Log_Pos: 2195

Relay_Master_Log_File: mysql-bin.000021

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Replicate_Do_DB: mydatabase

Replicate_Ignore_DB:

Replicate_Do_Table:

eplicate_Ignore_Table:

Replicate_Wild_Do_Table:

Replicate_Wild_Ignore_Table:

Last_Errno: 0

Last_Error:

Skip_Counter: 99654

Exec_Master_Log_Pos: 67406

Relay_Log_Space: 2195

Until_Condition: None

Until_Log_File:

Until_Log_Pos: 0

 Seconds_Behind_Master: 0

四.测试
mastermydatabase库里建立test表,并且插入数据,然后检查slave有没有同步这些数据,就能够检查出是否设置成功。

 

五、其它

1.  mysql 并发连接问题,最大多少?同时多少用户在线, 平均每个用户多少时间访问一次页面,平均一个页面有多少个SQL查询. 平均一个SQL查询需要花费多少时间(单线程情况下).

当然这些都是平均数据, 肯定有高峰和极端情况的.此外,你的数据库SQL查询和数据库规模关系大不大, 100W条下的执行时间和1000W条下的执行时间也可能不同.基本上这样你就可以大约知道你的数据库服务器可以支持多少用户同时在线.

单线程情况下,1个查询执行10ms,那么100个查询同时执行,每个查询基本上就是等待1s(因为是单线程,也就不用考虑锁定,线程切换等开销)实际上一个Mysql做的好的话可以达到2000多Query的。这里的最大连接数并不是并发数目有不少人经常出现 超过连接数而被拒绝连接的情况,这时候可以适当增加max connetions

如果自己不是很清楚,可以设为1024

2. .查看mysql设置参数

$mysqladmin -u root -p variables;

.开启服务器

$/etc/rc.d/init.d/mysqld start

$mysqld_safe –user=mysql &

$/etc/rc.d/init.d/mysqld stop

$mysqladmin shutdown -u root -p

.优化表

mysql>optimize table tblA,tblB;

[进行优化并检查修复任务]

$mysqlcheck -o dbname tblA tblB tblC -u root -p

.对表进行分析

mysql>analyze table tblA;

$mysqlcheck -a dbname [tblA tblB tblC ] -u root -p

.对表进行检查

mysql>check table tblA,tblB,tblC;

.赋权

mysql>grant all on dbname.* to username@ identified by ‘localhostpassword’

刷新权限表

mysql>flush privileges;

 

原文 http://blog.chinaunix.net/u/19637/showart_464668.html

Nginx + PHP mysql_pconnect = Database errors (Too many connections)

If you’re using NGinx spawn-cgi or FPM with PHP and calling mysql_pconnect, you are likely going to experience frequent database crashes and “Too many connections” errors.

This took a while to trace, but once you understand the issue, it all makes sense.

mysql_pconnect opens a “persistent” connection to the database. From the documentation: “the connection to the SQL server will not be closed when the execution of the script ends. Instead, the link will remain open for future use (mysql_close() will not close links established by mysql_pconnect()).”

The issue is that FPM keeps a number of php-cgi processes running in the background to process php scripts. These php-cgi processes never die and so MySQL connections keep open forever…

Sooner or later, you are going to run out of MySQL connections (or worse yet – run out of file descriptors) and that’s when all hell breaks loose.

And if that’s not enough, after doing some digging into mysql_pconnect I found a few additional reasons NOT to use mysql_pconnect:

1. If you use mysql_pconnect on a machine that has a local database and you are connecting to a remote database, PHP will try to use the same mysql connection for both databases.

2. Temporary tables don’t work with persistent connections (they are only visible to the connection that was used to open the table)

3. Setting charset variables on a persistent connection, is going to impact all future queries on that connection as well

4. Calling mysql_pconnect twice (in the same script) with different parameters doesn’t work as expected

5. PHP 4.1 on Apache running with MySQL persistent connections, is known to memory leak (not flushing properly).

Bottom line, never ever use mysql_pconnect.

Replace all occurrences of mysql_pconnect with mysql_connect in your code and in your php.ini file, prevent persistent connections:

[MySQL] 
; Allow or prevent persistent links. 
mysql.allow_persistent = Off 

原文 http://www.softwareprojects.com/resources/programming/t-nginx-+-php-mysql_pconnect–database-errors-too-m-1751.html

tar zxfk filename.tar.gz -k,–keep-old-files 不覆盖已存在文件

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明。
http://windtear.net/archives/2005/09/22/000777.html

倒数据当然推荐rsync
不过当文件数超级多 或者网络条件等不具备时 tar 打包就是首选了

数据运到目的地后 解包时需要注意别覆盖

tar 工具的 -k 参数就提供干这事
-k,–keep-old-files 不覆盖已存在文件

-k, –keep-old-files
keep existing files; don’t overwrite them from archive

如:
tar zxfk filename.tar.gz

tar命令详解 (推荐)

tar [-cxtzjvfpPN] 文件与目录 …

参数:

-c :建立一个压缩文件的参数指令(create 的意思);
-x :解开一个压缩文件的参数指令!
-t :查看 tarfile 里面的文件!
特别注意,在参数的下达中, c/x/t 仅能存在一个!不可同时存在!因为不可能同时压缩与解压缩。

-z :是否同时具有 gzip 的属性?亦即是否需要用 gzip 压缩?
-j :是否同时具有 bzip2 的属性?亦即是否需要用 bzip2 压缩?
-v :压缩的过程中显示文件!这个常用,但不建议用在背景执行过程!
-f :使用档名,请留意,在 f 之后要立即接档名喔!不要再加参数!
例如使用『 tar -zcvfP tfile sfile』就是错误的写法,要写成『 tar -zcvPf tfile sfile』才对喔!

-p :使用原文件的原来属性(属性不会依据使用者而变)
-P :可以使用绝对路径来压缩!
-N :比后面接的日期(yyyy/mm/dd)还要新的才会被打包进新建的文件中!
–exclude FILE:在压缩的过程中,不要将 FILE 打包!
范例:

范例一:将整个 /etc 目录下的文件全部打包成为 /tmp/etc.tar

[root@linux ~]# tar -cvf /tmp/etc.tar /etc <==仅打包,不压缩! [root@linux ~]# tar -zcvf /tmp/etc.tar.gz /etc <==打包后,以 gzip 压缩 [root@linux ~]# tar -jcvf /tmp/etc.tar.bz2 /etc <==打包后,以 bzip2 压缩 # 特别注意,在参数 f 之后的文件档名是自己取的,我们习惯上都用 .tar 来作为辨识。 # 如果加 z 参数,则以 .tar.gz 或 .tgz 来代表 gzip 压缩过的 tar file ~ # 如果加 j 参数,则以 .tar.bz2 来作为附档名啊~ # 上述指令在执行的时候,会显示一个警告讯息: # 『tar: Removing leading `/’ from member names』那是关於绝对路径的特殊设定。 范例二:查阅上述 /tmp/etc.tar.gz 文件内有哪些文件? [root@linux ~]# tar -ztvf /tmp/etc.tar.gz # 由於我们使用 gzip 压缩,所以要查阅该 tar file 内的文件时, # 就得要加上 z 这个参数了!这很重要的! 范例三:将 /tmp/etc.tar.gz 文件解压缩在 /usr/local/src 底下 [root@linux ~]# cd /usr/local/src [root@linux src]# tar -zxvf /tmp/etc.tar.gz # 在预设的情况下,我们可以将压缩档在任何地方解开的!以这个范例来说, # 我先将工作目录变换到 /usr/local/src 底下,并且解开 /tmp/etc.tar.gz , # 则解开的目录会在 /usr/local/src/etc 呢!另外,如果您进入 /usr/local/src/etc # 则会发现,该目录下的文件属性与 /etc/ 可能会有所不同喔! 范例四:在 /tmp 底下,我只想要将 /tmp/etc.tar.gz 内的 etc/passwd 解开而已 [root@linux ~]# cd /tmp [root@linux tmp]# tar -zxvf /tmp/etc.tar.gz etc/passwd # 我可以透过 tar -ztvf 来查阅 tarfile 内的文件名称,如果单只要一个文件, # 就可以透过这个方式来下达!注意到! etc.tar.gz 内的根目录 / 是被拿掉了! 范例五:将 /etc/ 内的所有文件备份下来,并且保存其权限! [root@linux ~]# tar -zxvpf /tmp/etc.tar.gz /etc # 这个 -p 的属性是很重要的,尤其是当您要保留原本文件的属性时! 范例六:在 /home 当中,比 2005/06/01 新的文件才备份 [root@linux ~]# tar -N ‘2005/06/01′ -zcvf home.tar.gz /home 范例七:我要备份 /home, /etc ,但不要 /home/dmtsai [root@linux ~]# tar –exclude /home/dmtsai -zcvf myfile.tar.gz /home/* /etc 注意:经本人测试后发现相对用相对路径和绝对路径有不同的结果,请注意区分以下差别: #tar cvf aaa.tar --exclude='/export/home/ipnet/tools/old/tools.client' old old/ old/tools.client/ old/tools.client/conf.ini old/tools.client/tools.jar old/tools.client/fping old/tools.client/run.sh old/tools.client/fping.linux old/tools.client/nohup.out old/tools.server/ old/tools.server/run.sh old/tools.server/startserver old/tools.server/tools.jar old/tools.server/nohup.out -------------------------------------------------------------- #tar cvf bbb.tar --exclude='tools.client' old old/ old/tools.server/ old/tools.server/run.sh old/tools.server/startserver old/tools.server/tools.jar old/tools.server/nohup.out #tar cvf aaa.tar --exclude='tools.client' old old/ old/tools.server/ old/tools.server/run.sh old/tools.server/startserver old/tools.server/tools.jar old/tools.server/nohup.out old/aaa.tar #tar cvf aaa.tar --exclude='tools.client/' old old/ old/tools.client/ old/tools.client/conf.ini old/tools.client/tools.jar old/tools.client/fping old/tools.client/run.sh old/tools.client/fping.linux old/tools.client/nohup.out old/tools.server/ old/tools.server/run.sh old/tools.server/startserver old/tools.server/tools.jar old/tools.server/nohup.out old/aaa.tar 范例八:将 /etc/ 打包后直接解开在 /tmp 底下,而不产生文件! [root@linux ~]# cd /tmp [root@linux tmp]# tar -cvf - /etc | tar -xvf - # 这个动作有点像是 cp -r /etc /tmp 啦~依旧是有其有用途的! # 要注意的地方在於输出档变成 - 而输入档也变成 - ,又有一个 | 存在~ # 这分别代表 standard output, standard input 与管线命令啦! http://hi.baidu.com/netalang/blog/item/a0feca02ddb94dea08fa9309.html

Netseek牛年拜年力作:Nginx 常见应用技术指南[Nginx Tips] 第二版

作者:NetSeek http://www.linuxtone.org (IT运维专家网|集群架构|性能调优)
欢迎转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明.
首发时间: 2008-11-25 更新时间:2009-1-14

目 录
一、 Nginx 基础知识
二、 Nginx 安装及调试
三、 Nginx Rewrite
四、 Nginx Redirect
五、 Nginx 目录自动加斜线:
六、 Nginx Location
七、 Nginx expires
八、 Nginx 防盗链
九、 Nginx 访问控制
十、 Nginx日志处理
十一、 Nginx Cache
十二、 Nginx负载均衡
十三、 Nginx简单优化
十四、 如何构建高性能的LEMP环境
十五、 Nginx服务监控
十六、 常见问题与错误处理.
十七、 相关资源下载

【前言】:
编写此技术指南在于推广普及NGINX在国内的使用,更方便的帮助大家了解和掌握NGINX的一些使用技巧。本指南很多技巧来自于网络和工作中或网络上朋友们问我的问题.在此对网络上愿意分享的朋友们表示感谢和致意!欢迎大家和我一起丰富本技术指南提出更好的建议!请朋友们关注: http://www.linuxtone.org 技术分享社区! 互想学习共同进步!

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

2、 Nginx的优点
nginx做为HTTP服务器,有以下几项基本特性:
1) 处理静态文件,索引文件以及自动索引;打开文件描述符缓冲.
2) 无缓存的反向代理加速,简单的负载均衡和容错.
3) FastCGI,简单的负载均衡和容错.
4) 模块化的结构。包括gzipping, byte ranges, chunked responses, 以及 SSI-filter等filter。如果由FastCGI或其它代理服务器处理单页中存在的多个SSI,则这项处理可以并行运行,而不需要相互等待。
5) 支持SSL 和 TLS SNI.

Nginx专为性能优化而开发,性能是其最重要的考量, 实现上非常注重效率 。它支持内核Poll模型,能经受高负载的考验, 有报告表明能支持高达 50,000 个并发连接数。
Nginx具有很高的稳定性。其它HTTP服务器,当遇到访问的峰值,或者有人恶意发起慢速连接时,也很可能会导致服务器物理内存耗尽频繁交换,失去响应,只能重启服务器。例如当前apache一旦上到200个以上进程,web响应速度就明显非常缓慢了。而Nginx采取了分阶段资源分配技术,使得它的CPU与内存占用率非常低。nginx官方表示保持10,000个没有活动的连接,它只占2.5M内存,所以类似DOS这样的攻击对nginx来说基本上是毫无用处的。就稳定性而言, nginx比lighthttpd更胜一筹。
Nginx支持热部署。它的启动特别容易, 并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在不间断服务的情况下,对软件版本进行进行升级。
Nginx采用master-slave模型, 能够充分利用SMP的优势,且能够减少工作进程在磁盘I/O的阻塞延迟。当采用select()/poll()调用时,还可以限制每个进程的连接数。
Nginx代码质量非常高,代码很规范, 手法成熟, 模块扩展也很容易。特别值得一提的是强大的Upstream与Filter链。 Upstream为诸如reverse proxy, 与其他服务器通信模块的编写奠定了很好的基础。而Filter链最酷的部分就是各个filter不必等待前一个filter执行完毕。它可以把前一个filter的输出做为当前filter的输入,这有点像Unix的管线。这意味着,一个模块可以开始压缩从后端服务器发送过来的请求,且可以在模块接收完后端服务器的整个请求之前把压缩流转向客户端。
Nginx采用了一些os提供的最新特性如对sendfile (Linux 2.2+),accept-filter (FreeBSD 4.1+),TCP_DEFER_ACCEPT (Linux 2.4+) 的支持,从而大大提高了性能

二、 Nginx 安装及调试
1、Pcre 安装

./configure
  make && make install
  cd ../

2. nginx 编译安装

./configure --user=www --group=www --prefix=/usr/local/nginx/ --with-http_stub_status_module --with-openssl=/usr/local/openssl 
make && make install

更详细的模块定制与安装请参照官方wiki.

3、Nginx 配置文件测试:

# /usr/local/nginx/sbin/nginx -t //Debug 配置文件的关键命令需要重点撑握.

2008/12/16 09:08:35 [info] 28412#0: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
2008/12/16 09:08:35 [info] 28412#0: the configuration file /usr/local/nginx/conf/nginx.conf was tested successfully
3、Nginx 启动:

# /usr/local/nginx/sbin/nginx
4、Nginx 配置文件修改重新加载:

# kill -HUP `cat /usr/local/nginx/logs/nginx.pid
`
三、Nginx Rewrite

1. Nginx Rewrite 基本标记(flags)
last – 基本上都用这个Flag。
※相当于Apache里的[L]标记,表示完成rewrite,不再匹配后面的规则
break – 中止Rewirte,不再继续匹配
redirect – 返回临时重定向的HTTP状态302
permanent – 返回永久重定向的HTTP状态301
※原有的url支持正则 重写的url不支持正则

2. 正则表达式匹配,其中:
* ~ 为区分大小写匹配
* ~* 为不区分大小写匹配
* !~和!~* 分别为区分大小写不匹配及不区分大小写不匹配

3. 文件及目录匹配,其中:
* -f和!-f用来判断是否存在文件
* -d和!-d用来判断是否存在目录
* -e和!-e用来判断是否存在文件或目录
* -x和!-x用来判断文件是否可执行

3. Nginx 的一些可用的全局变量,可用做条件判断:

$args
$content_length
$content_type
$document_root
$document_uri
$host
$http_user_agent
$http_cookie
$limit_rate
$request_body_file
$request_method
$remote_addr
$remote_port
$remote_user
$request_filename
$request_uri
$query_string
$scheme
$server_protocol
$server_addr
$server_name
$server_port
$uri

四、 Nginx Redirect
将所有linuxtone.org与netseek.linuxtone.org域名全部自跳转到http://www.linuxtone.org

server
{
listen 80;
server_name linuxtone.org netseek.linuxtone.org;
index index.html index.php;
root /data/www/wwwroot;
if ($host !~ "^www\.linxtone\.org$") {
rewrite ^(.*) [url]http://www.linuxtone.org[/url]$1 redirect;
}
........................
}

五、 Nginx 目录自动加斜线:

if (-d $request_filename){
           rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
     }

六 Nginx Location

1.基本语法:[和上面rewrite正则匹配语法基本一致]
location [=|~|~*|^~] /uri/ { … }
* ~ 为区分大小写匹配
* ~* 为不区分大小写匹配
* !~和!~*分别为区分大小写不匹配及不区分大小写不匹配

示例1:
location = / {
# matches the query / only.
# 只匹配 / 查询。
}
匹配任何查询,因为所有请求都已 / 开头。但是正则表达式规则和长的块规则将被优先和查询匹配

示例2:
location ^~ /images/ {
# matches any query beginning with /images/ and halts searching,
# so regular expressions will not be checked.
# 匹配任何已 /images/ 开头的任何查询并且停止搜索。任何正则表达式将不会被测试。

示例3:

location ~* \.(gif|jpg|jpeg)$ {
# matches any request ending in gif, jpg, or jpeg. However, all
# requests to the /images/ directory will be handled by 
}

# 匹配任何已 gif、jpg 或 jpeg 结尾的请求。

七、 Nginx expires

1.根据文件类型expires

# Add expires header for static content
location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {
    if (-f $request_filename) {
       root /data/www/wwwroot/bbs;
       expires      1d;
       break;
    }
}

2、根据判断某个目录

# serve static files
location ~ ^/(images|javascript|js|css|flash|media|static)/  {
root    /data/www/wwwroot/down;
        expires 30d;
  }

八、 Nginx 防盗链

1. 针对不同的文件类型

#Preventing hot linking of images and other file types
location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)$ {
        valid_referers none blocked server_names *.linuxtone.org linuxtone.org http://localhost baidu.com;
if ($invalid_referer) {
      rewrite   ^/   ;
     # return   403;
      }
}

2. 针对不同的目录

location /img/ {
    root /data/www/wwwroot/bbs/img/;
    valid_referers none blocked server_names *.linuxtone.org http://localhost baidu.com;
    if ($invalid_referer) {
                   rewrite  ^/  ;
                   #return   403;
    }
}

3. 同实现防盗链和expires的方法

#Preventing hot linking of images and other file types
location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)$ {
        valid_referers none blocked server_names *.linuxtone.org linuxtone.org http://localhost ;
if ($invalid_referer) {
      rewrite   ^/   ;
                     }
     access_log off;
     root /data/www/wwwroot/bbs;
expires 1d;
     break;
}

九、 Nginx 访问控制

1. Nginx 身份证验证

#cd /usr/local/nginx/conf
#mkdir htpasswd
/usr/local/apache2/bin/htpasswd -c /usr/local/nginx/conf/htpasswd/tongji linuxtone
#添加用户名为linuxtone
New password: (此处输入你的密码)
Re-type new password: (再次输入你的密码)
Adding password for user
[url]http://count.linuxtone.org/tongji/data/index.html[/url](目录存在/data/www/wwwroot/tongji/data/目录下)
将下段配置放到虚拟主机目录,当访问[url]http://count.linuxtone/tongji/[/url]即提示要密验证:

location ~ ^/(tongji)/  {
                root    /data/www/wwwroot/count;
                        auth_basic              "LT-COUNT-TongJi";
                        auth_basic_user_file  /usr/local/nginx/conf/htpasswd/tongji;
                }

2. Nginx 禁止访问某类型的文件.
如,Nginx下禁止访问*.txt文件,配置方法如下.

location ~* \.(txt|doc)$ {
   if (-f $request_filename) {
   root /data/www/wwwroot/linuxtone/test;
   #rewrite …..可以重定向到某个URL
   break;
   }
}

方法2:

location ~* \.(txt|doc)${
        root /data/www/wwwroot/linuxtone/test;
        deny all;
}

实例:
禁止访问某个目录

location ~ ^/(WEB-INF)/ { 
            deny all; 
}  

3. 使用ngx_http_access_module限制ip访问

location / {
    deny    192.168.1.1;
    allow   192.168.1.0/24;
    allow   10.1.1.0/16;
    deny    all;
}

详细参见wiki: http://wiki.codemongers.com/NginxHttpAccessModule#allow

4. Nginx 下载限制并发和速率

limit_zone   linuxtone  $binary_remote_addr  10m;
server
       {
               listen       80;
               server_name  down.linuxotne.org;
               index index.html index.htm index.php;
               root   /data/www/wwwroot/down;
               #Zone limit
               location / {
                   limit_conn   linuxtone  1;
                   limit_rate  20k;
               }
..........
       }

只允许客房端一个线程,每个线程20k.
【注】limit_zone linuxtone $binary_remote_addr 10m; 这个可以定义在主的

5. Nginx 实现Apache一样目录列表

location / {
autoindex on;
}
6. 上文件大小限制
主配置文件里加入如下,具体大小根据你自己的业务做调整。
client_max_body_size 10m;

十、 Nginx 日志处理

1.Nginx 日志切割
#contab -e

59 23 * * * /usr/local/sbin/logcron.sh /dev/null 2>&1

[root@count ~]# cat /usr/local/sbin/logcron.sh

#!/bin/bash
log_dir="/data/logs"
time=`date +%Y%m%d`  
/bin/mv  ${log_dir}/access_linuxtone.org.log ${log_dir}/access_count.linuxtone.org.$time.log
kill -USR1 `cat  /var/run/nginx.pid`

更多的日志分析与处理就关注(同时欢迎你参加讨论):http://bbs.linuxtone.org/forum-8-1.html

2.利用AWSTATS分析NGINX日志
设置好Nginx日志格式,仍后利用awstats进行分析.
请参考: http://bbs.linuxtone.org/thread-56-1-1.html

3. Nginx 如何不记录部分日志
日志太多,每天好几个G,少记录一些,下面的配置写到server{}段中就可以了

location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$
{
     access_log off;
}

十一、Nginx Cache服务配置

如果需要将文件缓存到本地,则需要增加如下几个子参数:

proxy_store on;
proxy_store_access user:rw group:rw all:rw;
proxy_temp_path 缓存目录;
其中,
proxy_store on用来启用缓存到本地的功能,
proxy_temp_path用来指定缓存在哪个目录下,如:proxy_temp_path html;

在经过上一步配置之后,虽然文件被缓存到了本地磁盘上,但每次请求仍会向远端拉取文件,为了避免去远端拉取文件,必须修改

proxy_pass:
if ( !-e $request_filename) {
proxy_pass http://mysvr;
}
即改成有条件地去执行proxy_pass,这个条件就是当请求的文件在本地的proxy_temp_path指定的目录下不存在时,再向后端拉取。

更多更高级的应用可以研究ncache,详细请参照http://bbs.linuxtone.org 里ncache相关的贴子.

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

2. Nginx 负载均衡实例1

upstream bbs.linuxtone.org {#定义负载均衡设备的Ip及设备状态
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://bbs.linuxtone.org/;

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

nginx支持同时设置多组的负载均衡,用来给不用的server来使用。

client_body_in_file_only 设置为On 可以讲client post过来的数据记录到文件中用来做debug
client_body_temp_path 设置记录文件的目录 可以设置最多3层目录
location 对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡

3. Nginx 负载均衡实例 2
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效,也可以用作提高Squid缓存命中率.

简单的负载均等实例:
#vi nginx.conf //nginx主配置文件核心配置


……….
#loadblance my.linuxtone.org
       upstream  my.linuxtone.org  {
       ip_hash;
       server   127.0.0.1:8080;
       server   192.168.169.136:8080;
       server   219.101.75.138:8080;
       server   192.168.169.117;
       server   192.168.169.118;
       server   192.168.169.119;
     }
…………..
include          vhosts/linuxtone_lb.conf;
………
# vi proxy.conf
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 50m;
client_body_buffer_size 256k;
proxy_connect_timeout 30;
proxy_send_timeout 30;
proxy_read_timeout 60;

proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
proxy_max_temp_file_size 128m;
proxy_store on;
proxy_store_access   user:rw  group:rw  all:r;
#nginx cache               
#client_body_temp_path  /data/nginx_cache/client_body 1 2;
proxy_temp_path /data/nginx_cache/proxy_temp 1 2;
#vi  linuxtone_lb.conf


server
    {
        listen  80;
        server_name my.linuxtone.org;
        index index.php;
        root /data/www/wwwroot/mylinuxtone;
        if (-f $request_filename) {
            break;
           }
        if (-f $request_filename/index.php) {
          rewrite (.*) $1/index.php break;
        }

        error_page 403 [url]http://my.linuxtone.org/member.php?m=user&a=login[/url];
        location / {
           if ( !-e $request_filename) {
               proxy_pass [url]http://my.linuxtone.org[/url];
               break;
           }
           include /usr/local/nginx/conf/proxy.conf;
        }
}

十三、Nginx简单优化

1. 减小nginx编译后的文件大小 (Reduce file size of nginx)
默认的nginx编译选项里居然是用debug模式(-g)的(debug模式会插入很多跟踪和ASSERT之类),编译以后一个nginx有好几兆。去掉nginx的debug模式编译,编译以后只有几百K
在 auto/cc/gcc,最后几行有:
# debug

CFLAGS=”$CFLAGS -g”
注释掉或删掉这几行,重新编译即可。

2.        修改Nginx的header伪装服务器
1)        修改nginx.h


#vi nginx-0.7.30/src/core/nginx.h
#define NGINX_VERSION      "1.8"
#define NGINX_VER          "LTWS/" NGINX_VERSION

#define NGINX_VAR          "NGINX"
#define NGX_OLDPID_EXT     ".oldbin"

2) 修改nginx_http_header_filter_module
#vi nginx-0.7.30/src/http/ngx_http_header_filter_module.c
将如下

static char ngx_http_server_string[] = "Server: nginx" CRLF;
修改为


static char ngx_http_server_string[] = "Server: LTWS" CRLF;

a) 修改nginx_http_header_filter_module
#vi nginx-0.7.30/src/http/ngx_http_special_response.c
将如下:

static u_char ngx_http_error_full_tail[] =
"
" NGINX_VER "
" CRLF "