2

/proc目录
内核把状态信息,统计信息,可配置参数通过proc伪文件系统输出
参数:
只读:输出信息
可写:配置内核
可写参数位于/proc/sys目录
1:sysctl查看设定/proc/sys目录中的参数
sysctl -w path.to.parameter=VALUE
sysctl -w kernel.hostname=yum-groupremove
以sys为相对路径
2:echo通过重定向也可修改大部分参数
echo "VALUE">/proc/sys/path/to/parameter
echo "yum-groupinfo">/proc/sys/kernel/hostname
sysctl: configure kernel parameters at runtime
配置文件:/etc/sysctl.conf
1:设置参数
sysctl -w parameter=VALUE
2:通过配置文件设置参数
sysctl -p [/path/to/conf_file]
-p:reload
内核的路由转发(核心转发)
/proc/sys/net/ipv4/ip_forward

/proc/sys/vm/drop_caches

/sys目录:
内核用来输出硬件设备的相关参数
sysfs:
输出内核识别出的各硬件设备相关属性信息,也有内核对硬件特性的设定信息,一些参数可修改,调整硬件工作特性

udev通过此sysfs动态为各设备生成所需设备文件,udev运行在用户空间,专用工具:udevadmin,hotplug
udev为设备生成设备文件时,会读取事先定义好的规则文件,一般在/etc/udev/rules.d/和/usr/lib/udev/rules.d/下

ramdisk文件的制作:
ramdisk是系统安装过程中,最后一步,通过收集当前系统硬件设备信息,按需创建

编译内核:
1:准备好开发环境
2:获取目标主机上硬件设备相关信息
3:获取目标主机系统功能相关信息,如要启用的文件系统
4:获取内核源代码包
www.kernel.org

准备好开发环境:centos 6
包组:
development tools
Server Platform Development
目标主机硬件设备相关信息
CPU:
cat /proc/cpuinfo
lscpu
x86info -a
PCI:
lspci
lspci -v
lspci -vv

USB:
lsusb [-v|-vv]
块设备:
lsblk
全部硬件设备信息:
hal-device
hal-device-gui
简单依据模板文件的制作过程:
tar xvzf linux-VERSION.tar.gz --directory=/usr/src
cd /usr/src
ln -sv /usr/src/linux-VERSION linux
cd linux-$(uname -r)
cp /boot/config-$(uname -r) ./.config

make menuconfig
screen
make -j #(使用#个核心进行编译)
make modules_install
安装/lib/modules/$(uname -r)/下的各模块文件
make install
安装bzImage为/boot/vmlinuz-VERSION-RELEASE
生成initramfs文件
修改/boot/grub/grub.conf配置文件
这两步完成后自动在/boot/grub/grub.conf中生成新的title

shutdown -r 0

