linux基本知识

1.什么是linux?

Linux是一款免费的操作系统,可以任意修改其代码.

linux完全兼容POSIX1.0标准.在linux下通过相应的模拟器运行常见的dos,Windows程序.

linux可以使多个程序同时并独立运行.

linux还是一种嵌入式操作系统,同时具有字符界面和图形界面,支持多处理器技术,大大提高了系统性能

linux是一套免费试用和自由传播的类unix操作系统

2.linux有哪些应用?

Linux是开源免费的操作系统

Linux服务器是当前最广泛应用的

Linux可以做嵌入式开发

3.linux的文件类型有哪些?(至少写出四种)

Linux操作系统支持 普通文件,目录文件,特殊文件 和 链接文件 等类型

I: ls:英文全称为list,列表列出的意思,作用是列出目录中的内容

格式:ls[参数][目录]

常用参数: ~ 代表当前目录的根目录,也就是root目录		-a 显示所有文件及目录		

		 -l或ll或ls-l:显示文件详细信息[第一列:文件的权限  第二列:链接的个数  第三列:用户  

		 				   第四列:用户组     第五列:修改日期    第六列:文件名称]

		-F 查看文件类型		-t 按最后修改时间排序  -S 按文件大小排序(大写s)  -r 排序时按倒序

		ls -al 列出所有文件详细信息,权限与属性(包含隐藏文件)

II: cd命令:该命令用来切换目录,cd是 change directory 的缩写

格式:cd[选项][参数]

	选项:-P 如果目录是符号链接,则进入实际目录  -L 如果目录是符号链接,则进行链接目录  

	- 进入到调用cd命令时的上一次的工作目录,即 OLDPWD所代表的目录

	cd可以不有任何选项,此时将进入到用户主目录($HOME)

cd命令用法:

	1.cd 不带任何参数,先进入etc目录,在用cd命令,不管当前所在目录是哪里,都会进入HOME目录下

	2.cd ~ 进入当前用户的家目录

	3.cd . 进入当前目录 .代表当前目录

	4.cd .. 返回上一级目录

	5. cd / 返回至根目录

	6.cd -  回到前一个目录,实现在两个目录之间来回切换

	7. cd 目录名称   进入到指定目录

III:pwd命令:查看当前工作目录的完整路径,执行pwd命令可立刻得知您目前所在的工作目录的绝对路径

格式: pwd[--help][--version]			--help:在线帮助 		--version:显示版本信息

IV: chgrp 改变文件的所属用户组

	要改变的组名必须存在于/etc/group文件内才行,否则会显示错误

	创建用户组:groupadd teacher  ---创建teacher用户组

	添加用户:useradd -g teacher teacher ---将teacher用户添加到teacher用户组

IIV: chown 改变文件所有者(change owner)

 用于必须是已经存在于系统中的账号,也就是在/etc/passwd这个文件夹中有记录的才可以改变

 可以顺便修改用户组的名称  加 -R 参数即可

 例:chown teacher file 将file所有者改为teacher账号

 例:chown root:root file 将file所有者改回为root

IIIV: chmod 改变权限(两种方式:数字和符号)
权限表现格式:

 	linux基本权限有9个:owner,group,others这三种身份各有自己的read,write,execute(可读,可写,可执行)

 	权限数字(符号)代表如下:1=x(执行权)  2=w(写权)  4=r(读权)

 	权限为:[-rwxrwxrwx-] 分数分别是 4+2+1=7 4+2+1=7 4+2+1=7  ----777 			[-rwxrwxr--]   ----774

 	例:把file2文件所有的权限设置启用

 		格式:chmod 777 文件名

 	-----chmod 777 file2

文件操作命令

掌握新建,复制,移动,删除,查看,重定向,管道符

I: touch 创建空文件

	例:在home目录创建一个空文件 :cd /home  touch FileName

echo 创建有内容的文件

	例:在home目录下创建一个名为file内容为I LOVE PHP的文件:

		echo I LOVE PHP>file

			查看内容:cat file

		>覆盖:echo 1803a >file ---此时文件内容为1803a

		>>追加:echo 666 >>file  ---此时文件内容为1803a 666

II: cp复制文件或目录

	最常用的命令之一,一般shell会设置一个别名,如果目标文件已存在,会询问是否覆盖,不管是否使用参数 

	-i,但是如果执行cp时没有参数 -i 时不会询问是否覆盖,说明命令行和shell脚本的执行方式不一样

	例:进入home目录,将php文件复制,命名为php1 : cp php php1

		语法格式: cp 要复制的文件名  重命名的名字

		参数: -i 覆盖前询问    -n 不要覆盖已存在的文件  -r -R 复制目录及目录下的所有文件

III: mv 更改一个文件名称 —移动到其他位置(move的缩写)

	例:将home目录下的php文件移动到aa文件夹并查看是否移动成功:

		mv php aa   ----移动

		cd aa/  进入aa文件夹   ls  -al ---查看所有文件

	例:将php文件重命名为php1

		mv php php1

	参数:   -b或--backup  若需覆盖文件,则覆盖前先行备份。

-f或–force  若目标文件或目录与现有的文件或目录重复,则直接覆盖现有的文 件或目录。

-i或–interactive  覆盖前先行询问用户。

-S<附加字尾>或–suffix=<附加字尾>  与-b参数一并使用,可指定备份文件的所要附加的字尾。

-u或–update  在移动或更改文件名时,若目标文件已存在,且其文件日期比源文件新,则不覆盖目标文件。

-v或–verbose  执行时显示详细的信息。

-V=<方法>或–version-control=<方法>  与-b参数一并使用,可指定备份的方法。

–help  显示帮助。

–version  显示版本信息。

IV: rm 删除文件或目录

	删除一个目录中的一个或多个文件或目录

	例:删除phpfile文件 : rm phpfile  是否删除? Y/N

	参数: -i 进行交互式删除  -f 忽略不存在的文件,不给出提示  

	      -r 提示rm将参数中列出的全部目录和子目录均递归删除

	      -rf 删除有内容的文件夹并且不提示

V. cat 查看文件内容

cat 文件名称  ---一次显示整个文件的内容

例:在YY文件写入内容并查看: echo 1803a >YY --写入内容     cat YY ---查看内容

参数: -n 或 --number 由 1 开始对所有输出的行数编号
		
	  -b 或 --number-nonblank 和 -n 相似,只不过对于空白行不编号
		
	  -s 或 --squeeze-blank 当遇到有连续两行以上的空白行,就代换为一行的空白行
		
	  -v 或 --show-nonprinting

VI. 重定向(使用符号 ‘>’)

	将显示的结果输出到YY文件中,若该文件存在则取代

	例:ls -al > YY  将所有的内容显示到YY

	   ls -al >> YY 追加到YY,原YY内容保留

VII. 管道符的使用(使用符号 ‘|’)

  管道命令操作符只能处理经由前面一个指令传出的正确信息,对错误信息没有直接处理能力,然后传递给下一个命令,作为标砖的输入
  
  命令格式: grep 查找字符串

  例:查找php文件中love单词:  cat YY | grep love

  参数: 	-E 开启货站(Extend)的正则表达式  -i 忽略大小写

  		-v 反过来(invert)只打印没有匹配的

  		-n 显示行号    -w 被匹配的只能是单词,而不能是单词中的某一部分

  		例:查看以.php结尾的文件: ls | grep *.php

VIII. 文件查找命令 find(查看文件或文件夹)

  在目录结构中搜索文件,并执行指定的操作

  例:查看root目录下所有文件或文件夹,会把具体位置列出来

  		find 名称

  	参数:  -name 按照文件名查找   -perm 按照文件权限查找

  		   -prune 使find命令不在当前指定的目录查找

  		   -user 按照文件属主来找找  -group 按照文件所属组来查找


