HCIA初级部分1、vm中openeuler容易上不了网使用以下方法nmcli dev con ens33nmcli con up ens33systemctl restart NetworkManager2、图形界面相关配置安装ukui桌面系统(系统ISO没有带,必须通过openEuler的yum源安装)yum install ukui -y装完后下次启动用图形启动systemctl set-default graphical.targetElure只支持三个图形界面统信的dde,只要安装了dde默认就安装gnome桌面、麒麟ukui安装ukui后,切换图形登陆,只有普通账号,没有root账号的解决方法:vim /etc/lightdm/lightdm.conf打开注释greeter-show-manual-login=trueallow-user-switching=trueallow-guest=truesystemctl restart lightdm重启服务后登陆选择login图标登陆输入root和密码就行了3、首次重要包安装装自动补全软件包yum install bash-completion查一个命令来自哪个包yum provides dateyum install ntfs-3g装完后就能识别到U盘了/etc/default/grub改启动菜单grub2-mkconfig -o /boot/grub2/brub.cfg改完让其生效虚拟机和真机互传文件dnf install lrzszrz就会弹出真机目录4、解锁root(安装时禁用了root用户)sudo passwd root 设备密码就可以解锁了openEuler只有管理员组的普通用户才能用su切到root用户,其它普通用户不能切root,只能用ssh以root用户连接过去,在一个就是sudo方法5、语言设置设备临时语言为中文,退出当前shell失效echo $LANGLANG=zh_CN.UTF-8帮助也可以看中文的了语言永久中文生效vi /etc/locale.confLANG="zh_CN.UTF-8"6、改时间和格式化输出date -s "2024-10-10 10:10:10"date "+%Y-%m-%d %H:%M:%S"7、6个终端控制台f1-f6,f1是登陆界面,f2是图形化界面,f3-f6是文本界面控制台切换ctrl+alt+F1-F68、windows10 远程登陆服务器C:\Users\Administrator>ssh admin@192.168.168.1309、用户及相当权限配置用户信息都保存在/etc/passwd文件用户密码都保存在/etc/shadow文件用户组都保存在/etc/group文件把/etc/passwd中的第二位密码位删除就能免密登陆root修改密码不受密码复杂度影响,可以设的非常简单,而普通用户会受复杂度限制/etc/shadow中把密码那行内容删除掉,就会锁定该用户啦用户管理(根据uid确认用户身份)超级管理员root,uid永远为0系统用户(为系统服务应用,加入了管理员组),uid 为1-999普通用户(为业务创建的),uid为1000-60000root用户临时指定passwd文件中不具有登陆权限的用户/sbin/nologinsu -s /bin/bash 临时指定该用户登陆useradd使用-g 私有组-G 附加组-d 家目录-s 指定用户登陆shell程序能否登陆userdel -r 删除用户相关文件-f 强制删除正在登陆使用的用户chage root查看root用户创建时间gpasswd -A设备管理员组-d删除组用户-a添加单个用户到组-M批量添加多个用户到组-l查看组用户如果用户删除了,对应文件的用户所有者或所属组会变成该删除用户的UID改文件或文件夹权限尽量用chmod +rwx因为这个不会覆盖旧权限chown仅root用户可以执行删除文件看该文件所在的文件夹的权限,但修改要看该文件的本身权限openEuler中的普通用户和root用户创建的umask都是022,和红帽不一样所以创建的文件和文件夹是用最大权限减去umask的值就是新建立的权限文件最大是权限是666,目录最大是777,所以减去umask得文件是644,文件夹是755如果改的umask值被最大权限666减完有x权限,就会自动加1,因为不能让创建的文件有执行权限suid针对文件,如果有一个文件有suid权限,则执行时按文件所有者权限执行,仅对二进制程序有效,shell脚本不生效,设置方法是chmod u+s 或者chmod 4777,如果再chmod u-s权限就会变成rwS,大写s不能执行,小写s才有权限 sgid针对目录,所属组加s,对组权限有效,一样大写S无权限,小s才有,chmod g+s或chmod 2777,在该目录下创建的文件,自动属于该组sbit针对目录,通常用来做临时目录,如果一个目录有sbit,那么该目录下的只有文件创建所有者才可以自己的文件,其它用户不能改其它用户的文件,如果是小写t有权限,大写T无sbit权限,chmod o+t或chmod 1777 重置密码root启动菜单按e键---linux开头行最尾一直往前删除到ro---ro空格加参数rd.break---ctrl+x启动---不用输密码进入系统---mount -o remount,rw /sysroot(以能写的方式挂载真根)---chroot /sysroot(为了用passwd密码换成真根)----passwd改密码---touch /.autorelabel(解决selinux允许操作)注意在欧拉中如果系统中手动加载过引导菜单grub2-mkconfig -o /boot/grub2/brub.cfg再进入重置密码时按e会要求输入用户名和密码,默认为root/openEuler#12,这个默认密码可以用grub2-set-password命令改grub2的引导菜单密码10、快捷键ctrl+r搜使用过的命令直接用alt+点/!$ 调用最后条命令后面的路径参数home/ctrl+u键快速跳到光标所在行的开头!!重复执行上一条命令!+histry数字执行那条命令!+开头执行那条命令end键快速到光标尾clear/ctrl+L/cls(windows)清屏11、帮助查已安装的命令是哪个位置哪个包,再安装帮助说明后面加-help,再用whatis就有帮助了,最后用--help查看(Euler默认不安装命令帮助,要自己手动安装)which daterpm -qf /usr/bin/dateyum install coreutils-helpwhatis date //看有帮助了吗用man date也可以date --helpman帮助一共有9章,保存在/usr/share/man中,用的最多的是1、5、8章第1章用户指令第2章函数调用第3章是函数库第4章设备文件说明第5章是文件格式和约定第6章是游戏第7章是杂项第8章是系统管理命令第9章是内核例程使用manman -f 命令 查命令作用man 章节 命令 查询指定章节的命令作用man -k 关键字 找关键字在哪个章节安装的软件产品文档及帮助文档和例子都在/usr/share/doc/里面openEuler在线产品文档docs.openeuler.org12、文件夹作用/bin或/usr/bin下是普通用户可以执行的命令/sbin或/usr/sbin是管理员能够执行的命令/boot中开机引导文件及内核文件/dev放的接口文件及设备文件,操作设备用/etc配置文件/lib库文件,通常以.so结尾,类似于windows中的dll文件/mnt 临时挂载目录/opt 额外软件包下载存放位置,或安装到此目录也行/proc系统进程信息/sys系统运行的状态信息,重启后信息清空/home普通用户的家目录/srv存放服务启动之后要运行的数据/tmp临时文件目录,每个用户在该目录下创建文件后,只能管理自己的文件,其它用户的不行/usr里面存放指令,有3个重要目录:/usr/bin和/usr/sbin和/usr/local,/usr/local存自定义安装的软件目录/var存放日志和服务的数据/run应用程序服务进程使用的运行状态文件,进程PID套接字13、常用命令cat /etc/os-release查系统情况hostnamectl也可以看系统情况lsblk查看所有的设备cd ~用户名返回指定用户家目录ls -t根据文件创建的时间排序,最近创建的文件最上面ls -R以目录树形式查看文件mkdir -p级连创建目录stat 查看文件的时间戳(访问时间atime、内容修改时间mtime、属性修改时间ctime、创建时间btime)cp -a复制过去属性不变cp -l创建硬连接mv当源文件和目标文件不在同一路径下就是移动,如果是不同路径就是重命名mv -f强制覆盖不提示cat -A每行出来尾部加$符,用于区分有没有加空格cat -n 输出带行号head只能看前10行tail只看后10行tail -f时间监控日志more/less分屏查看,空格翻页,回车一行行往下看less斜杠是从上往下搜,?号是从下住上搜grep -o只显示过滤的内容grep -v反选grep -i不区分大小写grep -v '^#' filename | grep -v '^$' 过滤掉空行和注释行grep -C 2 "error" /var/log/httpd/error_log 查看error行的前后2行grep -c 关键字的总行数grep -r 找关键字在该目录下的哪个文件中grep '^user'过滤以user开头的内容grep 'user$'过滤以user结尾的内容grep stud.t 一个点代表任意一位,想不来起中间的内容过滤用grep 'stud*' 星号代表一位或多位匹配grep -w 以完整的精确单词过滤,非包含grep -E或egrep为扩展grepegrep 'failed|wan|error' 对多个关键字匹配wc -l统计行数wc -w统计单词数sort 排序或去重复 sort -n按数字排序sort -t指定分隔符sort -k指定列sort -r倒序排sort -o重定向保存到指定文件中sort -u去不连续的重复uniq只能去除连续的重复uniq -c统计重复的行有多少diff a是新增的行 c不同的行 d删除的行vimdiff可视化比较两个文件的差异(要先安装vim软件才行)tr字符转换tr a-z A-Z把输出转成大写tr 1-3 a-c 把数字转字母tr -d 删除指定的字母或空格cut提取列cut -d指定分隔符、-f指定列cut -c 1-2取前两个字符awk -F 默认以空格为分割(有空格的一般不用cut都用awk)awk -F ':' '{print $1, $3}'第一和第三列sed流编辑器,先加到缓冲区,在缓冲区里操作 -i代表写入文件sed -n '13p' 地址定界和动作,13行打印出来,-n其它不输出sed -n '/ftp/,/root/p' ftp和root那2行打印出来sed -n '$p' 最后一行sed '1a\hello' 第一行后面加一行hellosed '/ftp/d' 删除ftp行sed '1d' 删除第一行sed '1 s/root/huawei/2' 把第一行的第2个root换成huaweised '1 s/root/huawei/g' 把第一行的所有的root换成huawei sed '1! s/root/huawei/g' 把除了第一行外的所有的root换成huawei sed 's/root/huawei/g' 把所有的root换成huawei sed 's/root//g' 把所有的root换成空sed -i.bak 's/root/huawei/g' 把所有的root换成huawei之前备份一个原文件14、vim操作i光标左插入,a在光标右插入,o在光标下方另起一行插入I在行首插入,A在行尾插入,O向上另起一行插入gg跳到开头行,G跳到最后一行,数字+G跳到指定行home键/^/0都可以跳到行首,$/end都能跳到行尾x删除一个字符yy复制当前光标行ny复制多行,n代表数字dd删除光标行ndd 删除光标和指定的多行u撤销上一次操作ctrl+r将撤销的操作再撤销set number设置行号set nonumber取消行号1,3 copy 5把1-3行复制到第5行1,3 move 5把1-3行移动到第5行 /搜索从上往下,?从下往上搜索,n往下搜已搜到的结果,N往上搜已搜到的结果/\croot 查root不区分大小写1 s/root/huawei/ 第一行第一个的root替换成huawei%s/root/huawei/g 所有的root替换成huawei%s/root/huawei/ig 所有的root替换成huawei,并且忽略大小写%s/root/huawei/igc 所有的root替换成huawei,并且忽略大小写,c表示要确认后才替换ctrl+v再安I选中第一列输入#号,再按esc所有选择的行就给注释了15、重定向>正确输出2>错误输出&>全部输出重定向/dev/null 一般都重定向到黑洞cat >>/opt/text.txt << eof 双重定向(eof可以随便自定义),后面的eof把内容给cat,cat再输入到text.txt例如让shell脚本写文件#!/bin/bashcat >>/opt/text.txt << eof hello world!eof执行脚本就会自动把hello world写入到text.txt中并生成一个文件重定向改密码免交互第一种改密码方法passwd user1 < passwd.txt 提前把两行密码写到passwd.txt中passwd.txt不能放在家目录下,selinux会阻止免交互改密码第二种方法echo admin | passwd --stdin user1 三通重定向tee 16、访问控制列表acl(ls查看到文件尾部有+号代表设备了acl)setfacl设置acl,etfacl -b test.txt删除所有的aclgetfacl查看aclchacl改acl17、visudosudo -V查看sudo版本sudo -i可以转到root用户,切一次默认五分钟内再次切不用输入密码sudo -k 不用等五分钟,下次提权时立马要求输入密码配置文件2个/etc/sudoers/etc/sudoers.d/*vim /etc/sudoerszhangsan example.com=(root) NOPASSWD:/usr/bin/touch,/usr/sbin/juseraddzhangsan用户对example.com主机提权到root一样的权限,执行touch命令和useradd命令,并且不用输入密码%wheel ALL=(ALL) ALL对一个组进行提权如果多个用户多个命令提权,可以用别名的方法(注意要区分大小写)vim /etc/sudoersUser_Alias ADMINS = zhangsan, lisiHost_Alias TESTHOST = example1.com, exapmle2.comRunas_Alias SUDOUSER = root, bob aliceCmnd_Alias COMMAND = /usr/bin/touch, /usr/bin/useraddADMINS TESTHOST=(SUDOUSER) NOPASSWD:COMMAND也可以在/etc/sudoers.d/*单独创建文件进行设置(可以一个用户创建一个文件)vim /etc/sudoers.d/zhangsanzhangsan example.com=(root) NOPASSWD:/usr/bin/touch,/usr/sbin/juseradd查看配置语法有无错误visudo -cf /etc/sudoers查看一个用户提取了哪些权限当前用户下执行sudo -l18、软件包管理rpmfind.net可以查各种要下载的rpm包openEuler只能通过iso系统自带的包rpm -ivh 完整包名,安装rpm -q 查包是否安装rpm -evh 卸载(如果配置文件改过,会保留该文件,要手动删除,注意看提示)rpm -Uvh升级,不管有没有旧版本都可以rpm -Fvh必须在旧版的上面升级rpm -ql查所有安装位置rpm -qc 查配置文件安装位置rpm -qd查帮助文件rpm -qa查本机上所有的软件包rpm -qpi查已安装的具体包信息rpm -qp --scripts 查要安装的包具体执行啥脚本rpm -qf vsftpd.con 查该配置文件来自哪个包rpm2cpio vsftp | cpio -id 解压rpm包如果配置文件改乱了没有备份就需要把该配置文件删除掉再安装一次,或者解压把原配置文件拿过来rpm -ivh --replacepkgs vsftpd 重新安装yum和dnf命令其实都是依赖最新的dnf3,dnf兼容yumyum软件仓库有2种配置方法/etc/dnf/dnf.conf/etc/yum.repos.d/*导入公钥rpm --import /mnt/RPM-GPG-KEY-openEuler查公钥是否安装rpm -qa|grep pubkeyrpm -K vsftpd 验证包有没有篡改rpm -e pubkey-XXX 删除公钥公钥保存位置ls -l /etc/pki/rpm-gpg/取消安装软件公钥认证,把开户1改成0 vim /etc/yum.confyum仓库生效dnf clean alldnf makecacheyum 仓库软件就是rpm包yum源的文件路径其实是找repodata,而不是具体放包的路径文件夹yum install epel-release安装epel源dnf remove 卸载dnf reinstall 重新安装dnf update 如果后面不更包名就是升级所有dnf groupinstall 组包安装dnf group info查组包信息dnf group list查看仓库有哪些组包源码包安装dnf install make gcc gcc-c++ 这三个编辑工具包必装./configure --help查看安装帮助./configure --prefix=/usr/local/ngingxmake -j4 用4个cpu编译make install19、建立本地yum仓库,解决本地服务器不能上公网也不能装光驱iso的情况下(注意仓库系统和服务器系统要一致,不然可能因版本不一致导致安装失败)dnf install --downloadonly --downloaddir ./pkgs/ httpd把httpd软件下载到本地的pkgs文件中做本地httpd的yum仓库生成repodnf install createrepo 先装这个工具createrepo /opt/pkgs/ 就会自动生成repodata文件,这里面放的就是包与包的索引关系vim /etc/yum.repo.d/my.repo[openEuler]name=Euler pkgsbaseurl=file:///opt/pkgsenabled=1gpgcheck=1gpgkey=file:///RPM-GPG-KEY-openEulerdnf clean alldnf makecache20、系统守护进程systemdsystemctl list-unit-filessystemctl status httpd.servicesystemctl enable httpd.servicesystemctl reload httpd.servicesystemctl restart httpd.servicesystemctl reload-or-restart httpd.service先不停止服务加载更改的文件,不行再重启,防止掉线systemctl stop httpd.servicesystemctl disable httpd.servicesystemctl is-active httpd.service 查是否开机启动systemctl enable --now httpd.service 开启服务并开机启动systemctl disable --now httpd.service 关掉服务并关掉开机启动21、swap把内存中不活跃的数据放到swap中创建swapfdisk /dev/sdb按t转为82为swap分区类型mkswap /dev/sdb1格式化swapon /dev/sdb1挂载swap给系统swapoff /dev/sdb1卸载swapon -s查看具体的swap信息用一个文件做swapdd if=/dev/zero of=swap.img bs=100M count=10mkswap /tmp/swap.imgfdisk -l查看硬盘情况GPT所有的分区都是主分区,有分区表的备份能力fdisk默认分的是mbr硬盘格式,目前fdisk工具已支持大硬盘GPT格式,按g可以硬盘转成gpt格式,转gpt立即生效不用按wpartprobe刚分完区如果lsblk不显示,就要刷新硬盘分区mkfs.xfs /dev/sdb1格式化为xfs格式mount挂载 mount -o 类型 mount -o noexec /dev/sdb1 /mnt/ 保护挂载后目录的安全不让里面的文件执行脚本blkid查看文件系统挂载的uuid和类型mount UUID=“XXXX” /mnt/用uuid挂载 开机挂载vim /etc/fstab/dev/sdb1 /mnt ext4 defaults 0 00 0 可以不用写测试fstab文件有没有问题,有问题就开不了机umount /dev/sdb1 mount -aswapon -a如果fstab文件中有挂载有问题就开不了机自动进紧急模式22、LVM逻辑卷物理硬盘---物理卷PV---卷组vg---逻辑卷LV逻辑卷中的最小寻址单元为LE,卷组中有PE最小存储单元,LE和PE对应物理硬盘fdisk时,打上逻辑卷的标签可以直观看出类型为lvm,用t转换成8e类型pvcreate /dev/sdb1 /dev/sdb2 /dev/sdb3 创建PVpvscan/pvdisplay查看vgcreate vg1 /dev/sdb1 /dev/sdb2 vgscan/vgdisplay查看lvcreate -n LV1 -L 4G vg1mkfs.xfs /dev/vg1/LV1lvscan/lvdisplay查看mount /dev/vg1/LV1 /mnt 挂载lvremove /dev/vg1/LV1 删逻辑卷挂载点扩容看vgs还有多少,如果不满足先扩容卷组vgextend vg1 /dev/sdb3lvextend /dev/vg1/LV1 -L 8G第一种扩容方法lvresize -L +1G /dev/vg1/lv1第二种扩容方法xfs_growfs /mnt/ xfs扩容后可以在原来基础上格式化,数据不会丢,但是xfs不支持缩容resize2fs /dev/vg1/LV1 其它格式扩容后要这样格式化文件系统e2fsck -f /dev/vg1/lv1 磁盘错误修复删除逻辑卷先卸载文件系统umount /mnt删除逻辑卷lvremove /dev/vg1/lv1删除卷组vgremove vg1删除物理卷pvremove /dev/sdb1 /dev/sdb223、计划任务at一次性计划任务,要yum install at安装先,atd还要开服务,at计划任务只能精确到分钟级cron周期性计划任务at 9:00ctrl+D结束交互设置at -l 查看at 黑白名单控制哪些用户可以用at,只有在白名单的才能用at /etc/at.deny/etc/at.allow周期性计划任务crontab真正执行是crond服务,crontab是crond的管理工具vim /etc/crontab/下面也行vim /var/spool/cron/默认位置配置文件/etc/cron.d/下面也行/etc/cron.daily/下面也行/etc/cron.hourly/下面也行/etc/cron.monthly/下面也行/etc/cron.weekly/下面也行crontrab -e 看不到计划任务不代表里面没有,要查所有的计划任务配置文件,防止木马五个* * * * *就是每分钟执行cat /etc/crontab查看帮助/etc/cron.allow白名单,普通用户只能有白名单有的才可以用计划任务crontab -e编辑计划任务(里面写绝对路径命令,里面特殊符号要加反斜杠转意)crontab -l查看当前用户计划任务crontab -l -u bob 查看bob用户计划任务crontab -r删除计划任务crontab -u设哪个用户的cron服务tail -f /var/log/cron看日志查看执行情况24、网络服务nmcli con show ens33 看IP等详细ip route show 看网关route -n也可以网络类型en以太网wl无线网卡ww无线广域网接口类型o板载网卡s热插拨网卡p pcie网卡真机的物理网卡名称就是网络类型+接口类型组成ifconfig ens33 down/up 禁用或激活ip link set ens33 down/up 禁用或激活nmcli device status 查看所有网卡设备情况正确命令修改网卡配置文件后nmcli connection up ens33nmcli connection reloadnmtui图形化配置网卡和主机名网卡配置文件不在新增nmcli connection add type ethernet ifname ens33 con-name ens37 ipv4.method manual ipv4.address 172.16.100.1/24 ipv4.gateway 172.16.100.254 ipv4.dns 8.8.8.8 autoconnect yes网卡配置文件在修改(不写+号就是改)nmcli connection modify ens33 +ipv4.address 172.16.100.2/24 多加一个ip地址nmcli connection up ens33删除一个IP地址nmcli connection modify ens33 -ipv4.address 172.16.100.2/24 多加一个ip地址nmcli connection up ens33只改dnsnmcli connection modify ens33 ipv4.dns 8.8.8.8nmcli connection up ens33只改网关nmcli connection modify ens33 ipv4.gateway 192.168.1.254nmcli connection up ens33删除网卡配置文件(如果有多个相同的ens33就以uuid删除)nmcli connection delete ens33nmcli connection delete uuidxxx新建一个网卡配置文件nmcli connection add type ethernet ifname ens33 con-name ens33nmcli connection up ens33nmcli connection show配置默认路由ip route add default via 192.168.1.254 dev ens33 临时配置默认路由ip route add 192.168.2.0/24 via 192.168.1.254 dev ens33 临时配置目标网络加路由nmcli connection modify ens33 +ipv4.routes "172.16.0.0/24 172.16.100.1" 永久配置目标网络加路由另一种配置方法nmcli connection modify ens33 +ipv4.routes "0.0.0.0/0 172.16.100.1" 永久配置默认路由另一种配置方法nmcli方法会在/etc/sysconfig/network-scripts/下自动增加配置文件route-ens33改主机名hostname test 临时有效配置主机名hostnamectl set-hostname 永久改用户名方法/etc/hostname永久改用户名会自动写入该文件中查看系统服务和端口cat /etc/services 查服务对应端口netstat -ntulp查看系统运行的端口ss -tanup也可以查看系统运行的端口25、进程管理systemd是所有的系统进程的父进程pid为1top运行中按1看有多少核top运行中按P可以看cpu使用排序top运行中按M可以看内存使用排序 top运行中按c可以看进程执行了哪个文件top运行中按k自动输入当前页第一行,按回车可以看杀死进程僵尸进程要手动杀,孤儿进程不用管会被systemd自动杀死.sock结尾的文件为套接字,可以把应用服务和进程间通讯kill不是杀死进程是给进程发送信号kill -l查看所有信号类型9是强制结束,1是重新读取配置killall通过名称结束一类进程pkill -9 -t pts/2 结束一个终端进程进程的优先级(top下能看)PRI的是动态优先级(内核自动调整)NI是静态优先级(可以由用户或管理员调整)NI取值范围是-19-20,值越小优先级越高nice 10 vim 调用优先级方法renice -n 12 PID 根据PID修改优先级前后台执行程序执行命令后面加上&符表示后台执行jobs查看后台执行程序fg %1把后台1的程序调到前台执行ctrl+z把前台任务放后台并暂停bg %1将任务在后台继续运行kill -9 %1 结束后台程序26、shell脚本变量2种类型:本地变量(本shell下生效)、环境变量(其它shell也能生效)set查看本地变量unset取消变量env查看环境变量本地变理定义方法a=1echo ${a} 精确方法echo $a 输入变量值环境变理定义方法export a=1$?看上一次 命令返回结果是1还是0,0代表成功curl -s -I baidu.com 看状态码/bin/true该命令执行结果永远为0,写while死循环用的if 判断(不知结果判断)#!/bin/bashif ping -c1 -w 1 baidu.com &>/dev/nullthen echo "baiduok"elif ping -c1 -w 1 163.com &>/dev/nullthen echo '163ok'else echo 'no'ficase使用(已知的结果用case)#!/bin/bashuser=$(cut -d : -f1 /etc/passwd|grep bob)case user in bob) echo 'hello bob' ;; tom) echo 'hello tom' ;; *) echo no user ;;esacfor循环(创建三个用户)#!/bin/bashfor user in {1..3}do useradd user#user echo user$user create successdonefor循环输出命令结果 #!/bin/bashfor i in $(ls)do echo $idonewhile循环(基于条件循环)#!/bin/bashread -p "input username: " get_userwhile id $get_user &>/dev/nulldo echo $get_user Error read -p "input username: " get_userdone useradd $get_user echo $get_user useradd success!监控网站3秒一次,写个死循环#!/bin/bashwhile /bin/truedo curl -s -I baidu.com|grep HTTP|awk '{print $2,$3}' >>/website.log if grep -q 404 website.log then echo webstie Error exit 100 fi sleep 3doneuntil循环(条件成立才退出循环,和whille相反)#!/bin/bashuntil ping -c 1 -w 1 172.16.0.1 &>/dev/nulldo echo down sleep 3done echo upshell执行和排错bash -x 脚本模拟运行系统加固内核参数加固sysctl -a 查看所有生效的内核参数vim /etc/sysctl.conf里面修改内核参数永久生效HCIP中级部分一、http服务常规原理https连接服务器用的是非对称密钥,数据安全使用对称加密trace查看真实访问者的IP地址,查看原始请求IP,不会看代理IP状态码200 OK301 和302跳转302响应报文location指明资源临时新位置304 从本地缓存读401需要账号密码认证才可以访问403 没授权(禁止 访问)404 资源被删除500 服务器配置问题web模型4个1、单进程IO模型,一个进行一个http请求,不适合高并发2、多进程IO模型,一个进行一个http请求,可以启多个进程3、复用IO模型,单个进程进行复用,一个进程使用多个线程,一个线程处理一个http请求4、复用多进程IO模型,通过事件机制保证高并发的长连接(linux内核特性epool)apache工作模型 1、perfork多进程IO 模型,不支持高并发,最大每秒支持32个进程,比较安全只会用apache用户进程2、worker多线程IO模型,不适合长连接多并发场景3、event异步IO事件模型(复用模型),默认是这种,监听接收线程和工作线程分开工作,需要2.6内核以上才支持(默认php不支持这个模型,支持perfork模型)。调以上工作模型:/etc/httpd/conf.modules.d/00-mpm.conf把对应的那行注销隐藏或开启重启服务就行了测试服务器压力 ab -n 10 -c 10 http://192.168.168.135/index.htmlhttpd -V查看模型用的哪一种二、配置文件解释apache配置文件/etc/httpd下conf主配置文件目录conf/httpd.conf主配置文件conf.d目录是扩展配置目录,配置多虚拟主机用的conf.moudles.d功能模块配置目录,放的启动模块配置文件logs软链接到/var/log/httpd/下日志文件modules链接到/usr/lib64/httpd/modules功能模拟库位置run链接到/run/httpd 是apache运行进程状态文件state链接到/var/lib/httpd 有错误时间记录,一般为空三、Apache全局配置文件详解 cat /etc/httpd/conf/httpd.conf httpd -t 测试配置文件语法有没有错误grep -vE '#|^$' /etc/httpd/conf/httpd.conf过滤掉空行和注释行ServerRoot "/etc/httpd" apache服务配置的根目录Listen 80 apache监听的默认端口,可以监听多个端口,写多个ListenListen 172.16.0.131:80apache可以监听在指定的接口或者是IP上(openEuler有些端口不用关selint也可以访问)改监听端口显示是ipv6:80问题,是内核自动转的,其实是监听ipv4,如果要改就在sysctl下改,把net.ipv6.binv6only=0改成1就会显示ipv4了或者直接在配置文件中Listern 1.1.1.1:80这样指定地址+接口再看就可以是ipv4 了Include conf.modules.d/*.conf 加载apache的核心模块以及第三方模块(扩展模块)User apache 工作进程绑定的用户名 可以指定普通用户来运行该进程,但指定的用户要有/var/www/html文件读取有权限Group apache 工作进程绑定的用户组ServerAdmin root@localhost 管理员邮箱 该邮箱在服务器出错时显 500以上的错误,可以改掉它<Directory /> 配置禁止访问 / 根目录 (目录的访问控制) AllowOverride none 开启的访问参数 Require all denied 禁止所有的访问</Directory>DocumentRoot "/var/www/html" 网站的发布目录 也就是网页文件存放的位置,如果配置指定的目录,访问被禁止,则需要允许该目录被访问,但需要下面的选项配合允许才可以<Directory "/var/www">AllowOverride NoneRequire all granted</Directory><IfModule dir_module> 目录下默认的首页文件 DirectoryIndex index.html index.php index.jsp 也就是访问一个目录时默认读取目录下的 index.html </IfModule><Files ".ht*"> 文件的访问控制 Require all denied 禁止 访问网站目录下以.ht开头的隐藏文件</Files>在/var/www/html下加个.htaccess文件后,网站访问要认证功能vim .htaccessAuthType BasicAuthName testAutheUserFile /opt/pass1Require user zhangsanErrorLog "logs/error_log" apache的错误日志存放的位置LogLevel warn 警告 debug 更加详细的日志<IfModule log_config_module> 定义日志的格式 LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common<IfModule logio_module> LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio </IfModule> CustomLog "logs/access_log" combined</IfModule><IfModule alias_module> 定义的别名目录 ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"</IfModule><IfModule mime_module> 定义了apache支持的文件类型 TypesConfig /etc/mime.types //查看该文件中支持的类型 AddType application/x-compress .Z AddType application/x-gzip .gz .tgz AddType text/html .shtml AddOutputFilter INCLUDES .shtml</IfModule>vim /etc/mime.types中文件类型说明MIME 会将资源打上特定的tag 也就是告诉浏览器这是什么类型的资源AddDefaultCharset UTF-8 网站默认字符集 字符处理的方式UTF-8 通用的国标码 gb2312 支持中文 可以在vim 中使用:set fileencoding=gb2312 修改文本的编码方式 当网站程序(网页文件)和服务器支持的编码方式不一致时 则出现乱码<IfModule mime_magic_module> MIMEMagicFile conf/magic 扩展的mime的类型 ,支持二进制文件,或者是一些应用的程序的文件类型</IfModule> IncludeOptional conf.d/*.conf 默认加载虚拟主机的配置文件 就是一个一个网站,通常每一个配置文件就是一个网站 /usr/lib64/httpd/modules/ Apache的动态功能模块 ,支持库文件以点.so 结尾httpd -M 查看apache加载的模块 ,取消模块加载,则需要在 conf.modules.d 中给相应的模块进行注释,即可取消加载apache高级配置长连接等配置位置vim /usr/share/doc/httpd/httpd-default.conf可以在主配置文件中关闭vim /etc/httpd/conf/httpd.confKeepAlive On1. apache的长连接 响应标头里面看到keep-alive,就是开了长连接方式.从http1.1开始引入是为了让下一次的socket通信复用之前创建的连接,从而,减少连接的创建和销毁的系统开销。保持连接,会让某个进程或者线程一直处于等待状态,即使没有数据过来apache 默认开启长连接 KeepAlive On|Off 开启或者关闭长连接 apache和nginx是默认开启的KeepAliveTimeout 5 超时时间,当服务器完成一次httpd请求后下一次请求超时的时间(也就是第一次连接后等待5秒,5秒内没有新的请求则关闭连接)MaxKeepAliveRequests 100 每一个连接默认处理100个请求在实际的生产中可以根据ab的压测结果来进行配置,推荐的值的是 KeepAliveTimeout 10 -15 MaxKeepAliveRequests 200 2. 配置资源的访问策略2.1 静态资源的配置指的是配置文件和目录的访问策略不要放在根目录,默认根目录不生效,因为conf.d/welcome.conf文件配置给限制了目录访问策略<directory “目录的路径”> 目录策略配置 </directory> 文件访问策略<files “文件的路径”> 文件的策略配置</files>目录和文件的中的具体配置项https://httpd.apache.org/docs/2.4/mod/core.html#options这个里面可以看具体哪一项是什么控制 Options: 配置目录的选项 索引、链接等选项: options Indexes FollowSymLinksIndexes: 如果在目录中找不到默认的首页则索引当前目录FollowSymLinks: 允许apache使用软链接Options All 启用所有的配置选项Options None 禁用所有的配置选项AllowOverride: 配置目录中的.htaccess访问文件是否生效选项: All 该文件中的所有指令都生效None 该文件中的所有指定都不生效(默认为该项)Authconfig 默认配置生效,其他指令都无效3、访问控制:也是在这个项里写<Directory "/data/euler">基于客户端IP地址的访问控制 Require all granted 允许所有人进行访问Require all denied 禁止所有人进行访问Require not ip 192.168.1.1 例外 not ip 和 granted 进行连用 表示黑名单</Directory><Directory "/data/euler"><RequireAll> 表示Require中所有的指令同时生效Require all granted 允许所有人访问Require not ip 192.168.1.1 将该IP排除在外</RequireALL></Directory></RequireAll>RequireAll: 在该段落内的require指令需要全部满足,也就是逻辑与的关系RequireAny: 在该段落内的require指令只需要满足其中任意一个即可使用技巧: 如果require的指令彼此之前是互相冲突的,使用All,如果彼此之前互相不影响,则使用AnyRequire ip 192.168.1.1 白名单时 不需要 先拒绝可以直接配置(因为apache默认的策略是拒绝的)Require host example.com 允许特定的主机进行访问(所指定的主机名是服务器端可以正常解析到地址的,才能够生效)4、基于用户认证的访问控制:在认证的目录路径中进行添加<Directory "/data/euler"> AuthType Basic AuthName openEuler AuthUserFile /opt/pass1 require user zhangsan</Directory>AuthType Basic 基础认证AuthName 认证提示的信息AuthUserFile 认证的用户和密码存储的文件 htpasswd -c /opt/pass1 zhangsan 生成文件require user zhangsan 可以认证的用户 基于密文的认证方式: 摘要认证AuthType DigestAuthName 认证提示的信息(在摘要认证中被称为域)AuthUserFile 认证的用户和密码存储的文件htdigest -c /opt/pass2 openEuler lisi 生成摘要文件require user zhangsan 可以认证的用户四、Apache的数据压缩:在服务器端将较大的资源文件发送到客户端时对内容进行压缩后传输主配置文件中httpd.confSetOutputFilter DEFLATE 开启压缩,默认开启html css js这三类文件一般都是要压缩的开启压缩是启用压缩传输的最基础的要求压缩传输的过程: 客户端浏览器发送请求是在请求头中加上Accept-Encoding告诉服务器端自己所支持的解压的方式默认使用的gzip,服务器端根据浏览器的请求头信息进行压缩后,通过Content-Encoding来告诉浏览器数据压缩的方式,浏览器根据指定的方式进行解压AddOutputFilterByType DEFLATE text/plain 指定要压缩的文件类型AddOutputFilterByType DEFLATE application/zip zip压缩文件AddOutputFilterByType DEFLATE application/octet-stream 二进制流文件AddOutputFilterByType DEFLATE text/html html网页文件AddOutputFilterByType DEFLATE text/css css 样式表文件AddOutputFilterByType DEFLATE application/javascript js类型文件AddOutputFilterByType DEFLATE application/mp4 压缩MP4 DeflateCompressionLevel 9 压缩的级别 0 - 9 数字越大压缩效果越好什么样的场景下要禁止数据压缩:1. 早期的浏览器的兼容问题,不支持压缩选项,需要忽略特定的浏览器的版本2. 服务器的特别大的文件进行压缩,会消耗大量的CPU和内存,例如ISO、大型的视频文件、数据文件… 禁止压缩的两个方式:禁止特定的浏览器进行压缩edge chrome 现代化浏览器中在用户访问资源时使用用户代理来防止部分网站对浏览器的限制 BrowserMatch ^Mozilla/4\.0[678] no-gzip 限制火狐4.06 4.07 4.08 进行压缩 禁止特定的资源后缀进行压缩SetEnvIfNoCase Request_URI \.(mp4|mov|avi)$ no-gzip.iso .mp4 Apache的日志配置access_log 服务器的正确日志,所有用户访问的请求都记录在此error_log 服务器的错误日志,所有服务的报错和限制都记录在此五、日志的格式: 172.16.0.1 - - [03/Mar/2024:15:27:44 +0800] "GET /test.mp4 HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.46"定义日志输出格式httpd.conf主配置件中改LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined %h 客户端IP地址 172.16.0.1 %l 远程登录名 (如果是 - 该项没有数据)%u 已认证的用户名 - %t 时间戳 [03/Mar/2024:15:27:44 +0800]%r http请求的方法+url+版本号 GET /test.mp4 http 1.1%>s 响应状态码 304%b 资源的字节数 %{Referer}i 客户端的来路 - %{User-agent}i 用户的浏览器信息(代理信息) combined 日志的名称自定义日志,(文件的路径+日志格式的名称)CustomLog /var/log/data.log httpd_test 六、Apache 配置HTTPS为域名hcie.openeuler.org.cn 配置ssl访问1. 安装apache的ssl的模块yum install mod_ssl -y 看文件生成没有 rpm -ql mod_ssl2.申请证书在 zerossl.com中申请单域名证书 90天有效Let’s Encrypt R3的证书 该证书支持通配符3.配置证书vim /etc/httpd/conf.d/ssl.confSSLCACertificateFile /opt/ssl/ca_bundle.crt 证书链(可以不配置,在浏览器中有自带)SSLCertificateKeyFile /opt/ssl/private.key 服务器的私钥文件SSLCertificateFile /opt/ssl/certificate.crt 服务器的证书(签名后的公钥)SSLEngine on 开启https的引擎Listen 443 https 改配置文件监听的是443 端口4、强制使用https访问,用http也会自动跳转至https访问方法 希望仅开启https的访问,而不要让用户访问http ,配置URL重写规则,将http的访问重定向到https 在 httpd.conf 中也就是80端口的配置文件中进行配置RewriteEngine on 开启重定向规则RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1 [redirect=302] 七、Apache的虚拟主机所谓的虚拟主机就是在一台服务器上实现多个网站的访问,在一台服务器上通过虚拟主机部署多个网站,并且每个网站都是独立的虚拟主机的配置:vim /etc/httpd/conf.d/*.conf 在该目录下所有以点.conf结尾的文件都是虚拟主机apache实现虚拟主机的方式有三种:1. 是基于端口的虚拟主机vim /etc/httpd/conf.d/*.conf <VirtualHost *:81>DocumentRoot /var/www/html/site1</VirtualHost>Listen 81 加上监听端口*号可以具体指定本机哪个IP地址2. 是基于IP的虚拟主机vim /etc/httpd/conf.d/*.conf <VirtualHost 172.16.0.100:80>ServerName site3.example.comDocumentRoot /var/www/html/site3</VirtualHost><VirtualHost 172.16.0.200:80>ServerName site3.example.comDocumentRoot /var/www/html/site4</VirtualHost>3. 是基于名称的虚拟主机所谓的名称指的就是通过域名来进行访问vim /etc/httpd/conf.d/*.conf <VirtualHost *:80>ServerName site3.example.comDocumentRoot /var/www/html/site3</VirtualHost><VirtualHost *:80>ServerName site4.example.comDocumentRoot /var/www/html/site4</VirtualHost>注意:如果在httpd.conf中 已经指定了 Listen 80,没有指定具体的IP端口则所有IP都监听80,则不用配置,如果指定的是192.168.1.1:80 具体IP的80端口则,虚拟主机中需要配置 Listen 172.16.0.100:80 监听具体IP的80端口七、Nginx的安装与配置1、Master主进程,主配置控制 worker工作进程,异步IO模型,支持长连接,也可以接收新的进程stream模块可以实现端口映射LB模拟做负载均衡和反向代理是起的2、安装yum install nginx (不支持热升级) 源码包安装支持热升级nginx -t校验配置文件nginx -v看版本nginx 启动nginx -s stop停止nging -s quit 优雅停止nginx -s load 启动/etc/nginx/nginx.conf 全局配置nginx.conf.default各种应用参考配置文件conf.d/下面放虚拟目录/usr/share/nginx/html/默认网站目录/var/log/nginx日志目录3、Nginx的配置文件详解:/etc/nginx/nginx.conf user nginx; 运行的用户worker_processes auto; 如果是auto则与CPU和核心数成正比,指定工作的进程数error_log /var/log/nginx/error.log; 指定错误的日志pid /run/nginx.pid; master 进程的IDinclude /usr/share/nginx/modules/*.conf; nginx加载的模块配置文件events 指定工作模式 {worker_connections 1024; 指定单个进程的连接数}HTTP模块的配置log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';log_format 日志的格式access_log /var/log/nginx/access.log main; sendfile on; 高效文件传输的(直接从磁盘上读取文件发送给用户,而不是先读到内存再从内存中发送)tcp_nopush on; 立即回应TCP的请求tcp_nodelay on; 对于小数据包直接回应keepalive_timeout 65; 开启长连接的超时 65s types_hash_max_size 4096; 记录Nginx的哈希散列的大小include /etc/nginx/mime.types; 可以识别的文件类型default_type application/octet-stream; 可以直接处理二进制的流文件,也就是二进制的文件可以直接下载include /etc/nginx/conf.d/*.conf 虚拟主机的配置目录server { 表示一个完整的虚拟主机的配置 listen 80 监听的端口 server_name 主机名(域名) root 网站的根目录 include /etc/nginx/default.d/*.conf; 定义虚拟主机开启的高阶特性 error_page 404 /404.html; 返回404错误的地址(自定义错误页面) location = /40x.html { 路由规则(定义的策略) 策略的内容}} error_page 500 502 503 504 /50x.html; 定义的错误码的返回页面4、Nginx的数据压缩:gzip on; 开启压缩gzip_comp_level 9; 压缩的比例是最大为9 范围 1-9gzip_min_length 1; 忽略小于该大小的文件不压缩,单位是字节gzip_types text_plain text/css application/octet-stream; 压缩的文件类型 (mime.type中查看)5、虚拟主机的配置:基于端口的虚拟主机server {listen 81;root /usr/share/nginx/html/site1;}server {listen 82;root /usr/share/nginx/html/site2;}基于IP的虚拟主机server {listen 172.18.0.134:80;root /usr/share/nginx/html/site1;}server {listen 172.18.0.100:80;root /usr/share/nginx/html/site2;}基于名称的虚拟主机server {listen 172.18.0.100:80;server_name example.com;root /usr/share/nginx/html/site1;}server {listen 172.18.0.100:80;server_name test.com;root /usr/share/nginx/html/site2;}6、location 的规则:location可以实现的功能:•重定向:可以使用 return 或 rewrite 指令进行请求重定向。•反向代理设置:可以使用 proxy_set_header 来设置请求头信息。•负载均衡设置:可以使用 proxy_pass 将请求分发到负载均衡的后端服务器。•FastCGI 设置:可以使用 fastcgi_pass 指令将请求转发给 FastCGI 服务器处理。•静态文件处理:可以使用 try_files 指令来尝试不同的文件路径来处理静态文件请求。•日志设置:可以使用 access_log 和 error_log 指令来配置访问日志和错误日志的记录路径。•Gzip 压缩:可以使用 gzip 相关指令来配置响应内容的压缩= 开头表示精确匹配location = /name.html { 精确匹配 必须是name.html return 403;}^~ 开头表示uri以某个常规字符串开头,不是正则匹配location ^~ /pass {return 403;}~ 开头表示区分大小写的正则匹配location ~ /pass {return 403;}~* 开头表示不区分大小写的正则匹配location ~*/pass {return 403;}/ 通用匹配, 如果没有其它匹配,任何请求都会匹配到/ 通配符 路径中的所有资源都可以匹配到 location /*.php {网站的全局配置中}在location 中指定路径的方式使用root指定 表示相对路径 指的是/usr/share/nginx + location的root + location的路径server {listen 172.18.0.134:81;server_name example.com;root /usr/share/nginx/html/site1;location /bbs {root test/euler;autoindex on;}}172.18.0.134:81/bbs ——> /usr/share/nginx/test/euler/bbs使用alias 指定 表示绝对路径location /bbs {alias /usr/share/nginx/test/euler/bbs;autoindex on; 开启索引return 404; 返回一个指定的错误}在location中指定 /bbs 表示的是文件 /bbs/ 表示的是目录 在location中alias会覆盖server段落的root example.com/bbs - /usr/share/nginx/test/euler/bbs;7、Https的配置ssl_certificate "/etc/pki/nginx/server.crt"; 网站的证书ssl_certificate_key "/etc/pki/nginx/private/server.key"; 网站的私钥文件证书需要找权威的CA进行申请,如果是自己试验,可以使用openssl进行自签名证书openssl -x 509 生成CA的公私钥生成CSR的证书请求文件 同时生成私钥使用私钥给CSR签名并生成证书8、Nginx 热升级:所谓的热升级指的是可以在nginx工作的状态下对nginx的版本进行升级,并且不影响用户的访问原理:在于Nginx的程序支持 USR2的信号(该信号可以让程序重新加载,而不用结束进程再重新启动),也就是在Nginx的新版和旧版能够同时在系统中响应服务,如果旧版的Nginx没有问题,则结束旧版程序,新版替代工作下载低版本的Nginxwget ttps://nginx.org/download/nginx-1.22.1.tar.gz编译安装tar xzf nginx-1.22.1.tar.gz 解压文件cd nginx-1.22.1 进入目录./configure --prefix=/usr/local/nginx 指定安装的路径make -j 2 使用两核进行预编译make installl 编译并安装启动nginx./nginx升级过程wget https://nginx.org/download/nginx-1.25.4.tar.gz 下载新版tar xzf nginx-1.25.4.tar.gzcd nginx-1.25.4./configure --prefix=/usr/local/nginx 预配置make -j 2 预编译 记住一定不要make install(会覆盖原来的配置文件和二进制文件) make install后会覆盖安装cp -a /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak 备份旧版本cp -a /opt/nginx-1.25.4/objs/nginx /usr/local/nginx/sbin/nginx -f 新版覆盖旧版本ps uax |grep nginx 查询master的PIDkill -s USR2 PID 此时 新版的Nginx自动运行访问测试新版的Nginx可用kill PID 结束旧版本的Nginx 升级完成八、web架构 Nginx / Apache 都是默认提供html 超文本网页的访问,而无法提供动态应用程序1、运行动态的应用程序2个方法:交给web服务器自身的模块来完成 交给第三方服务器来完成以apache为例 如果需要运行php ,有两个方式第一个方式通过php的模块使用apache来运行 (必须在prefork模式下)第二个方式交给php的服务器来进行处理(在event模式下),yum安装完默认是这种现在运行的动态程序通常交给应用程序的后端进行处理CGI: 应用程序网关接口(简单理解就是个API的地址,PHP或python后台) CGI 的主要作用是允许 Web 服务器调用外部程序来处理客户端的请求,并将处理结果返回给客户端fast-cgi是cgi的增强版,支持长连接2、实验 LAMP 实现 wordpress 企业门户网站 yum install httpdyum install mariadb-server yum install php 会自动在/etc/httpd/conf.d/下生成一个php.conf文件systemctl start php-fpm php的服务进程,可以不用管,apache的默认方式: 在安装好php后,会在apache的虚拟主机目录中,生成一个php.conf的配置文件,在该配置文件中通过CGI调用后端的PHP服务器来进行php的处理,因为安装完成php后就会自动在conf.d/目录下自动产生php.conf文件,apache启动时就自动连带启动在LAMP中配置Apache使用php的两种方式(常用第二种方法)1在perfork模式下使用apache自身来运行php——> 也就是通过web服务器所携带模块来运行2需要指定php的头部文件,也就是告诉apache这一类php的文件是什么类型(目常用这种)第2种方法又分两种配置方法:配置php的后端服务器使用CGI来进行调用 ——> 通过第三方服务器来运行php配置php的CGI接口两种方法两种方法都要做的前置 步骤vim /etc/httpd/conf.d/php.conf主配置文件中配AddType text/html .php 添加php的文件类型DirectoryIndex index.php 首页文件名<FileMath \.(php|phar)$> #SetHandler application/x-httpd-php 注释掉这行</FileMatch>第一种方法vim /etc/httpd/conf.d/php.conf主配置文件中<FilesMatch \.(php|phar)$>SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost" //另一种写法和上面二选一</FilesMatch>vim /etc/php-fpm.d/www.conflisten = /run/php-fpm/www.sock //起用,默认启用第二种方法给php指定端口vim /etc/httpd/conf.d/php.conf主配置文件中<FilesMatch \.(php|phar)$>setHandler "proxy:fcgi://127.0.0.1:9000" 该种方式需要php监听9000端口</FilesMatch>vim /etc/php-fpm.d/www.conf注意掉listen = /run/php-fpm/www/sock 添加listen = 9000安装wordpress下载网站的源码通常指的是一个CMS(内容管理)的系统wget https://cn.wordpress.org/latest-zh_CN.tar.gz yum install httpd php php-fpm -ysudo yum install php-jsonyum install mariadb-server yum install php-mysqlidnf install php-curl php-dom php-exif php-fileinfo php-fpm php-gd php-hash php-json php-mbstring php-mysqli php-openssl php-pcre php-xml libsodium让php支持apachevim /etc/httpd/conf.d/php.conf主配置文件中配AddType text/html .php 添加php的文件类型DirectoryIndex index.php 首页文件名vim /etc/httpd/conf.d/php.conf主配置文件中<FilesMatch \.(php|phar)$>SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost" </FilesMatch>vim /etc/php-fpm.d/www.conflisten = /run/php-fpm/www.sock //起用,默认启用<IfModule dir_module> DirectoryIndex index.html index.php</IfModule>配置并安装CMS系统(记得关闭防火墙和SELinux)安装过程中需要配置数据库、配置权限、安装插件…mysql_secure_installation初始化mysql设置MySQL的新密码并确认。本示例设置密码admin。输入Y并回车继续使用提供的密码。输入Y并回车移除匿名用户。设置是否允许远程连接MySQL。不需要远程连接时,输入Y并回车。需要远程连接时,输入N或其他任意非Y的按键,并回车。输入Y并回车删除test库以及对test库的访问权限。输入Y并回车重新加载授权表。create database wordpress创建数据库本教程中创建新用户xlc,新用户密码为admincreate user ‘xlc’@‘localhost’ identified by ‘admin’;赋予用户对数据库wordpress的全部权限。grant all privileges on wordpress.* to ‘xlc’@‘localhost’;使配置生效。flush privileges;只需要解压出的wordpress文件夹下所有内容,放到/var/www/html/下看下apache进程是哪个用户就设置为文件来哪个用户chown apache:apache -R /var/www/html/*安装Discuz装包yum install httpd php php-fpm -ysudo yum install php-jsonyum install mariadb-server yum install php-mysqlidnf install php-curl php-dom php-exif php-fileinfo php-fpm php-gd php-hash php-json php-mbstring php-mysqli php-openssl php-pcre php-xml libsodium让php支持apachevim /etc/httpd/conf.d/php.conf主配置文件中配AddType text/html .php 添加php的文件类型DirectoryIndex index.php 首页文件名vim /etc/httpd/conf.d/php.conf主配置文件中<FilesMatch \.(php|phar)$>SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost" </FilesMatch>vim /etc/php-fpm.d/www.conflisten = /run/php-fpm/www.sock //起用,默认启用mysql_secure_installation初始化mysql设置MySQL的新密码并确认。本示例设置密码admin。输入Y并回车继续使用提供的密码。输入Y并回车移除匿名用户。设置是否允许远程连接MySQL。不需要远程连接时,输入Y并回车。需要远程连接时,输入N或其他任意非Y的按键,并回车。输入Y并回车删除test库以及对test库的访问权限。输入Y并回车重新加载授权表。create database wordpress创建数据库本教程中创建新用户user,新用户密码为admincreate user ‘user’@‘localhost’ identified by ‘admin’;赋予用户对数据库wordpress的全部权限。grant all privileges on wordpress.* to ‘user’@‘localhost’;使配置生效。flush privileges;下载discuz的论坛源码wget https://gitee.com/Discuz/DiscuzX/attach_files/1621557/download只需要解压出的upload文件夹所有内容,其它不要,放到/var/www/html/下看下apache进程是哪个用户就设置为文件来哪个用户chown apache:apache -R /var/www/html/*安装cms 九、DNS部分DNS是一个什么架构??DNS 是一个典型的C/S架构也就是存在DNS的客户端和DNS的服务端,用户所使用的计算机就是DNS的客户端,客户端向服务器端发起请求要求服务端提供某一个域名的IP地址就是寻求解析DNS 使用UDP和TCP 53端口进行通信 DNS的层级结构:根域: .用点表示根域全求只有13台ip4+13台ipv6;互联网上所有的记录解析都是依靠根域来维持的,负责顶级域名的解析(也就是当出现example.com 域名需要解析时,根域返回一组.com服务器的地址,由.com的服务器来进行解析)顶级域:.com \.cn\.org\.net …… 顶级域负责找到域名的权威域com 通用商业域名cn 国家域名/地区域名org 表示非营利性组织net 网络公司edu 教育gov 政府…….权威域: 权威域 是最终负责将域名解析成IP的节点DNS的解析方式:DNS将域名解析成IP ——> 正向解析DNS将IP解析成域名 ——> 反向解析解析两种方式1、递归查询:zhangsan.lab0.cn ---本地/etc/hosts解析--- 本地DNS --上游DNS-- 权威DNS--- 用户所谓的递归查询,指的是客户端找指定的DNS查询记录,DNS直接返回记录,对于客户端而言,整个记录是DNS为其提供为其查询到的2、迭代查询:zhangsan.lab0.cn --本地DNS ---返回.cn DNS ---用户查询.cn DNS ---返回lab0.cn DNS ---用户查询 lab0.cn DNS---返回 zhangsan.lab0.cn IP 地址现在的DNS查询结合了递归和迭代,一次递归多次迭代;一次递归指的是 客户端向本地DNS发起解析是递归反向解析记录的使用场景: 用在防止垃圾邮件 反向解析是将IP解析成域名 因此ARPA 称为反向记录,如果不需要用到反向记录是可以不用配置的在LINUX中通常使用bind来作为DNS的服务端程序,BIND可以提供高效的解析服务以 example.com 这个域为例进行DNS解析1. 安装bind yum install bind -ysystemctl enable --now named 2. 配置bind配置文件:/etc/named.conf 主配置文件listen-on port 53 { any; }; 允许监听所有IP的端口allow-query { any; }; 允许所有人查询的地址include "/etc/named.rfc1912.zones"; 引入区域文件(正向和反向文件都写在这里面)include "/etc/named.root.key"; 根域的列表/var/named 区域的配置文件(可以使用bind-chroot来保护区域文件 )bind-chroot 就是将bind运行的根目录锁定在/var/named/chroot 下 /var/named/slave 从DNS的目录 该目录中的区域文件都是从主服务器下载过来的/var/named/named.ca 所有根服务器的列表 列表是可以更新的https://www.iana.org/ 获取根域的地址包括镜像站/var/log/named.log 如果该文件不存在则,查看message的日志named-checkzone example.com example.com.zone域名 区域文件名 3. 配置正向解析vim /etc/named.rfs1912.zones 正向区域配置:zone "example.com" IN { type master; file "example.com.zone";};反向区域配置:zone "0.18.172.in-addr.arpa" IN { type master; file "0.18.172.zone";};其中0.18.172 是反写的子网地址,最后一位主机位不用写4.创建正向区域文件(上面主配置文件加完后这里还得创建正向解析文件)/var/named/named.empty 下向区域文件/var/named/named.loopbak 反向区域文件/var/named/cp -a named.localhost example.com.zone用模块创建解析文件 ,所有的区域文件,不管是正向区域还是反向,named用户都必须可以读取该区域改成这样:第二行第二个@包含@往后改成:ns.example.com admin.exapmle.com. 后面admin开始是邮件A记录:要解析的服务器的ip地址NS 后面改成www.example.com.添加一行www A 192168.1.100要解析的服务器IPnamed-checkconf 检查主配置文件是否存在错误named-checkzone 检查区域配置文件是否存在错误一个反向解析文件只能做一个IP解析,多个要创建多个反向文件正向区域文件参数详解:TTL 表示缓存的时间SOA 表示该区域的起始记录,也就是该域为权威域 @ 第二行第二个@表示域名,要改成ns.+我们要解析的域名 0:表示版本号,供备从DNS服务器确定是否同步信息1D:表示从服务器向主服务器同步数据的间隔1H:表示从服务器向主服务器同步数据的重试间隔1W:表示从服务器判断主服务器是否失效的时间段,例如,1W表示如果从服务器在1周都无法和主服务器同步数据,则认为其已失效3H:无效域名缓存的时长,在此时间内,如果用户再次查询无效域名解析,服务器将直接返回无法解析的响应,不在进行查询解析记录:A 记录 是将 域名解析成Ipv4地址 AAAA 解析成ipv6地址CNAME 解析成别名(CDN)MX 邮件交换记录txt 域名验证记录NS 将子域交给其他DNS进行解析CAA CA验证记录可以通过DSN区域视图,所谓的区域视图指的是可以将用户的不同来路,解析成不同的记录(商业化功能,bind可以实现)DNS的客户端工具:nslookup 该工具来自于bind-utils nslookup www.example.com 查询反向和正向记录hosthost example.com dig 用法:dig @DNS服务器(不设置默认就是本机) 域名 类型eg. dig @172.18.0.134 example.com MX十、集群管理集群的分类所谓的集群,就是指使用一组计算机来完成某一个应用或者场景下的业务承载问题根据不同的使用场景,将集群分成三类1. LB的集群(Load Balance Cluster)负载均衡集群,用来将用户请求调度到不同的节点上,让整个集群内机器的性能处于一个相对平衡的状态2.HA 高可靠集群(Highly Available Cluster)高可靠集群,重点用来保障业务的连续运行,通过心跳,浮动IP、资源锁等一系列方式保障在集群节点出现故障时,业务的持续稳定运行3.HPC 高性能计算集群(High Performance Computing)高性能计算集群,指的是利用分布式节点来并行计算科学数据最终得到一个值集群的典型代表:LB的集群: LVS(Linux Virtual Sever)是一款开源的四层(传输层)负载均衡软件LVS使用了Linux内核的模块特性,使用的是netfilter的框架Nginx LVS支持四层及七层负载,配置最简单,Nginx可以根据http的来源进行转发 Haproxy 同时提供四层和七层的负载均衡,最强大HA的集群:keepalived 可以通过VRRP协议来实现浮动的IP漂移Heartbeat 用在集群节点之间进行心跳检测Pacemaker 通过和其他心跳插件集成来实现高可用(只能做集群资源的管理)LVS的功能:数据包的IP转发修改数据包的目的mac封装IP隧道信息nginx的功能:根据URL地址进行负载HA的核心实现:浮动IP(弹性IP/VIP) 心跳网络fence机制防止脑裂双主的问题,一般用BMC卡 负载均衡集群LVS的概念:VIP: 浮动IP ——> 客户访问的业务IPDIP:LVS上访问真实服务器的接口IPRIP:业务服务器(真实服务器)的IP地址LVS的架构:用户态管理程序: ipvsadm这个工具来管理lvs集群内核态数据包模块: ip_vs LVS的安装:yum install ipvsadm -y LVS的管理方式:ipvsadm的工具来进行管理,唯一的集群配置文件在/etc/sysconfig/ipvsadm-conf中保存如果启动ipvsadm的服务将会自动加载该配置文件ipvsadm --help 查询选项LVS的工作模式和调度算法一共有四种工作模式,十二种调度算法 NAT模式DR 直连路由模式TUN IP隧道模式FULL-Tun 全隧道模式(收费的)LVS的配置:hostnamectl set-hostname lvsyum install bash-com* -yyum install ipvsadm -ynmcli connection modify ens33 ipv4.method manual ipv4.addresses 172.18.0.10/24 autoconnect yesnmcli connection modify ens37 ipv4.method manual ipv4.addresses 192.168.66.100/24 ipv4.gateway 192.168.66.254 ipv4.dns 114.114.114.114 autoconnect yessystemctl disable --now firewalldsysctl -w net.ipv4.ip_forward=1 临时开启IP转发内核参数 vi /etc/sysctl.conf 将其参数改为1 然后使用sysctl -p 刷新内核参数配置集群的步骤:ipvsadm -A -t 192.168.66.100:80 -s rr 创建集群服务并指定调度算法为rripvsadm -a -t 192.168.66.100:80 -r 172.18.0.100 -mipvsadm -a -t 192.168.66.100:80 -r 172.18.0.200 -m向集群内添加真实服务器并指定工作模式为nat 十一、数据库yum install mariadb yum install mysql*mariadb数据库装完配置文件在这vim /etc/my.cnf[mariadb]#绑定IPv4和3306端口bind-address = l0.0.0.0port = 3306#设置mysql的安装目录basedir=/db#设置mysql数据库的数据的存放目录datadir=/dbs#允许最大连接数max_connections=200mysql_secure_installation初始化mysql设置MySQL的新密码并确认。本示例设置密码admin。输入Y并回车继续使用提供的密码。输入Y并回车移除匿名用户。设置是否允许远程连接MySQL。不需要远程连接时,输入Y并回车。需要远程连接时,输入N或其他任意非Y的按键,并回车。输入Y并回车删除test库以及对test库的访问权限。输入Y并回车重新加载授权表。允许远程登陆update user set user.Host='%' where user.User='root';flush privileges;mysql行数一般控制在100W条以内创建数据库create database openEuler charset=utf8;备份数据库1.备份全部数据库的数据和结构mysqldump -uroot -p123456 -A > /data/mysqlDump/mydb.sql2.备份全部数据库的结构(加 -d 参数)mysqldump -uroot -p123456 -A -d > /data/mysqlDump/mydb.sql3.备份全部数据库的数据(加 -t 参数)mysqldump -uroot -p123456 -A -t > /data/mysqlDump/mydb.sql4.备份单个数据库的数据和结构(,数据库名mydb)mysqldump -uroot-p123456 mydb > /data/mysqlDump/mydb.sql5. 备份单个数据库的结构mysqldump -uroot -p123456 mydb -d > /data/mysqlDump/mydb.sql6. 备份单个数据库的数据mysqldump -uroot -p123456 mydb -t > /data/mysqlDump/mydb.sql7. 备份多个表的数据和结构(数据,结构的单独备份方法与上同)mysqldump -uroot -p123456 mydb t1 t2 > /data/mysqlDump/mydb.sql8. 一次备份多个数据库mysqldump -uroot -p123456 --databases db1 db2 > /data/mysqlDump/mydb.sql还原 MySQL 备份内容有两种方式还原,第一种是在 MySQL 命令行中,第二种是使用 SHELL 行完成还原1.在系统命令行中,输入如下实现还原:mysql -uroot -p123456 < /data/mysqlDump/mydb.sql2.在登录进入mysql系统中,通过source指令找到对应系统中的文件进行还原:mysql> source /data/mysqlDump/mydb.sql在 Linux中,通常使用BASH脚本对需要执行的内容进行编写,加上定时执行命令crontab实现日志自动化生成。以下代码功能就是针对mysql进行备份,配合crontab,实现备份的内容为近一个月(31天)内的每天的mysql数据库记录。十二、NGINX调度算法 RR轮询、LC最少连接、ip hash源地址哈希、random随机指定、generic hash根据原始访问哪个服务器还返回那个算法。nginx默认使用轮询调度Nginx1的配置:hostnamectl set-hostname nginx1yum install nginx -ynmcli connection modify ens33 ipv4.method manual ipv4.addresses 172.18.0.100/24 ipv4.gateway 172.18.0.10 autoconnect yesnginx 负载均衡配置和反向代理同时存在/usr/share/nginx/modules/mod-stream.confupstream www.yeng.com{ server 192.168.1.1:81weight=5; server 192168.1.10:82 ; server 192.168.1.100:83 backup; server 192.168.1.20 max_connes 1000;}server{ listen 8080; location / { proxy_pass http://www.yeng.com; //调用指定上面的定义的域名 }}注意:真实服务器的网关一定要指向LVS的DIP地址echo hello Nginx1 > /usr/share/nginx/html/index.htmlsystemctl enable --now nginx.servicesystemctl disable --now firewalld反向代理配置vim /etc/nginx/nginx.confserver { listenlisten 80; server_name _; root /usr/share/nginx/html; include /etc/nginx/default.d/*.conf; location / { proxy_pass http://172.16.1.100/; #只要http://本机IP :80端口就路转这个IP } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { }}location和proxy是否以斜杠结尾,表示了完全不同的访问路径,正常写法就是两目录和IP都得有斜杠location/test/{proxy_passhttp://192.168.1.123/;}最终转发路径为:http://192.168.1.123/index.htmllocation /test/{proxy_pass http://192.168.1.123;},终转发路径为:http://192.168.1.123/test/index.htmllocation /test{proxy_pass http://192.168.1.123/;},最终转发路径为:http://192.168.1.123//index.htmllocation/test{proxy_passhttp://192.168.1.123;},最终转发路径为:http://192.168.1.123/test/index.htmlnginx端口映射配置/ect/nginx/nginx.conf 放到最后面单独放,不要放到http里面stream {upstream tcp_test{ server 192168.1.10:22 ;}server{ listen 9999; proxy_pass tcp_test; //调用指定上面的定义的域名 }}十三、ansible1、openEuler可以直接安装yum install ansible yum install epel-release其它系统要先装这个源ansible 2.9 是最后一个企业稳定版,模块多ansible 2.10开始都是容器版ansible-core版,自带的模块少 ansible --version查看安装的位置及模块位置等重要信息1、ansible配置文件默认配置文件在/etc/ansible/ansible.cfg整个配置文件一共有十个段落[defaults] 通用配置项[inventory] 主机清单配置项[privilege_escalation] 权限提升配置项[paramiko_connection] 旧版本paramiko连接插件的配置项[ssh_connection] ssh连接的配置项[persistent_connection] 持久连接配置项[accelerate] 加速连接配置项[selinux] selinux的配置项[colors] 任务的输出颜色配置项 例如错误是红色[diff] 打印任务前后的差异2、配置文件详解:[defaults] 通用配置项:inventory = /etc/ansible/hosts 主机清单的路径,也就是清单存放在那个文件中library = /usr/share/my_modules Ansible的库文件存放的位置,可以不用管module_utils = /usr/share/my_module_utils/ 模块存放的位置,也可以不用管remote_tmp = ~/.ansible/tmp 在远程主机上执行命令模块存放的位置 ,也可以不用管forks = 5 ansible 主机任务的并发数,表示同时可以在五个主机上执行任务,也可以不用管ask_pass = True 远程主机的身份验证方式,如果为true则是密码认证,也可以不用管false则是密钥认证ask_sudo_pass = True 用户提权是否需要密码remote_port = 22 被管理端主机的ssh端口remote_user = root 连接被管理端的用户host_key_checking = False 不检查被控端的主机公钥权限提升配置项[privilege_escalation] 在生产环境通常不会使用root用户直接ssh,因此只能使用一个普通用户连接到被管理端,然后在执行提权,将其权限提升为root,ansible也需要配置提权become=True //true表示开启提权,反之false则关闭become_method=sudo //提权的方式为sudobecome_user=root //表示提权到root用户become_ask_pass=False //表示提权不需要验证密码ssh连接的配置项[ssh_connection] ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s ssh 的连接选项-C启用压缩传输,ControlPersist用于提升性能以上配置文件的优先级:配置文件可以出现在四个地方:1.当前用户的家目录下的.ansible.cfg的隐藏文件2.系统中的ANSIBLE_CONFIG的环境变量3.当前工作目录下的ansible.cfg4./etc/ansible.cfg 是全局默认配置文件优先级的顺序是:优先级最高的是环境变量 > 当前工作目录 > 家目录 > /etc/ansible/ansible.cfg 3、Ansible的管理配置示例:被控端:创建zhangsan用户并设置密码为zhangsan用户配置sudo的提权且无需密码提权主控端:1.vim /etc/ansible/ansible.cfg的配置文件[defaults]inventory = ./hostsremote_user = zhangsanask_pass = truehost_key_checking = False //避免首次连接让填yes[privilege_escalation]become = truebecome_method=sudobecome_user=rootbecome_ask_pass=False[ssh_connection]ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s2. 定义主机清单vim /etc/ansible/hostsnode1node2node3172.18.0.1693. 测试ansible能否管理被控ansible all -m ping 其中all 表示所有主机[WARNING]: Platform linux on host 172.18.0.169 is using the discovered Python interpreter at/usr/bin/python3, but future installation of another Python interpreter could change this. Seehttps://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for moreinformation.在测试连通性时,如果发生python的警告信息,可以使用两个方式来解决:1. 在主机清单中为主机指定特定的python版本vim /etc/ansible/hosts172.18.0.169 ansible_python_interpreter=/usr/bin/python32.在ansible的配置文件中屏蔽掉告警信息[defaults]interpreter_python=auto_legacy_silent4、ansible模块用法分为两类模块:一类是命令执行模块:command、 shell、 raw 、script、copy(从主控端复制过去)、fetch(从被控端复制过来)一类是任务模块:很多ansible-doc -l 查询支持的模块ansible-doc 模块名 查模块用法ansible-doc -s 模块名,仅查参数5、ansible常用参数ansible 192168.1.1 -m user -a 'name=admin' -vvv-k 指定ssh密码认证方式-K 指定sudo提权密码-u 指定用户名-vvv 查看详细 -C 测试执行