作者: CheungQ

Nginx配置说明

user nginx nginx ;

Nginx用户及组:用户 组。window下不指定

 

worker_processes 8;

工作进程:数目。根据硬件调整,通常等于CPU数量或者2倍于CPU。

 

error_log  logs/error.log;  

error_log  logs/error.log  notice;  

error_log  logs/error.log  info; 

错误日志:存放路径。

 

pid logs/nginx.pid;

pid(进程标识符):存放路径。

 

worker_rlimit_nofile 204800;

指定进程可以打开的最大描述符:数目。

这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。

现在在linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。

这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误。

 

events

{

use epoll;

使用epoll的I/O 模型。linux建议epoll,FreeBSD建议采用kqueue,window下不指定。

补充说明:

与apache相类,nginx针对不同的操作系统,有不同的事件模型

A)标准事件模型

Select、poll属于标准事件模型,如果当前系统不存在更有效的方法,nginx会选择select或poll

B)高效事件模型

Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃。

Epoll:使用于Linux内核2.6版本及以后的系统。

/dev/poll:使用于Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。

Eventport:使用于Solaris 10。 为了防止出现内核崩溃的问题, 有必要安装安全补丁。

 

worker_connections 10000;

没个工作进程的最大连接数量。根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为。worker_processes*worker_connections

keepalive_timeout 65;

keepalive超时时间。

Continue reading

【mysql】insert … on duplicate key update column=IF(条件,值1,值2 ) 简直神一样的操作

Insert…on duplicate key相信大家都知道了,是一个非常好用的功能,可以在批量导入数据的时候插入并且保证在key冲突的时候执行更新操作而不是报错。笔者最近写代码的时候却碰到一个需求,就是想要在这个基础上根据某列的值来决定update后面的值,举个例子,如果columnA>0,那么更新columnB=1或者不更新,然后就在网上对duplicate key和update的用法大肆搜索一番,看有没有类似的用法,结果都是比较常规的用法,颇为失望。然后又想到普通的update是在后面加where条件的,那能不能试试直接加where条件呢?残念,这个也行不通。。。

然后在准备放弃老老实实用2条sql执行的时候,脑子里突然灵光一闪,想到mysql不是有自带函数的么?能不能结合利用一下呢?于是查mysql函数大全,我翻翻翻,bingo!终于被我找到一个函数

IF 函数用法

语法: IF(expr1,expr2,expr3)

函数用法说明:如果 expr1 是 TRUE (expr1 <> 0 and expr1 <> NULL) ,则 IF() 的返回值为 expr2 ; 否则返回值则为 expr3 。 IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定

这不就是我想要的吗?赶紧试试

INSERT INTO tbl (columnA,columnB,columnC) VALUES (1,2,3) ON DUPLICATE KEY UPDATE columnA=IF(columnB>0,1,columnA)

自增

array(2) {
[0]=>
int(0)
[1]=>
int(0)
}

iframe异步加载页面动态内容,实现页面动静分离

之前实现了手机站小说封面页动静分离的改造,稍微简单啰嗦几句,后面有机会详细的再写下。

封面页以书为key,缓存起来封面页的静态的通用的,很少改变的主要部分内容,利用异步加载的方法,修改页面上个别按钮和个人信息的内容部分。主页面内容部分由原来的300-500ms的响应时间可降低至50ms左右,因为内容都是直接根据url里的书号产生的key来从存储中获得的。另外通过异步加载动态获取的内容可以控制在60-100ms之内,基本实现了页面的动静分离和提速。

现在的问题是这样的,因为某些原因页面上布置了至少4、5个广告,当用户处于2g,甚至GPRS网络的情况下,因为网速的限制以及其他的一些原因,原本用的jquery的ajax加载非常的滞后执行,导致页面显示出来后目录部分原本文字需要等待4、5秒才能看到动态加载获取到目录内容替换掉静态内容中的目录部分。

这样就会给用户及其不好的加载延后的体验,后来经过摸索实验。将目录部分的内容放在iframe中,随页面dom结构加载,并在iframe的内的页面末端加上js,将iframe内的目录部分的内容替换主页面的目录部分的内容。
Continue reading

Ubuntu Server 14.04 LTS 服务器配置(java)

1.sudo su,切换到管理员权限下
2.添加ppa
add-apt-repository ppa:webupd8team/java

3.apt-get update更新资源索引

apt-get update 和 upgrade 的区别

update

update 是同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引,这样才能获取到最新的软件包。

upgrade

upgrade 是升级已安装的所有软件包,升级之后的版本就是本地索引里的,因此,在执行 upgrade 之前一定要执行 update, 这样才能是最新的。

An update should always be performed before an upgrade or dist-upgrade.

upgrade is used to install the newest versions of all packages currently installed on the system from the sources enumerated in /etc/apt/sources.list. Packages currently installed with new versions available are retrieved and upgraded.


4.sudo apt-get install oracle-java8-installer

安装java

5 java -version 查看是否安装成功

java,php的BOM头处理

[code type=php]
“;
}else{

$dirname = $basedir.”/”.$file;
checkdir($dirname);
}
}
}
closedir($dh);
}
}
function checkBOM ($filename) {
global $auto;
$contents = file_get_contents($filename);
$charset[1] = substr($contents, 0, 1);
$charset[2] = substr($contents, 1, 1);
$charset[3] = substr($contents, 2, 1);
if (ord($charset[1]) == 239 && ord($charset[2]) == 187 && ord($charset[3]) == 191) {
if ($auto == 1) {
$rest = substr($contents, 3);
rewrite ($filename, $rest);
return (“BOM found, automatically removed.“);
} else {
return (“BOM found.“);
}
}
else return (“BOM Not Found.”);
}
function rewrite ($filename, $data) {
$filenum = fopen($filename, “w”);
flock($filenum, LOCK_EX);
fwrite($filenum, $data);
fclose($filenum);
}
?>
[/code]

[code type=java]
/**

* 去除bom报头

*/

public static String formatString(String s) {

if (s != null) {

s = s.replaceAll(“\ufeff”, “”);

}

return s;

}
[/code]
来源 http://blog.csdn.net/u012519664/article/details/41596857

MySQL分区性能初探[转]

一, 分区概念

分区允许根据指定的规则,跨文件系统分配单个表的多个部分。表的不同部分在不同的位置被存储为单独的表。MySQL从5.1.3开始支持Partition。

分区和手动分表对比

手动分表 分区
多张数据表 一张数据表
重复数据的风险 没有数据重复的风险
写入多张表 写入一张表
没有统一的约束限制 强制的约束限制

MySQL支持RANGE,LIST,HASH,KEY分区类型,其中以RANGE最为常用:

Range(范围)–这种模式允许将数据划分不同范围。例如可以将一个表通过年份划分成若干个分区。
Hash(哈希)–这中模式允许通过对表的一个或多个列的Hash Key进行计算,最后通过这个Hash码不同数值对应的数据区域进行分区。例如可以建立一个对表主键进行分区的表。
Key(键值)-上面Hash模式的一种延伸,这里的Hash Key是MySQL系统产生的。
List(预定义列表)–这种模式允许系统通过预定义的列表的值来对数据进行分割。
Composite(复合模式) –以上模式的组合使用 

二,分区能做什么

逻辑数据分割
提高单一的写和读应用速度
提高分区范围读查询的速度
分割数据能够有多个不同的物理文件路径
高效的保存历史数据
一个表上的约束检查
不同的主从服务器分区策略,例如master按Hash分区,slave按range分区

Continue reading