LINUX系统下LNMP一键安装步骤

一、前期准备:
下载LNMP一键安装包:http://lnmp.org/install.html
yum源正常
关闭rpm默认安装的apache和mysql(最好是新装的新系统)
关闭selinux和iptables
(//关闭selinux
vi /etc/selinux/config
SELINUX=disabled;

//关闭iptables
iptables  -F     * 如果没有禁用防火墙,默认80端口禁止访问
iptables     -Z
iptables  -X)

LNMP一键安装

二、一键安装的过程:
1、安装包:lnmp1.0-full.tar.gz,上传到/root,解压命令tar -zxvf 包全名
2、进入解压后的目录,执行命令:./centos.sh,按照提示符选择:y,整个安装过程约20分钟左右
3、安装其他。
默认安装软件:Nginx,MySQL,PHP,PHPMyAdmin,Zend Optimizer(用来优化zend引擎)
4、安装结果:
LNMP相关软件安装目录
Nginx 目录: /usr/local/nginx/
MySQL 目录 : /usr/local/mysql/
MySQL数据库所在目录:/usr/local/mysql/var/
PHP目录 : /usr/local/php/
PHPMyAdmin目录为/home/wwwroot/phpmyadmin/

LNMP相关配置文件位置
Nginx主配置文件:/usr/local/nginx/conf/nginx.conf
/root/vhost.sh添加的虚拟主机配置文件:/usr/local/nginx/conf/vhost/域名.conf
MySQL配置文件:/etc/my.cnf
PHP配置文件:/usr/local/php/etc/php.ini
…..此处省略其他配置文件路径

LNMPA相关目录文件位置
Apache目录:/usr/local/apache/
Apache配置文件:/usr/local/apache/conf/httpd.conf
Apache虚拟主机配置文件目录:/usr/local/apache/conf/vhost/

LNMP一键安装配置文件

三、修改Nginx配置文件(重点)
vim /usr/local/nginx/conf/nginx.conf

LNMP的虚拟域名配置非常简单,只需要修改这2处即可!示例如下:
server_name www.tom.com;
index index.html index.htm index.php;
root  /home/wwwroot/tom;

在WINDOWS下修改修改HOSTS文件:C:\Windows\System32\drivers\etc\hosts,即可访问!

补充:
每次修改Nginx配置文件后做语法检查:
/usr/local/nginx/sbin/nginx -t

之后重启:pkill -HUP nginx (平滑重启命令,毫秒重启)

其他:
关于301永久跳转,页面跳转,只需要修改配置文件即可!

Linux常用命令整理

(想到再更新吧!这里只记录常用的,而不是完整版本的)

tar压缩工具:
tar [-zjxcvfpP] filename
tar -zxvf 用来解压.tar.gz的压缩包
tar -zcvf 在打包的时候直接压缩

增加用户,用户组:
usseradd 用户名
passwd 用户名 //修改用户密码
su //切换用户
//用户的配置文件:
/etc/passwd和/etc/shadow
/etc/group

文件与目录管理:
cd
pwd
mkdir
rm -rf
cp -a
mv //移动文件或者修改文件名
cat
ls -l (缩写ll)
ls -a (显示全部)
chgrp [组名] [文件] (更改所属组)
chown [ -R ] 账户名 文件名 (更改文件所属组)
chown [ -R ] 账户名:组名 文件名 (更改文件所属组)
备注:-R选项只作用于目录,作用是级联更改,即不仅更改当前目录,连目录里的目录或者文件全部更改。
chmod [-R] xyz 文件名 (改变用户对文件的读写执行权限)
备注:linux使用数字去代替rwx, 具体规则为 ‘r’ 等于4, ‘w’ 等于2, ‘x’ 等于1, ‘-‘ 等于0
which
whereis
find [路径] [参数]
‘-atime +n/-n’ : 访问或执行时间大于/小于n天的文件
‘-ctime +n/-n’ : 写入、更改inode属性(例如更改所有者、权限或者链接)时间大于/小于n天的文件
‘-mtime +n/-n’ : 写入时间大于/小于n天的文件
‘-name filename’ 直接查找该文件名的文件
‘-type filetype’ 通过文件类型查找(filetype 包含了 f, b, c, d, l, s 等)

RPM包安装:
mount /dev/cdrom /mnt (命令把光驱挂载到/mnt目录下)
rpm -ivh /mnt/Packages/libjpeg-turbo-devel-1.2.1-1.el6.i686.rpm (安装一个rpm包)
备注:
“-i” : 安装的意思
“-v” : 可视化
“-h” : 显示安装进度
rpm -q rpm包名 (查询一个包是否安装)
yum list (列出所有可用的rpm包)
yum install [-y] [rpm包名] (安装一个rpm包)

安装源码包:
1. ./configure (一般常用的有 –prefix=PREFIX 这个选项的意思是定义软件包安装到哪里。)
2. make
3. make install

