linux-shell脚本基础-2 !/bin/bash

1,用户组

添加用户

useradd
    -u   UID
    -o   
    -g  指定 GID或组名
    -c   注释信息
    -d  家目录
    -s  shell  
    -G  附加组
    -r  系统用户
    -m  家目录,系统用户
    -M  不创建家目录,非系统用户
      newusers file : 批量创建用户,需要事先准备好跟passwd格式一样的文件	
      chpasswd : 批量修改用户口令,文件格式:用户名:口令
    
    passwd    
             -l : 锁定指定的用户
            -u : 解锁指定的用户
            -e :强制用户下次登录时修改密码   
    
 usermod
    -u UID
    -g  GID
    -G  新附加组   -a 
    -d  HOME
    -l  新家目录
    -U   解锁
    -L   锁定
    -e   YYYY-MM-DD: 指明用户账号过期日期
    --f INACTIVE: 设定非活动期限
     -d DIR : 修改家目录
     -m : 配合-d,修改并且移动数据到新的家目录
    userdel  
        -r   删除用户家目录
       
 id [OPTION]... [USER]
 -n: 显示名称,需配合ugG使用
 -G: 显示用户所属的组的ID
 -u UID
 -g GID


切换用户方式
    su  :非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录
    su  -    :登录式切换,会读取目标用户的配置文件,切换至家目录,完全切换
    
    
  change  修改密码策略
  -d LAST_DAY
  -E --expiredate EXPIRE_DATE
  -I --inactive INACTIVE
  -m --mindays MIN_DAYS
  -M --maxdays MAX_DAYS
  -W --warndays WARN_DAYS
  
 chage -d 0 tom 下一次登录强制重设密码
 chage -m 0 –M 42 –W 14 –I 7 tom
 chage -E 2016-09-10 tom
 
   
  groupadd
  -g  GID
  -r   系统组
   
   groupmod   [option]    GROUP
            -n group_name : 修改组名
            -g GID : 修改GID  
           
   
  修改文件属性
  chown    -R     递归
  
  umask   
  可以用来保留在创建文件权限
  新建文件的默认权限: 666-umask,如果所得结果某位存在执行(奇数)权限,则将其权限+1
  新建目录的默认权限: 777-umask
  非特权用户umask是 002
  root的umask 是 022
  
   
   对于文件的权限:
    r : 查看 
    w : 修改
    x : 运行

    对于目录的权限:
    r : 查看目录内文件列表
    w : 创建和删除文件(需要x权限)
    x : cd进目录
   
   
  特殊权限
  SUID
  SGID
  默认情况下,用户创建文件时,其属组为此用户所属的主组
  一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组
      
  Sticky 位
  具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权
  在目录设置Sticky 位,只有文件的所有者或root可以删除该文件
  SUID: user,占据属主的执行权限位
  s:属主拥有x权限
  S:属主没有x权限
  SGID: group,占据属组的执行权限位
  s: group拥有x权限
  S:group没有x权限
  Sticky: other,占据other的执行权限位
  t:other拥有x权限
  T:other没有x权限
  
  文件特殊属性
  
  chattr +i 不能删除,改名,更改
  chattr +a 只能追加内容  
  lsattr 显示特定属性
   
     
     
 acl 访问控制列表
 
 ACL:Access Control List,实现灵活的权限管理
 CentOS7 默认创建的xfs和ext4文件系统具有ACL功能
 CentOS7 之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加
 tune2fs –o acl /dev/sdb1
 mount –o acl /dev/sdb1 /mnt/test
 
 ACL生效顺序:所有者>(自定义用户>所属组,自定义组)>其他人
    括号外的用户不收mask影响
 mount -o acl /directory
 getfacl file |directory
 setfacl -m u:wang:rwx file|directory
 setfacl -Rm g:sales:rwX directory
 setfacl -M file.acl file|directory
 setfacl -m g:salesgroup:rw file| directory
 setfacl -m d:u:wang:rx directory
 setfacl -x u:wang file |directory
 setfacl -X file.acl directory
 
 通过ACL赋予目录默认x权限,目录内文件也不会继承x权限
 base ACL 不能删除
 setfacl -k dir 删除默认ACL权限
 setfacl –b file1清除所有ACL权限
 getfacl file1 | setfacl --set-file=- file2 复制file1的acl权限给file2
 mask只影响除所有者和other的之外的人和组的最大权限
 Mask需要与用户的权限进行逻辑与运算后,才能变成有限的权限(EffectivePermission)
 用户或组的设置必须存在于mask权限设定范围内才会生效
  setfacl -mmask::rx file
  
  --set选项会把原有的ACL项都删除,用新的替代,需要注意的是一定要包含UGO的设置,不能象-m一样只是添加ACL就可以
  
  
 XFS文件系统默认支持ACL,其他低级的需要文件系统支持后,挂载时指定

2,脚本基础

变量命令

    1、不能使程序中的保留字:例如if, for
