Mysql中存储二进制的图片文件

分类:技术文档 - MySQL | 阅读(1302) | 发布于:2016-06-02 19:05 | 标签: 二进制图片 存储 mysql

在Mysql里,
BLOB 类型 最大 64K
MEDIUMBLOB 类型 最大 16M
LONGBLOB 类型 最大 4G 
一般图片可以使用MEDIUMBLOB来存储。

阅读更多...

Linux 计算器bc命令使用

分类:技术文档 - Linux | 阅读(1900) | 发布于:2016-05-25 15:57 | 标签: bc 计算器

Linux 计算器bc命令使用
bc 命令是用于命令行计算器。 它类似基本的计算器。 使用这个计算器可以做基本的数学运算。
安装
yum -y install bc
语法及参数
usage: bc [options] [file ...]
options:
	-i:强制进入交互式模式;
	-l:定义使用的标准数学库;
	-w:对POSIX bc的扩展给出警告信息;
	-q:不打印正常的GNU bc环境信息;
	-v:显示指令版本信息;
	-h:显示指令的帮助信息。
使用:
bc -l
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
2*3
6

2*7+6
20
运算符:
	+ 加法
	- 減法
	* 乘法
	/ 除法
	^ 指数
	% 余数
小数点设置
默认不保留小数[非四舍五入],可以用scale命名查看
scale
0
要设置小数位数可以使用scale=number来设置,例如保留5位小数
scale=5
此时来计算
2/3
.66666
退出命名quit

二进制装换:
#!/bin/bash
abc=192
echo "obase=2;$abc" | bc
11000000
另外,可以通过管道符来时间快捷计算,例如
echo "scale=5;2/3" | bc 
.66666
附:计算100位圆周率:
echo "scale=100; a(1)*4" | bc -l 
3.141592653589793238462643383279502884197169399375105820974944592307\
8164062862089986280348253421170676

阅读更多...

git2.8.2编译安装

分类:技术文档 - Git | 阅读(3303) | 发布于:2016-05-05 10:42 | 标签: git

yum默认安装的git版本为1.7.2,这个版本比较老了。只能手动编译安装最新版本。
(1) 添加rpmforge源
wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.i686.rpm
rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt       
rpm -i rpmforge-release-0.5.3-1.el6.rf.i686.rpm
(2) 安装依赖的包
yum update
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
(3) 下载Git源码并解压缩
wget https://www.kernel.org/pub/software/scm/git/git-2.8.2.tar.gz
tar -zxvf git-2.8.2.tar.gz
cd git-2.8.2
(4) 编译安装
make prefix=/usr/local/git all
make prefix=/usr/local/git install
(5) 将git安装路径添加到PATH变量
vim /etc/bashrc
#在最后一行添加 
#export PATH=/usr/local/git/bin:$PATH
#保存退出
(6) 验证是否安装成功
source /etc/bashrc
git --version
(7) 配置git
git config --global user.name "username"
git config --global user.email "user@mail.com"

阅读更多...

svn pre-commit.tmpl

分类:技术文档 - SVN | 阅读(1217) | 发布于:2016-04-26 16:07 | 标签: pre-commit svn

#!/bin/sh

REPOS="$1"
TXN="$2"

SVNLOOK="svnlook"

LOGMSG=`$SVNLOOK log "$REPOS" -t "$TXN" | wc -c`
if [ "$LOGMSG" -lt 10 ];
then
echo -e "请至少输入10个字符的注释" 1>&2 
exit 1
fi
exit

# Make sure that the log message contains some text.
SVNLOOK=/usr/bin/svnlook
$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" > /dev/null || exit 1

# Check that the author of this commit has the rights to perform
# the commit on the files and directories being modified.
commit-access-control.pl "$REPOS" "$TXN" commit-access-control.cfg || exit 1

# All checks passed, so allow the commit.
exit 0

阅读更多...

6个常见的 PHP 安全性攻击

分类:技术文档 - PHP文档 | 阅读(4086) | 发布于:2016-03-29 16:06 | 标签: 安全 攻击

1、SQL注入

SQL注入是一种恶意攻击,用户利用在表单字段输入SQL语句的方式来影响正常的SQL执行。还有一种是通过system()或exec()命令注入的,它具有相同的SQL注入机制,但只针对shell命令。