screen: ^a放开后按d就detached
screen -ls
screen -r #
Linux的内核编译:
编译内核步骤:
1:配置内核选项
支持"更新"模式进行配置
a:make config 基于命令行遍历的方式去配置内核中可配置的所有参数
b:make menuconfig 基于curses的文本窗口界面
c:make gconfig a GTK based front-end GNOME基于GTK开发环境的窗口界面
d:make xconfig a QT based front-end KDE基于QT开发环境的窗口界面
e:make localmodconfig update current config disabling modules not loaded
f:make localyesconfig update current config converting local mods to core
支持"全新配置"模式进行配置
make defconfig new config with default from ARCH supplied deconfig基于内核为目标普通提供的"默认"配置进行配置
make allnoconfig
make allyesconfig
2编译
make [-j #]启用多线程编译
只编译内核中的一部分功能
a:只编译某子目录中的相关代码(核心或模块)
cd /usr/src/linux只能在此目录执行make
make dir/
ex:make drivers/net/
必须在内核源码目录/usr/src/linux
源码编译完成后会生成*.o或*.ko文件,*.o文件链接后变成*.ko文件
b:只编译一个特定模块
cd /usr/src/linux
make dir/file.ko
ex:只为e1000编译驱动
make drivers/net/e1000/e1000.ko
$$$e1000.ko为要生成的目标文件,依据e1000.h编译而来
交叉编译内核:
一个程序编译,汇编,链接后只适用于特定平台
汇编就是把编译后的代码生成特定机器码(机器指令)的过程,机器指令区分平台

跨平台编译,编译的目标平台与当前平台不同

make ARCH=arch_name
arch_name指明哪个公司生产的哪种型号
获取特定目标平台使用帮助
make ARCH=arch_name help
ex:make ARCH=arm help
make ARCH=arm versatile_defconfig 执行完后会显示 configuration written to .config versatile此平台的默认配置写入到/usr/src/linux中的.config文件中

make help(current platform)

如何在已经执行过编译操作的内核源码树重新编译
需要事先清理*.o(ko)
cleaning targets:
1:clean remove most generated files but keep the config and enough build support to build external modules
2:mrproper remove all generated file + config + various backup files
3:distclean mrproper +remove editor backup(编译器备份) and patch files

make clean
make mrproper
make distclean

screen命令:
打开新的screen
screen
退出并关闭screen
exit
剥离当前screen
ctl+a,d
显示所有已经打开的screen
screen -ls
恢复某screen
screen -r [SESSION_NUM]
recover
只有一个screen,SESSION_NUM可省略

Centos系统安装:
BootLoader --> kernel(initramfs) --> rootfs --> /init
anaconda:安装程序
tui:基于curses的文本窗口
gui:
光盘中,boot.cat相当于BootLoader(446bytes)一阶段,isolinux.bin相当于二阶段的grub,配置文件isolinux.cfg, isolinux.bin结合vesamenu.c32显示图形窗口

第一次出现的图形窗口由vesamenu.c32提供,背景图片为splash.jpg

Centos安装程序启动过程:
MBR:boot.cat
stage2:isolinux/isolinux.bin
每个对应的菜单选项:
加载内核:isolinux/vmlinuz
向内核传递参数:append initrd=initrd.img
装载根文件系统,启动anaconda
默认启动GUI
若显示指定TUI接口
向内核传递text参数
boot:linux text
上述内容一般应位于引导设备,而后续的anaconda及其安装用到的程序包有几种方式可用
本地光盘
本地硬盘
ftp server:yum repository
HTTP server:yum repository
nfs server
手动指定安装源:
boot:linux method
anaconda工作过程:
安装前配置阶段:
键盘类型
语音
时区
管理员密码
设定分区方式和MBR安装位置
选择程序包
安装阶段
在目标磁盘创建分区,格式化
安装选定程序包
安装BootLoader
首次启动
iptables
selinux
core dump核心转储

分区表格式有两种:
1:MSDOS
2:UNIX:slice
Linux采用MSDOS分区表 /dev/sda partition table(MSDOS)

anaconda配置方式:
1:交互式
2:通过事先给的配置文件自动完成配置
按特定语法给出的配置选项
kickstart文件
安装引导选项:
boot:后输入的内容
text:文本界面安装
method:手动指定使用的安装方法
网络相关的引导选项:
ip=IPADDR
netmask=NETMASK
gateway=GW
dns=DNS_SERVER_IP
ifname=NAME:MAC_ADDR
与远程访问功能相关的引导选项
vnc
vncpassword='password'
指明kickstart文件位置
ks=
DVDdrive: ks=cdrom:/PATH/TO/KICKSTART_FILE
Hard drive: ks=hd:/PATH/TO/KICKSTART_FILE
HTTP server: ks=http://host:port/PATH/TO/KICKSTART_FILE
FTP server: ks=ftp://host:port/PATH/TO/KICKSTART_FILE
HTTPS server: ks=https://host:port/PATH/TO/KICKSTART_FILE
紧急救援模式
rescue
官方文档:<<installation guide>>

kickstart文件的格式;
命令段:指明各种安装的配置,如键盘的类型,磁盘配置
程序包段:指明要安装的程序包组,程序包,不安装的程序包
%packages 开头
#group_name 安装的包组
package
-package
.....
%end 结束
脚本段:
%pre:安装前脚本
运行环境:运行于安装介质上的微型Linux环境,可能部分命令不能使用
%post 安装后脚本
运行环境:安装完成后的系统

命令段中的命令:
必选命令:
authconfig:认证方式
authconfig --enableshadow --passalgo=sha512
bootload:bootloader的安装位置及配置
bootloader --location=mbr --driverorder=sda,sdb --append="crashkernel=auto rhgb quiet"
keyboard
keyboard us
lang语言
lang en_US.UTF-8
part:创建分区
rootpw:root密码
timezone
timezone --utc America/New_York


可选命令:
install OR update
text
network
firewall
selinux
PowerOff
reboot
repo
url:指明安装源

创建kickstart文件的方式
1:
手动编辑
可依据模板
2可使用创建工具:system-config-kickstart
可依据模板修改来生成

boot: linux ks=cdrom:/kickstart.cfg
检查kickstart文件语法错误:ksvalidator
ksvalidator /PATH/TO/KICKSTART_FILE
创建引导光盘:
mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 --boot-info-table -V "自定义光盘名字" -b isolinux/isolinux.bin(第二段引导程序) -c isolinux/boot.cat(第一段引导程序,MBR中的那个) -o /root/boot.iso myiso(在此目录上级使用命令)

kickstart文件:
命令段:
必备:authconfig,bootloader
可选:firewall,selinux,reboot
程序包段:
%packages
@group_name
package
-package
%end
脚本段:
%pre
.....
%end

%post
....
%end
创建工具:
system-config-kickstart
语法检查
ksvalidator
安装过程如何获取kickstart文件:
DVD:
ks=cdrom:/PATH/TO/KICKSTART
HTTP:
ks=http://HOST:port/PATH/TO/KICKSTART


SELinux:工作于内核,启用或关闭必须重启

DAC:自主访问控制
MAC:强制访问控制

selinux有两种工作级别:
strict:每个进程都受到selinux控制
targeted:仅有限个进程受到selinux控制
只监控容易被入侵的进程
only targeted network daemons are protected
subject operation object
subject:进程
object:进程,文件,或其他资源,比如用户
文件:open read write close chown chmod chcon

subject: domain
object: type

selinux为每个文件和进程提供了安全标签
user: selinux的user
role: 角色
type: 类型
selinux规则库
规则:哪种domain域能访问哪种type类型文件
配置selinux
selinux是否启用
给文件relabel重新打标
设置某些布尔特性
selinux状态:
enforcing:强制,每个受限进程必然受限
permissive:启用,每个受限进程违规操作不会被禁止,但会被记录于审计日志
disable:关闭
命令:
getenforce:
setenforce:
0:permissive
1:enforcing
重启后失效

配置文件:
/etc/sysconfig/selinux
/etc/selinux/config


给文件重新打标签:
chcon:
change file selinux security context

1:chcon [options] CONTEXT FILE
2:chcon [options] [-u user] [-r role] [-t type] file
3:chcon [options] --reference=RFILE file

-R:递归
restorecon:restore files default selinux security contexts
每个文件夹都有默认标签,文件夹下文件默认继承此label
restorecon [-R] /path/to/file

设定布尔型规则:
setsebool

getsebool:get SELinux boolean value

getsebool [-a] [boolean]

setsebool:
set SELinux boolean value

setsebool [-PV] booleanvalue
-P persistant
管理工具:semanage


sed:stream editor for filtering and transforming text
sed [options] [script-only-if-no-other-script] [input-file]

-n:--quiet
-e: -e script --expression=script
-f: -f script-file --file=script-file
-r:regexp-extend
-i:--in-place 原处编辑,修改源文件
pattern space hold space

地址定界:
1:不给地址全文处理
2:单地址
#:指定行
/pattern/:被此模式能匹配到的所有行
3:地址范围
#,#
#,+#
/pattern1/,/pattern2/
#,/pattern1/
4:~:步进
1~2
2~2
编辑命令:
d:
p: print the current pattern space
a \text:行后面追加文本,追加多行使用\n
i \text:
c \text:
w finename:write the current pattern space to filename把pattern space中内容保存到filename
r /path/from/file:读取指定文件中的文本流至模式空间中匹配到的行后
!:取反,在命令前对地址界定取反
s///:支持其他分隔符s@@@,s###
g:global
i:
p:仅显示替换成功的行
w /path/to/file
反向引用:引用前面所有匹配到的&
sed命令默认打印pattern space

sed中高级命令;
h:pattern space覆盖到hold space
H:模式空间内容追加到保持空间
g:从保持空间取出数据覆盖模式空间
G: 追加
x:pattern space与hold space内容互换
n:读取匹配到的行下一行至pattern space
N:追加.................
d:删除pattern space中的行
D:删除pattern space中的多行

systemd:
init:
centos5: sysV init
centos6: upstart
centos7: systemd
features:
系统引导时,实现服务并行启动
按需激活进程
系统状态快照
基于依赖关系定义服务控制逻辑
核心概念: unit
配置文件进行标识配置:文件中主要包含了系统服务,监听socket.保存的系统快照,以及其他与init相关的信息
保存至:
/usr/lib/systemd/system
/run/systemd/system
/etc/systemd/system
unit类型
service unit: *.service,定义系统服务
target unit: *.target,模拟实现运行级别
device unit: *.device,定义内核识别的设备
mount unit: *.mount ,定义文件系统挂载点
socket unit: *.socket ,标识进程间通信用的socket
snapshot unit: *.snapshot,管理系统快照
swap unit: *.swap,标识swap设备
automount unit: *.automount,文件系统自动挂载点
path unit: *.path,定义文件系统中的一个文件或目录

bash:
变量:存储单个元素的内存空间
数组:存储多个同类型的元素的连续内存空间

数组名
索引:编号从0开始,属于数值索引
索引可以使用自定义格式,不仅仅是数值格式
引用数组元素:
${ARRAY_NAME[INDEX]}
声明数组:
declare -a ARRAY_NAME
declare -A ARRAY_NAME:关联数组
数组元素赋值:
1:一次赋值一个元素
ARRAY_NAME[INDEX]="VALUE"
2:赋值全部元素
ARRAY_NAME=("VALUE" "VALUE" "VALUE"....)
grotesque=(/var/log/*.log)
3:赋值多个特定元素
ARRAY_NAME=([0]='VALUE' [3]='VALUE' [7]="VALUE"...)
4:read命令从stdin
read -p "STRING" -a ARRAY_NAME
引用数组元素:
${ARRAY_NAME[INDEX]}
无index则表示引用index=0的元素
数组长度:
${#ARRAY_NAME[@]} ${#ARRAY_NAME[*]}

引用数组所有元素
${ARRAY_NAME[@]} ${ARRAY_NAME[*]}

元素切片(数组切片)
${ARRAY_NAME[@]:offset:number}
offset:跳过的元素个数
number:要显示元素个数

${ARRAY_NAME:offset}

向数组追加元素
ARRAY[${#ARRAY[@]}]='VALUE'
删除数组中元素
unset ARRAY[INDEX]
关联数组
declare -A ARRAY_NAME
ARRAY_NAME=([INDEX_1]="VALUE" [INDEX_2]="VALUE".....)
mktemp:
mktemp [options] [template]
template:filename.XXX
XXX大写,至少三个
options:
-d:创建临时目录
--tmpdir=/PATH/TO/DIR
给出绝对路径
mktemp /tmp/neuter.XXX
mktemp -d /tmp/neuter.XXX 为目录
mktemp --tmpdir=/tmp neuter.XXX
install命令
install -m 777 -d grotesque
-m:mode
-o:owner
-g:group

bash字符串处理
字符串切片:
${String:offset:number}
${String:offset}
${String: -length}:取右侧几个字符(有空格)
基于模式取子串:
${String#*pattern} /etc/systemd/journald.conf -->etc/systemd/journald.conf
${String##*pattern} /etc/systemd/journald.conf --> journald.conf

${String%pattern*} /etc/systemd/journald.conf -->/etc/systemd
${String%%pattern*} /etc/systemd/journald.conf -->null
查找替换:
${String/pattern/substitution} 第一个
${String//pattern/substitution} 全局
${String/#pattern/substitution} 开头
${String/%pattern/substitution} 结尾
查找删除:
${String/pattern}
${String//pattern}
${String/#pattern}
${String/%pattern}
大小写转换
${String^^}
${String,,}
变量赋值
${String:-value}
${String:=value}
${String:+value} String不为空,返回value
${String:?error_info} String为空或未设置,返回error_info,为错误输出流,有值返回其值
为脚本程序使用配置文件
1:定义在文本文件,每行定义"name=value"
2:在脚本中source此文件

gawk:pattern scaning and processing language

基本用法:
gawk [options] 'program' file
program:PATTERN{action statements}
语句用分号分隔
print printf
选项:
-F: 输入时的字段分隔符
-v: var=value 自定义变量
print
print item1,item2

要点:
1:逗号分隔符
2:输出的各item,可以是字符串,是数值,当前记录的字段.变量或AWK表达式
3:省略item 相当于print $0
变量
内建变量
FS: input field separator
OFS:output field separator
RS: input record seperator
ORS: output record seperator
NF:number of fields
'{print NF}' '{print $NF}'
NR:number of records
FNR: file number of records
各文件分别计算
FILENAME:当前文件名
ARGC:命令行参数个数
awk 'BEGIN{print ARGC}' /etc/sudo.conf /etc/sysctl.conf
ARGV:数值,保存命令行各参数
awk 'BEGIN{print ARGV[0]}' /etc/sudo.conf /etc/sysctl.conf
自定义变量
变量在action statements中必须带""
1:-v var=value
awk -v protesque="distortion" "BEGIN{print protesque}"
2:在program中直接定义
awk 'BEGIN{protesque="distortion";print protesque}'
printf:
格式化输出:printf "FORMAT",item1,item2,..
1:FORMAT必须给出,在""内
2:不会自动换行,需显示给出换行空字符\n
3:FORMAT中需要分别为后面每个item指定一个格式化符号

格式符:
%c:显示字符的ASCII码
%d,%i:decimal,integer,10进制整数
%e,%E:科学计数法显示
%f:显示为浮点数
%g,%g:科学计数法或浮点数显示数值
%s:字符串
%u:无符号整数
%%:%自身
awk -F: '{printf "grotesque:%s distortion:%d",$1,$3}' /etc/group
修饰符:
#[.#]:第一个#控制显示的宽度,第二个#表示小数点后的精度
%4.2f
默认右对齐
-:左对齐
+:显示数值符号
awk -v FS=: '{printf "grotesque:-15%s distortion:-+%d",$1,$3}' /etc/group

4操作符
算数操作符:
x+y x-y x*y x/y x^y x%y
-x
+x:转换为数值
字符串操作符;没有符号的操作符,字符串连接

赋值操作符:
=,+=,-+,*=,/=,%=,^=
比较操作符:
>,>=,<,<=,==,!=
模式匹配:
~:是否匹配
!~:是否不匹配
逻辑操作符
&&
||
!
函数调用:
function_name(arg1,arg2,........)
条件表达式
selector?if-true-expression:if-false-expression
awk -v FS=: '{$3>=1000?grotesque="neuter":grotesque="distortion";printf "%-20s%-10d%-10s",$1,$3,grotesque}' /etc/passwd

5 PATTERN
1:empty:空模式,匹配每一行
2:/regular exp/:仅处理能够被匹配到的行
3:relation expression:结果为真才会被处理
真:非0,非空字符串
4:line ranges:
/startline/,/endline/
/pattern1/,/pattern2/

awk -v FS=: '(NR<=5||NR>=10){print $1,$3}' /etc/passwd
awk -v FS=: '/3/,/10/{print $1,$NF}' /etc/passwd

5:BEGIN/EDN
BEGIN{}仅在处理文本前处理一次
END{}仅在处理文本后处理一次
{print "string"},string一定带""
awk '!/^UUID/{printf "%-60s%-30s\n",$1,$2}' /etc/fstab

awk -F: '$NF!="/bin/bash"{print $1,$3,$NF}' /etc/fstab

awk -v FS=: '$NF!~/bash$/{print $1,$3,$NF}' /etc/fstab

6.常用action
1:expression
2:control statements:if while
3:compound statements:
4:input statements
5:output statements
7控制语句
if(condition) {statements}

if(condition) {statements} else {statements}

while(condition){statements}
do {statements} while(condition)
for( ; ; ;) {statements}
break
continue
delete array[index]
delete array
exit

awk -v FS=: '{if($3>=1000){print "grogesque",$1}else{print "distortion",$1}}' /etc/passwd
有else语句,单语句也必须使用{},否则后面全部会被认作if后面的语句块
使用场景:对awk取得的整行或某个字段做条件判断
awk -F: '{if($NF!~/bash/)print $1,$2,$NF}' /etc/passwd

awk '{if(NF>=5)print $0}' /etc/fstab

df -h|awk -F% '/^\/dev/{print $1}'|awk '{if($NF>=10)print $NF}'

df -h|awk -F% '{print $1}'|awk '(NR>=2){if($5>=10)print $5}'

awk '/^[[:space:]]*linux16/{i=1;while(i<=NF){print length($i)":"$i;i++}}' /etc/grub2.cfg
awk '/^[[:space:]]*linux/{i=1;while(i<=NF){if(length($i)>=10){print length($i)":\t"$i};i++}}' /etc/grub2.cfg

7.3 do-while
do{statements}while(condition)
7.4 for

awk '/^[[:space:]]*linux/{for(i=1;i<=NF;i++){if(length($i)>=10){print length($i)":\t"$i}}}' /etc/grub2.cfg

特殊用法:
遍历数组中的元素
for(var in array)
{statements}

var遍历的是数组的index而不是值


7.5 switch
phrase:
swith(expression){case VALUE or /regexp/:statement;case VALUE OR /REGEXP/:{statements};........default:{statements};}
7.6
break [#] continue控制行内字段间跳转
7.7
next:提前结束对本行处理,进入下一行
awk -v FS=: '/2/,/NR/{if($3%2!=0)next;print $1":\t"$3}' /etc/passwd
awk内生循环:行循环
8.array
数组索引数组
自定义索引数组(关联数组)

awk:''用来引用program,program内部字符串必须使用""

array[index-expression]:关联数组
index-expression:
1;可使用任意字符串;字符串必须使用""
2:如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其初始化为"空串"

若要判断数组中是否存在某元素,使用"index in array"格式

grotesque["neuter"]="distortion"
遍历数组中每个元素,使用for循环
for(var in array){statements}

var会遍历array的每个索引:
netstat -ant|awk '/^tcp6?\>/{grotesque[$NF]++};END{for(wearing in grotesque){print $NF":\t"grotesque[$NF]}}'
错误:END最后扫描一行后执行,此时NF=5,$NF=LISTEN,保存的都是最后一行的值,
netstat -ant|awk '/^tcp\>/{grotesque[$NF]++};END{for(wearing in grotesque){print wearing":\t"grotesque[wearing]}}'
利用for(var in array)进行遍历
grotesque["LISTEN"]++
grotesque["ESTABLISHED"]++

less -cmisf /var/log/httpd/access_log|awk '{ontology[$1]++};END{for(erratic in ontology){printf "%-17s##\t%-5s\n",erratic,ontology[erratic]}}'

cat /etc/fstab|awk '/^[^#]/{metaphysics[$3]++};END{for (neuter in metaphysics){print neuter"**\t"metaphysics[neuter]}}'

awk '{for(i=1;i<=NF;i++){grotesque[$i]++}};END{for(neuter in grotesque){print neuter"&&\t"grotesque[neuter]}}' /etc/fstab

9.函数
9.1内置函数
数值处理:
rand():返回(0.1)间随机数
字符串处理
length()
length("metaphysics")
{neuter="metaphysics";length(neuter)}
sub(r,s[,t]): 以r表示的模式来查找t表示的字符串中匹配的内容,将r第一次出现替换为s
gsub(r,s[,t])

sub()和gsub()返回值为替换的数量
awk -v FS=: '/0/,/30/{print sub("o","O",$0);print $0}' /etc/passwd

awk -v FS=: '/0/,/30/{print gsub("o","O",$0);print $0}' /etc/passwd

split(string,array,r):r为分隔符,awk数值从1开始编号
9.2自定义函数

公钥加密:
身份认证
密钥交换
数据加密
算法:RSA DSA ELGamal(商业)

单向加密:只能加密,不能解密,提取数据指纹
特性:定长输出,雪崩效应
算法:
md5 128bits
sha1 160bits
sha224
sha256
sha384
sha512
完整性认证
密钥交换:IKE Internet key exchange
RSA
DH(Deffie-Hellman)
A:P g
B:P g

P:大素数prime g 生成器
Pg公开
A: x
P^x%g -->B
P^y%g^x=P^xy%g此为公钥
B:y
P^y%g -->A
P^x%g^y=P^xy%g相同值
PKI:public key infrastructure
签证机构:CA
注册机构:RA
证书吊销列表:CRL
证书存取库

x.509 标准规范,有三版,
定义了证书的结构和认证协议标准
版本号
序列号
签名算法ID
发行者名称
有效期
主体名称
主体公钥
发行者唯一标识
主体唯一标识
扩展信息
发行者签名

openssl:开源项目
三个组件:
openssl:多用途命令行工具
libcypto:公共加密库
libssl:库 实现了ssl,tls

openssl:
standard commands:
openssl version
crl certificate revoke list
ca
enc
对称加密
工具:openssl enc,gpg
算法:3des,des,aes,

enc:子命令
symmetric cipher routines
openssl enc -ciphername -in filename -out filename -pass arg -e -d -base64 -k passwd -salt

encryption: openssl enc -e -des3 -base64 -salt -in wearing -out waring.des3
decryption: openssl enc -d -des3 -base64 -in wearing.des3 -out wearing
加密中使用-base64解密也必须使用
单向加密:
工具: md5sum sha1sum sha224sum sha256sum
openssl dgst -md5 [-hex|-binary] [-out finename] /path/to/somefile

MAC:Message Authentication Code 单向加密的一种延伸应用,用于实现在网络通信中传输数据的完整性
机制:
CBC-MAC
HMAC:使用md5或sha1算法
生成用户密码:
passwd
openssl passwd -1 -salt SALT
1 use md5
生成随机数:
openssl rand -base64|-hex Num
num;字节数

公钥加密:
加密:
算法:RSA
工具:gpg,openssl rsautl
数字签名:
算法:RSA DSA
密钥交换:
算法: DH
DSA:Digital Signature Algorithm
DSS:Digital Signature Standard
RSA
生成密钥对:
entropy pool
kernel random number source devices

随机数生成器:
/dev/random : 仅从熵池返回随机数,随机数用尽,阻塞
/dev/urandom: 默认从熵池返回随机数,随机数用尽,会利用软件生成伪随机数,不会阻塞

chmod go= numbits
chmod go=r-- numbits

openssl genrsa [-out finename] [-rand file] [numbits]
openssl genrsa -out genrsa.file 2048

(umask 066;openssl genrsa -out dgst.enc 4096)
在子shell中执行此语句,不改变当前shell的umask

openssl rsa -in /PATH/FROM/SECRETKEY -pubout

 


DNS and BIND
子域授权:每个域的名称服务器,都是在上级的名称服务器的解析库中定义授权
类似根域授权tld:
com. 172880 IN NS m.gtld-servers.net.
com. 172880 IN NS j.gtld-servers.net.
com. 172880 IN NS i.gtld-servers.net.

m.gtld-servers.net. IN A 1.1.1.1
j.gtld-servers.net. IN A 8.8.4.4
i.gtld-servers.net. IN A 9.9.9.9

mageud.com. 在.com.的名称服务器中的解析库中添加资源记录RR
magedu.com. IN NS ns1.magedu.com.
magedu.com. IN NS ns2.magedu.com.
magedu.com. IN NS ns3.magedu.com.
ns1magedu.com. IN A 8.8.4.4
ns2magedu.com. IN A 9.9.9.9
ns3magedu.com. IN A 1.1.1.1
这样的记录称为glue record(黏合记录),用于将上级服务器和下级服务器建立关联关系,上级服务器把对某个子域的解析能力授予给子域的某一台服务器
域名注册:
代理商:万网,新网.godaddy

专门的互联网域名解析服务提供商 dnspod
注册完成后,用自己的专用服务器来解析
1:管理后台:
NS记录指明自己的域名服务器名称,比如ns1.magedu.com,
A记录指明域名服务器的ip地址
BIND:dns的一种实现
程序包名:bind , 程序名,named
程序包:
bind
bind-libs 为bind和bind-utils提供共享库
bind-utils 包含很多命令行测试工具
dns解析依靠glibc中的一个共享库完成
bind-chroot 以/var/named/chroot为根,生产环境中安装,
bind:
服务脚本:/etc/rc.d/init.d/named
主配置文件:/etc/named.conf
/etc/named.rfc1912.zones
/etc/rndc.key
解析库文件:也称bind的数据库文件
/var/named/ZONE_NAME.zone
1:必须有根区域文件
2:一台物理服务器可同时为多个区域提供解析
3:有两个(包括ipv6,应该更多)实现localhost和本地回环地址的解析库
rndc:remote name domain controller默认与bind安装在同一主机,且只能通过127.0.0.1链接named进程,提供辅助性管理功能,也是服务,监听在953/tcp端口
ss -tunpl|grep :53

主配置文件:
/etc/named.conf
1:全局配置 options {}
2:日志子系统配置: logging {}
3:区域定义: 本机能够为哪些zones解析解析,就需要定义哪些zones
zone "ZONE_NAME" {}
任何服务程序如果期望能够通过网络被其他主机访问,至少应该监听在一个能与外部主机通信的ip地址上

cp /etc/named.conf{,.bak}
ls /etc/named.conf{|.bak} 注意|用法
ls /etc/|grep named.conf{,.bak} 会使grep接受三个参数

rpm -q bind

缓存名称服务器:
监听外部地址
dnssec:关闭

chmod 640 magedu.com.zone
chown :named magedu.com.zone

主DNS名称服务器
1:在主配置文件中定义区域
zone "ZONE_NAME" IN {
type {master|slave|hint|forward};
file "ZONE_NAME.zone";
};
2:定义区域解析库文件
出现的内容
宏定义
RR
测试命令dig
dig [ -t type ] name [@server] [query option]
@server省略表示使用本机dns服务器指向
dig用于测试dns 不会查询hosts进行解析
query option:
+[no]trace跟踪解析过程
+[no]recurse 进行递归解析
测试反向解析:
dig -x IP @SERVER
模拟全量传送
dig -t axfr canonical.com @127.0.0.1
dig -t axfr 1.16.172.in-addr.arpa. @192.168.9.134
host:
host [-t type] name [server]
nslookup:
nslookup [options] name server
交互式:
nslookup>
server IP:指明用哪个dns server查询
set q=RR_TYPE 指明查询的RR类型
name 查询名字

反向区域:
区域名称: 网络地址反写.in-addr.arpa.
192.168.9 --> 9.168.192.in-addr.arpa.

zone "16.168.192.in-addr.arpa" IN {
type master;
file "192.168.16.zone";
};

named-checkzone "16.168.192.in-addr.arpa" 192.168.16.zone

1:定义区域:
zone "ZONE_NAME" IN {
type {master|slave|forward};
file "网络地址.zone";
};
2:区域解析文件
不需要MX和A,AAAA,以PTR记录为主

泛域名解析:
1:可用CNAME记录
* IN CNAME www
2;可用A记录
* IN A 172.16.1.1
RR中地址后面要加 .
canonical.com. IN CNAME www
错误,不支持CNAME,只支持 A记录
canonical.com. IN A 172.16.1.3
canonical.com. 可用@替换

ll -d /var/named
named 用户对/var/named目录无写权限

rndc relaod
tail /var/log/messages

named-checkconf
named-checkzone canonical.com canonical.com.zone
named-checkzone 172.16.1.in-addr.arpa. 172.16.1.zone
上面的错误,反向区域定义反着写
named-checkzone 1.16.172.in-addr.arpa. 172.16.1.zone

AXFR-style IXFR全量风格的增量传送,只传递了改变的部分
有了sending notifies机制,同步几乎是实时的
主从复制:
1:应该为一台独立的名称服务器
2:主服务器的区域解析库文件中,必须有一条NS记录和A记录指向从服务器,sending notifies才能工作
3:从服务器只需要定义区域,无需编辑解析库文件,解析库文件应该放置于/var/named/slaves目录中
4:主服务器允许从服务器做区域传送.
除了从服务器可以做axfr操作,其他全部关掉,否则对方可以获得所有数据
5:主从服务器时间应该同步,可通过ntp进行
6:bind程序的版本应该一致,否则从高,主低
定义从区域:
zone "ZONE_NAME" IN {
type slave;
masters { MASTER_IP; };可以为从服务器IP,链状结构的
file "slaves/ZONE_NAME.zone";
};

rndc: remote name domain control,远程rndc管理工具
rndc服务端监听在(tcp/953),rndc默认不允许远程连接

rndc [-b address] [-s server] [-c config] [-p port] [-k key-file] command

默认server为127.0.0.1
-p port:默认953
-k key-file:默认/etc/rndc.key(rpm包安装默认)
command:
reload:重载主配置文件和区域解析库文件
reload zone:重载区域解析库文件
retransfer zone:手动启动区域传送过程,不管serial 是否增加
notify zone:重新对区域发送通知
reconfig:重载主配置文件
querylog:开启或关闭查询日志,数据立即同步到日志文件,日志文件通常为同步IO,为了保证日志完整性,服务器崩溃时,日志丢失,同步磁盘IO方式进行,有日志文件产生立即同步到磁盘,不会再内存中缓冲,极大拖慢系统性能
rndc querylog
rndc status
tail /var/log/messages
只记录查询本机的,不记录本机向外查询的
只有定位错误的目的,才启用,否则一段关闭
只提供记录解析时的拍错信息,若想知道服务器哪里有问题,启用debug日志,debug调试目的,不同debug级别,级别越高,输出信息越详细,出错时,才启用,debug level:0,未开启.
rndc trace:increment debugging level by one
rndc trace level
rndc notrace
rndc flush 清除dns缓存
rndc dumpdb:把dns缓存生成/var/named/data/cache_dump.db文件
缓存失效,带来雪崩效应

子域授权: 分布式数据库

正向解析区域子域的方法:
定义一个子区域
ops.canonical.com. IN NS ns1.ops.canonical.com.
ops.canonical.com. IN NS ns2.ops.canonical.com.
可简写为
ops IN NS ns1.ops
IN NS ns2.ops


ns1.ops.canonical.com. IN A 1.1.1.1
ns2.ops.canonical.com. IN A 1.1.1.2
同样可简写
ns1.ops IN A 1.1.1.1
ns2.ops IN A 1.1.1.2


定义转发服务器
被转发的服务器能够为请求者进行递归解析,否则,转发请求无效

1:全部转发:凡是对非本机所有负责区域的解析请求,统统转发给指定服务器
options {
forward {first|only}
forwarders
}
2:区域转发:仅转发特定区域的请求至某服务器
zone "ZONE_NAME" IN {
type forward;
forward {first|only};
forwarders;
}
显性关闭dnssec,注释掉为默认开启
dnssec-enable no;
dnssec-validation no;

bind中基础安全配置
acl:把一个或多个主机归并为一个集合,并通过一个统一的名称调用

acl acl_name {
ip;
ip;
net/prelen;
};
第一个acl为关键字 ,第二个为自定义名字

EX:
acl consortium {
172.31.0.0/16;
};

localhost为主机名,any为acl
bind有四个内置acl
none:无任何主机
any:任意主机
local:本机
localnet:本机IP与netmask运算得到的网络地址
先定义,后使用,因此,一般定义在配置文件中options前面

访问控制的指令
allow-query { any; };白名单
放在zone中控制一个zone,放在options中,控制所有zone


dig -t axfr www.canonical.com @1.1.1.1
区域传送,传送的是解析库,解析库在ns服务器上,所以上面不对,必须针对域进行区域传送

allow-transfer { 127.0.0.1; };允许区域传送的主机
allow-recursion { local; };通常在全局配置options中,
把recursion yes注释
允许递归主机
allow-update { localnet; }; 允许更新区域数据库文件
更改的是比如www的指向(ip地址),非常危险
通过dhcp实现,可以攻击dhcp把www改成钓鱼网站ip
一般为allow-update { none: };
recursion yes;
allow-recursion { severity; };

band view
view:
一个bind服务器可定义多个view,每个view中可定义多个zone
一个view用来匹配一组客户端
多个view可能需要对同一个zone解析,但使用不同的区域解析文件

view view_name {
match-clients {};
};

1:一旦启用view,所有zone只能定义在view中
2:仅有必要在匹配到运行进行递归请求的客户所在view中,才定义根区域
3:客户端请求到达时,从上到下检查每个view的match-clients {};

全局负载均衡网络,能够实现负载均衡的主机,根据地域来做负载均衡,分省分网解析
智能dns:
dnspod,dns.la
cdn:content delivery network

编译安装bind:
www.isc.org
bind-9.9
bind-10
tar
cd
groupadd -r -g 53 named
useradd -u 53 -g 53 -r named
./configure --prefix=/usr/local/bind9 --sysconfdir=/etc/named --disable-ipv6 --disable-chroot --enable-threads
make
makeinstall
自己编译的程序,自带的库文件,其他程序如果要用,需要导出

dig -t ns "." @自建缓存服务器> /var/named/named.ca

install -d -o [--owner= ] -g [--group= ] -m [--mode= ] directory
named -u named -f -g -d 3
killall named

rndc-confgen生成rndc.key,如果阻塞使用 rndc-confgen -r /dev/urandom 指明随机文件

rndc-confgen -r /dev/urandom>/etc/named/rndc.conf
tail -n 11/etc/named/rndc.conf>>/etc/named/named.conf
vim: .,$-1s/^# //g

killall -GIGHUP named
发送重读配置文件信号
rndc halt

benchmark压力测试

源码包中contrib目录里 中的scripts 和queryperf(a DNS SERVER query performance testing tool)
进到queryperf中
./configure
make
生成queryperf程序
cp queryperf /usr/local/bind9/bin
queryperf -h

rndc querylog

queryperf -d /root/deviation -s 127.0.0.1

rndc querylog

queryperf -d /root/deviation -s 127.0.0.1

rndc trace 4

queryperf -d /root/deviation -s 127.0.0.1

vmstat 1
iostat 1

OpenSSH:
ssh: 22/tcp
OpenSSH:SSH协议的开源实现
dropbear另一个开源实现
Telnet-server
Telnet:客户端
明文传送不允许直接root登录,普通用户登录后可以su -切换到root

telnet 不能使用telnet ID@host 方式登录,必须使用 telnet hostname port
xinetd超级守护进程
chkconfig telnet on
ss -ant
exit

SSH协议版本
v1:基于CRC-32做MAC(message authentication code),遭受man-in-middle攻击
v2:双方主机协商选择安全的MAC方式
基于DH双方IKE交换密钥,基于RSA或DSA身份认证

两种用户登录认证方式
password
key密钥

OpenSSH: openssh.x86_64 openssh-server.x86_64
C/S
C:ssh scp sftp
Windows:
xshell putty securecrt sshsecureshellclient
S:sshd
客户端组件:
ssh,配置文件 /etc/ssh/ssh_config
ssh root@ip 'hostname'
ssh [user@]host [command]
ssh -p port [user@]host [command]
host PATTERN
PARAMETER VALUE

-X enables X11 forwarding支持X11转发
-Y enables trusted X11forwarding支持受信任的X11转发
基于密钥认证方式:
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
必须使用大写P,非交互式
在客户端生成密钥对
ssh-keygen -t rsa [-P ''] [-f ~/.ssh/id_rsa]
2:把用户公钥传到服务器端
ssh-copy-id install your public key in a remote machine's authorized_keys
ssh-copy-id -i /root/.ssh/id_rsa.pub id@host
ssh-copy-id -i identity_file user@machine

scp:secure copy 跨主机copy
pull 下载
push 上传
scp [optionS] SRC... DEST/
pull: scp [options] [user@]host:/path/from/somewhere /path/to/somewhere
push: scp [options] /path/from/somewhere [user@]host:/path/to/somewhere
常用选项:
-r :recursive
-p : preserve
-q :quiet
-P port: 指明remote host监听的端口

sftp:依赖ssh工作,数据传输加密
sftp [user@]host
sftp> help

sshd_config:
KeyRegenerationInterval:默认情况下,sshV2使用DH密钥交换算法生成对称加密密钥,生成的对称加密密钥仅用一个小时
ServerKeyBits:主机密钥长度

SyslogFacility:Syslog为日志服务器名称
记录日志的设施
ll /var/log/secure
tail /var/log/secure
LoginGraceTime 2m:登录宽限时长2m
PermitRootLogin no: su - root
StrictModes yes:严格安全检查模式
MaxAuthTries
MaxSessions
PasswordAuthentication yes:口令登录

ChallengeResponseAuthentication no:基于明文,双向认证,不安全,关闭
X11Forwarding yes:是否允许X11转发
startx &

the remote ssh server rejected X11 forwarding request:
缺少xorg-x11-xauth包
x11 protocal :linux上显示图形界面的协议,x11位版本号,GNOME,KDE图形界面图形显示协议都是x11

subsystem sftp /usr/libexec/openssh/sftp-server


服务器端:
sshd /etc/ssh/sshd_config
常用参数
Port 22
ListenAddress ::
PermitRootLogin yes

man sshd_config

selinux会阻止程序监听非默认端口
iptables 也会阻止新改的端口
iptables -I INPUT -p tcp --dport -j ACCEPT

UseDNS yes:DNS反向解析,会非常慢
限制登录用户:
AllowUsers user1........
AllowGroups `
ssh实践
不使用默认端口
禁止protocol version 1
限制可登录用户
设定空闲会话超时时长
利用防火墙,设置ssh访问策略
仅监听特定ip
基于口令认证时,使用强密码
tr -dc A-Za-z0-9_ < /dev/urandom|head -c 30|xargs
使用密钥认证
限制ssh访问频率和并发在线数
做好日志

ssh协议的另一个实现:dropbear

dropbear -t rsa -f /etc/dropbear/dropbear_rsa_host_key -s 2048

dropbear -t dss -f /etc/dropbear/dropbear_dss_host_key

dropbear -p [ip:]port -F -E
ip省略:所有的
-F:foreground
-E:错误日志发送到标准错误输出,不要写入日志

OpenSSL:
openssl:多用途命令行工具
libcrypto:加密解密库
libssl:ssl协议的实现
PKI:public key information
CA
RA
证书存取库
建立私有CA
OpenCA
openssl
证书申请
请求
RA核验
CA签署
获取证书
创建私有CA
openssl的配置文件: /etc/pki/tls/openssl.cnf

在/etc/pki/CA目录下 .pem为密钥存储格式
1:
touch index.txt(datebase index file)
2:
echo 01>serial (the current serial number)
3:
CA自签证书(生成private key,然后从私钥生成pubkey)
private_key = $dir/private/cakey.pem
错 (umask;openssl genrsa 2048 -out private/cakey.pem)
(umask;openssl genrsa -out private/cakey.pem 2048)
自签证书可以自动提取公钥
whatis req
req (1ssl) PKCS#10 certificate request and certificate generating utility
man req

openssl req -new -x509 -days 300 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem
-new:生成新证书签署请求
-x509:专用于CA自签证书
-key:生成请求是用到的私钥
-days #:证书有效期限
-out /path/to/cacert.pem:证书路径
4:发证

install -d -m 700 -o root -g root /etc/httpd/ssl
(umask 066;openssl genrsa -out /etc/httpd/httpd.key 2048)

openssl req -new -days 365 -key httpd.key -out httpd.csr
certificate signature request

rpm -q openssh-clients
rpm -q openssh-server
openssl无clients server
hash -d : show hash table
hash -r : flush hash table
用到证书的主机生成请求
(umask 066;openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)
openssl req -new -days 698 -in /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr
把httpd.csr证书请求传给CA
scp -P 22 httpd.csr root@host:/tmp
CA签署证书,并把证书发给请求主机
openssl ca -days 608 -in /tmp/httpd.csr -out /tmp/httpd.crt

查看证书中信息
openssl x509 -in /path/from/*.crt -noout -text|-subject|-serial
5吊销证书
客户端获取要吊销证书的serial和subject
openssl x509 -in /path/from/*.crt -noout -serial -subject
CA
根据客户提交的serial和subject信息,对比校验是否与index.txt文件中的信息一致

吊销证书
openssl ca -revoke /etc/pki/CA/newcerts/serial.pem
生成吊销证书编号(第一次吊销时操作是在 )
echo 01 > crlnumber

更新证书吊销列表
openssl ca -gencrl -out asterisk.locality.crl
查看crl文件
openssl crl -in /etc/pki/CA/asterisk.locality.crl -noout -text

MAC:设备到设备
ip报文遇到nat会改变

Web Service
传输层:提供进程地址
Port number
tcp:面向连接的协议,双方通信前需要建立虚拟链路,结束后,拆除链路,提供可靠数据流通信,
udp:user datagram protocol,无连接协议
Socket:IPC一种实现,inter process communication
允许位于不同主机(可以是同一主机)上不同进程间的通信,
Socket API,封装到库中,system call提供太底层,太基础,glibc(c标准库)叫 Socket API, BSD,Berkeley System Distribution
TCP套接字使用TCP端口 SOCK_STREAM

udp套接字使用udp端口 SOCK_DGRAM
SOCK_RAW
MTU通常为1500bytes
0-1023端口:永久分配给固定进程使用,特权端口,22/tcp(ssh) 443/tcp(https)
1024-49151:亦为注册端口,但要求不是特别严格,分配给程序注册使用,11211/tcp,11211/udp(memcached),3306/tcp(mysql)
49152+:客户端程序随机使用,动态端口,或私有端口,范围定义/proc/sys/net/ipv4/ip_local_port_range

TCP protocol:
建立连接:三次握手
将数据打包成段,校验和(CRC-32)
确认,重传,超时
排序:逻辑序号
流量控制:滑动窗口算法
拥塞控制:慢启动和拥塞避免算法
Socket Domain(根据所使用的地址)
AF_INET:Address Family IPV4
AF_INET6: IPV6
AF-UNIX:同一主机上,不同进程通信使用
每类套接字至少提供两种socket,流,数据报
流:可靠,面向连接,无边界
数据报:不可靠,无连接,有边界
套接字相关的系统调用
socket():创建一个套接字
bind():绑定套接字(使用)
listen();监听在套接字上
accept():接受请求
c程序员在开发服务器程序时用到
connect():请求连接建立(客户端)
write():向套接字文件写数据,建立一个套接字,相当于在内核打开了一个文件,叫套接字文件,write()为系统调用,向套接字文件写数据,相当于把数据通过套接字发送到另一台主机上
read():从缓存中接收数据
send(), recv(),sendto(),receivefrom(),

CSS:cascading style sheets

MIME:multipurpose Internet mail extensions
工作机制:
http请求
http响应
web resource
静态文件
动态文件
媒体类型(MIME类型) major/minor
text/html
text/plain
image/jpeg
image/gif
URI:uniform Resource Identifier
URL:Uniform Resource Locator 用于描述某服务器某特定资源的位置
scheme://server:port/path/to/resource
URN:Uniform Resource Naming
http协议版本
HTTP/0.9 原型版本(很多设计缺陷,不支持多媒体)
HTTP/1.0 支持MIME,缓存机制不完善,广泛使用
HTTP/1.1 增强了缓存功能
HTTP/2.0
一次完整的http请求过程
1:建立,处理链接(接受|拒绝)
2:接受请求
接受来自于网络的请求报文中对某资源的一次请求过程
并发访问响应模型(Web I/O)
单进程I/O结构,启动一个进程处理用户请求,而且一次只处理一个,多个请求被串行响应
多进程I/O结构,并行启动多个进程,每个进程响应一个请求(一个页面访问叫一个PV,page view,页面查看)
复用I/O结构:一个进程响应n个请求
多线程模型:一个进程生成n个线程,每个线程响应一个用户请求
Linux进程很轻量,Linux把线程当做进程调度,单独调度
事件驱动:event-driven
复用的多进程I/O结构:启动多个(m)进程,每个进程响应n个请求
3:处理请求
对请求报文进行解析,并获取请求资源和请求方法等相关信息
元数据:请求报文首部
<method><URL><version> <method>
host:canonical.com : web服务器支持基于名称虚拟主机,
connection :连接方式
<method> get 下载put上传 post 提交表单
4:访问资源
获取请求报文中请求的资源
web服务器资源路径映射方式
docroot
alias
虚拟主机docroot
用户家目录docroot
5构建响应报文
资源的MIME类型
显式分类
魔法分类
协商分类
URL重定向
web服务构建的响应并非客户端请求的资源,而是资源另外一个访问路径
6发送响应报文
7记录日志
http服务器程序
httpd
NGINX
lightpd
应用程序服务器
IIS
Tomcat jetty jboss resin
websphere weblogic
www.netcraft.com

httpd
a patchy server = Apache
ASF = Apache software foundation
httpd:
高度模块化 DSO:dynamic shared objects
core + modules
DSO:
MPM:Multi-Processing Modules
prefork:多进程模型,每个进程响应一个请求
一个主进程,负责生产n个子进程(工作进程),子进程用来处理用户请求,没有用户请求,也会预先生产多个空闲进程,等待请求
最大不会超过1024个,主进程负责监听套接字,也叫监听进程,负责监听,不负责处理和响应,等待连接的套接字叫做监听套接字,子进程使用的套接字叫连接套接字(非80端口),使用80套接字响应,响应内容构建不是主进程

worker:多进程多线程(多进程生成,一个进程生成多个线程),一个线程响应一个请求
event:事件驱动模型,基于异步方式响应用户请求,一个线程响应多个请求

路径别名
丰富的用户认证机制
basic
digest

并发服务器响应请求:
单进程I/O模型
多进程I/O模型
复用的I/O模型
多线程模型
事件驱动
复用的多进程I/O模型
httpd
CentOS 6:
程序环境:
配置文件
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
服务脚本
/etc/rc.d/init.d/httpd
配置文件
/etc/sysconfig/httpd
主程序文件
rpm -ql httpd|grep bin
/usr/sbin/httpd (prefork)
/usr/sbin/httpd.worker
/usr/sbin/httpd.event
日志文件目录
/var/log/httpd
access_log
error_log
站点文档目录
/var/www/html
模块文件路径
/usr/lib64/httpd/modules
配置文件组成
grep Section /etc/httpd/conf/httpd.conf

Section 1:Global Environment
Section 2:Main server configuration
Section 3:Virtual Hosts
常用配置
配置格式: directive value
directive:不区分大小写
value为路径时,取决于文件系统
1修改监听IP,Port
Listen [IP:]port
修改端口后一般只能restart
2持久连接
persistent connection 每个资源获取完成后不会断开连接,而是继续等待其他请求的完成
如何断开
数量限制:100
时间限制:可配置
副作用:对并发访问较大的服务器,持久连接会使有些请求得不到响应,(排队队列中超时的,导致对方显示拒绝服务)
折衷:使用较短的持久连接时间
httpd-2.4支持millisecond级持久时间
httpd1.0默认非持久
httpd1.1默认持久
KeepAlive on|off
MaxKeepAliveRequests #
KeepAliveTimeout #

telnet IP 80
80为文本协议格式,所有明文的文本协议都可以使用telnet连接,做测试
telnet HOST PORT
GET /URL HTTP/1.1
Host: hostname|ip
必须连续两次回车
elinks -dump host
测试链接工具
MPM
multi-processing modules
prefork worker event
httpd-2.2不支持同时编译多个模块,所以编译时只能选定一个,RPM安装的包提供了三个二进制程序文件,分别用于实现对不同MPM机制的支持,确认方法ps aux|grep httpd
默认为/usr/sbin/httpd 使用prefork

mod_so.c:支持模块动态装卸载,模块接口

查看模块列表
查看静态编译的模块
httpd -l
compiled in modules
core.c
prefork.c
http_core.c
mod_so.c
httpd -M
查看静态编译,动态装载的模块
更换使用的http的程序
/etc/sysconfig/httpd
HTTPD=
restart生效
prefork的配置
<IfModule prefork.c>
startservers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequetsPerChild 4000
work.c的配置
<IfModules worker.c>
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadPerChild 25
MaxRequestsPerChild 0
<IfModules>
PV:page view,
多少个页面被用户访问,有效访问
UV:user view
独立ip量

DSO
配置指令实现模块加载
LoadModule <mod_name> <mod_path>
模块路径可用相对地址
相对于ServerRoot(/etc/httpd)指向的路径而言
/etc/httpd/modules

定义"main" server的文档页面路径
DocumentRoot
文档路径映射
DocumentRoot指向的路径为URL路径的起始位置
DocumentRoot "/var/www/html"
test/index.html --> http://host:port/test/index.html

站点访问控制
可基于两种类型的路径指明对那些资源进行访问控制
文件系统路径
<Directory "">
</Directory>
<FileMatch "">
</FileMatch>

URL路径
可限制请求方法(method)
<Location "">
</Location>
<LocationMatch "">
</LocationMatch>
访问控制机制
基于来源IP(容易伪装,风险大)
基于账号
directory中基于来源地址实现访问控制
1:options
Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
All None
Includes:server includes
Indexes:索引
FollowSymLinks:允许跟踪符号链接文件
ExecCGI:是否允许执行CGI脚本
MultiViews:内容协商机制,效率差,不安全

2:基于来源地址的访问控制机制
order
Allow from
Deny from

来源地址
IP
NetAddress:
定义默认主页面
DirectoryIndex index.html index.html.var

日志设定

错误日志
ErrorLog logs/error_log
LogLevel warn
debug info notice warn error crit alert emerg
访问日志
CustomLog logs/access_log combined
LogFormat "%h %l %u %t \"%r\" %>s
"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""

%h Remote host 客户端ip地址
%l Remote logname,远程登录名(from identd,if supplied),This will return a dash unless mod_ident is present and IdentityCheck is set on
%u Remote user,大多数情况网站无需认证,为空,
用户登录两种认证方式(两种访问控制方式)
基于ip
基于用户账户
%t Time the request was received(standard english format)服务器收到请求的时间
\"%r\" First line of request,请求报文的首行信息(method url version),多个项目,所以""引起来(转义)
%>s :status code状态码,status for requests that got internally redirected,this is the status of the "original" request %>s for the last
%b Size of response in bytes,excluding HTTP headers
响应报文大小,单位bytes,不包括响应报文首部
\"%{Referer}i\" 请求报文当中"Referer"首部的值,当前资源的访问入口,即从哪个页面的超链接跳转而来
\"%{user-agent}i\" 请求报文当中"User-Agent"首部的值;即发出请求报文的应用程序
官方日志
httpd.apache.org/docs

httpd 会以apache用户身份运行 httpd.conf(User apache \n Group apache),定义路径别名Alias时,如果apache用户无权限会显示403 forbidden

路径别名
DocumentRoot "/www/htdocs"

Alias /URL/ "/PATH/TO/SOMEDIR" 必须是路径
Alias /vortex/ "/etc/sysconfig/"
http://www.canonical.com/vortex/xinetd
--> /etc/sysconfig/xinetd (保证apache有读权限)

设定默认字符集
AddDefaultCharset UTF-8
GBK GB2312 GB18023

基于用户的访问控制
认证质询
www-authenticate:响应码 401,拒绝客户请求,要求客户提供账号密码
认证
authorization 客户端输入账号密码后再次发生请求报文,认证通过,则服务器发生响应资源

认证类型
basic 明文(basic 64编码)
digest:消息摘要
账号密码计算md5值发送到服务器,
这种认证方式很少使用,现在大多数认证通过表单进行,不是对话框.为HTTP认证,不是表单,HTTP协议完成认证跟应用程序无关
表单认证(需要用户自己编写的认证程序进行,跟HTTP无关)

htpasswd:
manage user files for basic authentication
htpasswd [-c] [-m] [-D] passwdfile username
-c: create the passwdfile,第一次添加用户使用
-m: user MD5 encryption for passwords
-s: user SHA encryption for passwords
-D: delete user
-p: user plaintext passwords


安全域:路径(需要用户认证才能访问)
通过AuthName进行标识,告知用户认证的原因

用户账号密码存于何处?
虚拟账号:仅用于访问某服务时用到的认证标识
存储
文本文件
SQL
ldap
nis
一般放在/etc/httpd/cond.d/.htpasswd中


basic认证
1定义安全域
<Directory "">
Options none
AllowOverride none
Authtype Basic
AuthName "STRING"
AuthUserFile "/etc/httpd/conf.d/.htpasswd"
Require user user#
Require valid-user
</Directory>
2提供账号密码存储(文本文件)
使用htpasswd命令进行管理
htpasswd [options] passwordfile username

3实现基于组进行认证
<Directory "">
Options none
AllowOverride none
AuthType Basic
AuthName "STRING"
AuthUserFile "/path/to/httpd_user_file"
AuthGroupFile "/path/to/httpd_group_file"
Require group group1 .......
</Directory>

需要提供用户账号文件和组文件
组文件:
GROUP_NAME: USER1 USER2 ..............
GROUP_NAME2: ...................
实例:
<Directory "/decentralize/htdocs/htpasswd">
Options none
AllowOverride none
AuthType Basic
AuthName "string"
AuthUserFile "/etc/httpd/conf.d/.htpasswd"
AuthGroupFile "/etc/httpd/conf.d/.htgroup"
Require group htgroup
</Directory>


VirtualHost:虚拟主机
三种实现
基于IP
为每个VirtualHost准备至少一个IP
基于port
为每个VirtualHost准备一个专用port
基于域名
为每个VirtualHost准备专用域名
可混合使用
虚拟主机不要与中心主机混用,所有要用虚拟主机,先禁用中心主机
禁用中心主机:注释DocumentRoot

每个虚拟主机都有专用配置
<VirtualHost IP:port>
ServerName
DocumentRoot
</VirtualHost>

ServerAlias:虚拟主机别名
ErrorLog
CustomLog

内置的status页面
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 192.168.8.0/24 必须跟netmask
AuthType Basic
AuthName precede.deprecate
AuthUserFile /etc/httpd/conf.d/.htpasswd
AuthGroupFile /etc/httpd/conf.d/.htgroup
Require group group_name
</Location>

额外选项:
ExtendedStatus On|Off
LogFormat
\"%{referer}i\" 引用referer这个首部的值

URL:
URL方案:scheme
服务器地址:ip:port
资源路径:path
基本语法
<scheme>://<user>:<passwd>@<host>:<port>/<path>;<params>?<query>#<frag>
params:参数
query: .....?username=pertain&title=kerberos

相对URL:同站,同一文档,不完整,相对当前资源的位置,来获取下一个资源路径
绝对URL:跨站
http协议
http/0.9 http/1.0 http/1.1 http/2.0
stateless
服务器无法程序追踪访问者来源,
cookie session
http事务
request
response
报文语法格式
request报文
<method> <request-path> <version>
<headers>

<entity-body>
response报文
<version> <status-code> <reason-phrase>
<headers>

<entity-body>
method:请求方法 客户端希望服务器对资源执行的动作
GET:从服务器获取一个资源
HEAD:只从服务器获取响应报文的首部
POST:向服务器发送要处理的数据
PUT:将请求的主体部分存储在服务器
DELETE:删除服务器上指定文档
TRACE:追踪请求到达服务器中间经过的代理服务器
OPTIONS:请求服务器返回对指定资源支持的请求方法

协议分析查看工具
tcpdump tshark wireshark
status(状态码)
1xx:100 101 信息提示
2xx:200-206 成功
3xx:300-305 重定向
4xx:400-415 客户端错误
5xx:500-505 服务器错误

常用状态码
200 ok 请求的数据通过响应报文的entity-body发送
301 Moved Permanently 请求的URL指向的资源已经删除,但是在响应报文header中通过Location指明资源现在的位置
302 Found 响应报文的header中通过Location指明资源现在的临时位置
304 Not Modified 客户端发出条件式请求,但服务器上的指定资源未发生改变,服务器返回304给客户端
401 Unauthorized 输入账号密码认证才能访问的资源
403 Forbidden

Not Found 服务器无法找到客户端请求的资源
500 Internal Server Error
502 Bad Gateway 代理服务器从后端服务器收到了一条伪响应
header:
Cache-Control:public

首部分类
通用首部
请求首部
响应首部
实体首部
扩展首部

通用首部
Date:报文创建时间
Connection:连接状态(KeepAlive|close)
Via:显示报文经过的中间节点
Cache-Control:缓存控制
请求首部
Accept:通知服务器可接受的MIME类型
Accept-Encoding:gzip deflate
Accept-Language:zh-CN,zh;

Client-IP:
Host:请求服务器的名称和port
Referer:
User-Agent:

条件式请求首部
Expect:
If-Modified-Since:自从指定时间,请求的资源是否发生修改
If-None-Match:本地缓存中文档的ETag标签是否与服务器文档ETag不匹配

安全请求首部
Authorization:向服务器发送认证信息,如账号密码
Cookie:向服务器发送Cookie
Cookie2

代理请求首部
Proxy-Authorization

响应首部
信息性
Age响应持续时长
Server:Apache2/.2.15 (CentOS)
协商首部:资源有多种表示方法时使用
Accept-Ranges:
Vary:服务器查看的其他首部列表
安全响应首部
Set-Cookie:向客户端设置cookie
Set-Cookie2
WWW-Authorization

实体首部
Allow:列出对此实体可使用的请求方法
Location:通知客户端真正实体位置
Conten-Encoding
Content-Length
Content-Location
Content-Type
缓存相关
ETag:实体扩展标签
Expires:实体过期时间
Last-Modified:最后一次修改时间

version
HTTP/major.minor
status
reason-phrase
header
name: value
entity-body 请求时附加的数据或响应时附加的数据

 


15 curl命令
curl transfer a URL,基于URL语法在命令行方式下工作的文件传输工具,支持FTP FTPS HTTP HTTPS GOPHER TELNET DICT FILE LDAP 等协议,curl支持HTTPS认证,并且支持HTTP的POST,PUT方法,FTP上传
kerberos认证,HTTP上传,代理服务器,cookies,用户名密码认证.下载文件断点续传,上传文件断点续传,HTTP代理服务器管道(proxy tunneling),支持IPV6,socks5代理服务器,通过 HTTP代理服务器上传文件到FTP服务器.

curl [options] [URL]
常用选项:
-A/--user-agent <string> 设置用户代理发送给服务器
-basic 使用HTTP basic认证
--tcp-nodelay 使用TCP_NODELAY选项
-e/--referer URL来源
--cacert <file> ca证书(ssl)
--compressed 要求返回压缩格式
-H/--header <line>自定义头部信息传递给服务器
-I/--head 只显示响应报文首部信息
--limit-rate <rate>
-u/--user <user[:password]>设置服务器的用户名密码
-O/--http1.0

另一个工具elinks
elinks [options] [URL]
-dump,不进入交互模式,直接将URL内容输出到stdout
16使用mod_deflate(deflate_module)模块压缩页面优化传输速度
使用场景
1 节约带宽,额外消耗CPU时钟周期
2 压缩适用于适合压缩的资源(文本文件)

SetOutputFilter DEFLATE (输出过滤器) 调用DEFLATE输出过滤器,对特定输出资源做压缩,
作为web服务器,从磁盘加载内容为输入,将内容响应给客户端为输出.
读取客户端请求做过滤的场景不多,很多时候实现输出过滤,

##mod_deflate configuration

##Restrict compression to these MIME types
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/x-javascript

##Level of compression (Highest 9 - Lowest 1)

DeflateCompressionLevel 9

##Netscape 4.x have some problems
BrowserMatch ^Mozilla/4 gzip-only-text/html

##Netscape 4.06-4.08 have some problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip

##MSIE masquerades as Netscape,but it is fine
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

BrowserMatch 后面的Match表面做模式匹配

17 https
HTTP over ssl HTTPS 443/tcp
ssl v3
tls v1
ssl会话
1:客户端发送可供选择的对称加密方式,请请求服务器证书
2:服务器发送证书,选定的对称加密方式给客户端
3证书验证
客户端信任服务器证书的CA
a:验证证书来源合法性(CA的公钥可以加密证书的数字签名)
b:验证证书内容合法性,完整性验证(验证数字签名)
c:验证证书有效期
d:验证证书是否在CRL
e:证书主体和访问主机是否一致
4客户端生成临时会话密钥,用服务器公钥加密后发送给服务器,完成密钥交换
5服务器用此临时会话密钥加密资源,响应客户端
SSL会话基于IP地址创建,所以单IP主机,仅可以使用一个https虚拟主机

配置httpd支持https
1 为服务器申请数字证书
测试:通过私建CA发证书
a:创建私有CA
b:将服务器创建的证书签署请求发给CA
c:CA签证
2 配置httpd支持使用ssl,及使用证书
yum -y install mod_ssl
配置文件 /etc/httpd/conf.d/ssl.conf
DocumentRoot
ServerName
SSLCertificateFile
SSLCertificateKeyFile
3 测试基于https访问服务器
openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile file]

18 httpd自带工具程序
htpasswd basic认证基于文件实现时,用到的账号密码文件生成工具
apachectl httpd自带的服务控制脚本
apxs httpd-devel包提供,扩展httpd第三方模块
apache extension tool 手动编译模块
rotatelogs:日志滚动工具
access.log --> access.log access.1.log access.2.log
suexec
访问某些有特殊权限配置的资源时,临时切换指定用户运行
ab: apache benckmark

19http压力测试工具
ab
webbench
http_load

专业工具 需要自己编写测试文件,构建测试逻辑
jmeter
loadrunner

网易的tcpcopy

ab [options] URL
-n 总的请求数
-c 模拟的并发数
-k 以持久连接测试
ulimit -n #:调整当前用户同时打开的文件数

安装httpd-2.4
httpd依赖于apr-1.4+ apr-util-1.4+ apr-icon
apr:apache portable runtime

CentOS6 apr-1.3
编译安装
1.4+ apr apr-util
前提安装开发环境,安装pcre-devel
1 apr
./configure --prefix=/usr/local/apr
make && make install
2 apr-util
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make && make install

groupadd -r apache
useradd -r -g apache apache
./configure --prefix=/usr/local/apache --sysconf=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --enable-zlib --enable-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork

--enable-so:支持动态模块加载
--enable-rewrite:支持URL重写
--enable-zlib:压缩库(gzip deflate)
--enable-pcre:支持Perl扩展的regexp,URL重写用到
yum install -y pcre-devel
--enable-modules=all 所有模块
--enable-mpms-shared=all 支持mpm的共享模块编译机制,all把所有支持的mpm都编译
--enable-mpm=prefork 默认使用prefork
make && make install
启动访问
apachectl
rpm -q apr* 错
rpm -qa apr*


vim /etc/profile.d/httpd.sh
export PATH=/usr/local/apache/bin:$PATH
. /etc/profile.d/httpd.sh
which apachectl


httpd2.4
配置文件
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf 辅助配置文件
/etc/httpd/conf.modules.d/*.conf 模块配置文件
mpm 以DSO机制提供,配置文件/etc/httpd/conf.modules.d/*.conf

1 切换使用MPM
LoadModule mpm_NAME_module modules/mod_mpm_NAME.so
NAME; prefork worker event

2 修改'Main' server 的DocumentRoot

3基于IP的访问控制法则
允许所有主机访问 Require all granted
拒绝........... Require all deny

控制特定IP访问
Require IP Ipaddr
Require not IP Ipaddr

Ipaddr:
IP:172.31.1.2
Network/mask:172.16.0.0/255.255.0.0
Network/length:172.31.0.0/16

控制特定主机访问
Require host HOSTNAME
Require not host HOSTNAME

HOSTNAME
FQDN
DOMAIN:指定域内所有主机
<RequireAll>
Require all granted
Require not ip Ipaddr
</RequireAll>


httpd+php
modules:无需子进程
CGI:
fastcgi(fpm)

SET PASSWORD FOR 'root'@'localhost'=PASSWORD('favicon');
SET PASSWORD FOR 'root'@'localhost'=PASSWORD('favicon');
FLUSH PRIVILGES;

information_schema performance_schema 类似于/proc 和/sys(伪文件系统),是伪数据库,在mariadb不启动时为空,mariadb启动后,才有数据,是mariadb的字典数据库,数据字典.mariadb运行过程中,状态数据,性能数据等信息.mysql是元数据库,是mysql专用的管理数据库

PHP Opcode
Opcode是一种PHP脚本编译后的中间语言,像Java的bytecode 或者ASP.NET的MSL, PHP执行PHP脚本代码一般会经历如下四步
1
scanning(lexing)-------将PHP代码转换成语言片段(tokens)
2
parsing---------将tokens转换成简单有意义的表达式
3
compilation-----------------将表达式编译成Opcode
4
Execution------------顺次执行Opcode,每次一条,从而实现PHP脚本功能

PDO(PHP data objects)

httpd + php
module
httpd prefork libphp5.so
httpd worker event libphp5-zts.so

php解释器
PHP:
读取文件I/O调用(库调用),读取文件,

/etc/php.ini /etc/php.d/*.ini
配置文件php.ini在启动时被读取,对于服务器模块版本和fastcgi(fpm),仅在服务器启动时读取,CGI和cli每次调用都会读取

Section headers (e.g. [Foo]) are also silently ignored,
[Foo] sectionheader

directive = value
php -m 查看PHP加载模块
mariadb
关系型数据库的一种开源实现
采用何种结构组织数据,叫数据结构模型,
文件系统是树状模型,文本文件是数据流模型,
数据结构模型:
层次模型 网状模型 关系模型

插件式存储引擎:存储管理器有多种实现版本
存储引擎也称为"表类型"
1:更多存储的存储引擎
MyISAM --> Aria
InnoDB --> XtraDB

安装使用mariadb
通用二进制格式
1准备数据目录
/pvremove/data
2配置mariadb
groupadd -r -g 306 mysql
useradd -r -g 306 -u 306 mysql
tar xvf mariadb-version-server.xz --directory=/usr/local
ln -sv mariadb-version-server.xz mysql
cd /usr/local/mysql
chown -R root:mysql ./*
scripts/mysql_install_db --datadir=/pvremove/data --user=mysql
cp support-files/mysql.server /etc/rc.d/init.d/mysqld
chkconfig --add mysqld
3准备配置文件
配置格式,类ini.为各程序均通过单个配置文件提供配置信息
[program_name]
配置文件查找程序
/etc/my.cnf /etc/mysql/my.cnf --default-extra-file=/path/to/config_file ~/.my.cnf

install -d /etc/mysql
cp support-files/my-large.cnf /etc/mysql/my.cnf

添加三个选项
datadir = /pvremove/data
innodb_file_per_table = on
skip_name_resolve = on
Maria的程序组成
c:
mysql:CLI交互式终端
mysqldump mysqladmin
s:
mysqld_safe
mysqld
mysqld_multi
服务器监听的两种socket地址
ip socket:监听在3306/tcp,支持远程通信
unix sock:监听在sock文件上(/tmp/mysql.sock /var/lib/mysql/mysql.sock),仅支持本地通信
server:localhost 127.0.0.1
命令行交互式客户端程序:mysql
mysql
-u username 默认root
-h host:服务器主机 默认localhost
-p password 默认空
mysql用户账户由两部分组成: 'username'@'host'
host用于限制用户可通过哪些主机远程连接mysql服务
支持通配符
%:匹配任意长度字符

_: 匹配单个字符
mysql_secure_installation:安全初始化

命令:
客户端命令:本地执行
mysql>help
服务端命令
通过mysql应用层协议发往服务器执行并取回结果
每个命令必须有命令结束符号(默认semicolon)
关系型数据库常见组件
数据库 database
表 table
索引 index
视图 view
用户 user
权限 privilege

存储过程:procedure,无返回值,通常使用call
存储函数;function,有返回值,通常使用select
触发器:trigger
事件调度器:类似crontable,event scheduler

SQL:
DDL: Data Definition Language 数据定义语言
操作对象及其属性,对象包含数据库,table,view,field,具体操作CREATE DROP ALTER .对象的概念比记录大,DDL不会对具体数据进行操作(记录).

CREATE DATABASE|SCHEMA [IF NOT EXISTS] 'DB_NAME'
DROP DATABASE|SCHEMA [IF EXISTS] 'DB_NAME'
获取help
HELP CREATE DATABASE;
HELP DROP DATABASE;
[DEFAULT] CHARACTER SET [=] CHARSET_NAME
[DEFAULT] COLLATE [=] COLLATION_NAME
查看字符集:
SHOW CHARACTER SET;
查看支持的排序规则
SHOW COLLATIONS;

SHOW DATABASES;
TABLE
CREATE TABLE cadence1 [IF NOT EXISTS] TABLE_NAME (col1 datatype modifier,col2 datatype modifier) ENGINE='';
查看所有引擎
SHOW ENGINES;
查看表
SHOW TABLES;
SHOW TABLES FROM DB_NAME;
查看表结构
DESC [DB_NAME.]TABLE_NAME;
删除表
DROP TABLE [IF EXISTS] TABLE_NAME;

 

DML: Data Manipulation Language
操作对象为数据库对象中包含的具体数据(记录)

DCL:Data Control Language
操作对象为用户,组,public

DQL:Data Query Language
SELECT FROM WHERE

数据类型:
字符型:
定长字符型CHAR(#),BINARY(#)
变长字符型VARCHAR(#),VARBINARY(#)

TEXT
SMALL TEXT MEDIUM TEXT TEXT LONG TEXT
BLOB
SMALL BLOB MEDIUM BLOB BLOB LONG BLOB
数值型
整形
TINY INT 1 BYTE
SMALL INT 2 BYTE
MEDIUM INT 3 BYTE
INT 4 BYTE
BIGINT 8 TYTE
十进制
decimal
近似数值型
单精度浮点型
float
双精度浮点型
double
mysql中数值不加quotation marks,字符串要加quotation marks

CREATE DATABASE [IF NOT EXISTS] 'DB_NAME'
[DEFAULT] CHARACTER SET charset
[DEFAULT] COLLATE collate;
DROP DATABASE [IF EXISTS] 'DB_NAME';

CREATE TABLE[IF NOT EXISTS] 'TABLE_NAME';

PRIMARY KEY(COL1,COL2)

 

posted @   ascertain  阅读(325)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示