扩展: 文件查找命令  locate 根据/var/lib/mlocate数据库记载,找出用户输入的关键字文件名

	例:找出系统中所有与list相关的文件名:   locate list

	安装所所需要的库: yum -y mlocate,依赖关系完成  执行命令 updatedb,再执行locate list 即可

IX. 压缩解压命令

1.压缩文件大小有两个明显好处:一是可以减少存储空间,而是通过网络传输文件时,可以减少传输时间

Gzip 是在linux系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用

语法:Gzip [选项] 压缩(解压缩)的文件名				解压缩: gzip -dv with 文件名

例:将YY压缩 : Gzip YY         					例: gzip -dv with YY.gz

显示压缩文件信息

例:gzip -l YY.gz

参数: -a 使用ASSCII文字模式   -c把压缩后的文件输出到标准输出设备,不去更懂原始文件

	 -l 列出压缩文件的相关信息	-f 强行压缩文件

bzip2 将文件压缩成bz2模式

语法:bzip2 [选项][参数]

参数: -c 将压缩与解压缩的结果送到标准输出     -d 执行解压缩

	-f  bzip2在压缩或解压缩时,若输出文件与现有文件同名,预设不会覆盖现有文件。若要覆盖,请使用此参数

	-h或--help  显示帮助    -k或--keep  bzip2在压缩或解压缩后,会删除原始的文件。若要保留原始文件,请使用此参数。 
	 
	-s或--small  降低程序执行时内存的使用量  -t或--test  测试.bz2压缩文件的完整性
	
	-v或--verbose  压缩或解压缩文件时,显示详细的信息
	 
	-z或--compress  强制执行压缩         -L,--license,
	 
	-V或--version  显示版本信息
	
	--repetitive-best  若文件中有重复出现的资料时,可利用此参数提高压缩效果
	 
	--repetitive-fast  若文件中有重复出现的资料时,可利用此参数加快执行速度
	 
	-压缩等级  压缩时的区块大小

	例: 压缩指定文件YY   bzip2 YY   或 bzip2 -z YY 

		解压缩指定的文件YY.bz2:  bzip -d YY.bz2 或 bzip2 YY.bz2

X.关机重启命令:

关机命令:

	*shutdown -h now  ---立即关机

	shutdown -h +1	 ---1分钟后关机

	halt	    ---立即停止系统,需要人工关闭电源

	poweroff    ---立即停止系统,并且关闭电源

重启命令:

	*reboot		

	*shutdown -r now

	 shutdown -r +1		---1分钟后重启

注销命令:

	exit	 

	control + d

目录做操命令

I:mkdir 创建目录 格式:mkdir[选项]目录

功能:在指定位置创建指定文件名的文件夹或目录

1.没有参数,在home目录下,创建

2.-p  

p代表parents,可以是一个路径的名称,此时若路径中的某个目录不存在,加上此选项后,系统将自动建立好哪些不存在的目录

3.-m mode模式,设定权限<模式>

4.-v verbose创建当前新目录或文件时显示信息

II:rmdir 删除目录 rmdir命令用来删除空目录

格式:rmdir[选项]

命令的参数以及用法:

	1.没有参数:在home文件夹下有一空文件夹h5,要将其删除,删除之后查看还是否存在

	2.-p 或 --parents 删除指定目录后,若该目录的上层目录已经变成空目录,则将其一并删除

	3.--ignore-fail-on-non-empty: 此选项是rmdir命令忽略由于删除非空目录导致的错误信息

	4.-v或--verboes 显示命令的详细执行过程							

I:用户管理

了解/etc/passwd 和 /etc/shadow 文件的作用: 在linux 中/etc/passwd中每一个用户都有一个对应的记录行,他记录了这个用户的一些基本属性

系统管理员会经常接触到这个文件的修改,以完成对用户的管理工作,这个文件对所有用户都是可读的.在linux中,所有的用户(包括系统管理员)

的账号和密码都可以在/etc/passwd和/etc/shadow这两个文件中找到

[用户和密码就放在文件中,不怕被其他人看到修改吗?/etc/passwd只有系统管理员才可以修改,其他用户可以查看,/etc/shadow其他用户查看不了]

II:用户的添加

useradd = adduser  	语法:useradd[选项][用户名]

参数: -c<备注>  加上备注文字。备注文字会保存在passwd的备注栏位中。  -d<登入目录>  指定用户登入时的启始目录。 

-D  变更预设值. -e<有效期限>  指定帐号的有效期限。 -f<缓冲天数>  指定在密码过期后多少天即关闭该帐号。
 
-g<群组>  指定用户所属的群组。 -G<群组>  指定用户所属的附加群组。
 
-m  自动建立用户的登入目录。 -M  不要自动建立用户的登入目录。
 
-n  取消建立以用户名称为名的群组. -r  建立系统帐号。
 
-s   指定用户登入后所使用的shell。 -u  指定用户ID。

      例:创建用户1803a 在目录/etc/passwd文件中查看是否创建成功,默认放在home文件夹

      例:将创建的用户放在指定的目录: useradd -d 路径 -m 用户名

      例:给用户创建指定用户组: useradd -g 用户组 用户名

III: 修改用户

修改用户账号就是根据实际情况更改用户(chgrp是针对文件而言)的有关属性
	
usermod [选项][用户名][只有终极管理员才有权限修改账号名,如果用sudo命令对普通账号授权也行]

usermod -l 新用户名 旧用户名 :这个选项指定一个新的账号,即将原来的用户名改为新的用户名

usermod -g 新组  用户名 : 修改用户所属的群组

IV: 删除用户

userdel -r [用户名] 删除用户及用户目录

V: 设置密码 用户口令

passwd:创建用户之后,这个用户是被封锁的,无法登陆,要设置密码,哪怕密码为空

在设置密码是,一定要是root权限

例:给aa用户设置密码:

		useradd aa  ---->  passwd aa ----> 新密码  ---->  确认密码

注意:终极用户能为自己和其他用户设置口令,普通用户只能修改自己的口令

	语法:passwd [选项][用户名]

	参数: -l 锁定口令,即禁用账号     -u 口令解锁	-d 使账号无口令	-f 强迫用户下次登录时修改口令

	注意:如果默认用户名,修改当前用户的口令

V: 用户组管理

	用户组的内容都与这个文件有关/etc/group,/etc/gshadow,内容很简单,几乎都是增,修改,删除

1.用户组添加:groupadd 用户组名 	----  查看用户组:grep 用户组名 /etc/group /etc/gshadow

2.用户组修改:groupmod 跟useradd类似,这个命令仅是在进行group相关参数的修改而已

	参数: -g 修改GID数字		-n  修改组名

	例:将刚创建的用户组bb改名为cc,GID为201	: groupmod -g 201 -n cc bb

3.用户组删除:groupdel 用户组名

	例:将刚创建的用户组cc删除 : groupdel cc;

4.向组内添加已有用户: 

	gpasswd --- 用户组管理员功能[如果系统管理员太忙,导致某些账号想要加入某个项目时找不到人帮忙,这个时候可以新建'用户组管理员']

	什么是用户组管理员: 就是让某个用户组具有一个管理员,这个用户组管理员可以管理这些账号:加入,移除;这个时候就用到了这个命令

	例:gpasswd abc:

	参数:如果没有参数,表示给abc一个密码

		-A 将abc的主控权交友后面的用户组管理(该用户的管理员)      -M 将某些账号加入这个用户组当中

		-r 将abc密码删除		-R:将abc密码失效		-a: 将某个用户加入到这个用户组中	

		-d: 将某个用户从这个用户组删除

	用户组管理员做的操作:

		gpasswd -a 用户名 组名		gpasswd -d 用户名 组名