$username = $_POST['username'];
$query = "select * from auth where username = '".$username."'";
echo $query;
$db = new mysqli('localhost', 'demo', ‘demo', ‘demodemo');
$result = $db->query($query);
if ($result && $result->num_rows) {
	echo "<br />Logged in successfully";
} else {
	echo "<br />Login failed";
}
防止SQL注入选项:
*使用mysql_real_escape_string()过滤数据
*手动检查每一数据是否为正确的数据类型
*使用预处理语句并绑定变量
*使用准备好的预处理语句
*分离数据和SQL逻辑
*预处理语句将自动过滤(如:转义)
*把它作为一个编码规范,可以帮助团队里的新人避免遇到以上问题
$query = 'select name, district from city where countrycode=?';
if ($stmt = $db->prepare($query) ){
	$countrycode = 'hk';
	$stmt->bind_param("s", $countrycode);
	$stmt->execute();
	$stmt->bind_result($name, $district);
	while ( $stmt ($stmt->fetch() ){
		echo $name.', '.$district;
		echo '<br />';
	}
	$stmt->close();
}


2、XSS攻击

XSS(跨站点脚本攻击)是一种攻击,由用户输入一些数据到你的网站,其中包括客户端脚本(通常JavaScript)。如果你没有过滤就输出数据到另一个web页面,这个脚本将被执行。接收用户提交的文本内容

<?php
	if (file_exists('comments')) {
		$comments = get_saved_contents_from_file('comments');
	} else {
		$comments = '';
	}

	if (isset($_POST['comment'])) {
		$comments .= '<br />' . $_POST['comment'];
		save_contents_to_file('comments', $comments);
	}
?>
输出内容给(另一个)用户
<form action='xss.php' method='POST'>
Enter your comments here: <br />
<textarea name='comment'></textarea> <br />
<input type='submit' value='Post comment' />
</form><hr /><br />
<?php echo $comments; ?>

将会发生什么事?
    
*烦人的弹窗
*刷新或重定向
*损坏网页或表单
*窃取cookie
*AJAX(XMLHttpRequest)
防止XSS攻击
为了防止XSS攻击,使用PHP的htmlentities()函数过滤再输出到浏览器。
htmlentities()的基本用法很简单,但也有许多高级的控制,请参阅 XSS速查表。

3、会话固定

会话安全,假设一个PHPSESSID很难猜测。然而,PHP可以接受一个会话ID通过一个Cookie或者URL。因此,欺骗一个受害者可以使用一个特定的(或其他的)会话ID 或者钓鱼攻击。

4、会议捕获和劫持

这是与会话固定有着同样的想法,然而,它涉及窃取会话ID。如果会话ID存储在Cookie中,攻击者可以通过XSS和JavaScript窃取。如果会话ID包含在URL上,也可以通过嗅探或者从代理服务器那获得。
防止会话捕获和劫持:
*更新ID
*如果使用会话,请确保用户使用SSL

5、跨站点请求伪造(CSRF)

CSRF攻击,是指一个页面发出的请求,看起来就像是网站的信任用户,但不是故意的。它有许多的变体,比如下面的例子:

<img src='http://example.com/single_click_to_buy.php?user_id=123&item=12345'>

防止跨站点请求伪造
一般来说,确保用户来自你的表单,并且匹配每一个你发送出去的表单。有两点一定要记住:
对用户会话采用适当的安全措施,例如:给每一个会话更新id和用户使用SSL。
生成另一个一次性的令牌并将其嵌入表单,保存在会话中(一个会话变量),在提交时检查它。


6、代码注入

代码注入是利用计算机漏洞通过处理无效数据造成的。问题出在,当你不小心执行任意代码,通常通过文件包含。写得很糟糕的代码可以允许一个远程文件包含并执行。如许多PHP函数,如require可以包含URL或文件名,例如:

<form>
	Choose theme:
	<select name = theme>
		<option value = blue>Blue</option>
		<option value = green>Green</option>
		<option value = red>Red</option>
	</select>
	<input type = submit>
</form>
<?php
if($theme) {
	require($theme.'.txt');
}
?>
在上面的例子中,通过传递用户输入的一个文件名或文件名的一部分,来包含以"http://"开头的文件。

防止代码注入
*过滤用户输入

*在php.ini中设置禁用allow_url_fopen和allow_url_include。这将禁用require/include/fopen的远程文件。

其他的一般原则
1. 不要依赖服务器配置来保护你的应用,特别是当你的web服务器/ PHP是由你的ISP管理,或者当你的网站可能迁移/部署到别处,未来再从别处迁移/部署在到其他地方。请在网站代码中嵌入带有安全意识的检查/逻辑(HTML、JavaScript、PHP,等等)。

2. 设计服务器端的安全脚本:

—例如,使用单行执行 - 单点身份验证和数据清理

—例如,在所有的安全敏感页面嵌入一个PHP函数/文件,用来处理所有登录/安全性逻辑检查

3. 确保你的代码更新,并打上最新补丁。

阅读更多...

mysql中通过地理位置获取附近的人

分类:技术文档 - MySQL | 阅读(2900) | 发布于:2016-03-28 13:01 | 标签: 地理位置 mysql

在Mysql数据表中每条数据都存有lat和lng两个值,用来表示经纬度位置,
先需要更具一个给定经纬度获取小于10KM的数据并且按距离最近的排序:
SELECT  
  id, (  
    6377.830 * acos (  
      cos ( radians(39.620076) )  
      * cos( radians( lat ) )  
      * cos( radians( lng ) - radians(116.067221) )  
      + sin ( radians(39.620076) )  
      * sin( radians( lat ) )  
    )  
  ) AS distance  
FROM merchant_store
HAVING distance < 10
ORDER BY distance  
LIMIT 0, 20; 
说明:
6377.830是地球半径
10:是km数
39.620076:是给定的纬度
116.067221:是给定的经度
此种方式虽然不推荐使用(无法使用Mysql索引),但也是一个可行的方案。

阅读更多...

GeoHash核心原理解析

分类:技术文档 - PHP文档 | 阅读(1464) | 发布于:2016-03-26 12:54 | 标签: geohash

引子 机机是个好动又好学的孩子,平日里就喜欢拿着手机地图点点按按来查询一些好玩的东西。某一天机机到北海公园游玩,肚肚饿了,于是乎打开手机地图,搜索北海公园附近的餐馆,并选了其中一家用餐。

饭饱之后机机开始反思了,地图后台如何根据自己所在位置查询来查询附近餐馆的呢?苦思冥想了半天,机机想出了个方法:计算所在位置P与北京所有餐馆的距离,然后返回距离<=1000米的餐馆。小得意了一会儿,机机发现北京的餐馆何其多啊,这样计算不得了,于是想了,既然知道经纬度了,那它应该知道自己在西城区,那应该计算所在位置P与西城区所有餐馆的距离啊,机机运用了递归的思想,想到了西城区也很多餐馆啊,应该计算所在位置P与所在街道所有餐馆的距离,这样计算量又小了,效率也提升了。


机机的计算思想很朴素,就是通过过滤的方法来减小参与计算的餐馆数目,从某种角度上讲,机机在使用索引技术。


一提到索引,大家脑子里马上浮现出B树索引,因为大量的数据库(如MySQL、oracle、PostgreSQL等)都在使用B树。B树索引本质上是对索引字段进行排序,然后通过类似二分查找的方法进行快速查找,即它要求索引的字段是可排序的,一般而言,可排序的是一维字段,比如时间、年龄、薪水等等。但是对于空间上的一个点(二维,包括经度和纬度),如何排序呢?又如何索引呢?解决的方法很多,下文介绍一种方法来解决这一问题。


思想:如果能通过某种方法将二维的点数据转换成一维的数据,那样不就可以继续使用B树索引了嘛。那这种方法真的存在嘛,答案是肯定的。目前很火的GeoHash算法就是运用了上述思想,下面我们就开始GeoHash之旅吧。



一、感性认识GeoHash

首先来点感性认识,http://openlocation.org/geohash/geohash-js/ 提供了在地图上显示geohash编码的功能。


1)GeoHash将二维的经纬度转换成字符串,比如下图展示了北京9个区域的GeoHash字符串,分别是WX4ER,WX4G2、WX4G3等 等,每一个字符串代表了某一矩形区域。也就是说,这个矩形区域内所有的点(经纬度坐标)都共享相同的GeoHash字符串,这样既可以保护隐私(只表示大 概区域位置而不是具体的点),又比较容易做缓存,比如左上角这个区域内的用户不断发送位置信息请求餐馆数据,由于这些用户的GeoHash字符串都是WX4ER,所以可以把WX4ER当作key,把该区域的餐馆信息当作value来进行缓存,而如果不使用GeoHash的话,由于区域内的用户传来的经纬度是各不相同的,很难做缓存。