下载一个源码包:wget http://mirrors.hust.edu.cn/apache/httpd/httpd-2.2.27.tar.bz2
解码一个源码包:tar jxvf httpd-2.2.27.tar.bz2
配置相关的选项,并生成Makefile
备注:通常源码包都是安装在/usr/local/目录下的

gcc编译器,需要先安装一下:yum install -y gcc

网络配置,维护等:
netstat (查看网络状况)
ifconfig (查看网卡ip)
setup (设定ip, 防火墙等)
vim /etc/selinux/config (防火墙配置,关闭selinux的方法为,使 “SELINUX=disabled”, 默认为 enforcing)
iptables -F (关闭防火墙,3条指令一起执行)
iptables -Z
iptables -X

必备软件:
– 虚拟机:VMware
– 镜像:CentOs
– 远程工具:XShell, Putty
– WinSCP

>学习资料:
<http://www.apelearn.com/study_v2/>

>LNMP一键安装包
<http://lnmp.org/>

Github上使用HTTPS创建一个本地项目操作步骤

1. New repository 新建一个仓库,命名blog。(在GITHUB上仓库就是项目的意思)

01

新建一个分支,命名gh-pages(这里是github规定的)
02

2. 克隆项目到本地
英文帮助:https://help.github.com/articles/which-remote-url-should-i-use/

Select Code
1
git clone URL

提示:上面的URL必须填写你的项目的URL
03
04
05

3. 检测分支gh-pages

Select Code
1
git checkout --track origin/gh-pages

06
07
08

4. 写你的代码,这里新建了test.html
09
10

5. 添加代码

Select Code
1
git add .

Select Code
1
git add test.html

(因为我们只更新了一个文件,add . 表示更新所有的文件)
11

6. 提交到git上的仓库(repository)

Select Code
1
git commit -m '提交的时候写些注释'

或者

Select Code
1
git commit

(这里省略填写注释,下一步会提示你使用VIM编辑器填写更新的注释)
12

7. 最后一步上传,更新的代码到仓库

Select Code
1
git push origin gh-pages

13
14
15
16

简单快速:配置LAMP环境下的虚拟域名

配置LAMP环境下的虚拟域名

1、编辑Apache的配置文件 httpd.conf:
开启 Include conf/extra/httpd-vhosts.conf 选项

2、创建:test.com目录。
C:\wamp\www\test.com

3、修改Apache下的配置文件:
修改文件路径:C:\wamp\bin\apache\apache2.4.17\conf\extra\httpd-vhosts.conf

Select Code
1
2
3
4
5
ServerAdmin wbo86@126.com
DocumentRoot "c:/wamp/www/test.com"
ServerName test.com
ErrorLog "logs/test.com.log"
CustomLog "logs/test.com.log" common

4、修改文件路径:C:\Windows\System32\drivers\etc\hosts

Select Code
1
127.0.0.1  test.com

最后:重启LAMP

PHP 和 AJAX 请求的实例代码(适合初学者)

所有现代浏览器均支持 XMLHttpRequest 对象(IE5 和 IE6 使用 ActiveXObject)。

XMLHttpRequest 用于在后台与服务器交换数据。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

出处:http://www.w3school.com.cn/php/php_ajax_suggest.asp

说明:AJAX和数据库MySQL交互的案例见这里

HTML文件(内嵌Javascript处理代码):

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
<script type="text/javascript">

/*
如果输入框为空 (str.length==0),则该函数清空 txtHint 占位符的内容,并退出函数。

如果输入框不为空,showHint() 函数执行以下任务:

    创建 XMLHttpRequest 对象
    当服务器响应就绪时执行函数
    把请求发送到服务器上的文件
    请注意我们向 URL 添加了一个参数 q (带有输入框的内容)
*/