vim/vi文本编辑器几种模式,vi,vim都是多模式编辑器,vim是vi的升级版;

I: vim的优势:

	1.vim可以多级撤销(u键,在vim里面可以无限级撤销,vi只能撤销一次);

	2.易用性(vi只能运行于[unix]中,vim可以运行在[linux,unix,mac,windows]等多操作平台);

	3.语法加亮(可以用不同的颜色来加亮代码);

	4.可视化操作(vim不仅可以在终端运行,还可以运行于xwindow,mac os,windows);

	*5.对vi完全兼容(某些情况下,可以把vim当成vi来使用,vi和vim都是linux中的编辑器,不同的是vim比较高级,可以

	视为vi的升级版,vi适用于文本编辑,vim更适用于coding);[coding--编码,编程]

了解为什么要学习vim?

	vi编辑器是所有unix和linux系统下标准的编辑器,他就相当于windows系统中的记事本一样,他的强大不逊色于任何最新的

文本编辑器.他是我们使用linux系统不可缺少的工具.由于对unix及linux系统的任何版本,vi编辑器都是完全相同的
	
所有的unix like系统都会内建vi文本编辑器,其他的文本编辑器则不一定会存在,一些软件的编辑器接口都会主动调用vi.

II: vi有三种模式:

	命令行模式(一般模式),文本输入模式(编辑模式),末行模式;

掌握vi一般模式:

	vi打开一个文件就直接进入了一般模式(这是默认模式),这个模式中你可以使用上下左右键来移动光标,可以使用删除

字符或删除整行来处理文件内容,也可以使用复制,粘贴来出来你的文件数据;

安装vim: yum search vim查看vim相关信息   yum install -y vim在线安装vim

掌握vi编辑模式:

	在一般模式中可以进行删除,复制,粘贴等操作,但是却无法编辑文件内容,只有当你按下[A,a,i,I,O,o,R,r]任何一个

字母之后才会进入编辑模式;这时候屏幕下方会出现[insert]字样,此时才能进进行编辑;要回到一般模式,必须要按下[ESC]键

退出编辑模式;

掌握vi命令行模式:

	输入[: 或 / 或 ?]三个中的任何一个,就可以将光标移动到最底下的行.在这个模式中,可以提供查找,读取,存盘,替

换字符,离开vi,显示行号等动作.

vim的4种模式:正常模式,插入模式,命令模式,可视模式

	正常模式:

		启动vim默认处于正常模式;
	
	插入模式:

		在正常模式下按下A,O,I,a,o,i等键,会进入插入模式;

	命令模式:

		在正常模式中下按 :(英文冒号)进入命令模式,可以执行一些输入,并执行一些vim指令或插件提供的指令,就像

在shell例一样,这些指令包括 设置环境,文件操作,调用某个功能等等,常用的命令有 [q–退出,q!–强制退出,w–保存,

wq–保存并退出];

	可视模式:
	
	进入可视模式:
		
		v进入面向字符的可视模式	V进入面向行的可视模式		Ctrl + v进入面向列块的可视模式
        
        gv重选上次的高亮选区

    在可视模式之间切换:

    	ESC回到普通模式	ctrl+[回到普通模式	v,V,ctrl+v在对应的模式下回到普通模式

    切换高亮度选区的活动端:o

    重复执行面向执行的可视命令:

    	. 在行可视模式执行操作后,执行此命令会重选相同范围的文本行并执行一样的操作

    	v   j   >   进入面向行的可视模式,再用j调整了行边界,执行命令缩进命令>再普通模式下执行.会将重复

刚选中的可视行并执行缩进。建议,只要可能,最好用操作符命令,而不是可视命令

	从可视模式到插入模式:

		在可视模式中,i和a键会被当做对象的组成部分,按下i和a不会进入到插入模式,得用I和A进入插入模式

III: vi内部命令

1.了解模式切换 ---[a,i,o,:,esc]

例:创建day4文件,进入文件 :  echo i love php >day4    vi day4

2.按i进入插入模式(编辑模式)	3.在编辑模式下输入内容	

4.编辑模式下不能保存文件,先退出到命令模式,然后保存退出,这是我们回到bash终端[:q,:wq,:q!]

5.通过cat查看刚编辑保存的内容

6.vim文件名再次进入命令模式 k--向上走  j--向下走  h--向左走  l--向右走

7.保存不退出的方式[--末行模式] -----按下 :(英文冒号),鼠标就跑到屏幕的最后一行

8.了解光标操作指令(nG,ngg,H,M,L)

	H---光标移动到这个屏幕的最上方那一行的第一个字符	M---光标移动到这个屏幕的中间那一行的第一个字符

	L---光标移动到这个屏幕的最下方那一行的第一个字符	G---光标移动到这个文件的最后一行

	nG--光标移动到这个文件的第n行(2G--第二行)			gg--移动到这个文件的第一行,相当于1G

9.内容操作指令(删除,复制,粘贴)

	yy---复制光标所在的那一行		nyy--复制光标所在向下的n行	p---将已复制的数据在光标下一行粘贴

	P----贴在光标上一行			dd---删除光标所在行			ndd-删除光标所在的向下n行

10.末行指令(/ ? : w q x !  [set nu])

	:set nu 显示行号 ----- :set nonu 取消行号		:w保存  :q退出  	 :q!强制退出不保存	:wq保存并退出

	:x保存退出

IV:常见错误操作

使用vi出现错误的原因一般有两种情况

1.linux时多人,多任务的环境,如果多人同时编辑同一个文件,同时保存时,内容会变得乱起八糟

解决办法:1)找到另外的从程序猿[攻城狮],让他把vim工作结束,你继续编辑; 

		2)如果你只是要看文件,不做处理,可以选择打开为只读文件

2.非正常退出

接解决办法:1) O大写,open read only:打开此暂存文件成为只读文件

		  2) E 用正常的方式打开你要编辑的文件,并不会载入暂存文件的内容

		  3) R 加载暂存文件的内容,加载恢复后需要手动删除对应的暂存文件

		  4) D 删除暂存文件		

		  5) Q 离开vim,不进行任何操作,回到命令提示符

		  6) A 忽略这个编辑行为,回到命令提示符

V: linux进程管理

1.了解什么是进程: 

	触发任何一个事件,系统都会将他定义成为一个进程,并且给予这个进程一个ID,称为PID,同时依据启发这个进程的用户与相关

属性的关系,给予这个PID一组有效的权限设定,从此以后,这个PID能够在系统上进行的操作,就与这个PID的权限有关了.

2.程序与进程的关系:

	用户执行磁盘中的程序,然后载入到内存,会产生pid,属性,执行权限

3.查看进程: 可以使用ps命令,他能显示当前运行中的程序的相关信息,包括进程的pid,linux和unix都支持ps命令

	常用的命令: ps aux查看所有进程数据, 然后在通过管道使用 grep 命令过滤查找特定的进程,然后在对特定的进程操作.

		ps 参数: -A 显示所有进程 	-a 显示终端中包括其他用户所有进程  -u 有效用户相关进程	

		        -x  显示无控制终端的进程		-lA 查看系统中的所有进程数据 		ps axjf 联通部分进程树状态

4.动态查看进程:top命令提供了运行中系统的动态实时视图,在命令提示行中输入top [按q退出,按h进入帮助]