2、只能使用数字、字母及下划线,且不能以数字开头
3、见名知义
4、统一命名规则:驼峰命名法

  Shell中命名建议规则:
1、变量名大写
2、局部变量小写
3、函数名小写
4、用英文名字,并体现出实际作用

根据变量的生效范围等标准划分下面变量类型
局部变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,
包括当前shell的子shell进程均无效
环境变量:生效范围为当前shell进程及其子进程
本地变量:生效范围为当前shell进程中某代码片断,通常指函数
位置变量:$1, $2, ...来表示,用于让脚本在脚本代码中调用通过命令行传
递给它的参数
特殊变量:$?, $0, $*, $@, $#,$$
 
     $$  shell 本身的pid当前进程号
     $!   shell 最后运行的后台processs pid


      set   	
       -e : 如果一个命令返回一个非0退出状态值(失败),就退出。 
       -n : 不需要执行脚本只是检查语法结构,返回所有的语法错误信息。      
       -u :  置换时把未设置的变量看作出错。    
       -v :  当读入shell输入行时,把它们显示出来。     
       -x :  执行命令时,把命令和它们的参数显示出来

变量赋值:name=‘value’
可以使用引用value
(1) 可以是直接字串: name=“root"
(2) 变量引用: name="$USER"
(3) 命令引用: name=COMMAND
name=$(COMMAND)

  变量引用:${name} 或者 $name
" " 弱引用,其中的变量引用会被替换为变量值
' ' 强引用,其中的变量引用不会被替换为变量值,而保持原字符串
  显示已定义的所有变量:set
  删除变量:unset name

只读变量:只能声明,但不能修改和删除
  声明只读变量:
readonly name
declare -r name
  查看只读变量:
   readonly -p

变量作用域

local  
export   全局
新开子shell 运行脚本
source    脚本执行,在本sehll

命令行扩展

$() 或 ``

声明变量
readonly name
declare -r name
-i 整型
-x 环境变量

readonly -p

撤销变量
unset var
unset -f 函数名

位置变量
linux-shell脚本基础-2
!/bin/bash

退出码
bash自定义退出状态码
exit [n]:自定义退出状态码
注意:脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字
注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码

算术运算
只支持整数运算

let
expr
ab=expr $a + $b
$[ ]
$(( ))

bc支持小数
echo "5*7 .3" | bc
linux-shell脚本基础-2
!/bin/bash

条件测试

条件测试

真 返回0
假 返回1

逻辑运算
与 -a &&
或 -o ||
非 !
a 使用 []
[ -a ]

&& 使用 [[ ]]
[[ && ]]
[ ] && [ ]
测试命令

test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]

1,使用-n -z 判断 变量是否为空
[ ] 需要在变量外侧加" " [[ ]] 不必
linux-shell脚本基础-2
!/bin/bash
注意:EXPRESSION前后必须有空白字符

命令组合

( command;command ) 开启子shell
{ command ; command ; } 本shell下执行

bash的数值测试

-v VAR

变量VAR是否设置

数值测试
-gt 是否大于-ge 是否大于等于-eq 是否等于-ne 是否不等于-lt 是否小于-le 是否小于等于
linux-shell脚本基础-2
!/bin/bash