function showHint(str)
{
var xmlhttp;

if (str.length==0)
  { 
  document.getElementById("txtHint").innerHTML="";
  return;
  }

/*
创建 XMLHttpRequest 对象:

为了应对所有的现代浏览器,包括 IE5 和 IE6,请检查浏览器是否支持 XMLHttpRequest 对象。如果支持,则创建 XMLHttpRequest 对象。如果不支持,则创建 ActiveXObject
*/
if (window.XMLHttpRequest)
{ // code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
}
else
{ // code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}

/*
-------------------------------------
服务器响应:
-------------------------------------

如需获得来自服务器的响应,请使用 XMLHttpRequest 对象的 responseText 或 responseXML 属性。

  responseText  获得字符串形式的响应数据。
  responseXML   获得 XML 形式的响应数据。

-------------------------------------
onreadystatechange 事件:
-------------------------------------

当请求被发送到服务器时,我们需要执行一些基于响应的任务。
每当 readyState 改变时,就会触发 onreadystatechange 事件。
readyState 属性存有 XMLHttpRequest 的状态信息。

onreadystatechange
存储函数(或函数名),每当 readyState 属性改变时,就会调用该函数。

readyState  
存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。

    0: 请求未初始化
    1: 服务器连接已建立
    2: 请求已接收
    3: 请求处理中
    4: 请求已完成,且响应已就绪

status
  200: "OK"
  404: 未找到页面

*/
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
  {
  document.getElementById("txtHint").innerHTML=xmlhttp.responseText;
  }
}

/*
如需将请求发送到服务器,我们使用 XMLHttpRequest 对象的 open() 和 send() 方法。

-------------------------------------
XMLHttpRequest 对象
-------------------------------------

open(method,url,async)  
规定请求的类型、URL 以及是否异步处理请求。

    method:请求的类型;GET 或 POST
    url:文件在服务器上的位置
    async:true(异步)或 false(同步)

send(string)  
将请求发送到服务器。

    string:仅用于 POST 请求

*/
xmlhttp.open("GET", "gethint.php?q="+str, true);
xmlhttp.send();
}
</script>
</head>
<body>

<h3>请在下面的输入框中键入字母(A - Z):</h3>
<form action=""> 
姓氏:<input type="text" id="txt1" onkeyup="showHint(this.value)" />
<!-- 由 "onkeyup" 事件触发 -->
</form>
<p>建议:<span id="txtHint"></span></p>
</body>

PHP页面:gethint.php

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<?php
// 用名字来填充数组
$a[]="Anna";
$a[]="Brittany";
$a[]="Cinderella";
$a[]="Diana";
$a[]="Eva";
$a[]="Fiona";
$a[]="Gunda";
$a[]="Hege";
$a[]="Inga";
$a[]="Johanna";
$a[]="Kitty";
$a[]="Linda";
$a[]="Nina";
$a[]="Ophelia";
$a[]="Petunia";
$a[]="Amanda";
$a[]="Raquel";
$a[]="Cindy";
$a[]="Doris";
$a[]="Eve";
$a[]="Evita";
$a[]="Sunniva";
$a[]="Tove";
$a[]="Unni";
$a[]="Violet";
$a[]="Liza";
$a[]="Elizabeth";
$a[]="Ellen";
$a[]="Wenche";
$a[]="Vicky";

//获得来自 URL 的 q 参数
$q=$_GET["q"];

//如果 q 大于 0,则查找数组中的所有提示
if (strlen($q) > 0)
  {
  $hint="";
  for($i=0; $i<count($a); $i++)
    {
    if (strtolower($q)==strtolower(substr($a[$i], 0, strlen($q))))
      {
      if ($hint=="")
        {
        $hint=$a[$i];
        }
      else
        {
        $hint=$hint." , ".$a[$i];
        }
      }
    }
  }

// 如果未找到提示,则把输出设置为 "no suggestion"
// 否则设置为正确的值
if ($hint == "")
  {
  $response="no suggestion";
  }
else
  {
  $response=$hint;
  }

//输出响应
echo $response;
?>

PHP5.5以后支持password_hash加密,MD5加密OUT了

md5()加密有一个问题,加密后的字符串就固定了,所以很容易就解密!而password_hash()加密,同样的明文每次生成的密码却不相同,显然会更加安全。

笔者实验的演示代码如下:

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php 
/*
string password_hash ( string $password , integer $algo [, array $options ] )
*/
// password_hash()函数在PHP5.5后才有效
$password = '123456';

$save_password = password_hash($password, PASSWORD_DEFAULT);
$save_password2 = password_hash($password, PASSWORD_DEFAULT);

// 输出加密后的密码
echo $save_password."<br>";
echo $save_password2."<br>";

// md5加密后的密码
echo md5($password)."<br>";

/*
boolean password_verify ( string $password , string $hash )
*/

// 明文密码与加密后的密码验证,返回布尔值。
$verify_result = password_verify($password, $save_password);
$verify_result2 = password_verify($password, $save_password2);
var_dump($verify_result);
var_dump($verify_result2);
?>

演示结果:

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//123456生成HASH加密密码(页面刷新就变化)
$2y$10$nCQdypMAZ8Z/AmwYgPQI0OHpVbqooYlrQ1QpDpt01wmQrUK2.LcoO

//123456生成HASH加密密码(页面刷新就变化)
$2y$10$Jif15g.7BgdzZV/WgpZ1sOrPlZO1WDUu5WJA67zX7t7rINvFNGckG

//md5生成123456加密的密码(每次都是固定的)
e10adc3949ba59abbe56e057f20f883e

//password_verify()验证hash加密后的密码
boolean true

//password_verify()验证hash加密后的密码
boolean true

备注:虽然HASH加密后的密码,每次都不同,但是使用password_verify()函数还是可以验证密码是否正确。常用于用户登录、注册。