5.杀死进程: kill

	杀掉进程常用的两种方法:1)杀进程号	2)杀进程名

	杀进程号:ps 找到进程号,然后 kill [-9] 进程号 [参数-9彻底杀死进程]

	杀进程名:ps 找到进程名,然后 kill

6.计划任务:

	1)什么是例行性工作: linux系统有自己的定时要办的事情,比如日志文件的轮替,whatis数据库的建立等等.

		linux例行工作分一次性的(at)和循环执行的(cron)[cron是linux下定时执行的工具,无需人工干预]

		可以使用命令 sudo service cron restart/start/stop 来启动 cron

		安装:crontab    使用 yum 在线安装方式: 先执行yum install vixie-cron,在执行yum install ctrontabs

	2)掌握cron的编辑,查看,删除

		编辑:crontab -e 编辑crontab的工作内容(也就是编辑例行性工作),执行此命令后会打开一个类似于vi编辑器的窗口,

	往里面写入自己例行工作

		查看:crontab -l 查阅crontab的工作内容,会显示出当前用户的所有crontab工作.

		删除:crontab -r 删除crontab的所有工作,可以理解为清空,当你仅仅要删除其中的一项时,不要使用此命令,用-e打开

	重新编辑即可

		crontab -u 用户名 [-e,-l,-r] 一般root用户使用这个命令,目的是帮助其他用户创建或删除crontab工作

	例:执行输出当前时间

		1.创建一个shell脚本: vim a.sh  	2.编辑定时任务:crontab -e 	3.查看定时任务:crontab -l

	定时任务的格式:

		文件格式为 'M,H,D,m,d,cmd';其中M代表分钟(0-59),H代表小时(0-23),D代表天(1-31),m代表月(1-12),d代表一星

	期内的天(0-6[0为周日]),cmd表示要运行的程序,*代表每分钟都执行 [0 6 * * * sh /home/c.sh]

I: SSH与putty

ssh: 是 secure shell 的缩写,ssh为建立在应用层和存储层基础上的安全协议.ssh是目前较可靠,专为远程登录回话和其他网络

服务提供安全性的协议.咱们传统的远程网络服务如ftp,telnet等在本质上都是不安全的,因为他们在网络上用明文栓从口令和数据.当

如果出现第三方假冒服务器接收到咱们发送过去的明文数据时,此时可能就会发成严重问题.但是如果使用ssh,你可以把所有传输的数据

进行加密,这样恶意用户的这种攻击方式就不可能实现了,而且也能够防止dns欺骗和ip欺骗.使用ssh还有一个额外的好处,就是传输的

数据是经过压缩的,所以可以加快传输速度.

II:ssh安装 ssh链接 putty链接

一 ssh与putty应用

	1.ssh:咱们现在安装的linux版本都会装有ssh,可以通过 ssh -V 命令来查看安装的ssh版本信息,默认名为openssh

	  ssh类似于咱们windows操作系统上的telnet程序,可以远程登录到远程端的服务器,在通过ssh登录到远程端的linux服务

	器以后,咱们就相当于实际登陆了linux系统一样,可以对其进行操作,同时文件上传,下载都可以非常轻松的搞定,可以说,

	在学习ssh之前,ftp,samba这些咱们是要必须掌握的,但是在学习了ssh以后,这些服务器都是浮云了.

	  在linux系统中,ssh服务器的服务名称是sshd.默认情况下,linux系统在启动时,sshd服务就会启动,咱们不需要去改变他

	因为ssh也是一种网络服务,所以其必然也绑定了一个端口号,在linux系统中,ssh绑定的端口号是22.

	  启动ssh服务: service sshd start(7.0以下)	systemctl start sshd.service(7.0以上)

	  检测是否启动服务器: ps aux | grep ssh

	  关闭服务器: service sshd stop(7.0以下) 		systemctl stop sshd.service(7.0以上)

	  重启服务器: service sshd restart(7.0以下)	systemctl restart sshd.service(7.0以上)

	  查看硬盘容量: df -h

	因为linux上安装的是ssh服务端,所以咱们如果希望通过远程访问的方式登录到这台服务器上,比如我们要在Windows系统

上远程登录到ssh上,咱们就得在windows上装一个ssh客户端,现在ssh客户端软件非常多,大家可以选择一个下载.

	putty是一个免费的,开源的,支持telnet/ssh/rlogin等连接类型的连接工具软件,主要运行在windows平台,因为windows

没有自带的ssh连接工具.

	winscp是一个支持ssh的scp文件传输软件,只要文件主机支持ssh协议,你就可以下载,上传文件.

2.上传代码到服务器上,然后优化代码目录权限

	安装lnmp集成环境 ---[linux+nginx+mysql+php]

	1) df -h 查看磁盘容量 	 2) mkdir pubsrv  3)创建一个名为pubsrv的目录  cd pubsrv 进入目录

	3) 运行 screen -S lnmp命令,如果提示screen:command not found 命令不存在可以执行 yum install screen安装

	4) 在执行 screen -S lnmp

	5) 执行以下命令
		
		wget http://soft.vpser.net/lnmp/lnmp1.5.tar.gz -cO lnmp1.5.tar.gz && tar zxf lnmp1.5.tar.gz && 
	
	cd lnmp1.5 && ./install.sh lnmp
	
	6) 如果提示wget: command not found 命令不存在可以执行 yum install wget 在执行
		
	wget http://soft.vpser.net/lnmp/lnmp1.5.tar.gz -cO lnmp1.5.tar.gz && tar zxf lnmp1.5.tar.gz && 

	cd lnmp1.5 && ./install.sh lnmp
	见 图

	7 ctrl + c   退出安装结束界面
	
	8  netstat -ntlp  查看所有正在启动的端口  访问

III: linux下目录权限设置

在windows上运行好好的项目,迁移到linux上就遇到了很多问题,其中最重要的是网站目录权限设置,当然简单起见,既可以使用命

令 “chmod 777 -R 自己的网站”,这样就不用担心项目运行的时候会涉及到权限的问题了.通常来说如果你的项目是部署在公网或者部

署在租用的linux服务器上不建议这么做.因为如果这样设置了那么任何和用户都可以对这个站点下的文件,目录进行操作,这样会影响网

站的运营,同样不安全.

最简单的法子,不建议这么做(例如你的网站部署目录为/var/www/html): chmod 777 -R /var/www/html/demo

网站的目录和文件的所有者设置为 'demo' ,所属组设置为 'www-data'

	chown -R demo : www-data /var/www/html/demo

这是网站目录权限为 750 

	(750是demo这个用户对目录拥有读,写,执行的权限,这样demo用户可以在任何目录下创建文件,用户组有读,执行权限,这样就

有进入目录的权限,其他用户没有任何权限)

命令: chmod 750 /var/www/html/demo			进入目录:cd /var/www/html/demo

find -type	d -exec chmod 750 {}\

linux之find命令详解:

	查找文件: find ./ -type f 	查找目录: find ./ -type d    查找名字为test的文件或目录: find ./ -name test


	查找名字符合正则表达式的文件,注意前面的‘.*’(查找到的文件带有目录):  find ./ -regex .*so.*\.gz

	查找目录并列出目录下的文件(为找到的每一个目录单独执行ls命令,没有选项-print时文件列表前一行不会显示目录名称)
	
	find ./ -type d -print -exec ls {} \;

	查找目录并列出目录下的文件(为找到的每一个目录单独执行ls命令,执行命令前需要确认)
	
	find ./ -type d -ok ls {} \;

	查找目录并列出目录下的文件(将找到的目录添加到ls命令后一次执行,参数过长时会分多次执行)
	
	find ./ -type d -exec ls {} +

	查找文件名匹配*.c的文件: find ./ -name \*.c

	打印test文件名后,打印test文件的内容: find ./ -name test -print -exec cat {} \;

	不打印test文件名,只打印test文件的内容:find ./ -name test -exec cat {} \;

	查找文件更新日时在距现在时刻二天以内的文件: find ./ -mtime -2