2)字符串越长,表示的范围越精确。如图所示,5位的编码能表示10平方千米范围的矩形区域,而6位编码能表示更精细的区域(约0.34平方千米)

3)字符串相似的表示距离相近(特殊情况后文阐述),这样可以利用字符串的前缀匹配来查询附近的POI信息。如下两个图所示,一个在城区,一个在郊 区,城区的GeoHash字符串之间比较相似,郊区的字符串之间也比较相似,而城区和郊区的GeoHash字符串相似程度要低些。

城区 郊区

通过上面的介绍我们知道了GeoHash就是一种将经纬度转换成字符串的方法,并且使得在大部分情况下,字符串前缀匹配越多的距离越近,回到我们的 案例,根据所在位置查询来查询附近餐馆时,只需要将所在位置经纬度转换成GeoHash字符串,并与各个餐馆的GeoHash字符串进行前缀匹配,匹配越 多的距离越近。


二、GeoHash算法的步骤

下面以北海公园为例介绍GeoHash算法的计算步骤

2.1. 根据经纬度计算GeoHash二进制编码

地球纬度区间是[-90,90], 北海公园的纬度是39.928167,可以通过下面算法对纬度39.928167进行逼近编码:

1)区间[-90,90]进行二分为[-90,0),[0,90],称为左右区间,可以确定39.928167属于右区间[0,90],给标记为1;