shell 变量字符串
${parameter}
${#parameter} 字符长度
${parameter:offset} 从offset 之后开始提取子串到结尾
${parameter:offset:length} 从offset 之后开始提取长度为length的字串
${parameter#word} 从${parameter}开头开始删除最短匹配的word字符串
${parameter##word} 从${parameter}开头开始删除最长匹配的word字符串
${parameter%word} 从${parameter}结尾开始删除最短匹配的word字符串
${parameter%%word} 从${parameter}结尾开始删除最长匹配的word字符串
${parameter/pattern/string } string 代替第一个匹配的pattern
${parameter//pattern/string } 所有
字符长度
管道echo ${char} |wc -L
expre length "${char}"

特殊扩展变量

${parameter:-word} 如果parameter变量为空或未赋值,则返回word字符串并代替变量值
${parameter:=word} 如果parameter变量为空或未赋值 ,则设置为word并返回,位置变量与特殊变量不适用
${parameter:?word} 如果parameter变量为空或未赋值,word作为标准错误输出,否则输出变量值
${parameter:+word} 如果parameter变量为空或未赋值,什么都不做,否则word的值返回

数学运算

no1=4;
no2=5;
let result=no1+no2
echo $result
result=$[ no1 + no2 ]
result=$[ $no1 + 5 ]
也可以使用(()),但使用(())时,变量名之前需要加上$:

数组

$ ass_array=([index1]=val1 [index2]=val2)
使用独立的“索引-值”进行赋值:
$ ass_array[index1]=val1
$ ass_array'index2]=val2
数组索引
$ echo ${!array_var[]}
$ echo ${!array_var[@]
$ echo ${!fruits_value[
]}

 while   read  n  ;do
   echo  " name  is   $n  "                                           
   done   <   name                  #文本文件每行

   cat student_name.txt | while read name  ;   do
    useradd $name
    echo $name is created
    done 


find

find /var -not ( -user root -o -user lp -o -user gdm )

与xargs 配合

压缩

compress .Z
gzip .gz
bzip2 .bz2
xz .xz
zip .
tar
cpio

-j: bzip2, -z: gzip, -J: xz

软硬符号链接
df -i --print-type

符号链接和硬链接的区别?
符号链接:
软链接有自己的文件属性及权限等;
可对不存在的文件或目录创建软链接;
软链接可交叉文件系统;
软链接可对文件或目录创建;
创建软链接时,链接计数 i_nlink 不会增加;
删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)。

硬链接:
文件有相同的 inode 及 data block;
只能对已存在的文件进行创建;
不能交叉文件系统进行硬链接的创建;
不能对目录进行创建,只可对文件创建;
删除一个硬链接文件并不影响其他有相同 inode 号的文件。

每个文件存在两个计数器:i_count 与 i_nlink,即引用计数与硬链接计数。结构体 inode 中的 i_count 用于跟踪文件被访问的数量,而 i_nlink 则是上述使用 ls -l 等命令查看到的文件硬链接数。或者说 i_count 跟踪文件在内存中的情况,而 i_nlink 则是磁盘计数器。当文件被删除时,则 i_nlink 先被设置成 0。文件的这两个计数器使得 Linux 系统升级或程序更新变的容易。系统或程序可在不关闭的情况下(即文件 i_count 不为 0),将新文件以同样的文件名进行替换,新文件有自己的 inode 及 data block,旧文件会在相关进程关闭后被完整的删除

创建软链接是以相对路径创建时,该链接会在当前目录下寻找相同文件名的文件,如果无法找到,该链接失效。链接文件有自己的节点数据。

其他

[abc.,f]单个字符选择
{ad,ch } 符号扩展 字符串选择
basename dirname
变量扩展 :变量存在与否
${待测变量-默认值} 变量不存在,返默认值,存在返其值
${待测变量:-默认值} 变量不存在或为空,传后值
${待测变量:=默认值} 变量不在或空 变量设为默认值
echo 默认换行 -n 取消换行 -e 使特殊字符起作用
: 传回真值0 :> test.txt 建立空文件
. source 在现行shell环境中执行脚本
set 设定bash shell 属性 显示变量和函数内容
set -o emacs 打开命令行修改模式
shopt 设定bash shell 行为模式
-s -u -o -q
read 没指定接收变量,默认REPLY -p 提示信息
read LINE < dataf1 dataf1的第一行赋值给LINE
read f f2 f3 f4 < dataf1 dataf1的第一行字段赋值
如果各字段以:分开
IFS=":"
read f1 f2 f3 f4 f5 f6 f7 < /etc/passwd
exec 执行指定程序取代原来shell 或转向操作生效
exec 程序或命令 取代当前shell 环境
exec < datafile 凡是由标准输入读取数据的,改向datafile 读取
eval 读取变量内容并执行
listlog="ls -la /var/log/*.log"
eval $listlog
uniq 已排序好的重复行删除
cut -c2 f1 抽取f1 每一行的第二个字符
cut -c3-10
-c9-
paste tr
script log.text 记录命令的执行信息 exit 退出
${变量}获取变量值
单一执行 echo 会换行
unset -v变量 -f函数
单引号 所见即所得

正则表达式
[0-9]匹配0-9 d 阿拉伯数字 D 非数字字符 % | . 匹配任意字符
()捕获分组 引用1 {3}出现次数 + 一个或多个 * 零个或多个

其他


本文是介绍使用源码编译安装,包括具体的编译参数信息。
正式开始前,编译环境gcc g++ 开发库之类的需要提前装好。
安装make:
yum -y install gcc automake autoconf libtool make
安装g++:
yum install gcc gcc-c++
 

一般我们都需要先装pcre, zlib,前者为了重写rewrite,后者为了gzip压缩。
1.选定源码目录
可以是任何目录,本文选定的是/usr/local/src
cd /usr/local/src
2.安装PCRE库
ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.39.tar.gz 下载最新的 PCRE 源码包,使用下面命令下载编译和安装 PCRE 包:

 
cd /usr/local/src
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.39.tar.gz
tar -zxvf pcre-8.39.tar.gz
cd pcre-8.39
./configure
make && make install
3.安装zlib库
http://zlib.net/zlib-1.2.11.tar.gz 下载最新的 zlib 源码包,使用下面命令下载编译和安装 zlib包:

  cd /usr/local/src
  wget http://zlib.net/zlib-1.2.11.tar.gz 
  tar -zxvf zlib-1.2.11.tar.gz 
  cd zlib-1.2.11
  ./configure 
  make && make install

4.安装ssl(某些vps默认没装ssl)
cd /usr/local/src
wget https://www.openssl.org/source/openssl-1.1.0b.tar.gz
tar -zxvf openssl-1.1.0b.tar.gz
./config
make && make install
 
5.安装nginx
以安装最新稳定版ngixn-1.10.2为例子,其他版本也一样。
下面是把 Nginx 安装到 /usr/local/nginx 目录下的详细步骤:
 cd /usr/local/src
 wget http://nginx.org/download/nginx-1.10.2.tar.gz
 tar -zxvf nginx-1.10.2.tar.gz
 cd nginx-1.10.2
1、添加nginx用户和用户组
groupadd -r nginx
useradd -r -g nginx nginx
你可能收到提示已经有了nginx 用户和组这个无所谓有了更好。
 
2、配置nginx安装参数

 
  ./configure 
  --prefix=/usr/local/nginx 
  --sbin-path=/usr/local/nginx/sbin/nginx 
  --conf-path=/usr/local/nginx/nginx.conf 
  --pid-path=/usr/local/nginx/nginx.pid 
  --user=nginx 
  --group=nginx 
  --with-http_ssl_module 
  --with-http_flv_module 
 --with-http_mp4_module  
 --with-http_stub_status_module 
 --with-http_gzip_static_module 
 --http-client-body-temp-path=/var/tmp/nginx/client/ 
 --http-proxy-temp-path=/var/tmp/nginx/proxy/ 
 --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ 
 --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi 
 --http-scgi-temp-path=/var/tmp/nginx/scgi 
 --with-pcre=/usr/local/src/pcre-8.39 
 --with-zlib=/usr/local/src/zlib-1.2.11 
 --with-openssl=/usr/local/src/openssl-1.1.0b 

注:当前所在目录一定要是/usr/local/src/nginx-1.10.2
--with-pcre=/usr/local/src/pcre-8.39 指的是pcre-8.39 的源码路径。
--with-zlib=/usr/local/src/zlib-1.2.11 指的是zlib-1.2.11 的源码路径。
--with-openssl=/usr/local/src/openssl-1.1.0b 指的是openssl-1.1.0b 的源码路径。
编译安装
1 make && make install
 
安装成功后 /usr/local/nginx 目录下如下:

 
3、启动
确保系统的 80 端口没被其他程序占用,运行/usr/local/nginx/sbin/nginx 命令来启动 Nginx
 netstat -ano|grep 80
/usr/local/nginx/sbin/nginx
可能会出现mkdir /var/tmp/nginx/client failed的提示
这时手动创建就可以了 mkdir -p /var/tmp/nginx/client就可以了
打开浏览器访问此机器的 IP,如果浏览器出现 Welcome to nginx! 则表示 Nginx 已经安装并运行成功
ps:
若nginx成功运行后,通过ip地址无法访问服务器 则可能是防火墙的问题 需要开放80端口或关闭防火墙
开启80端口 
firewall-cmd --zone=public --add-port=80/tcp --permanent 
命令含义: 
--zone #作用域 
--add-port=80/tcp #添加端口,格式为:端口/通讯协议 
--permanent #永久生效,没有此参数重启后失效 
重启防火墙 
firewall-cmd --reload
或者永久关闭防火墙
systemctl stop firewalld.service  //停止防火墙
systemctl disable firewalld.service //不再开机停止运行防火墙
 
nginx编译选项
make是用来编译的,它从Makefile中读取指令,然后编译。
make install是用来安装的,它也从Makefile中读取指令,安装到指定的位置。
configure命令是用来检测你的安装平台的目标特征的。它定义了系统的各个方面,包括nginx的被允许使用的连接处理的方法,比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本,执行结束时,它会创建一个Makefile文件。nginx的configure命令支持以下参数:
--prefix=path    定义一个目录,存放服务器上的文件 ,也就是nginx的安装目录。默认使用 /usr/local/nginx。
--sbin-path=path 设置nginx的可执行文件的路径,默认为  prefix/sbin/nginx.
--conf-path=path  设置在nginx.conf配置文件的路径。nginx允许使用不同的配置文件启动,通过命令行中的-c选项。默认为prefix/conf/nginx.conf.
--pid-path=path  设置nginx.pid文件,将存储的主进程的进程号。安装完成后,可以随时改变的文件名 , 在nginx.conf配置文件中使用 PID指令。默认情况下,文件名 为prefix/logs/nginx.pid.
--error-log-path=path 设置主错误,警告,和诊断文件的名称。安装完成后,可以随时改变的文件名 ,在nginx.conf配置文件中 使用 的error_log指令。默认情况下,文件名 为prefix/logs/error.log.
--http-log-path=path  设置主请求的HTTP服务器的日志文件的名称。安装完成后,可以随时改变的文件名 ,在nginx.conf配置文件中 使用 的access_log指令。默认情况下,文件名 为prefix/logs/access.log.
--user=name  设置nginx工作进程的用户。安装完成后,可以随时更改的名称在nginx.conf配置文件中 使用的 user指令。默认的用户名是nobody。
--group=name  设置nginx工作进程的用户组。安装完成后,可以随时更改的名称在nginx.conf配置文件中 使用的 user指令。默认的为非特权用户。
--with-select_module --without-select_module 启用或禁用构建一个模块来允许服务器使用select()方法。该模块将自动建立,如果平台不支持的kqueue,epoll,rtsig或/dev/poll。
--with-poll_module --without-poll_module 启用或禁用构建一个模块来允许服务器使用poll()方法。该模块将自动建立,如果平台不支持的kqueue,epoll,rtsig或/dev/poll。
--without-http_gzip_module — 不编译压缩的HTTP服务器的响应模块。编译并运行此模块需要zlib库。
--without-http_rewrite_module  不编译重写模块。编译并运行此模块需要PCRE库支持。
--without-http_proxy_module — 不编译http_proxy模块。
--with-http_ssl_module — 使用https协议模块。默认情况下,该模块没有被构建。建立并运行此模块的OpenSSL库是必需的。
--with-pcre=path — 设置PCRE库的源码路径。PCRE库的源码(版本4.4 - 8.30)需要从PCRE网站下载并解压。其余的工作是Nginx的./ configure和make来完成。正则表达式使用在location指令和 ngx_http_rewrite_module 模块中。
--with-pcre-jit —编译PCRE包含“just-in-time compilation”(1.1.12中, pcre_jit指令)。
--with-zlib=path —设置的zlib库的源码路径。要下载从 zlib(版本1.1.3 - 1.2.5)的并解压。其余的工作是Nginx的./ configure和make完成。ngx_http_gzip_module模块需要使用zlib 。
--with-cc-opt=parameters — 设置额外的参数将被添加到CFLAGS变量。例如,当你在FreeBSD上使用PCRE库时需要使用:--with-cc-opt="-I /usr/local/include。.如需要需要增加 select()支持的文件数量:--with-cc-opt="-D FD_SETSIZE=2048".
--with-ld-opt=parameters —设置附加的参数,将用于在链接期间。例如,当在FreeBSD下使用该系统的PCRE库,应指定:--with-ld-opt="-L /usr/local/lib".

php-fpm安装配置
nginx本身不能处理PHP,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端。
nginx一般是把请求发fastcgi管理进程处理,fascgi管理进程选择cgi子进程处理结果并返回被nginx
本文以php-fpm为例介绍如何使nginx支持PHP
一、编译安装php-fpm
什么是PHP-FPM
PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的,可以在 http://php-fpm.org/download下载得到.
PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中。必须将它patch到你的PHP源代码中,在编译安装PHP后才可以使用。
新版PHP已经集成php-fpm了,不再是第三方的包了,推荐使用。PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,比spawn-fcgi具有更多优点,所以被PHP官方收录了。在./configure的时候带 –enable-fpm参数即可开启PHP-FPM,其它参数都是配置php的,具体选项含义可以查看这里。
安装前准备
添加 epel 源
# rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
安装依赖
# yum install gcc bison bison-devel zlib-devel libmcrypt-devel mcrypt mhash-devel openssl-devel libxml2-devel libcurl-devel bzip2-devel readline-devel libedit-devel sqlite-devel

1 yum -y install gcc gcc-c++ glibc
yum -y install libmcrypt-devel mhash-devel libxslt-devel 
libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel 
zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel 
ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel 
krb5 krb5-devel libidn libidn-devel openssl openssl-devel


 
 cd /usr/local/src
 wget http://au1.php.net/get/php-7.1.10.tar.gz/from/this/mirror
 tar -zvxf php-7.1.10.tar.gz
 cd php-7.1.10

./configure --prefix=/usr/local/php --enable-fpm --with-mcrypt 
--enable-mbstring --enable-pdo --with-curl --disable-debug  --disable-rpath 
--enable-inline-optimization --with-bz2  --with-zlib --enable-sockets 
--enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex 
--with-mhash --enable-zip --with-pcre-regex --with-pdo-mysql --with-mysqli 
--with-gd --with-jpeg-dir --with-freetype-dir --enable-calendar
make && make install

以上就完成了php-fpm的安装
下面是对php-fpm运行用户进行设置
1、为php提供配置文件
1 cp php.ini-production /usr/local/php/etc/php.ini
2、为php-fpm提供配置文件
 
1 cd /usr/local/php
2 cp etc/php-fpm.conf.default etc/php-fpm.conf
3 vim etc/php-fpm.conf
修改
user = www
group = www
如果www用户不存在,那么先添加www用户
1 groupadd www
2 useradd -g www www
修改
pm.max_children = 150
pm.start_servers = 8
pm.min_spare_servers = 5
pm.max_spare_servers = 10
pid = /usr/local/php/var/run/php-fpm.pid 
 
配置文件
# cp php.ini-production /usr/local/php/etc/php.ini
# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
# cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
# cp -R ./sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
 
需要注意的是php7中www.conf这个配置文件配置phpfpm的端口号等信息,如果你修改默认的9000端口号需在这里改,再改nginx的配置
重启
# killall php-fpm
#  service php-fpm restart
 
使用如下命令来验正(如果此命令输出有中几个php-fpm进程就说明启动成功了):
1 ps aux | grep php-fpm
3、nginx和php-fpm整合
编辑/usr/local/nginx/nginx.conf
1 vim /usr/local/nginx/nginx.conf

user www www;
worker_processes auto;
#error_log /usr/local/wwwlogs/error_nginx.log crit;
pid /usr/local/nginx/nginx.pid;
worker_rlimit_nofile 51200;
events {
  use epoll;
  worker_connections 51200;
  multi_accept on;
}
http {
  include mime.types;
  default_type application/octet-stream;
  client_header_buffer_size 32k;
  large_client_header_buffers 4 32k;
  client_max_body_size 1024m;
  sendfile on;
  tcp_nopush on;
  keepalive_timeout 120;
  server_tokens off;
  tcp_nodelay on;
  fastcgi_connect_timeout 300;
  fastcgi_send_timeout 300;
  fastcgi_read_timeout 300;
  fastcgi_buffer_size 64k;
  fastcgi_buffers 4 64k;
  fastcgi_busy_buffers_size 128k;
  fastcgi_temp_file_write_size 128k;
  #Gzip Compression
  gzip on;
  gzip_buffers 16 8k;
  gzip_http_version 1.1;
  gzip_min_length 256;
  gzip_proxied any;
  gzip_vary on;
  gzip_types
  text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml
  text/javascript application/javascript application/x-javascript
  text/x-json application/json application/x-web-app-manifest+json
  text/css text/plain text/x-component
  font/opentype application/x-font-ttf application/vnd.ms-fontobject
  image/x-icon;
  gzip_disable "MSIE [1-6].(?!.*SV1)";
  #If you have a lot of static files to serve through Nginx then caching of the files' metadata (not the actual files' contents) can save some latency.
  open_file_cache max=1000 inactive=20s;
  open_file_cache_valid 30s;
  open_file_cache_min_uses 2;
  open_file_cache_errors on;
  ######################## default ############################
  server {
    listen 80;
    server_name _;
    #access_log /usr/local/wwwlogs/access_nginx.log combined;
    root /home/www/default;
    index index.html index.htm index.php;
    location /nginx_status {
      stub_status on;
      access_log off;
      allow 127.0.0.1;
      deny all;
    }
    location ~ [^/].php(/|$) {
      #fastcgi_pass remote_php_ip:9000;
      fastcgi_pass unix:/dev/shm/php-cgi.sock;
      fastcgi_index index.php;
      include fastcgi.conf;
    }
    #location ~ .php$ {
      # root /home/www;
      # fastcgi_pass 127.0.0.1:9000;
      # fastcgi_index index.php;
      # fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      # include fastcgi_params;
    #}
    location ~ .*.(gif|jpg|jpeg|png|bmp|swf|flv|ico)$ {
      expires 30d;
      access_log off;
    }
    location ~ .*.(js|css)?$ {
      expires 7d;
      access_log off;
    }
  }
  ########################## vhost #############################
  include vhost/*.conf;
}

 
项目路径
1 mkdir /usr/local/nginx/vhost
2 touch www.qyi.com.conf
3 vim www.qyi.com.conf

server {
  charset utf-8;
  client_max_body_size 200M;
  listen 80;
  #listen [::]:80 default_server ipv6only=on; ## listen for ipv6
  listen 443 ssl;
  # server_name localhost;
  # ssl on;
  ssl_certificate /usr/local/ssl/beta-v2.crt;
  ssl_certificate_key /usr/local/ssl/beta-v2.key;
  ssl_session_timeout 5m;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers ALL:!DH:!EXPORT:!RC4:+HIGH:+MEDIUM:-LOW:!aNULL:!eNULL;
  ssl_prefer_server_ciphers on;
  server_name www.qyi.com;
  root /home/www/www.qyi.com;

  #access_log /home/www/www.qyi.com/advanced.access.log main buffer=50k;
  error_log /usr/local/nginx/logs/bella.error.log warn;
  location / {
    root /home/www/www.qyi.com/frontend/web;
    try_files $uri /frontend/web/index.php?$args;
    # avoiding processing of calls to non-existing static files by Yii
    location ~ .(js|css|ttf|woff|woff2|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
      access_log off;
      expires 360d;
      try_files $uri =404;
    }
  }
  location /admin {
    alias /home/www/www.qyi.com/backend/web;
    rewrite ^(/admin)/$ $1 permanent;
    try_files $uri /backend/web/index.php?$args;
  }
  # avoiding processing of calls to non-existing static files by Yii
  location ~ ^/admin/(.+.(js|css|ttf|woff|woff2|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar))$ {
    access_log off;
    expires 360d;
    rewrite ^/admin/(.+)$ /backend/web/$1 break;
    rewrite ^/admin/(.+)/(.+)$ /backend/web/$1/$2 break;
    try_files $uri =404;
  }
  location /v1 {
    alias /home/www/www.qyi.com/api/v1/web;
    rewrite ^(/v1)/$ $1 permanent;
    try_files $uri /api/v1/web/index.php?$args;
  }
  location /v2 {
    alias /home/www/www.qyi.com/api/v2/web;
    rewrite ^(/v2)/$ $1 permanent;
    try_files $uri /api/v2/web/index.php?$args;
  }

  location ~ .php$ {
    include fastcgi_params;
    # check your /etc/php5/fpm/pool.d/www.conf to see if PHP-FPM is listening on a socket or port
    #fastcgi_pass unix:/var/run/php5-fpm.sock; ## listen for socket
    #fastcgi_pass 127.0.0.1:9000; ## listen for port
    #fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    #try_files $uri =404;
    fastcgi_pass unix:/dev/shm/php-cgi.sock;
    fastcgi_index index.php;
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    include fastcgi.conf;
  }
  #error_page 404 /404.html;
  location = /requirements.php {
    deny all;
  }
  location = /palmobo.net.html{
    try_files $uri =404;
  }
  location ~ .(ht|svn|git) {
    deny all;
  }
}

 
phpmyadmin路径
1 touch www.mysql.com.conf
2 vim www.mysql.com.conf

server {
  listen 80;
  server_name www.mysql.com;
  access_log off;
  index index.html index.htm index.php;
  #include /usr/local/nginx/vhost/www.mysql.com.conf;
  root /home/www/www.mysql.com;
  location ~ [^/].php(/|$) {
    #fastcgi_pass remote_php_ip:9000;
    fastcgi_pass unix:/dev/shm/php-cgi.sock;
    fastcgi_index index.php;
    include fastcgi.conf;
  }
  location ~ .*.(gif|jpg|jpeg|png|bmp|swf|flv|ico)$ {
    expires 30d;
    access_log off;
  }
  location ~ .*.(js|css)?$ {
    expires 7d;
    access_log off;
  }
}

其他

#!/bin/sh
# desc: setup linux system security

#设置账号
passwd -l xfs
passwd -l news
passwd -l nscd
passwd -l dbus
passwd -l vcsa
passwd -l games
passwd -l nobody
passwd -l avahi
passwd -l haldaemon
passwd -l gopher
passwd -l ftp
passwd -l mailnull
passwd -l pcap
passwd -l mail
passwd -l shutdown
passwd -l halt
passwd -l uucp
passwd -l operator
passwd -l sync
passwd -l adm
passwd -l lp
# 用 chattr 给用户路径更改属性。
# chattr 命令用法参考文末说明[1]
chattr +i /etc/passwd
chattr +i /etc/shadow
chattr +i /etc/group
chattr +i /etc/gshadow
# 设置密码连续输错 3 次后锁定 5 分钟
sed -i 's#auth required
pam_env.so#auth required
pam_env.so nauth required
pam_tally.so onerr=fail deny=3
unlock_time=300
nauth required /lib/security/ 
$ISA/pam_tally.so onerr=fail 
deny=3 unlock_time=300#'

/etc/pam.d/system-auth
# 5 分钟后自动登出,原因参考文末说明[2]
echo "TMOUT=300" >> /etc/profile
# 历史命令记录数设定为 10 条
sed -i
"s/HISTSIZE=1000/HISTSIZE=10/"
/etc/profile
# 让以上针对 /etc/profile 的改动立即生效
source /etc/profile
# 在 /etc/sysctl.conf 中启用 syncookie
echo "net.ipv4.tcp_syncookies=1" >>
/etc/sysctl.conf
# exec sysctl.conf enable
sysctl -p
# 优化 sshd_config
sed -i "s/#MaxAuthTries 6/MaxAuthTries
6/" /etc/ssh/sshd_config
sed -i "s/#UseDNS yes/UseDNS no/"
/etc/ssh/sshd_config
# 限制重要命令的权限
chmod 700 /bin/ping
chmod 700 /usr/bin/finger
chmod 700 /usr/bin/who
chmod 700 /usr/bin/w
chmod 700 /usr/bin/locate
chmod 700 /usr/bin/whereis
chmod 700 /sbin/ifconfig
chmod 700 /usr/bin/pico
chmod 700 /bin/vi
chmod 700 /usr/bin/which
chmod 700 /usr/bin/gcc
chmod 700 /usr/bin/make
chmod 700 /bin/rpm
# 历史安全
chattr +a /root/.bash_history
chattr +i /root/.bash_history
# 给重要命令写 md5
cat > list << "EOF" &&
/bin/ping
/usr/bin/finger
/usr/bin/who
/usr/bin/w
/usr/bin/locate
/usr/bin/whereis
/sbin/ifconfig
/bin/vi
/usr/bin/vim
/usr/bin/which
/usr/bin/gcc
/usr/bin/make
/bin/rpm
EOF
for i in `cat list`
do
 if [ ! -x $i ];then
 echo "$i not found,no md5sum!"
 else
 md5sum $i >>
/var/log/`hostname`.log
 fi
done
rm -f list



###############################
iptables缺省脚本

/sbin/modprobe ip_tables
/sbin/modprobe ip_nat_ftp
iptables -F
iptables -X
iptables -Z
# 默认规则
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# 限制数据包数量
/sbin/iptables -A INPUT -f -m limit --limit 100/sec --limit-burst 100 -j ACCEPT
/sbin/iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -m limit --limit 20/sec
--limit-burst 200 -j ACCEPT
/sbin/iptables -A INPUT -p icmp -m limit --limit 12/min --limit-burst 2 -j DROP
#ssh 规则
iptables -t filter -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -o eth0 -p tcp --sport 22 -j ACCEPT
#www-ftp-mail-dns 规则
iptables -t filter -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -o eth0 -p tcp --sport 80 -j ACCEPT
#ICMP 规则
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT


基础知识 :
iptables 以顺序方式执行,从上到下
常用 iptables 维护命令 :
#iptables -L -n
显示当前 iptables 规则
#iptables-save > /etc/iptables-script
保存规则
#iptables-restore /etc/iptables-script
恢复保存的规则
设置 iptables 开机自动加载规则,添加以下内
容至 /etc/rc.local 文件中即可
/sbin/iptables-restore /etc/iptablesscript
需要注意的是,必须写完全路径,要不然系统找
不到命令与规则及脚本




##用 iptables 把来自某个国家的 IP 重定向

#!/bin/bash
# Redirect traffic from a specific country to a specific page
# written by vpsee.com
COUNTRY="cn"
YOURIP="1.2.3.4"
if [ "$(id -u)" != "0" ]; then
 echo "you must be root" 1>&2
 exit 1
fi
iptables -F
iptables -X
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -i eth0 -j ACCEPT
iptables -A OUTPUT -o eth0 -j ACCEPT
# Redirect incoming http (80) from China to 81
for c in $COUNTRY
do
 country_file=$c.zone
 IPS=$(egrep -v "^#|^$" $country_file)
 for ip in $IPS
 do
 echo "redirecting $ip"
 iptables -t nat -I PREROUTING -p tcp --dport 80 -s $ip -j DNAT 
 --to-destination $YOURIP:81
 done
done
iptables-save > /etc/sysconfig/iptables
chmod go-r /etc/sysconfig/iptables
service iptables restart




密码随机生成
#1
date +%s | sha256sum | base64 | head -c 32; echo
使用 SHA 来哈希日期,输出头 32 个字节。
#2
< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-32};echo;
使用内嵌的 /dev/urandom,只输出字符,结果取
头 32 个。
#3
openssl rand -base64 32
使用系统自带的 openssl 的随机特点来产生随机
密码
#4
tr -cd ‘[:alnum:]‘ < /dev/urandom | fold -w30 | head -n1
#5
strings /dev/urandom | grep -o‘[[:alnum:]]’| head -n 30 | tr -d‘
’; echo
通过过滤字符命令,输出随机密码
#6
< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c6
这个命令比起来比较简单了
#7
dd if=/dev/urandom bs=1 count=32 2>/dev/null | base64 -w 0 | rev | cut -b 2- | rev
#8
</dev/urandom tr -dc ’12345!@#$%qwertQWERTasdfgASDFGzxcvbZXCVB’| head -c8; echo “”
#9
randpw(){ < /dev/urandom tr -dc _A-Za-z-0-9 | head -c${1:-16};echo;}
使用 randpw 随时产生随机密码,可以把它放到~/.bashrc 文件里面。
#10
date | md5sum












bash  程序的排错
检查语法
bash -v  xxx.sh

不执行,仅查看
bash  -n xxx.sh 

追踪
bash  -x 
强制变量经过声明才能使用
shopt  -s -o  nounset 

一般执行bash xxx.sh 会在当前的父sell 下新开一个子shell(#!/bin/bash)
在当前shell 环境下执行,不重新开启子shell, 会影响当前shell的环境

.   xxxx.sh
source xxx.sh

echo $SHLVL  查看处于的shell层次

ps  -axf 内存中进程的层级关系



HIS="history"
evel  "$HIS > $USER.log"  #读取参数结合形成一个新的命令并执行
basename   路径的文件名
dirname    目录名

tee  
diff

script 记录命令的执行过程



here  document


支持变量替换:转向前替换变量
命令  << EOF
djkkd

dkga

EOF



关闭变量替换:按照原本样式输出

cat << 'HERE'
sd
date
HERE


多行批注
: << DO-NOTTHING
DKDSS
jfdjga
DO-NOTTHING