例:设置网站文件权限为640 (640是指只有demo用户对网站文件有更改的权限)

		find -not -tyep d -exec chmod 640 {}\

	递归给runtime目录下的目录和文件赋予770权限(需要针对个别目录来设置权限,以tp为例,他的runtime目录了存的有日志

文件,还有与数据库做orm映射的数据信息,这说明apache服务器要对这些目录有访问的权限,并对下面的日志文件写入权限,这时候

就要对这个特殊的目录设置)

		cd /var/www/html/demo	进入目录      

		find . -name 'runtime' -type -exec chmod -R 770 {}\	设置权限

IV: 创建虚拟站点

1.当lnmp安装成功后,命令输入 lnmp vhost add ,进行添加域名,根据提示输入指令.一般情况下,每个虚拟主机就是一个网站,网

站一般通过域名进行访问;

虚拟主机管理基本命令:lnmp vhost {add | list | del}	具体操作:添加虚拟主机

2.具体步骤:

	1)执行 lnmp vohost add 命令 		2)输入要添加网站的域名,我们就以添加www.1803.com,输入域名

	3)询问是否添加多个域名,直接输入域名即可,如果绑定多域名,使用空格隔开,如不绑定,直接回车

	4)需要设置网站目录		

	5)网站目录不存在的话,会创建目录,也可以输入已经存在的目录或要设置的目录;

		注意:如果要输入路径,必须是全路径,以/开头的完整路径,不输入的话直接回车,采用默认目录 /home/wwwroot/域名;

	6)伪静态可以使 url 更加简洁,也利于 SEO[搜索引擎优化],如程序支持并且需要设置伪静态的话,启用输入y,不启用输入n

回车		

	SEO[搜索引擎优化,是一种方式:利于搜索引擎的规则,提高网站在有关搜索引擎内的自然排名.目的是:微网站提高生态式

的自我营销解决方案,让其在行业内占据领先地位,获得品牌受益]

3.虽然在(1)中设置了域名,但这个域名是假的,比如设置的域名是 www.book.com,你若在网址栏输入www.book.com,网页肯定会

直接跳到现实中真实存在的www.book.com,而不是自己私设的www.book.com,所以要进行域名重定向,在输入www.book.com直接重

定向到虚拟机中的项目在win7/10中打开 C:\Windows\System32\drivers\etc,中的hosts,若没有则可能隐藏了,打开文件夹选项选

中显示隐藏文件和勾掉隐藏受保护的操作系统文件,打开hosts,另起一行添加虚拟机的ip 域名,比如:

		192.168.70.111www.book.com  并保存修改 ,若不让修改, 就先把文件拉到桌面,改完后再拉回去 

4.重启lnmp:linux命令行输入lnmp restart

I: PHP运行模式:

	1)CGI(通过网关接口)   2)FastCGI(长柱型)   3)CLI(命令行运行)   4)Web模块模式(Apache等web服务器运行模式)

	5)ISAPI(在php5.3以后,PHP不在有ISAPi模式,安装后也不再有php5isapi.dll)

II: 学习 php-fpm 的概念和使用

	php-fpm: 就是php中的 FastCGI 进程管理器;是对于 FastCGI 协议的具体实现,他负责管理一个进程池,来处理来自web服

务器的请求;在 php5.3 之后,是内置于php的.因为 php-cgi 只是一个 CGI 程序,他自己本身只能解析请求,返回结果,不会进程

管理,所以就出现了一些能够调度 php-cgi 进程的程序,php-fpm 也是用于的调度管理 php 解析器 php-cgi的管理程序.

	php-fpm 通过生成新的子进程,可以实现 php.ini 修改后的平滑重启.

III:配置文件 nginx[nginx.conf],php[php.ini]

	查看 nginx 安装目录: ps -ef | grep nginx     查看 nginx 配置文件目录: nginx -t

	启动 nginx 服务: -c nginx.conf 配置文件目录;	其中参数 -c 指配置文件的路径,如果不加 -c 参数,nginx会默认自

动加载其安装目录的 conf 子目录中的 nginx.conf 文件.