2)接着将区间[0,90]进行二分为 [0,45),[45,90],可以确定39.928167属于左区间 [0,45),给标记为0;

3)递归上述过程39.928167总是属于某个区间[a,b]。随着每次迭代区间[a,b]总在缩小,并越来越逼近39.928167;

4)如果给定的纬度x(39.928167)属于左区间,则记录0,如果属于右区间则记录1,这样随着算法的进行会产生一个序列1011100,序列的长度跟给定的区间划分次数有关。

根据纬度算编码


bit min mid max
1 -90.000 0.000 90.000
0 0.000 45.000 90.000
1 0.000 22.500 45.000
1 22.500 33.750 45.000
1 33.7500 39.375 45.000
0 39.375 42.188 45.000
0 39.375 40.7815 42.188
0 39.375 40.07825 40.7815
1 39.375 39.726625 40.07825
1 39.726625 39.9024375 40.07825



同理,地球经度区间是[-180,180],可以对经度116.389550进行编码。

根据经度算编码

bit min mid max
1 -180 0.000 180
1 0.000 90 180
0 90 135 180
1 90 112.5 135
0 112.5 123.75 135
0 112.5 118.125 123.75
1 112.5 115.3125 118.125
0 115.3125 116.71875 118.125
1 115.3125 116.015625 116.71875
1 116.015625 116.3671875 116.71875



2.2. 组码

通过上述计算,纬度产生的编码为10111 00011,经度产生的编码为11010 01011。偶数位放经度,奇数位放纬度,把2串编码组合生成新串:11100 11101 00100 01111。

最后使用用0-9、b-z(去掉a, i, l, o)这32个字母进行base32编码,首先将11100 11101 00100 01111转成十进制,对应着28、29、4、15,十进制对应的编码就是wx4g。同理,将编码转换成经纬度的解码算法与之相反,具体不再赘述。





三、GeoHash Base32编码长度与精度

下表摘自维基百科:http://en.wikipedia.org/wiki/Geohash

可以看出,当geohash base32编码长度为8时,精度在19米左右,而当编码长度为9时,精度在2米左右,编码长度需要根据数据情况进行选择。



三、GeoHash算法

上文讲了GeoHash的计算步骤,仅仅说明是什么而没有说明为什么?为什么分别给经度和维度编码?为什么需要将经纬度两串编码交叉组合成一串编码?本节试图回答这一问题。

如图所示,我们将二进制编码的结果填写到空间中,当将空间划分为四块时候,编码的顺序分别是左下角00,左上角01,右下脚10,右上角11,也就 是类似于Z的曲线,当我们递归的将各个块分解成更小的子块时,编码的顺序是自相似的(分形),每一个子快也形成Z曲线,这种类型的曲线被称为Peano空 间填充曲线。

