linux-shell脚本基础-2
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 函数名
位置变量
退出码
bash自定义退出状态码
exit [n]:自定义退出状态码
注意:脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字
注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码
算术运算
只支持整数运算
let
expr
ab=expr $a + $b
$[ ]
$(( ))
bc支持小数
echo "5*7 .3" | bc
条件测试
条件测试
真 返回0
假 返回1
逻辑运算
与 -a &&
或 -o ||
非 !
a 使用 []
[ -a ]
&& 使用 [[ ]]
[[ && ]]
[ ] && [ ]
测试命令
test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]
1,使用-n -z 判断 变量是否为空
[ ] 需要在变量外侧加" " [[ ]] 不必
注意:EXPRESSION前后必须有空白字符
命令组合
( command;command ) 开启子shell
{ command ; command ; } 本shell下执行
bash的数值测试
-v VAR
变量VAR是否设置
数值测试
-gt 是否大于-ge 是否大于等于-eq 是否等于-ne 是否不等于-lt 是否小于-le 是否小于等于
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的值返回
数学运算
!/bin/bash
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‘\n’; 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
linux-shell脚本基础-2的更多相关文章
- 详细介绍Linux shell脚本基础学习
Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Lin ...
- Linux shell脚本基础学习详细介绍(完整版)二
详细介绍Linux shell脚本基础学习(五) Linux shell脚本基础前面我们在介绍Linux shell脚本的控制流程时,还有一部分内容没讲就是有关here document的内容这里继续 ...
- Linux shell脚本基础学习详细介绍(完整版)一
Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Lin ...
- Linux shell脚本基础
程序的组成: 程序:算法+数据结构 数据:程序处理的目标 数据结构:相互之间存在一种或多种特定关系的数据元素的集合 算法:处理数据的方式 编程风格: 面向对象:把所有的操作都转化为对象的方式. 面向过 ...
- Linux shell脚本 基础
一.shell中三个引号的用法 1.单引号:所见即所得 例如:var=123 var2='${var}123' echo var2 var2结果为${var}123 2.双引号:输出引号中的内容,若存 ...
- 阿里Linux Shell脚本面试25个经典问答
转载: 阿里Linux Shell脚本面试25个经典问答 Q:1 Shell脚本是什么.它是必需的吗? 答:一个Shell脚本是一个文本文件,包含一个或多个命令.作为系统管理员,我们经常需要使用多个命 ...
- Linux shell入门基础(六)
六.Shell脚本编程详解 将上述五部分的内容,串联起来,增加对Shell的了解 01.shell脚本 shell: # #perl #python #php #jsp 不同的脚本执行不同的文本,执行 ...
- 老李分享:《Linux Shell脚本攻略》 要点(一)
老李分享:<Linux Shell脚本攻略> 要点(一) 第一章:Shell起步基础 1.变量:在bash中,每一个变量的值都是字符串.无论你给变量赋值时,有没有使用引号,值都会以字符 ...
- linux ——shell 脚本
linux—shell 脚本 精简基础 2018/10/30 13 ...
- linux shell脚本相关知识
最近的项目中,有一个编写linux shell脚本的任务.由于之前不是很熟悉,在这个过程中遇到了很多困难,查找了很多资料,也收获了很多.下面是linux shell脚本中常用的知识总结. 1基础语法 ...
随机推荐
- windows OS安全配置【持续更新20190618】
https://www.52stu.org/?p=76 来源:5号暗区 5号黯区 五号黯区 5号暗区 windows系统的一些加固方法等 关闭445端口: REG ADD HKLM\SYSTEM\Cu ...
- Synchronized底层优化(轻量级锁、偏向锁)(二)
一.重量级锁 上篇文章中向大家介绍了Synchronized的用法及其实现的原理.现在我们应该知道,Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的.但是监视器锁本质 ...
- bi的tableau
参考: 官网: https://help.tableau.com/current/server-linux/zh-cn/get_started_server.htm 可视化分析最佳做法: 实用指南 h ...
- Object的create、assign、getPrototypeOf与拷贝
Object的create.assign.getPrototypeOf与拷贝:https://www.cnblogs.com/ninalei/p/8655567.html
- ELK的搭建以及使用
一.架构如图: 二.工作机制: 在需要收集日志的应用上安装filebeat(需要修改配置文件,配置文件稍后介绍),启动filebeat后,会收集该应用的日志推送给redis,然后logstash从re ...
- C#获取局域网主机
C#获取局域网主机 最近在做一个使用MSRDPClient来实现远程桌面功能,需要先判断一下该局域网主机是否在线,所以就需要获取一遍局域网主机. 首先获取本地IP地址,这里需要注意的是,要排除掉虚拟机 ...
- 运维ipvsadm配置负载均衡2
一.什么是lvs1.lvs的定义LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统.是由章文嵩博士开发的一款开源软件,1998年5月发布,是中 ...
- css 超出部分显示省略号 汇总
单行: 加宽度 overflow: hidden; text-overflow:ellipsis; white-space: nowrap; 多行: display: -webkit-box; -we ...
- 什么是RESTful API、WSGI、pecan
RESTful API REST的全称是Representational State Transfer(表征状态转移), 是Roy Fielding在他的博士论文Architectural Style ...
- JVM常用虚拟机命令汇总
title: JVM常用虚拟机命令汇总 comments: false date: 2019-07-22 11:45:33 description: 总结一下常用的JVM虚拟机启动命令. catego ...