IV: FPM介绍及运行原理,nginx 和 php-fpm 配置

	一.FPM介绍及运行原理

		代理与反代理:	 

			1.正向代理:访问 google ; ---[用户 <-> 互联网 <->  service <-> www.google.com]

			因为google被墙,我们需要才能访问www.google.com,对于我们来说是可以感知到的(我们链接),对
		
		于google服务器来说,是不可感知的(google只知道有http请求过来).

			对于人来说可以感知到,但服务器感知不到的服务器,我们叫他正向代理服务器.

			2.反向代理: 通过反向代理实现负载均衡
													|<-->server1
			[用户 <-> 互联网 <-> 反向代理server <-> 	|<-->server2
													|<-->server3
			]

			反向代理服务器,对于我们来说是不可感知的(我们只能感知到访问的是百度的服务器,不知道中间还有代理服务器

		的负载均衡)此代理服务器,对于server1 server2 server3 是可感知的(代理服务器负载均衡路由到不同的server)

			对于用户来说不可感知,但是对于服务器来说是可感知的,我们叫他反向代理服务器.

	
	i:php-fpm是什么: php-fpm是FastCGI的实现,并提供了进程管理的功能.

		进程包含master(主进程)进程和worker(子进程)进程两种进程;master进程只有一个,负责监听端口,接收来自web 

	server的请求,而worker进程则一般有多个(具体的数量根据实际需求配置),每个进程内部都嵌入一个php解释权,是php代码

	真正执行的地方.

	ii:运行模式

		php-fpm支持三种运行模式:static,ondemand,dynamic,默认为dynamic

		1)static:  静态模式,启动时分配固定的worker进程

		2)ondemand:按需分配,当收到用户请求时 fork worker进程

		3)dynamic: 启动时分配固定的进程,伴随着请求数增加,在设定的浮动范围调整worker进程.

		三种模式各有千秋,可以根据不同的环境调整相应的配置.

    iii:工作原理

    	php-fpm采用master/worker架构设计,前面简单的魔术了master和worker进程模块的功能.

    	master主进程工作流程分为四个阶段:

    		首先初始化CGI -> 初始化php环境 -> 初始化php-fpm -> 运行php-fpm

    	worker子进程:

    		接收客户请求 -> 处理客户请求 -> 请求结束

    	总结:

    		php-fpm采用 master/worker架构设计,master进程负责CGI,PHP公共环境的初始化及时间监听操作;worker进程负

    	责请求处理.在worker进程处理请求时,无需再次初始化php运行环境,这也是 php-fpm 性能优异的原因之一.

	二.nginx 和 php-fpm配置

		nginx如果与php-fpm结合:

			上面我们说了,nginx不只有处理http请求的功能,还能做反向代理,nginx通过反向代理功能,将动态请求转向后端

		php=fpm.

		下面我们就来配置一个全新的 nginx + php-fpm

			1.配置nginx.conf文件:

				首先进入nginx目录下,编辑nginx.conf文件.在nginx.conf文件最后面一行添加include文件.

				查看nginx安装目录: ps -ef | grep nginx    查看配置文件目录: nginx -t

			2.添加对应的server

				进入上面include路径,添加一个server

				cd vhost,然后 vim 需要打开的conf文件(www.1803.com.conf)

				server{
				        listen 80;   ----监听80端口,接收http请求

				        #listen [::]:80;

				        server_name www.1803a.com ;   ---网站地址

				        index index.html index.htm index.php default.html default.htm default.php;

				        root  /home/wwwroot/www.1803a.com;	---准备存放代码工程的路径

				        	路由到网站根目录www.1803a.com 的时候处理

				        include rewrite/y.conf;

				        #error_page   404   /404.html;

				        # Deny access to PHP files in specific directory

				        #location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; }

				        include enable-php-pathinfo.conf;

				        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
				        {
				            expires      30d;
				        }

				        location ~ .*\.(js|css)?$
				        {
				            expires      12h;
				        }

				        location ~ /.well-known {
				            allow all;
				        }

				        location ~ /\.
				        {
				            deny all;
				        }

				        access_log  /home/wwwlogs/www.1803a.com.log;

	会有一个文件:

			location ~\.php${

				include /usr/local/etc/nginx/fastcgi.conf;	---加载fastcgi模块

				Fastcgi_intercept_errors on;	---开启错误处理

				Fastcgi_pass 127.0.0.1:8080;	---nginx fastcgi进程监听的ip地址和端口
			}


	当我们访问www.1803a.com的时候,处理的流程是这样的:www.1803a.com -> nginx -> 路由到www.1803a.com/index.php

-> 加载nginx的fast-cgi模块 ->fast-cgi监听127.0.0.1:9000地址 -> 请求www.1803a.com/index.php到127.0.0.1:9000地址

-> 等待处理

IV: 搭建虚拟主机

gninx 和 php-fpm配置

命令:cat /usr/local/php/etc/php-fpm.conf			fpm默认端口号9000

pwd 查看当前目录			检测nginx配置文件对不对,是否有语法错误 nginx -t

重启nginx /usr/local/nginx/sbin/nginx -s reload

重启php-fpm  /etc/init.d/php-fpm restart			查看PHP进程: ps -ef | grep php

查看端口是否起来 	netstat -ntlp

I:什么是进程

进程是程序执行时的一个实例,即他是程序已经执行程度的数据结构的汇集.从内核的观点看,进程的目的就是担当分配系统资源(cpu时间,内存等)的基本单位.

II:什么是线程

线程是进程的一个执行流,是cpu调度和分配的基本单位,他是比进程能更小的独立运行的基本单位.一个进程由几个线程组成(拥有很多相对独立执行流的用户程序

共享应用程序的大部分数据结构),线程与同属一个进程的其他线程共享进程所拥有的全部资源.

进程 --- 资源分配的最小单位		线程 --- 程序执行的

III:线程与进程的区别

1.进程是比较大的单位,一个进程可以有多个线程,一个线程只能被一个进程拥有.

2.进程是资源分配的基本单位,线程是处理机制调度的最小单位,所有的线程共享其所属进程的所有资源与代码.

3.线程执行过程中容易被同步,而进程之间需要通信进程同步.

4.线程共享进程数据的同时,拥有自己的堆与栈.

IV:线程的一些优点

1.由于线程用所属进程的一些资源,线程的划分尺度更小,并发性比较高.

2.线程可以共享进程的一些数据和代码,这样就比进程通过消息通信来得更加简单,启动速度和切换也比进程快.

V:Apache服务器的MPM模块,Nginx中http,server,location模块

1.Apache服务器的MPM模块配置

	1)启用mpm模块配置文件:需要在httpd.conf文件中启用该配置文件.需要在httpd.conf文件中找到 

		#server-poor management(MPM specific)

		#include conf/extra/httpd-mpm.cpnf(去掉前面的井号)

	2)启用MPM模块后找到配置文件进行编辑

		在Apache安装目录/conf/extra目录中有一个httpd-mpm.conf配置文件,这个文件主要用于进行MPM模块的相关配置.

	3)此时我们需要根据当前Apache服务器所使用的MPM模块来修改对应的节点下的参数配置.

		mpm-winnt: 这个模块会创建一个子进程,因此这里对单个子进程的参数设置就相对于整个Apache的参数设置.

		两个参数: ①ThreadsPerChild:每个子进程的最大并发数线程.	②MaxConnectionsPerChild:每个子进程允许处理的请求组数.

	4)mpm-perfork模块下默认配置,对应的配置参数作用如下:

		StartServers: 启动APache时自动黄建的子进程数		

		MinSpareServers: 处于空闲状态下最小子进程数
	    
	    MaxSpareServers: 处于空闲状态下最大子进程数			

	    MaxClients: 最大连接数
	    
	    MaxRequestsPerChild: 

	  mpm-worker模块下的默认配置,对应的配置参数作用如下:  

	    MinSpareThreads: 处于空闲状态最小线程数

	    MaxSpareThreads: 处于空闲状态最大线程数

VI: nginx配置文件中http,server,location模块

	http:全局配置	server:虚拟主机	location:用来为匹配的url进程配置

	Location:是nginx中的块儿级指令.

VII:nginx代理模块(proxy_pass)

	proxy模块是nginx中最碉堡的模块之一.就是有了proxy模块,nginx才能和其他的http服务器关联起来,极大程度的提高了nginx的可用性.proxy这个模块比较

大,光是指令就很多.简单的介绍最核心的指令proxy_pass:

	当我们遇到跨域问题,而且客户端无法支持cors时候,最好的办法让服务器来做代理.在前端页面所在的服务器nginx配置上一个路由,然后使用proxy去请求另一

个域名下的资源.如果跨域资源也部署在同一台机器上,我们甚至可以用proxy到127.0.0.1

	比如:location /img{

			proxy_pass http://127.0.0.1:1234;

		}

	当客户端请求/img这个路径下的资源时,服务器会帮助我们去 127.0.0.1的1234端口上获取资源,这样就解决了跨域的问题.

VIII:掌握php-fpm中 pm 模块的配置(/usr/local/php/etc)

	php-fpm.conf --- 这里面有两个至关重要的参数:	

*1)max_children		

	pm.max_children 表示能启动的子进程的最大数量.他的值取决于你的服务器内存.

		假设打算给10G内存给当前配置的 php-fpm 池.一般一个php请求占用内存10M-40M,我们按站点每个php请求占用内存25M,这样

	max_children=10G/25M=409,所以这个值是可以根据情况计算出来.

*2)request_terminate_timeout: 将执行时间太长的进程直接终止.

3)pm.start_servers:	启动时的进程数

4)pm.min_spare_servers: 保证空闲进程数的最小值,如果空闲进程小于此值,则创建新的子进程.

5)pm.max_spare_servers: 保证空闲进程数的最大值,如果空闲进程大于此值,则此进程被清理.

6)pm.max_idle_timeout:	空闲进程超时时间.

I: http协议(http1.0,http1.1,http2.0)

1.http协议:超文本传输协议,他是一个基于请求与相应模式的,无状态的'应用层'协议.;他是基于tcp的链接方式,http链接是短链接.

2.tcp/ip协议与回http协议的区别:

	tcp协议是传输层的协议,主要解决数据如何在网络中传输.而http是应用层的协议,他解决的是如果保障数据.关于tcp协议和http协议的关系,网络上有一段比

较容易理解的介绍:"我们在传输数据的时候,可以只使用tcp协议(传输层),但是那样的话,如果没有应用层,便无法识别数据内容,如果想要使数据的传输有意义,则必

须使用到应用层协议,比如ftp,http等;也可以自定义应用层协议.Web使用http协议作为应用层协议,以封装http文本信息,然后使用tcp作为传输层协议将他发到网