这种类型的空间填充曲线的优点是将二维空间转换成一维曲线(事实上是分形维),对大部分而言,编码相似的距离也相近, 但Peano空间填充曲线最大的缺点就是突变性,有些编码相邻但距离却相差很远,比如0111与1000,编码是相邻的,但距离相差很大。

除Peano空间填充曲线外,还有很多空间填充曲线,如图所示,其中效果公认较好是Hilbert空间填充曲线,相较于Peano曲线而 言,Hilbert曲线没有较大的突变。为什么GeoHash不选择Hilbert空间填充曲线呢?可能是Peano曲线思路以及计算上比较简单吧,事实 上,Peano曲线就是一种四叉树线性编码方式。

四、使用注意点

1)由于GeoHash是将区域划分为一个个规则矩形,并对每个矩形进行编码,这样在查询附近POI信息时会导致以下问题,比如红色的点是我们的位 置,绿色的两个点分别是附近的两个餐馆,但是在查询的时候会发现距离较远餐馆的GeoHash编码与我们一样(因为在同一个GeoHash区域块上),而 较近餐馆的GeoHash编码与我们不一致。这个问题往往产生在边界处。

解决的思路很简单,我们查询时,除了使用定位点的GeoHash编码进行匹配外,还使用周围8个区域的GeoHash编码,这样可以避免这个问题。

2)我们已经知道现有的GeoHash算法使用的是Peano空间填充曲线,这种曲线会产生突变,造成了编码虽然相似但距离可能相差很大的问题,因此在查询附近餐馆时候,首先筛选GeoHash编码相似的POI点,然后进行实际距离计算。






本文出自:http://blog.jobbole.com/80633/

阅读更多...

Linux下xargs命令详解

分类:技术文档 - Linux | 阅读(2279) | 发布于:2016-03-22 11:34 | 标签: xargs

xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。
它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理。
通常情况下,xargs从管道或者stdin中读取数据,但是它也能够从文件的输出中读取数据。
xargs的默认命令是echo,这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代。
xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令,下面是一些如何有效使用xargs 的实用例子。
1. 当你尝试用rm 删除太多的文件,你可能得到一个错误信息:/bin/rm Argument list too long. 用xargs 去避免这个问题
find ~ -name ‘*.log’ -print0 | xargs -0 rm -f

2. 获得/etc/ 下所有*.conf 结尾的文件列表,有几种不同的方法能得到相同的结果,下面的例子仅仅是示范怎么实用xargs ,
在这个例子中实用 xargs将find 命令的输出传递给ls -l
find /etc -name "*.conf" | xargs ls –l

3. 假如你有一个文件包含了很多你希望下载的URL, 你能够使用xargs 下载所有链接
# cat url-list.txt | xargs wget –c

4. 查找所有的jpg 文件,并且压缩它
find / -name *.jpg -type f -print | xargs tar -cvzf images.tar.gz

5. 拷贝所有的图片文件到一个外部的硬盘驱动
ls *.jpg | xargs -n1 -i cp {} /external-hard-drive/directory

阅读更多...

nginx.service.sh

分类:技术文档 - Linux | 阅读(2060) | 发布于:2016-03-22 11:24 | 标签: nginx

nginx.service.sh
#! /bin/sh
# chkconfig: 2345 55 25
# Description: Startup script for nginx webserver on Debian. Place in /etc/init.d and
# run 'update-rc.d -f nginx defaults', or use the appropriate command on your
# distro. For CentOS/Redhat run: 'chkconfig --add nginx'

### BEGIN INIT INFO
# Provides:          nginx
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the nginx web server
# Description:       starts nginx using start-stop-daemon
### END INIT INFO

# Author:   licess
# website:  http://lnmp.org

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
NAME=nginx
NGINX_BIN=/usr/local/nginx/sbin/$NAME
CONFIGFILE=/usr/local/nginx/conf/$NAME.conf
PIDFILE=/usr/local/nginx/logs/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