络上."

3.Keep-Alive:解决效率低的问题.

  	http采用"请求-应答"模式,如果不是keep-alive模式的时候,每个请求/应答客户端和服务器都要建立一个链接,完成之后断开链接;当使用keep-alive

模式的时候(又称持久链接,链接重用),keep-alive功能使客户端到服务器的链接持续有效,当出现对服务器的后续请求时,keep-alive避免了建立或者重新建立

连接.

4.http协议的主要特点:

	1)支持客户/服务器模式		

	2)简单快速:客户向服务器请求服务时,只需传送请求方法和路径;常用的请求方法:get和post;每种方法规定了客户与服务器联系的类型不同.由于http协议简

单,使得http服务器的程序规模小,因为通信速度很快

	3)灵活:http允许传输任意类型的数据对象.

	4)无链接:限制每次链接只处理一个请求;服务器处理完客户的请求,并收到客户的应答后就断开链接.采用这种方式可以节省传输时间

	5)无状态:http是无状态协议;无状态是指协议对事物的处理没有记忆能力.缺少状态意味着如果后续需要处理需要前面的信息,则他必须重传信息,这样可能导

致每次链接传送的数据量增大;另一方面,在服务器不需要先前信息时,他的应答就较快.

5.http1.0 和 http2.0 的关系和区别

	1)链接方面

		http1.0使用的是非持久连接,在非持久连接下,一个tcp连接只传输一个web对象.每次请求和响应都需要建立一个单独的连接,每次连接只是传输一个单独

	的对象;严重影响客户端与服务器的性能.

		http1.1默认使用的是持久连接,在持久连接下,不必为每个web对象传输建立一个新的连接;一个连接可以传输多个对象.在一个tcp连接上,可以传送多个

	http请求和响应,减少了建立和关闭连接的消耗和延迟.

	2)缓存方面

		http1.0主要使用header里的if-Modified-Since,Expires来做缓存判断;

		http1.1中引入了更多的缓存策略;如#Entity tag,If-Unmodified-Since,If-Mathch,If-None-Match等更多可供选择的缓存头来控制缓存策略带宽优

	化及网络连接的使用;

	3)状态码

		在http1.1中新增了24个错误状态响应码;如409表示请求的资源与资源当前的状态发成冲突;410表示服务器上的某个资源被永久性的删除;

	4)带宽优化

		http1.1支持只发送header信息(不带任何body信息),如果服务器认为客户端有权限请求服务器,则返回100,否则返回401;客户端如果接收到100,才开始

	把请求的body发送的服务器;这样当服务器返回401的时候,客户端就不用发送body请求了.节约了带宽.

	5)host头

		http1.0中认为每台服务器都绑定了一个唯一的ip地址,因此请求消息中url并没有传递主机名(hostname);伴随着虚拟主机技术的发展,在一台物理服务

	器上可以存在多个虚拟主机,并且他们共享一个ip地址.

		http1.1的请求消息和响应消息都应支持host头域,并且请求消息中如果没有host头域,会报告一个错误400;

6.http1.1和http2.0的区别

	1)多路复用

		在http1.1协议中,浏览器客户端在同一时间针对同一域名的请求有一定的数据限制,超过一定数目,请求就会被堵塞;在http2.0协议中使用了多路复

	用技术,做到同一个连接并发处理多个请求,而且并发请求的数量比http1大了好几个数量级.

		当然http1.1也可以多建立几个tcp连接来支持处理更多的并发请求,但是创建tcp连接本身也是有开销的.

	2)首部压缩

		http1.1不支持header数据的压缩,http2.0使用HPACK算法对header数据进行压缩.这样数据体积就变小了,在网络上传输的速度就会很快.

	3)服务器推送

		当我们对支持http2.0的web server请求数据的时候,服务器会顺便把一些客户端需要的资源一起推送给客户,免得客户端再次创建连接,发送请求到

	服务器获取;这种方式非常适合加载静态资源.

7.http和https的区别

	1)https协议需要到CA申请证书,一般免费证书很少,需要交费.

	2)http协议运行 在tcp智商,所有的传输内容都是名人,https运行在ssl/TLS之上,ssl/TLS运行在tcp之上,所以https传输的内容都是经过加密的.

	3)http和https使用的是完全不同的连接方式,用的端口也不一样;http端口80,https端口号是443;

	4)https可以有效的防止运行商的劫持,解决了一个防劫持的大问题.

	5)http:http -->TCP      https: -->SSL/TLS[加密/解密] -->TCP

II: http持久连接和非持久连接

http可以使用非持久连接,也可以使用持久链接;http1.0使用的是非持久连接,http1.1默认使用的是持久连接.

1.非持久连接

	非持久连接有些缺点。首先,客户得为每个待请求的对象建立并维护一个新的连接。对于每个这样的连接,TCP得在客户端和服务器端分配TCP缓冲区,并维持TCP

变量。对于有可能同时为来自数百个不同客户的请求提供服务的Web服务器来说,这会严重增加其负担。其次,每个对象都有2个RTT(往返时间,往返时间在计算机网

络中它是一个重要的性能指标)的响应延长--一个RTT用于建立TCP连接,另-个RTT用于请求和接收对象。最后,每个对象都遭受TCP慢启动,因为每个TCP连接都起始

于慢启动阶段。

2.持久连接

	在持久连接情况下,服务器在发出响应后让TCP连接继续打开着。同一对客户/服务器之间的后续请求和响应可以通过这个连接发送。整个Web页面可以通过单个持

久TCP连接发送,甚至存放在同一个服务器中的多个Web页面也可以通过单个持久TCP连接发送。通常,HTTP服务器在某个连接闲置一段特定时间后关闭它,而这段时

间通常是可以配置的。

III:http协议的版本,端口号 --------[1.0 1.1 2.0 端口:80]

IV:http协议的组成结构和标头构成

http请求有三部分组成:请求方法 和 URI及使用的协议 、消息报头、请求正文

1、请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本

2,HTTP消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息都是由开始行,消息报头,空行,消息正文组成。HTTP消息报头包括普通报

头、请求报头、响应报头、实体报头。每一个报头域都是由名字+“:”+空格+值 组成,消息报头域的名字是大小写无关的。

V:http和tcp的关系,和iso7层网络模型

第一部分我们开发控制的范畴:应用层,表示层,会话层

第二部分处在所有开发者同一的范畴:运输层,网络层,链路层,物理层

七层模型从低到高:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。 [ISO/OSI开放系统互连模型]

	1.物理层处于iso参考模型的最低层。物理层的主要功能是利用物理传输介质为数据链路层提供物理连接,以透明地传送比特流。

	2.数据链路层在物理层提供比特流传输服务的基础上,在通信实体之间建立数据链路连接,传送以帧为单位的数据,通过差错控制、流量控制方法,变有差错的

物理线路为无差错的数据链路。 

	3.网络层主要任务是通过执行路由选择算法,为报文分组通过通信子网选择最适当的路径。它是ISO参考模型七层中最复杂的一层。
 	
 	4.传输层是向用户提供可靠的端到端服务,透明地传送报文。 

 	5.会话层的主要目的是组织同步的两个会话用户之间的对话,并管理数据的交换。

 	6.表示层主要用于处理两个通信系统间信息交换的表示方式,它包括数据格式变换、数据加密与解密、数据压缩与恢复等功能。 

 	7.应用层是iso参考模型的最高层。应用层不仅要提供应用进程所需要信息交换和远程操作,而且还要作为应用进程的用户代理,完成一些为进行语义上有意义

 的信息交换所必须的功能。

 	TCP三次握手:

 		第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; 

 		SYN:同步序列编号(Synchronize Sequence Numbers)
		
		第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 

		第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手.
	
	完成三次握手,客户端与服务器开始传送数据

I.http协议的请求方法(8种)

http1.0定义了三种请求方法:Get Post Header

http1.1新增五种请求方法:Options Put Delete Trace Connect

Get:请求指定的页面信息,并返回实体.Get可以说是最常见的,它本质就是发送一个请求来获取服务器上的某一资源,资源通过一组

http头和html,图片呈现数据返回给客户.

Header:类似于Get请求,只不过返回的响应中没有指定的内容,用户获取报头.

Post:向服务器提交数据.这个方法用途广泛,几乎所有的提交操作都是靠这个完成的.

Put:从客户端向服务器传送的数据取代指定的文档的内容.Put和Post很相似,都是向服务器发送数据,他们之间有一个重要的区别:

Put通常指定资源存放的位置,而Post没有;Post数据的存放位置由服务器自己决定.

Delete:请求服务器删除指定的页面.[删除某一个资源]

Connect:http1.1协议中,预留给能够将链接改为管道当时的代理服务器.

Options:允许客户端查看服务器的性能.返回服务器针对特定资源所支持的http请求方法.

Trace:回显服务器收到的请求,主要用于测试或诊断.

注意:

1.方法名称区分大小写,当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405;当服务器不认识或者

不支持对应的请求方法时,应返回状态码501

2.http服务器至少应该实现Get Post Header方法;其他方法都是可选的,此外除上述方法,特定的http服务器支持扩展

自定义方法.

II.接口的规范和接口文档

1.接口规范的重要性:为了app开发人员与后台接口开发人员更好的配合,所以我们需要制定接口规范.接口是app端与服务器端交互

密不可分的环节,接口的规范性会直接影响双方对接过程中的效率和质量.本着快速高效开发的目的性,避免对接过程中的错误率,接口应

当口有规范的约束.

例:返回数组[],返回对象{}
{
“list”: [

		{
			"name":"张三",

			"id": '100'
		},

		{
			"name":"李四",

			"id": '101'
		},
	],

	"object":{

		"title":"demo",

	},

	"message":"数据加载成功",

	"status":"SUCCESS",

	"page":"1",

	"number":"2",
}

list:只存储list数据[列表,数组数据],为空时也返回一个空的list("list":[])		

object:只存储实体数据	

message:返回的提示信息[例:加载成功,查询失败,登录成功等]			

status:接口状态[SUCCESS-成功 ERROR-失败]--静态变量大写

page和number:其他可选字段,例如页数,list条数等根据项目需求来指定字段

2.接口文档

	后台人员和移动端开发人员之间的配额和肯定少不了接口文档这种利器!像中大型项目可能一个接口包含的字段就有上百个,如

果没有接口文档,仅仅靠两个人口头交流,那估计一天就能搞定几个接口配合.

3.接口文档有哪几种形式?

	1)Excel Word等文档形式	--古老的方式				2)接口管理开源网站	--高效便捷

	Eolinker

	一个完整的接口需要由以下几个部分组成

		1)请求地址	http://127.0.0.1:8080/xx/xx/xx

		2)请求方式	Post Get

		3)请求参数	"id":'1',"name":"小明"

		4)返回参数	一般返回json格式

		5)返回实例

4.接口的编写和接口的数据格式

	接口存在的意义就是实现'多重继承',准确的来说应该叫做'多重实现',因为一个php类智能有一个父类,而一个类却可以实现

多个接口现在主流的通信接口返回的数据主要有json和xml两种格式.

	json的优势是:生成方便,体积小,更便于传输;	缺点是:不便于阅读,需要解析;

	xml的优点是:便于阅读,但是体积大,生成较json要麻烦的多

5.json方式封装通信接口

6.xml方式封装接口通信(自学)

III.使用postman和fiddler测试数据接口

1.postman是一个谷歌浏览器(Google Chrome)扩展,能提供强大的web api 和 http 调试请求功能;postmna能够发送任何类

型的http请求,支持Get,Post,Put,Delete等;请求头中可以附带任何数量的header信息

postman支持不同的认证机制:basic,digest,OAuth

postman非常简单易用,通过填写url,header,body等就可以发送一个请求,这对于我们平时做一些简单的测试是够用的.

postman有一个"集合"的功能,用于存储所有请求相同我的 api 域,这个功能可以方便我们重新发送请求.

2.fiddler是好用的web api 调试工具之一,他能记录所有客户端和服务器的http,https请求,允许你监视和设置断点,甚至修改

输入输出数据;fiddler是以代理web服务器的形式工作的,使用fiddler无论是对开发还是测试来说,都有很大的帮助.

注意:
cd /usr/local/mysql/ --先进入linux中的mysql目录

mysql -u root -p  --进入mysql命令行	然后执行 use mysql

在执行GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.80.1' IDENTIFIED BY '123456' WITH GRANT OPTION;

IV:浏览器跟服务器交互的整个生命周期

1.浏览器和服务器交互是通过socket

2.浏览器与服务器交互的语法:http协议

3.浏览器和服务器交互的目的:获取服务器的资源(html,图片,js,css)

4.服务器要做的就是想尽办法满足浏览器的需求.所以一旦浏览器请求的是动态页面的时候,服务器就要创建页面类的对象,并执行

里面的方法,最后将生成的html代码返回浏览器

httpRuntime方法	HTTPWorkerRequest  创建一个HTTPContext对象	httpApplicationFactory

processRequest  IHttpHandler	FramworkIntalize

I.传输数据的几种数据格式

1)HTML:由一些普通文本组成;如果服务器通过XMLHTTPRequest发送html,文本将存储在responseText属性中.从服务器端发送的

html的代码在浏览器端不需要用JavaScript进行解析,可以直接使用innerHTML属性把服务器传输过来的html插入到页面中.

2)XML:是一种通用的数据格式;他不必把数据强加到已经定义好的格式中,而是要为数据自定义合适的标记.利用dom可以完全掌控文

档.XML是当前编程中最为流行的数据交换格式,拥有跨平台,跨语言的优势.


苏靖凯 http://abs.com/--都可自定义 [email protected]
3)json:json是一种轻量级的数据交换格式,他是基于JavaScript的一个子集. json的优点:同xml和html片段相比,json提供更好的间断性和灵活性,在JavaScript地盘内,json毕竟是主战场,其优势当然 要远远优越于xml;他非常适合于服务器与JavaScript交互. json的数据格式: 1.并列数据之间用 逗号(,) 分隔; 2.映射用 冒号(:) 分隔 3.并列数据的集合用 [] 表示 4.映射的集合用 {} 表示 实际上JavaScript是将服务器端返回的json数据赋值给一个js变量,将js变量输出即可在页面中显示服务器端返回的数据.

三者对比;

若应用程序不需要与其他应用程序共享数据的时候,使用html片段返回数据时最简单;如果数据需要重用,json文件是个不错的选择,

其在性能和文件大小方面有优势.当远程应用程序未知时,xml文档是首选.YAML(自学)

II.跨域传值的同源策略

1.什么是源:源就是协议,域名和端口号	--http://www.baidu.com:80

  若地址里面的协议,域名,端口号均相同则属于同源.

2.什么是同源策略:同源策略就是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方的资源.所以

a.com下的js脚本采用ajax读取b.com里面的文件数据是会报错的.所谓的同源是指协议,域名,端口相同.

不受同源策略限制的

	1)页面中的链接,重定向以及表单提交是不会受到同源策略限制的.

	2)跨域资源的引入是可以的.