case "$1" in
	start)
		echo -n "Starting $NAME... "

		if netstat -tnpl | grep -q nginx;then
	        echo "$NAME (pid `pidof $NAME`) already running."
	        exit 1
		fi

		$NGINX_BIN -c $CONFIGFILE

		if [ "$?" != 0 ] ; then
			echo " failed"
			exit 1
		else
			echo " done"
		fi
	;;

	stop)
		echo -n "Stoping $NAME... "

		if ! netstat -tnpl | grep -q nginx; then
			echo "$NAME is not running."
			exit 1
		fi

		$NGINX_BIN -s stop

		if [ "$?" != 0 ] ; then
			echo " failed. Use force-quit"
			exit 1
		else
			echo " done"
		fi
	;;

	status)
		if netstat -tnpl | grep -q nginx; then
			PID=`pidof nginx`
			echo "$NAME (pid $PID) is running..."
		else
			echo "$NAME is stopped"
			exit 0
		fi
	;;

	force-quit)
		echo -n "Terminating $NAME... "

		if ! netstat -tnpl | grep -q nginx; then
			echo "$NAME is not running."
			exit 1
		fi

		kill `pidof $NAME`

		if [ "$?" != 0 ] ; then
			echo " failed"
			exit 1
		else
			echo " done"
		fi
	;;

	restart)
		$SCRIPTNAME stop
		sleep 1
		$SCRIPTNAME start
	;;

	reload)

		echo -n "Reload service $NAME... "

		if netstat -tnpl | grep -q nginx; then
			$NGINX_BIN -s reload
			echo " done"
		else
			echo "$NAME is not running, can't reload."
			exit 1
		fi
	;;

	configtest)

		echo -n "Test $NAME configure files... "

		$NGINX_BIN -t
	;;

	*)
		echo "Usage: $SCRIPTNAME {start|stop|force-quit|restart|reload|status|configtest}"
		exit 1
	;;

esac

阅读更多...

LNMP安装

分类:技术文档 - PHP文档 | 阅读(4348) | 发布于:2016-03-22 11:14 | 标签: lnmp

LNMP安装

Centos_6.6 + nginx_1.8.0 + mysql_5.6.28 + php5.6.2

1.追加CentOS 6.5的epel及remi源。
rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm


2.工具包安装

yum -y update 
yum -y install wget patch make cmake gcc gcc-c++ gcc-g77 perl flex bison file libtool libtool-libs \
	autoconf kernel-devel libjpeg libjpeg-devel libpng libpng-devel libpng10 libpng10-devel gd gd-devel \
	freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glib2 glib2-devel bzip2 bzip2-devel \
	libevent libevent-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 \
	krb5-devel libidn libidn-devel openssl openssl-devel vim-minimal nano fonts-chinese gettext \
	gettext-devel ncurses-devel gmp-devel pspell-devel unzip libcap diffutils libcurl-devel \
	libmcrypt-devel libedit libedit-devel readline readline-devel pcre pcre-devel

3.mysql安装
mysql_install.sh
wget -c http://www.cmake.org/files/v2.8/cmake-2.8.10.2.tar.gz
tar -xzvf cmake-2.8.10.2.tar.gz
cd cmake-2.8.10.2
./bootstrap
make && make install
cd ..

groupadd mysql ;useradd -r -g mysql mysql
mkdir -p /usr/local/mysql ;mkdir -p /data/mysqldb

wget -c http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.28.tar.gz
tar zxvf mysql-5.6.28.tar.gz
cd mysql-5.6.28
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock -DDEFAULT_CHARSET=utf8 \
	-DDEFAULT_COLLATION=utf8_general_ci -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 \
	-DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DMYSQL_DATADIR=/data/mysqldb -DMYSQL_TCP_PORT=3306 -DENABLE_DOWNLOADS=1  
rm -rf CMakeCache.txt
make
make install 

cd /usr/local/mysql
chown -R mysql:mysql .
cd /data/mysqldb
chown -R mysql:mysql .
cd /usr/local/mysql
scripts/mysql_install_db --user=mysql --datadir=/data/mysqldb
\cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf

sed -i 's;# basedir = .....;basedir = /usr/local/mysql/;g' /etc/my.cnf
sed -i 's;# datadir = .....;datadir = /data/mysqldb;g' /etc/my.cnf
sed -i 's;# port = .....;port = 3306;g' /etc/my.cnf
sed -i 's;# server_id = .....;server_id = 1;g' /etc/my.cnf
sed -i 's;# socket = .....;socket = /usr/local/mysql/mysql.sock;g' /etc/my.cnf

cp support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
echo 'PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH' >> /etc/profile
echo 'export PATH' >> /etc/profile

source /etc/profile 

ln -s /usr/local/mysql/lib/mysql /usr/lib/mysql
ln -s /usr/local/mysql/include/mysql /usr/include/mysql
ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
ln -s /usr/local/mysql/bin/mysqldump /usr/bin/mysqldump
ln -s /usr/local/mysql/bin/myisamchk /usr/bin/myisamchk
ln -s /usr/local/mysql/bin/mysqld_safe /usr/bin/mysqld_safe

service mysqld start
chkconfig --level 35 mysqld on
netstat -tulnp | grep 3306
ln -s /usr/local/mysql/mysql.sock /tmp/mysql.sock
#测试Mysql
mysql -u root -p
#(密码为空)
mysql> \q

#修改Mysql密码为123456
mysqladmin -u root password '123456'
mysql -u root -p123456
mysql> \q
cd ..
	

4.php安装

groupadd www && useradd -g www -s /sbin/nologin -M www
wget -c http://mirrors.sohu.com/php/php-5.6.2.tar.gz
tar zxvf php-5.6.2.tar.gz 
cd php-5.6.2
./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-inline-optimization \
	--disable-debug --disable-rpath --enable-shared --enable-fpm --with-fpm-user=www --with-fpm-group=www \
	--with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-gettext --enable-mbstring \
	--with-iconv --with-mcrypt --with-mhash --with-openssl --enable-bcmath --enable-soap --with-libxml-dir \
	--enable-pcntl --enable-shmop --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-sockets \
	--with-curl --with-zlib --enable-zip --with-bz2 --with-readline
make && make install

/usr/local/php/bin/php --version
cp php.ini-development /usr/local/php/etc/php.ini
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf 
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
chmod +x /etc/init.d/php-fpm 
service php-fpm start
service php-fpm status
vim /etc/profile

	PATH=/usr/local/php/bin:/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
	export PATH
	
source /etc/profile
php --version
chkconfig --level 35 php-fpm on
php -m

5.nginx安装
wget http://mirrors.sohu.com/nginx/nginx-1.8.0.tar.gz
tar zxvf nginx-1.8.0.tar.gz
cd nginx-1.8.0
./configure --prefix=/usr/local/nginx --user=www --group=www  --with-http_ssl_module \
	--with-http_stub_status_module --with-http_realip_module
make && make install 
cd ..


wget -c http://soft.vpser.net/lnmp/ext/init.d.nginx
cp init.d.nginx /etc/init.d/nginx
chmod +x /etc/init.d/nginx
chkconfig --level 345 nginx on
/etc/init.d/nginx start

cd /usr/local/nginx/conf/
vi nginx.conf

	# ...
	location ~ \.php$ {
		root           html;
		fastcgi_pass   127.0.0.1:9000;
		fastcgi_index  index.php;
		fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
		include        fastcgi_params;
	}
	# ...

5.redis-2.8.8安装
if [ -s redis-2.8.8 ]; then
    rm -rf redis-2.8.8/
fi

wget -c http://download.redis.io/releases/redis-2.8.8.tar.gz
tar zxf redis-2.8.8.tar.gz
cd redis-2.8.8/
if [ `getconf WORD_BIT` = '32' ] && [ `getconf LONG_BIT` = '64' ] ; then
        make PREFIX=/usr/local/redis install
else
        make CFLAGS="-march=i686" PREFIX=/usr/local/redis install
fi
mkdir -p /usr/local/redis/etc/
cp redis.conf  /usr/local/redis/etc/
sed -i 's/daemonize no/daemonize yes/g' /usr/local/redis/etc/redis.conf
cd ../

phpredis安装


function phpredis {
	if [ -s redis-2.2.5 ]; then
	rm -rf redis-2.2.5/
	fi
	sed -i '/redis.so/d' /usr/local/php/etc/php.ini
	wget -c http://pecl.php.net/get/redis-2.2.5.tgz
	tar zxf redis-2.2.5.tgz
	cd redis-2.2.5/
	/usr/local/php/bin/phpize
	./configure --with-php-config=/usr/local/php/bin/php-config
	make && make install
	cd ../
sed -i '/the dl()/i\
extension = "redis.so"' /usr/local/php/etc/php.ini
}


阅读更多...