
精通Centos、Ubuntu、Redhat、Windows 开机和重启
一、基础环境 云主机 下载软件包 将所有软件下载至/data目录 # 链接:https://pan.baidu.com/s/13DlR1akNBCjib5VFaIjGTQ 密码:1l69 # 链接:https://pan.baidu.com/s/1V6Uuj6a08mEq-mRLaI1xgw 密码:6gap master到node做免密认证 ssh-keygen ssh-copy-id root@192.168.1.237 ssh-copy-id root@192.168.1.100 ssh-copy-id root@192.168.1.188 设定主机名与host文件 # 分别设定node与master的主机名 hostnamectl set-hostname master exec bash # 同步所有主机的hosts文件 vim /etc/hosts 192.168.1.78 master localhost 192.168.1.237 node1 192.168.1.100 node2 192.168.1.188 node3 解决DNS解析localhost 此云主机的DNS解析localhost会解析到一个鬼地址,这是个大坑。kubeadm初始化是会用到localhost。如果你的主机能解析到自己的IP,那么这步可以跳过。如果不能则需要自己搭建一个DNS,将localhost解析到自己。 # 1.检测 [root@node2 ~]# nslookup localhost Server: 118.118.118.9 Address: 118.118.118.9#53 Non-authoritative answer: Name: localhost.openstacklocal Address: 183.136.168.91 # 2.搭建DNS yum -y install dnsmasq cp /etc/resolv.conf{,.bak} rm -rf /etc/resolv.conf echo -e "nameserver 127.0.0.1\nnameserver $(hostname -i)" >> /etc/resolv.conf chmod 444 /etc/resolv.conf chattr +i /etc/resolv.conf echo -e "server=8.8.8.8\nserver=8.8.4.4" > /etc/dnsmasq.conf echo -e "$(hostname -i)\tlocalhost.$(hostname -d)" >> /etc/hosts service dnsmasq restart # 3.再次检测 [root@master ~]# nslookup localhost Server: 127.0.0.1 Address: 127.0.0.1#53 Name: localhost Address: 192.168.1.78 同步系统时间 ntpdate 0.centos.pool.ntp.org 关闭防火墙 iptables -F systemctl stop firewalld systemctl disable firewalld 关闭SELinux & 关闭swap swapoff -a sed -i 's/.*swap.*/#&/' /etc/fstab setenforce 0 确认时区 timedatectl set-timezone Asia/Shanghai systemctl restart chronyd.service 修改系统参数 cat <<EOF > /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system 安装docker tar -xvf docker-packages.tar cd docker-packages yum -y install local *.rpm systemctl start docker && systemctl enable docker 配置镜像加速器 vim /etc/docker/daemon.json { "registry-mirrors": ["https://lw9sjwma.mirror.aliyuncs.com"] } systemctl daemon-reload systemctl restart docker 配置k8s的yum源 vim /etc/yum.repos.d/k8s.repo [k8s] name=k8s baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ gpgcheck=0 获取kube软件包 cd kube-packages-1.10.1 # 软件包在网盘中下载 tar -xvf kube-packages-1.10.1.tar cd kube-packages-1.10.1 yum -y install local *.rpm systemctl start kubelet && systemctl enable kubelet 统一k8s与docker的驱动 # 1.查看docker驱动 docker info | Cgroup Driver Cgroup Driver: cgroupfs # 修改k8s配置文件与docker保持一致 sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 导入基础镜像 cd /data docker load -i k8s-images-1.10.tar.gz 二、初始化master节点 # 初始化master 指定的版本要与kubeadm版本一致 # kubeadm只给定了最少选项,集群名称等等都没有指定,kubeadm init [root@master ~]# kubeadm init --kubernetes-version=v1.10.1 --pod-network-cidr=10.244.0.0/16 # 初始化完成后得到如下信息 Your Kubernetes master has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ You can now join any number of machines by running the following on each node as root: kubeadm join 192.168.1.78:6443 --token qabol0.c2gq0uyfxvpqr8bu --discovery-token-ca-cert-hash sha256:2237ec7b8efd5a8f68adcb04900a0b17b9df2a78675a7d62b4aef644a7f62c05 # kubeadm join 是node节点加入集群的命令,注意token的有效期 若要通过普通用户使用群集,需要执行以下步骤 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config 基本命令 # 查看pods kubectl get pods # 查看系统pods [root@master ~]# kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE etcd-master 0/1 Pending 0 1s kube-apiserver-master 0/1 Pending 0 1s kube-controller-manager-master 0/1 Pending 0 1s kube-dns-86f4d74b45-d42zm 0/3 Pending 0 8h kube-proxy-884h6 1/1 NodeLost 0 8h kube-scheduler-master 0/1 Pending 0 1s # 查看集群各组件状态信息 [root@master ~]# kubectl get componentstatuses NAME STATUS MESSAGE ERROR scheduler Healthy ok controller-manager Healthy ok etcd-0 Healthy {"health": "true"} You have new mail in /var/spool/mail/root 三、node加入集群 # 确保node节点cgroup驱动保持一致 sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf # 命令来自集群初始化之后额显示中 kubeadm join 192.168.1.78:6443 --token v0866r.u7kvg5js1ah2u1bi --discovery-token-ca-cert-hash sha256:7b36794f4fa5121f6a5e309d0e312ded72997a88236a93ec7da3520e5aaccf0e # master节点查看nodes信息 [root@master data]# kubectl get nodes NAME STATUS ROLES AGE VERSION master NotReady master 57m v1.10.1 node1 NotReady <none> 27m v1.10.1 node2 NotReady <none> 11s v1.10.1 node3 NotReady <none> 4s v1.10.1 You have new mail in /var/spool/mail/root 四、部署网络 部署 flannel官网 flannel下载时不用科学上网,flannel的yml文件会自动去quay.io网站中下载镜像。 # 1.1使用软件包中的flannel,并指pod映射到哪个主机的网卡上面。 vim kube-flannel.yml command: [ "/opt/bin/flanneld", "--ip-masq", "--kube-subnet-mgr","-iface=eth0" ] # 以下要按顺序创建,先创建rbac,之前没有穿件rbac导致pod正常创建,但是pin不同 kubectl apply -f kube-flannel-rbac.yml kubectl apply -f kube-flannel.yml # 后,节点的状态会变为ready [root@master1 kubernetes1.10]# kubectl get node NAME STATUS ROLES AGE VERSION master Ready master 57m v1.10.1 node1 Ready <none> 27m v1.10.1 node2 Ready <none> 11s v1.10.1 node3 Ready <none> 4s v1.10.1 # 2.从官网下载最新的flannel,k8s1.7+ 直接执行以下命令即可 kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml flannel配置文件修改 kube-flannel.yml中指定使用的网段 "Network": "10.244.0.0/16" 默认使用16位掩码,则在各node中都分配一个10.244.0.0/8的网络 五、部署dashboard kubectl apply -f kubernetes-dashboard-http.yam kubectl apply -f admin-role.yaml kubectl apply -f kubernetes-dashboard-admin.rbac.yaml 命令行常用命令 # 查看pod信息,默认显示default名称空间下的pod [root@master ~]# kubectl get pods No resources found. # 指定名称空间写pod [root@master ~]# kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE etcd-master 1/1 Running 0 3h kube-apiserver-master 1/1 Running 0 3h kube-controller-manager-master 1/1 Running 0 3h kube-dns-86f4d74b45-bzbvc 3/3 Running 0 3h kube-flannel-ds-5ghhj 1/1 Running 0 2h kube-flannel-ds-ht4xd 1/1 Running 0 3h kube-flannel-ds-kbm5g 1/1 Running 0 3h kube-flannel-ds-mlj4r 1/1 Running 0 2h kube-proxy-9xxnd 1/1 Running 0 3h kube-proxy-n9w5x 1/1 Running 0 3h kube-proxy-nkn8c 1/1 Running 0 2h kube-proxy-shd6l 1/1 Running 0 2h kube-scheduler-master 1/1 Running 0 3h kubernetes-dashboard-5c469b58b8-rjfx6 1/1 Running 0 1h # 显示更详细的pod信息,此时各pod中都运行了一个kube-proxy和flannel容器 -o wide 显示更详细的信息,报错node节点iP、主机名 [root@master ~]# kubectl get pods -n kube-system -o wide NAME READY STATUS RESTARTS AGE IP NODE etcd-master 1/1 Running 0 3h 192.168.1.78 master kube-apiserver-master 1/1 Running 0 3h 192.168.1.78 master kube-controller-manager-master 1/1 Running 0 3h 192.168.1.78 master kube-dns-86f4d74b45-bzbvc 3/3 Running 0 3h 10.244.0.2 master kube-flannel-ds-5ghhj 1/1 Running 0 2h 192.168.1.188 node3 kube-flannel-ds-ht4xd 1/1 Running 0 3h 192.168.1.78 master kube-flannel-ds-kbm5g 1/1 Running 0 3h 192.168.1.237 node1 kube-flannel-ds-mlj4r 1/1 Running 0 2h 192.168.1.100 node2 kube-proxy-9xxnd 1/1 Running 0 3h 192.168.1.237 node1 kube-proxy-n9w5x 1/1 Running 0 3h 192.168.1.78 master kube-proxy-nkn8c 1/1 Running 0 2h 192.168.1.100 node2 kube-proxy-shd6l 1/1 Running 0 2h 192.168.1.188 node3 kube-scheduler-master 1/1 Running 0 3h 192.168.1.78 master kubernetes-dashboard-5c469b58b8-rjfx6 1/1 Running 0 1h 10.244.0.3 master 六、kubeadm清空配置 # 清空kubectl kubeadm reset # 清空网络信息 ip link del cni0 ip link del flannel.1 七、踩过的那些坑 确保master与node的DNS解析localhost能解析到自己的IP node加入master确保token不过期 node确保kubelet正常启动并运行 flannel网络要先创建kube-flannel-rbac.ymal再创建 kube-flannel.yml 八、token过期的解决办法 # 1.查看已经存在的token kubeadm token list # 2.创建token kubeadm token create # 3.查看ca证书的sha256编码 openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //' # 4.node使用新的token加入集群 kubeadm join --token acb123 --discovery-token-ca-cert-hash sha256:efg456 172.16.6.79:6443 --skip-preflight-checks # abc123 新创建的Token # efg456 证书的sha256编码 # IP+Port Master的IP+Port 感谢 无痴迷,不成功 discsthnew
下载安装ntfs-3g 下载驱动让linux挂载windows磁盘 https://tuxera.com/opensource/ntfs-3g_ntfsprogs-2017.3.23.tgz 安装 tar -xvf ntfs-3g_ntfsprogs-2017.3.23.tgz cd ntfs-3g_ntfsprogs-2017.3.23 ./configure make make install 下载安装chntpw 下载chntpw https://pkgs.org/download/chntpw wget http://li.nux.ro/download/nux/dextop/el7/x86_64//chntpw-0.99.6-22.110511.el7.nux.x86_64.rpm yum -y install ./hntpw-0.99.6-22.110511.el7.nux.x86_64.rpm 挂载windows磁盘 挂载windows的系统盘 默认第二个分区才是C盘 mkdir /win mount -t ntfs-3g /dev/xvdb2 /win 备份SAM文件 cd /win/Windows/System32/config/ cp SAM{,.bak} 清除Windows密码 chntpw SAM User Edit Menu: 1 - Clear (blank) user password 2 - Edit (set new) user password (careful with this on XP or Vista) 3 - Promote user (make user an administrator) (4 - Unlock and enable user account) [seems unlocked already] q - Quit editing user, back to user select Select: [q] > 1 # 1 清除密码 Password cleared! Hives that have changed: # Name 0 <SAM> Write hive files? (y/n) [n] : y # y保存 0 <SAM> - OK 将windows系统盘重新挂载回windows中即可
负载均衡实例 http{ upstream myserver { server 10.10.10.1 weight=3 max_fails=3 fail_timeout=20s; server 10.10.10.2 weight=3 max_fails=3 fail_timeout=20s; #定义后端服务器,权重3,失败3次后暂停服务20s } server { listen 80; server_name www.domain.com; index index.html; root /date/web location / { # 配置健康检查 proxy_pass http://myserver; proxy_next_upstream http_500 http_502 error timeout invalid_header; # 当出现以上状态码时,转发给下一台服务器 } } } 健康检查 指定在何种情况下一个失败的请求应该被发送到下一台后端服务器: error # 和后端服务器建立连接时,或者向后端服务器发送请求时,或者从后端服务器接收响应头时,出现错误 timeout # 和后端服务器建立连接时,或者向后端服务器发送请求时,或者从后端服务器接收响应头时,出现超时 invalid_header # 后端服务器返回空响应或者非法响应头 http_500 # 后端服务器返回的响应状态码为500 http_502 # 后端服务器返回的响应状态码为502 http_503 # 后端服务器返回的响应状态码为503 http_504 # 后端服务器返回的响应状态码为504 http_404 # 后端服务器返回的响应状态码为404 off # 停止将请求发送给下一台后端服务器 需要注意一点的是,只有在没有向客户端发送任何数据以前,将请求转给下一台后端服务器才是可行的。也就是说,如果在传输响应到客户端时出现错误或者超时,这类错误是不可能恢复的。
我的github 安装MySQL服务器 安装数据库 yum install -y mariadb-server 初始化数据库 mysql_secure_installation #MySql初始化脚本,以下为每一项的翻译 是否设置root密码 输入密码 确认密码 是否设置匿名用户 是否允许root远程登录 删除test数据库 现在是否生效 添加PATH变量 启动数据库 systemctl start mariadb 主服务器基础搭建 设定主机名,在当前bash生效 hostnamectl set-hostname mysql-master exec bash 创建数据库 MariaDB [(none)]> create database shuaiguoxia ; Query OK, 1 row affected (0.00 sec) MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | shuaiguoxia | | test | +--------------------+ 5 rows in set (0.00 sec) 创建表 use shuaiguoxia; create table blog (name varchar(20),age int,sex varchar(10)); 查看表结构 MariaDB [shuaiguoxia]> desc blog; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | name | varchar(20) | YES | | NULL | | | age | int(11) | YES | | NULL | | | sex | varchar(10) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 插入测试数据 insert into blog (name,age,sex) values ("guo",27,"nan"); insert into blog (name,age,sex) values ("wu",33,"nan"); insert into blog (name,age,sex) values ("cai",31,"nv"); insert into blog (name,age,sex) values ("li",19,"nan"); insert into blog (name,age,sex) values ("zhao",18,"nan"); insert into blog (name,age,sex) values ("qian",25,"nv"); 设定主服务器 修改配置文件 vim /etc/my.cnf [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock server-id=10 log-bin=mysql-bin relay-log=mysql-relay-bin replicate-wild-ignore-table=mysq.% 给blog表上锁 mysql -u root -p use shuaiguoxia; MariaDB [shuaiguoxia]> lock tables blog read; Query OK, 0 rows affected (0.00 sec) 导出主库中已经有的数据 mysqldump -u root -p -h 127.0.0.1 --database shuaiguoxia > /bak.sql Enter password: # 导出时一定要--dabatase指定数据库 将数据复制到从节点 scp /bak.sql 192.168.1.175:/ 从节点导入从主节点复制的数据 mysql -u root -p < /bak.sql 给从节点创建授权用户 grant replication slave on *.* to 'slave_user'@'192.168.1.%' identified by '1234' 从节点配置 设定主机名,在当前bash生效 hostnamectl set-hostname slave-master exec bash 设定配置文件 [root@mysql-slave ~]# cat /etc/my.cnf [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock server-id=21 log-bin=mysql-bin replicate-wild-ignore-table=mysql.% 查看主节点的master状态 # 查看主节点的master状态,要在主节点执行 MariaDB [(none)]> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000003 | 2900 | | | +------------------+----------+--------------+------------------+ 从节点导入从主节点复制的数据 # 前面导入过就不同导入了,怕你忘了再提一句 mysql -u root -p < /bak.sql 设定自动复制 # 命令中的master_log_file和master_log_pos为主节点查询的结果 MariaDB [(none)]> change master to \ master_host='192.168.1.46', master_user='slave_user', master_password='1234', master_log_file='mysql-bin.000003', master_log_pos=2900; 启动复制 MariaDB [(none)]> start slave; Query OK, 0 rows affected (0.01 sec) 查看复制状态 # 正常状态下Slave_IO_Running和 Slave_SQL_Running都为yes MariaDB [(none)]> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.46 Master_User: slave_user Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000003 Read_Master_Log_Pos: 3057 Relay_Log_File: mariadb-relay-bin.000002 Relay_Log_Pos: 686 Relay_Master_Log_File: mysql-bin.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: mysql.% Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 3057 Relay_Log_Space: 982 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 10 1 row in set (0.00 sec) 主从失败常见原因 网络不通:排查网络、端口 用户密码不对:检查在主节点创建的用户名密码 用户权限不对:MySQL中对一个用户的标识为IP@username, pos不对:检查从节点设定的开始pos是否为主节点正在进行的pos 开始二进制文件不对:检查从节点开始的二进制文件是否为主节点整个在进行的二进制位内按 防火墙限制:关闭防火墙 从节点导入数据不生效 主节点导出数据时要添加--databases参数 mysqldump -u root -p -h 127.0.0.1 --database shuaiguoxia > /bak.sql Enter password: # 导出时一定要--dabatase指定数据库 从节点导入数据库是要使用mysql命令 mysql -u root -p < /bak.sql
Python基础 作者:李斌 归档:学习笔记 2018/3/27 格式说明: 蓝色字体:注释 黄色背景:重要 绿色背景:注意 目 录 第1章 Python变量 2 1.1 Python变量的类型 2 1.2 字符串 2 Python变量 Python变量的类型 Python将所有数据存为内存对象,每个对象都分为可变类型和不可变类型,其中主要的核心类型数字(整型、布尔型)、字符串、元组是不可变的,列表、字典是可变的。 变量事实上是指向内存对象的引用,对于不可变类型的重新赋值,他的机制是重新创建一个不可变类型的对象,然后将原来的变量重新指向新创建的对象。对于没有引用的变量来说,引用计数为0,就会把当做垃圾回收。 字符串 每一个字符串都是一个序列,可以理解为数字,可以直接基于下标调用。 domain = "shuaiguoxia" print domain[0] s Print domain[2] U 对象的引用 = 用于将变量名与内存中的某对象进行绑定,如果存在就直接进行绑定,如果不存在就创建一个新的引用对象 domain = "shuaiguoxia"
tomcat默认情况下不带www的域名是不会跳转到带www的域名的,而且也无法像apache那样通过配置.htaccess来实现。如果想要把不带“www'的域名重定向到带”www"域名下,又不想写代码,可以使用UrlRewriteFilter来实现。 一、前期准备 1.安装JDK yum install java-1.8.0-openjdk-devel vim /etc/profile.d/jdk.sh export JAVA_HOME=/usr/java/latest # 首先定义JAVA_HOME的环境变量 export PATH=$JAVA_HOME/bin:$PATH # 然后追加 . /etc/profile.d/jdk.sh 2.安装tomcat yum install tomcat tomcat-admin-webapps.noarch \ tomcat-webapps.noarch tomcat-docs-webapp.noarch 二、urlRewriteFilter实现重定向 urlRewriteFilter是一个用于改写URL的Web过滤器,类似于Apache的mod_rewrite。适用于任何Web应用服务器(如Tomcat,jboss,jetty,Resin,Orion等)。其典型应用就把动态URL静态化,便于搜索引擎爬虫抓取你的动态网页。 1.下载UrlRewriteFilter UrlRewriteFilter的官方网站http://tuckey.org/urlrewrite/ jar包要放在应用的WEB-INF/lib目录中 yum install wget -y cd /usr/share/tomcat/webapps/ROOT/WEB-INF/lib/ wget http://central.maven.org/maven2/org/tuckey/urlrewritefilter/4.0.3/urlrewritefilter-4.0.3.jar 2.配置过滤规则 在应用的./WEB-INF/目录下创建一个名为urlrewrite.xml规则文件,名称千万不能出错!! vim ./WEB-INF/urlrewrite.xml <urlrewrite> <rule> <name>seo redirect</name> <condition name="host" operator="notequal">^www.example.com</condition> <condition name="host" operator="notequal">^localhost</condition> <from>^/.*</from> <to type="redirect" last="true">http://www.example.com/$1</to> </rule> </urlrewrite> 3.配置tomcat 在应用的`./WEB-INF/中的web.xml中添加 vim ./WEB-INF/web.xml <web-app> # 要在web-app中,在其它servlet mapping前加入 ...... <filter> <filter-name>UrlRewriteFilter</filter-name> <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class> </filter> <filter-mapping> <filter-name>UrlRewriteFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping> </web-app> 参考http://tuckey.org/urlrewrite/
简述 在公司内部搭建内部视频学习网站,经过对比选择了wordpress进行站点搭建。但是在上传视频遭遇到了各种问题,特将此处理过程进行记录。 原因排查 1.上传一个十几兆mp4的文件上传进度到达百分之百,会媒体提示http错误 2.刚开始怀疑是PHP、Nginx的上传大小限制了。但是查看PHP、Nginx配置均配置了1000M vim /etc/nginx/conf.d/default.conf location / { root /data/web; index index.php index.html index.htm; client_max_body_size 1000M; } vim /etc/php.ini upload_max_filesize = 1000M post_max_size = 1000M max_execution_time = 300 3.查看Nginx erro日志 tail /var/log/nginx/error.log 2018/02/14 09:32:07 [error] 87522#87522: *1 client intended to send too large body: 35016434 bytes, client: 36.111.88.33, server: localhost, request: "POST /wp-admin/async-upload.php HTTP/1.1", host: "117.66.240.116:81", referrer: "http://117.66.240.116:81/wp-admin/media-new.php" 只有下面这一行是最主要的保存信息。以下错误就是body限制大小的问题 client intended to send too large body 4.将限制大小的设定在http中后上串资源就不会在有限制 vim /etc/nginx/nginx.conf http{ client_max_body_size 1000M; keepalive_timeout 300; }
iptables规则持久化 设定防火墙规则 iptables -A INPUT -s 1.1.1.1/32 -p tcp -m tcp --dport 22 -j DROP iptables -A INPUT -s 2.2.2.2/32 -p tcp -m tcp --dport 22 -j DROP iptables -A INPUT -s 3.3.3.3/32 -p tcp -m tcp --dport 22 -j DROP iptables -A INPUT -s 4.4.4.4/32 -p tcp -m tcp --dport 22 -j DROP 保存防火墙规则 service iptables save 或 iptables-save > /etc/sysconfig/iptables 设定开机自动恢复iptables规则 vim /etc/rc.d/rc.local iptables-restore < /etc/sysconfig/iptables iptables关机自动保存 先清空防火墙规则 iptables -F 保存iptables规则,也就是说将/etc/sysconfig/iptables文件清空 service iptables save 或 iptables-save > /etc/sysconfig/iptables 手动生成一些iptables规则 iptables -A INPUT -s 1.1.1.1/32 -p tcp -m tcp --dport 22 -j DROP iptables -A INPUT -s 2.2.2.2/32 -p tcp -m tcp --dport 22 -j DROP iptables -A INPUT -s 3.3.3.3/32 -p tcp -m tcp --dport 22 -j DROP iptables -A INPUT -s 4.4.4.4/32 -p tcp -m tcp --dport 22 -j DROP 查看iptables规则是否生效 [root@ecs-7740 init.d]# iptables -nvL Chain INPUT (policy ACCEPT 27 packets, 1978 bytes) pkts bytes target prot opt in out source destination 0 0 DROP tcp -- * * 1.1.1.1 0.0.0.0/0 tcp dpt:22 0 0 DROP tcp -- * * 2.2.2.2 0.0.0.0/0 tcp dpt:22 0 0 DROP tcp -- * * 3.3.3.3 0.0.0.0/0 tcp dpt:22 0 0 DROP tcp -- * * 4.4.4.4 0.0.0.0/0 tcp dpt:22 设定关机时自动保存iptables规则 创建关机时要执行的脚本,并且确保其有执行权限 vim /etc/init.d/shutdownsh iptables-save > /etc/sysconfig/iptables chmod +x /etc/sysconfig/shutdownsh ls /etc/sysconfig/shutdownsh -rwxr-xr-x 1 root root 40 Jan 16 22:05 shutdownsh 创建软连接文件至rcN.d路径下,N为运行等级 http://blog.csdn.net/snaking616/article/details/78680021 https://wenku.baidu.com/view/9a988bb9f424ccbff121dd36a32d7375a417c6f1.html ln -s /etc/init.d/shutdownsh /etc/rc6.d/K01shutdownsh ln -s /etc/init.d/shutdownsh /etc/rc0.d/K01shutdownsh ln -s /etc/init.d/shutdownsh /var/lock/subsys/ 注:以上方法(在/var/lock/subusys创建空文件或者软连接,仅在第一次关机或重启有效,当重启后/var/lock/subsys下的文件就自动消失了,所以在第二次关机或者重启脚本并不能执行)
Beats 平台集合了多种单一用途数据采集器。这些采集器安装后可用作轻量型代理,从成百上千或成千上万台机器向 Logstash 或 Elasticsearch 发送数据。 一、架构图 此次试验基于前几篇文章,需要先基于前几篇文章搭建基础环境。 二、安装Filebeat 下载并安装Filebeat wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.0.1-x86_64.rpm yum install ./filebeat-6.0.1-x86_64.rpm 修改Filebeat配置文件 vim /etc/filebeat/filebeat.yml # 主配置文件 \- type: log # 文档类型 paths: \- /var/log/httpd/access.log* # 从哪里读入数据 # 输出在elasticsearch与logstash二选一即可 output.elasticsearch: #将数据输出到Elasticsearch。与下面的logstash二者选一 hosts: ["localhost:9200"] output.logstash: # 将数据传送到logstash,要配置logstash使用beats接收 hosts: ["172.18.68.14:5044"] 启动Filebeat systemctl start filebeat 三、配置Filebeat 配置Logstash接收来自Filebeat采集的数据 vim /etc/logstash/conf.d/test.conf input { beats { port => 5044 # 监听5044用于接收Filebeat传来数据 } } filter { grok { match => { "message" => "%{COMBINEDAPACHELOG}" # 匹配HTTP的日志 } remove_field => "message" # 不显示原信息,仅显示匹配后 } } output { elasticsearch { hosts => ["http://172.18.68.11:9200","http://172.18.68.12:9200","http://172.18.68.13:9200"] # 集群IP index => "logstash-%{+YYYY.MM.dd}" action => "index" document_type => "apache_logs" } } 启动Logstash /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/test.conf 四、模拟日志访问 通过curl命令来模拟客户访问,生成访问日志 curl 127.0.0.1 curl 172.18.68.51 curl 172.18.68.52 curl 172.18.68.53 五、验证信息 清除之前实验的旧数据(删除时要在对话框中输入删除),然后可以看到filebeat采集数据经过Logtash过滤再送给Elasticsearch的数据。 扩展 随着ELK日志系统逐渐升级,现在已经能基于Filebeat采集各节点日志,Logstash过滤、修剪数据,最后到ELasticsearch中进行索引构建、分词、构建搜索引擎。现在可以基于Elasticsearch的Head查看在浏览器中查看,但是Head仅仅能简单查看并不能有效进行数据分析、有好展示。要想进行数据分析、有好展示那就需要用到Kibana,Kibana依然放在下一篇文章中讲解,这里先放上架构图。
Logstash 是一款强大的数据处理工具,它可以实现数据传输,格式处理,格式化输出,还有强大的插件功能,常用于日志处理。 一、原理 Input 可以从文件中、存储中、数据库中抽取数据,Input有两种选择一个是交给Filter进行过滤、修剪。另一个是直接交给Output Filter 能够动态地转换和解析数据。可以通过自定义的方式对数据信息过滤、修剪 Output 提供众多输出选择,您可以将数据发送到您要指定的地方,并且能够灵活地解锁众多下游用例。 二、安装使用 1.安装 wget https://artifacts.elastic.co/downloads/logstash/logstash-6.0.1.rpm yum install -y ./logstash-6.0.1.rpm 2.Logstash配置文件 vim /etc/logstash/logstash.yml path.data: /var/lib/logstash # 数据存放路径 path.config: /etc/logstash/conf.d/*.conf # 其他插件的配置文件,输入输出过滤等等 path.logs: /var/log/logstash # 日志存放路径 3.Logstash中的JVM配置文件 Logstash是一个基于Java开发的程序,需要运行在JVM中,可以通过配置jvm.options来针对JVM进行设定。比如内存的最大最小、垃圾清理机制等等。这里仅仅列举最常用的两个。 JVM的内存分配不能太大不能太小,太大会拖慢操作系统。太小导致无法启动。 vim /etc/logstash/jvm.options # logstash有关JVM的配置 -Xms256m # logstash最大最小使用内存 -Xmx1g 4.最简单的日志收集配置 安装一个httpd用于测试,配置Logstash收集Apache的accless.log日志文件 yum install httpd echo "Hello world" > /var/www/html/index.html # 安装httpd,创建首页用于测试 vim /etc/logstash/conf.d/test.conf input { file { # 使用file作为数据输入 path => ['/var/log/httpd/access_log'] # 设定读入数据的路径 start_position => beginning # 从文件的开始处读取,end从文件末尾开始读取 } } output { # 设定输出的位置 stdout { codec => rubydebug # 输出至屏幕 } } 5.测试配置文件 logstash是自带的命令但是没有再环境变量中,所以只能使用绝对路径来使用此命令。 /usr/share/logstash/bin/logstash -t -f /etc/logstash/conf.d/test.conf # 测试执行配置文件,-t要在-f前面 Configuration OK # 表示测试OK 6.启动logstash 在当前会话运行logstash后不要关闭这个会话暂时称其为会话1,再打开一个新的窗口为会话2 /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/test.conf 启动以后在会话2中使用curl命令进行测试 curl 172.18.68.14 然后在回到之前的会话1可以看到输出的信息 { "@version" => "1", "host" => "logstash.shuaiguoxia.com", "path" => "/var/log/httpd/access_log", "@timestamp" => 2017-12-10T14:07:07.682Z, "message" => "172.18.68.14 - - [10/Dec/2017:22:04:44 +0800] \"GET / HTTP/1.1\" 200 12 \"-\" \"curl/7.29.0\"" } 至此最简单的Logstash配置就已经完成了,这里仅仅是将收集到的直接输出没有进行过滤或者修剪。 三、Elasticsearch与Logstash 上面的配置时Logsatsh从日志文件中抽取数据,然后输出至屏幕。那么在生产中往往是将抽取的数据过滤后输出到Elasticsearch中。下面讲解Elasticsearch结合Logstash Logstash抽取httpd的access.log文件,然后经过过滤(结构化)之后输出给Elasticsearch Cluster,在使用Head插件就可以看到抽取到的数据。(Elasticsearch Cluster与Head插件搭建请查看前两篇文章) 配置Logstash vim /etc/logstash/conf.d/test.conf input { file { path => ['/var/log/httpd/access_log'] start_position => "beginning" } } filter { grok { match => { "message" => "%{COMBINEDAPACHELOG}" } remove_field => "message" } } output { elasticsearch { hosts => ["http://172.18.68.11:9200","http://172.18.68.12:9200","http://172.18.68.13:9200"] index => "logstash-%{+YYYY.MM.dd}" action => "index" document_type => "apache_logs" } } 启动Logstash /usr/share/logstash/bin/logstash -t -f /etc/logstash/conf.d/test.conf # 测试配置文件 Configuration OK /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/test.conf # 启动Logstash 测试 每个执行10次172.18.68.14,位Logstash的地址 curl 127.0.0.1 curl 172.18.68.14 验证数据 使用浏览器访问172.18.68.11:9100(Elastisearch 安装Head地址,前面文章有讲) 选择今天的日期,就能看到一天内访问的所有数据。 四、监控其他 监控Nginx日志 仅仅列了filter配置块,input与output参考上一个配置 filter { grok { match => { "message" => "%{HTTPD_COMBINEDLOG} \"%{DATA:realclient}\"" } remove_field => "message" } date { match => ["timestamp","dd/MMM/YYYY:H:m:s Z"] remove_field => "timestamp" } } 监控Tomcat 仅仅列了filter配置块,input与output参考上一个配置 filter { grok { match => { "message" => "%{HTTPD_COMMONLOG}" } remove_field => "message" } date { match => ["timestamp","dd/MMM/YYYY:H:m:s Z"] remove_field => "timestamp" } } 五、Filebeat 现在已经搭建成在节点安装Logstash并发送到Elasticsearch中去,但是Logstash是基于Java开发需要运行在JVM中,所以是一个重量级采集工具,仅仅对于一个日志采集节点来说使用Logstash太过重量级,那么就可以使用一个轻量级日志收集工具Filebeat来收集日志信息,Filebeat同一交给Logstash进行过滤后再Elasticsearch。这些在接下来的文章在进行讲解,先放一张架构图吧。
在学习Elasticsearch的过程中,必不可少需要通过一些工具查看es的运行状态以及数据。如果都是通过rest请求,未免太过麻烦,而且也不够人性化。此时,head可以完美的帮助你快速学习和使用Elasticsearch。 基础环境 Elasticsearch集群搭建请参考前一篇文章http://www.cnblogs.com/aubin/p/8012840.html 系统 节点名 IP 软件版本 CentOS7.3 els1 172.18.68.11 Elasticsearch6.0 CentOS7.3 els2 172.18.68.12 Elasticsearch6.0 CentOS7.3 els3 172.18.68.13 Elasticsearch6.0 一、安装 插件官网地址https://github.com/mobz/elasticsearch-head 由于插件时托管在github中,要从github中直接下载所以需要先安装git 安装插件时又使用到了npm,所以npm同时都安装上(注意:npm在epel源中) yum install git npm # npm在epel源中 git clone https://github.com/mobz/elasticsearch-head.git # 安装过程需要连接互联网 cd elasticsearch-head # git clone后会自动生成的一个目录 npm install npm run start 二、测试 使用浏览器打开http://172.18.68.11:9200。如果能正常打开说明head插件安装正确 现在集群健康状态哪里显示未连接,这是因为head插件没有权限获取集群节点的信息,接下来设置权限 三、权限设定 如果想查询集群健康信息,那么需要在elasticsearch配置文件中授权 vim /etc/elasticsearch/elasticsearch.yml http.cors.enabled: true # elasticsearch中启用CORS http.cors.allow-origin: "*" # 允许访问的IP地址段,* 为所有IP都可以访问 四、测试 填入测试索引 curl -XPUT '172.18.68.11:9100/book' 打开浏览器 再次通过浏览器打开,填入已经授权节(上面的两行配置)点IP地址,点击链接,就可以看到集群健康信息与测试索引的分片信息。 点数据浏览就可以查看到所有的信息,不过这里没有插入数据也就看不到。接下来的文章会记录如何输入、输出、过滤数据
Elastic 的底层是开源库 Lucene。但是,你没法直接用 Lucene,必须自己写代码去调用它的接口。Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。Elastic 的底层是开源库 。但是,你没法直接用 Lucene,必须自己写代码去调用它的接口。Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。 一、ES中的基本概念 cluster 代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。 shards 代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。 replicas 代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。 recovery 代表数据恢复或叫数据重新分布,es在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。 river 代表es的一个数据源,也是其它存储方式(如:数据库)同步数据到es的一个方法。它是以插件方式存在的一个es服务,通过读取river中的数据并把它索引到es中,官方的river有couchDB的,RabbitMQ的,Twitter的,Wikipedia的。 gateway 代表es索引快照的存储方式,es默认是先把索引存放到内存中,当内存满了时再持久化到本地硬盘。gateway对索引快照进行存储,当这个es集群关闭再重新启动时就会从gateway中读取索引备份数据。es支持多种类型的gateway,有本地文件系统(默认),分布式文件系统,Hadoop的HDFS和amazon的s3云存储服务。 discovery.zen 代表es的自动发现节点机制,es是一个基于p2p的系统,它先通过广播寻找存在的节点,再通过多播协议来进行节点之间的通信,同时也支持点对点的交互。 Transport 代表es内部节点或集群与客户端的交互方式,默认内部是使用tcp协议进行交互,同时它支持http协议(json格式)、thrift、servlet、memcached、zeroMQ等的传输协议(通过插件方式集成)。 二、部署环境 采用三台CentOS7.3部署Elasticsearch集群,部署Elasticsearch集群就不得不提索引分片,以下是索引分片的简单介绍。 系统 节点名 IP CentOS7.3 els1 172.18.68.11 CentOS7.3 els2 172.18.68.12 CentOS7.3 els3 172.18.68.13 ES集群中索引可能由多个分片构成,并且每个分片可以拥有多个副本。通过将一个单独的索引分为多个分片,我们可以处理不能在一个单一的服务器上面运行的大型索引,简单的说就是索引的大小过大,导致效率问题。不能运行的原因可能是内存也可能是存储。由于每个分片可以有多个副本,通过将副本分配到多个服务器,可以提高查询的负载能力。 三、部署Elasticsearch集群 1.安装JDK Elasticsearch是基于Java开发是一个Java程序,运行在Jvm中,所以第一步要安装JDK yum install -y java-1.8.0-openjdk-devel 2.下载elasticsearch https://artifacts.elastic.co/downloads/elasticsearch/ 是ELasticsearch的官方站点,如果需要下载最新的版本,进入官网下载即可。可以下载到本地电脑然后再导入CentOS中,也可以直接在CentOS中下载。 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.0.1.rpm 3.配置目录 安装完毕后会生成很多文件,包括配置文件日志文件等等,下面几个是最主要的配置文件路径 /etc/elasticsearch/elasticsearch.yml # els的配置文件 /etc/elasticsearch/jvm.options # JVM相关的配置,内存大小等等 /etc/elasticsearch/log4j2.properties # 日志系统定义 /var/lib/elasticsearch # 数据的默认存放位置 4.创建用于存放数据与日志的目录 数据文件会随着系统的运行飞速增长,所以默认的日志文件与数据文件的路径不能满足我们的需求,那么手动创建日志与数据文件路径,可以使用NFS、可以使用Raid等等方便以后的管理与扩展 mkdir /els/{log,date} chown -R elasticsearch.elasticsearch /els/* 5.集群配置 集群配置中最重要的两项是node.name与network.host,每个节点都必须不通。其中node.name是节点名称主要是在Elasticsearch自己的日志加以区分每一个节点信息。discovery.zen.ping.unicast.hosts是集群中的节点信息,可以使用IP地址、可以使用主机名(必须可以解析)。 vim /etc/elasticsearch cluster.name: aubin-cluster # 集群名称 node.name: els1 # 节点名称,仅仅是描述名称,用于在日志中区分 path.data: /var/lib/elasticsearch # 数据的默认存放路径 path.logs: /var/log/elasticsearch # 日志的默认存放路径 network.host: 192.168.0.1 # 当前节点的IP地址 http.port: 9200 # 对外提供服务的端口,9300为集群服务的端口 discovery.zen.ping.unicast.hosts: ["172.18.68.11", "172.18.68.12","172.18.68.13"] # 集群个节点IP地址,也可以使用els、els.shuaiguoxia.com等名称,需要各节点能够解析 discovery.zen.minimum_master_nodes: 2 # 为了避免脑裂,集群节点数最少为 半数+1 6.JVM配置 由于Elasticsearch是Java开发的,所以可以通过/etc/elasticsearch/jvm.options配置文件来设定JVM的相关设定。如果没有特殊需求按默认即可。 不过其中还是有两项最重要的-Xmx1g与-Xms1gJVM的最大最小内存。如果太小会导致Elasticsearch刚刚启动就立刻停止。太大会拖慢系统本身 vim /etc/elasticsearch/jvm.options -Xms1g # JVM最大、最小使用内存 -Xmx1g 7.启动Elasticsearch 由于启动Elasticsearch会自动启动daemon-reload所以最后一项可以省略。 systemctl enable elasticsearch.service systemctl start elasticsearch systemctl daemon-reload # 可以省略 8.测试 Elasticsearch直接听过了http接口,所以直接使用curl命令就可以查看到一些集群相关的信息。 可以使用curl命令来获取集群的相关的信息, _cat代表查看信息 nodes为查看节点信息,默认会显示为一行,所以就用刀了?preety让信息更有好的显示 ?preety让输出信息更友好的显示 curl -XGET 'http://172.18.68.11:9200/_cat/nodes?pretty' 172.18.68.12 18 68 0 0.07 0.06 0.05 mdi - els2 172.18.68.13 25 67 0 0.01 0.02 0.05 mdi * els3 # *号表示为当前节点为主节点的意思 172.18.68.11 7 95 0 0.02 0.04 0.05 mdi - els1 如果你要想查看更多有关于集群信息、当前节点统计信息等等,可以使用一下命令来获取到所有可以查看的信息。 curl -XGET 'http://172.18.68.11:9200/_cat?pretty'
使用开源web应用solo blog进行项目演示。前端使用Nginx作为负载均衡器,后端Tomcat连接Redis实现session存储。Redis的特点就是可以将session持久化。样才能真正实现后台多个Tomcat负载平衡,用户请求能够发往任何一个tomcat主机。 keeplived、zabbix与ansible暂不在本文章的范围当中,会在之后的文章逐一进行讲解 实验架构图 部署环境 CentOS7 Nginx1.10.2 Tomcat7.0 Redis3.2.3 Mariadb 5.5.44 所需软件包 commons-pool2-2.2.jar jedis-2.5.2.jar tomcat-redis-session-manager-2.0.0.jar 下载地址 https://github.com/izerui/tomcat-redis-session-managercommons-pool2-2.2.jar solo blog 下载地址 http://b3log.org/ 一、Nginx服务器配置 安装前准备 ntpdate 172.18.0.1 iptables -F 安装Nginx yum install nginx 修改配置文件 upstream tomcatservers:创建后端服务器组,要在http内部追加 location:匹配URL,在server内部追加 注:省略号为其他默认的参数,如果没有特殊需要按默认即可 vim /etc/nginx/nginx.conf http { ... upstream tomcatservers { server 172.18.68.21:8080; server 172.18.68.22:8080; } ... server { ... location / { proxy_pass http://tomcatservers; } ... } } systemctl start nginx 检查端口 启动服务器要检查80端口是否正常监听 ss -ntl 二、Tomcat服务器配置 两台Tomcat服务器的配置完全一样。以下步骤在两台主机重复操作即可 安装前准备 ntpdate 172.18.0.1 iptables -F 安装Tomcat yum install Tomcat 部署solo .war包复制到webapps目录下后重启tomcat,tomcat会自动解压其文件 cp solo-2.4.1.war /usr/share/tomcat/webapps/ systemctl restart tomcat 配置solo serverhost为前端负载均衡的域名或者IP,如果部署完毕后出现静态资源无法加载的情况,多数是这里出了问题。 cd /usr/share/tomcat/webapps/solo-2.4/WEB-INF/classes vim latke.properties #### Server #### # 配置协议 serverScheme=http # 配置客户端访问站点时的域名或IP,也就是前端Nginx的域名 serverHost=www.shuaiguoxia.com # 使用的端口 serverPort=80 配置solo连接MySQL H2 runtime的部分是solo默认使用的,把他手动注释掉后把MySQL runtime部分注释取消。 设定MySQL的用户名密码,然后把172.18.68.41改为MySQL(主)的IP地址。 #### H2 runtime #### #runtimeDatabase=H2 #jdbc.username=root #jdbc.password= #jdbc.driver=org.h2.Driver #jdbc.URL=jdbc:h2:~/solo_h2/db #jdbc.pool=h2 # #### MySQL runtime #### runtimeDatabase=MYSQL jdbc.username=root # 用户名 jdbc.password=123456 # 密码 jdbc.driver=com.mysql.jdbc.Driver jdbc.URL=jdbc:mysql://172.18.68.41:3306/solo?useUnicode=yes&characterEncoding=utf8 jdbc.pool=druid 配置Tomcat连接Reids Tomcat连接Reids需要3个软件包: commons-pool2-2.2.jar jedis-2.5.2.jar tomcat-redis-session-manager-2.0.0.jar 下载地址https://github.com/izerui/tomcat-redis-session-manager 将所需要的jar包复制到 /usr/share/tomcat/lib/ cp commons-pool2-2.2.jar /usr/share/tomcat/lib/ cp jedis-2.5.2.jar cp tomcat-redis-session-manager-2.0.0.jar 修改contest.xml文件,再文件中加入以下两行。 IP为RedisIP地址,端口为Redis监听的端口 vim /etc/tomcat/context.xml # <Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" /> <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager" host="172.18.68.31" port="6379" database="0" maxInactiveInterval="60" /> 重启Tomcat systemctl restart tomcat 三、Redis服务器配置 Redis服务器一共两台,一主一从。仅仅配置文件不同,其他过程全部相同。 安装前准备 ntpdate 172.18.0.1 iptables -F 安装Redis yum install Redis Redis主节点的配置 主节点仅配置IP、监听的端口、与连接密码 vim /etc/redis.conf bind 0.0.0.0 # 监听所有IP port 6379 # 设定监听的端口 requirepass 123456 # 设定连接的密码 Redis从节点配置 从节点设置为只读 bind 0.0.0.0 # 监听所有IP slaveof 172.18.68.31 6379 # 设定主节点的IP+端口 masterauth 123456 # 主节点的连接密码 slave-read-only yes # 从节点为只读 确认主从配置成功 shell > redis-cli -h 172.18.68.32 # 连接从服务器redis 127.0.0.1:6379> INFO replication # 查看主从复制状态信息 # Replication role:slave master_host:172.18.68.31 # 主节点IP master_port:6379 # 主节点的端口 master_link_status:up # up为主从同步正常 master_last_io_seconds_ago:9 master_sync_in_progress:0 slave_repl_offset:1420 slave_priority:100 slave_read_only:1 connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 四、MySQL服务器配置 MySQL服务器一共两台,一主一从。仅仅配置文件不同,其他过程全部相同。 安装前准备 ntpdate 172.18.0.1 iptables -F 安装Mariadb yum install Mariadb # # #运行初始化脚本对MySQL进行 cd /usr/local/mysql/bin mysql_secure_installation #MySql初始化脚本,以下为每一项的翻译 先回车 是否设置root密码 输入密码 确认密码 是否设置匿名用户 是否允许root远程登录 删除test数据库 现在是否生效 MySQL主服务器的配置 主从同步就必须要开启二进制日志,修改配置文件一共有两点。 1.server-id必须不能冲突 2.在主服务器创建授权用户,让用户有复制权限。 shell > vim /etc/my.cnf server-id=1 #节点ID log-bin=mysql-bin #指定二进制日志前缀 relay-log=mysql-relay-bin #指定relaylog日志前缀 replicate-wild-ignore-table=mysql.% #排除要复制的表 replicate-wild-ignore-table=test.% replicate-wild-ignore-table=information_schema.% 在主服务器行创建授权用户,让从服务器有权限复制主服务器数据。授权用户应该匹配最小权限法则,允许连接的IP地址越精确越好。 Musql > grant replication slave on *.* to 'slave_user'@'10.0.0.67' identified by '123456'; MySQL从服务器的配置 MySQL的主从配置也仅仅是server-id不同 shell > vim /etc/my.cnf server-id=2 #节点ID log-bin=mysql-bin #指定二进制日志前缀 relay-log=mysql-relay-bin #指定relaylog日志前缀 replicate-wild-ignore-table=mysql.% #排除要复制的表 replicate-wild-ignore-table=test.% replicate-wild-ignore-table=information_schema.% 在从服务器连mysql命令行配置,配置主节点的IP、用户名密码。最重要的是master_log_file、master_log_pos,这两项是在主节点上查询后的结果,要与主节点查询结果相同。 # 在MySQL主服务器中查询结果 MariaDB [(none)]> show master status\G; *************************** 1. row *************************** File: master-log.000003 Position: 18893845 Binlog_Do_DB: Binlog_Ignore_DB: 配置MySQL从服务器 MySQL > change master to master_host='10.0.0.66', master_user='slave_user', master_password='123456', master_log_file='mysql-bin.000001', master_log_pos=106;` 查看主动同步情况 在从服务器中查看主从同步情况。最后两行的yes标志着主从同步成功。还可以通过查询表、库甚至数据的方式查询验证主从同步情况。 MariaDB [(none)]> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 172.18.68.41 Master_User: slave-user Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master-log.000002 Read_Master_Log_Pos: 245 Relay_Log_File: mysql-relay-bin.000002 Relay_Log_Pos: 530 Relay_Master_Log_File: master-log.000002 Slave_IO_Running: Yes Slave_SQL_Running: Yes 部署完毕 通过浏览器访问172.18.68.11/solo-2.4就能访问部署的solo博客,初次进入会让你注册一个用户密码,就是管理员账号密码。 至此不管Nginx怎样调度,Tomcat都能将客户端的session保存在Redis中。可以通过windwos的Redis管理软件查看到在Redis主从两个数据库都有了session信息。
会话保持的三种方式 Session sticky会话绑定:通过在前端调度器的配置中实现统一session发送至同一后发端服务器 Session cluster会话集群:通过配置Tomcat保持所有Tomcat的session的信息一致。 Session server 会话服务:将所有的session交给专门的session服务管理。 这里讲解第三种,使用Memcached做session server 一、架构图 系统环境 所有服务器全部采用CentOS7.3 所需要的软件包 以下文件都要放置在tomcat服务器主机上的类库目录中 rpm -ql tomcat-lib # /usr/share/java/tomcat/ # yum安装默认在此目录 /usr/local/tomcat/lib # 在官网rpm安装的默认在此目录了 memcached-session-manager-1.8.3.jar http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager/1.8.3/ memcached-session-manager-tc7-1.8.3.jar http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager-tc7/1.8.3/ spymemcached-2.11.1.jar http://repo1.maven.org/maven2/net/spy/spymemcached/2.11.1/ javolution-5.4.3.1.jar http://memcached-session-manager.googlecode.com/svn/maven/javolution/javolution/5.4.3.1/ msm-javolution-serializer-1.8.3.jar http://repo1.maven.org/maven2/de/javakaffee/msm/msm-javolution-serializer/1.8.3/ 二、Apache详细配置 安装httpd yum install httpd 创建配置文件 在/etc/httpd/conf.d下新建一个配置文件 shell > vim /etc/httpd/conf.d/ajp-tomcat.conf # <proxy balancer://tomcatservers> # 定义主机组 BalancerMember ajp://172.18.68.21:8009 route=tomcatA BalancerMember ajp://172.18.68.22:8009 route=tomcatB ProxySet lbmethod=byrequests </proxy> # <virtualhost *:80> # 创建虚拟主机 ServerName www.baidu.com ProxyVia On ProxyRequests Off ProxyPreserveHost On proxyvia on <Proxy *> Require all granted </Proxy> ProxyPass / balancer://tomcatservers/ # 设定所有调度至后端 ProxyPassReverse / balancer://tomcatservers/ # 设定所有调度至后端 <Location /> # centos7默认拒绝,所以要允许 Require all granted </Location> <Location /balancer-manager> # apache的管理页面 SetHandler balancer-manager ProxyPass ! # 匹配到apache的管理页面不代理 Require all granted # 设定允许 </Location> </virtualhost> # shell > systemctl start httpd 三、Tomcat的配置 两台tocat的配置大同小异,配置文件基本都相同,仅是后面创建的两个测试页面不同而已。 安装Tomcat yum install tomcat tomcat-admin-webapps tomcat-webapps 修改配置文件 在/etc/tomcat/下有个server.xml文件,打开这个文件后在host标签内添加或者修改如下配置。 vim /etc/tomcat/server.xml 在host标签内配置以下内容 <Context path="/myapp" docBase="myapp" reloadable="true"> <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:172.18.68.31:11211,n2:172.18.68.32:11211" #n1:IP:prot为后端两个memcached地址 # failoverNodes="n2" # 设定n2备用。所以n1就是主 requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" # 匹配到这些结尾的文件不考虑cookie transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" /> </Context> # 黄色标记部分为流式化管理工具,如果使用其他流式化工具,更改这两个名即可 下载所依赖的软件包 将文章最开头提到的所有.jar文件结尾的文件软布放置在tomcat服务器主机上的类库目录中 rpm -ql tomcat-lib # 通过此命令查看.jar文件存放的目录,就是类库文件的目录 /usr/share/java/tomcat/ # yum安装的tomcat类库路径 /usr/local/tomcat/lib # 在官网rpm安装的tomcat类库路径 添加测试页面 下面两个测试页面各不相相同,所以要在各自的目录下分别创建。在tomcatA中添加测试页面 shell > mkdir -pv /usr/local/tomcat/webapps/test/WEB-INF/{classes,lib} shell > vim /usr/local/tomcat/webapps/test/index.jsp 添加如下内容: <%@ page language="java" %> <html> <head><title>TomcatA</title></head> <body> <h1><font color="red">TomcatA.magedu.com</font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("magedu.com","magedu.com"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html> 在tomcatB中添加测试页面 shell > mkdir -pv /usr/local/tomcat/webapps/test/WEB-INF/{classes,lib} shell > vim /usr/local/tomcat/webapps/test/index.jsp <%@ page language="java" %> <html> <head><title>TomcatB</title></head> <body> <h1><font color="blue">TomcatB.magedu.com</font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("magedu.com","magedu.com"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html> 启动服务 systemctl start tomcat 四、Memcached配置 Mechached基本没有什么配置的,安装上启动服务即可. yum install memcached systemctl start memcached 五、测试 使用浏览器访问http://172.18.68.11,然后多次刷新,只要SessionID这一栏的数值不变就说明session已经保持不变
Redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化。redis支持四种持久化方式,一是 Snapshotting(快照)也是默认方式;二是Append-only file(缩写aof)的方式;三是虚拟内存方式;四是diskstore方式。下面分别介绍之。 一、RBD(快照) 原理 在某个时间点将内存中的数据写入一个磁盘的临时文件,持久化结束后,用这个临时文件替换上次持久化的文件。 配置文件 save 900 1 # 在900秒内如果键值修改过1次就快照 save 300 10 # 在300秒内如果键值修改过10次就快照 save 60 10000 # 在60秒内键值修改过10000次就快照 stop-writes-on-bgsave-error yes # 后台备份出错时,是否禁止新的写入操作? 如果不禁止容易造成数据不一致 rdbcompression yes # 导出的rdb文件是否压缩 rdbchecksum yes # 恢复时导入rdb文件是否检验完整性、是否检验版本是否一致 dbfilename dump.rdb # 导出来得rdb文件名 dir /var/lib/redis # rdb的存放路径 二、AOF 原理 通过将发送到服务器的写操作命令记录下来,形成AOF文件,此文件只许追加不能修改,Redis启动时会读取AOF文件后重构数据(重新执行一遍)。文件默认名称是appendonly.aof 配置文件 appendonly no # 是否开启aof功能 appendfilename "appendonly.aof" # 文件名 appendfsync always # 只要一修改就同步至缓冲区,并同步至磁盘 appendfsync everysec # 每秒将数据同步至缓冲区,并同步至磁盘 appendfsync no # redis不设定同步策略,由内核设定的参数决定是否同步 no-appendfsync-on-rewrite no # appendfsync设定为always或everysec的话,还要不要同步磁盘 auto-aof-rewrite-percentage 100 # 每隔多久重构aof文件,单位秒 auto-aof-rewrite-min-size 64mb # aof文件最小为多少时重构一次aof文件。搭配上一条使用 aof-load-truncated yes # 崩溃修复后自动进行全备 aof重写、重构 将大量重复的命令合并成一条命令,而不必频繁的去重新执行每一条命令. 三、AOF对比RDB AOF更加安全,可以将数据即时同步到文件中,但是消耗磁盘I/O,效率低 Snapshot更高效,它是服务器在正常运行情况下数据同步最佳手段,文件尺寸小,效率高,安全性低 注:RDB与AOF同时开启 默认使用AOF来恢复数据 四、常用架构 架构良好的环境中:Master使用AOF,Slave使用snapshot。原因是主要确保数据完整,从要速度快。 网络环境较差:建议使用master与slave同时使用AOF更加安全 网络良好、需要收密集型写操作:建议Master采用snapshot,Slave采用AOF
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。 一、安装Redis Redis配置文件:/etc/redis.conf Redis主程序:/usr/bin/redis-server 客户端工具:/usr/bin/redis-cli 默认监听端口:6379 数据目录:/var/lib/redis 服务脚本:/usr/lib/systemd/system/redis.service yum install redis # 基于CentOS7的epel源 二、连接Redis Redis的客户端命令工具为redis-cli,默认连接本地的Redis服务。 如果需要远程连接则使用redis-cli -h HOST -p PORT -a PASSWD [root@cache1 ~]# redis-cli 127.0.0.1:6379> ping # 使用ping命令测试与服务的连接性 PONG # 服务端回复pong则说明网络连接没有问题 三、Redis数据类型 String(字符串) string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。 string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。 string类型是Redis最基本的数据类型,一个键最大能存储512MB。 Hash(哈希) Redis hash 是一个键值(key=>value)对集合。 Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。 List(列表) Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。 Set(集合) Redis的Set是string类型的无序集合。 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 zset(sorted set:有序集合) Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。 zset的成员是唯一的,但分数(score)却可以重复。 四、获取帮助 help @ + 双击tab # 双击tab会出现各种子命令的帮助 help @string # 字符串相关的配置 help @list # 列表相关的配置;列表类似于数组 help @set help @hash ...... 五、List相关的命令 其他几个数据类型比较简单,通过帮助就能获得命令的使用方法。最简单的办法就是百度。由于List相关的命令仅仅看帮助的话很难理解一些操作,所以拿出来单独讲讲最常用的几个命令 示例: 127.0.0.1:6379> LPUSH stu aubin # LPUSH,向列表左侧添加元素,列表不存在自动创建 (integer) 1 127.0.0.1:6379> RPUSH stu 22 # RPUSH,向列表右侧添加元素,列表不存在则自动创建 (integer) 2 127.0.0.1:6379> RPUSHX stu nan # RPUSHX,如果列表存在则右侧添加元素 (integer) 3 127.0.0.1:6379> LPUSHX stu linux # LPUSHX,如果列表存在则左侧添加元素 (integer) 4 127.0.0.1:6379> LRANGE stu 0 10 # LRANGE,显示名为stu的列表的0-10个值 1) "aubin" 2) "22" 3) "nan" 4) "linux" LPOP stu # 左弹,删除名为stu列表中的第一个元素 RPOP stu # 右弹,删除名为stu列表中的最后一个元素 LREM stu 3 aubin # 从头到尾删除3个值为aubin的元素 LREM stu -3 aubin # 从尾到头删除3个值为aubin的元素 LREM stu 0 aubin # 删除所有值为aubin的元素
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。 诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。目前Tomcat最新版本为9.0。 一、Tomcat体系架构 核心组件 server:相当于一个tomcat实例。接收并解析请求信息;完成相关动作后把响应结果返回给计算机。service:每个server包含多个service,相互独立,仅共享JVM以及类库。用于把连接器(connector)与引擎(engine)关连起来,且一个service只能有一个engine,但是可以有多个connector。因为engine无法直接接受连接器发来的数据。connector:负责开启socket并监听客户端请求、返回响应数据。多个connector监听多个端口engine:负责具体的处理请求,connector仅仅负责监听,收到数据后交给engine运行。host:在ngine中可以包含多个host,每个host定义了虚拟主机context:每个context可以部署一个web应用。一个host可以存在多个context。如果部署多个应用需要分别对每个应用装载所依赖的库,这个步骤可以自动可以手动。 二、Tomcat的安装 tomcat其实就是一个JAVA程序,所以要运行在JAVA虚拟机中。要运行虚拟机就要先安装JDK。 1.JDK的安装 1.通过YUM安装 yum install java-1.8.0-openjdk-devel 2.配置环境变量 vim /etc/profile.d/java.sh export JAVA_HOME=/usr/java/latest # 首先定义JAVA_HOME的环境变量 export PATH=$JAVA_HOME/bin:$PATH # 然后向后追加即可 ###2.Tomcat的安装 首先要从Tomcat的官网下载Tomcat,然后上传至服务器解压。 https://tomcat.apache.org 1.将下载的软件包解压 tar xf apache-tomcat-VERSION.tar.gz -C /usr/local/ cd /usr/local 2.创建软连接,或者将解压的tomcat直接改名为tomcat也能达到同样的效果 ln -sv apache-tomcat-VERSION tomcat 3.添加环境变量 vim /etc/profile.d/tomcat.sh export CATALINA_BASE=/usr/local/tomcat export PATH=$CATALINA_BASE/bin:$PATH 4.创建tomcat需要的用户 useradd tomcat 5.将安装包的路径下的所有属组都改为tomcat chown -R root.tomcat /usr/local/tomcat # 设定所有者为root,所属组为tomcat chown -R tomcat /usr/local/tomcat/{logs,temp,work,webapps} # 仅将需要有写权限文件所有者改为tomcat chmod g+r /usr/local/tomcat/conf # 默认没有权限,会导致启动失败 5.切换到tomcat用户最后启动服务即可 su - tomcat catalina.sh start # 启动tomcat。catalina.sh命令需要先添加环境变量 三、Tomcat服务的配置文件结构 bin: 脚本、以及Tomcat自身所携带的工具包 conf: Tomcat服务的配置文件目录; lib: 库文件,Java类库,jar; logs: 日志文件目录; temp: 临时文件目录; webapps:webapp的默认目录;相当于页面的根目录。部署的应用都应该在IC目录下 work: 工作目录,存放编译后的字节码文件; 四、部署测试页面 创建一个测试页面,将下面的步骤全部做完后,通过浏览器访问http://IP:8080/test 即可访问到测试的页面 1.创建文件夹,classes、lib、WEB-INF为一个标准应用应该有的目录,这里创建仅仅为了与标准看齐 mkidr -pv /usr/share/tomcat/webapps/test/{classes,lib,WEB-INF} 2.创建一个测试页面用于检验Tomcat服务是否能正常提供服务 vim /usr/local/tomcat/webapps/test/index.jsp # 创建jsp测试页面 <%@ page language="java" %> <%@ page import="java.util.*" %> <html> <head> <title>Test Page</title> /head> <body> <% out.println("hello world"); %> </body> </html 3.重启服务 systemctl restart tomcat 4.部署完成后在webapp目录自动生成一些目录 cd /usr/share/tomcat/work/Catalina # 部署完成后自动生成的test目录下的文件 [root@localhost Catalina]# tree . . └── localhost # 默认主机站点 ├── _ ├── docs ├── examples ├── host-manager ├── manager ├── sample └── test # webpp应用名称。自动生成以下目录 └── org └── apache └── jsp ├── index_jsp.class └── index_jsp.java 五、Tomcat的至 配置文件 1.service组件 前面讲到connecotr负责接收用户请求,而engine负责接处理用户请求。但是connecotr并不能与engine直接通信。所以service就是负责将connector与engine连接起来的组件 <Service name="Catalina"> 2.connector组件 connector负责接收客户端发来的请求,常见的连接有三种:http、https、ajp 进入tomcat的请求可分为两类: (1) standalone : 请求来自于客户端浏览器; (2) 由其它的web server反代:来自前端的反代服务器,通过反带服务器发来的又有以下几种; nginx --> http connector --> tomcat httpd(proxy_http_module) --> http connector --> tomcat httpd(proxy_ajp_module) --> ajp connector --> tomcat httpd(mod_jk) --> ajp connector --> tomcat 示例 <Connector port="8080" # 默认有两个connector一个监听http一个监听ajp protocol="HTTP/1.1" # 如果是http可以无需指明协议。AJP的话Protocol="AJP/1.3" connectionTimeout="20000" # 超时时长,毫秒即20s redirectPort="8443" # 如果请求的为SSL请求就将请求转发至8443端口 address: # 监听的IP地址;默认为本机所有可用地址;不写就监听本地所有IP maxThreads: # 最大并发连接数,默认为200; enableLookups: # 是否启用DNS查询功能;将IP地址解析为域名。关闭提升性能 acceptCount: # 等待队列的最大长度; secure: # =true的表示使用SSL通信 sslProtocol: # 设定使用哪个SSL协议,通常在tomcat上不建议使用SSL,速度太慢 /> 3.Engine组件 Engine组件负责处理发来的请求。 Engine是Servlet实例,即servlet引擎,其内部可以一个或多个host组件来定义站点; 通常需要通过defaultHost来定义默认的虚拟主机。 示例 <Engine name="Catalina" defaultHost="localhost"> name=Catalina # 引擎的名称 defaultHost="localhost" # 默认的响应主机站点。如果找不到合适,或者域名不匹配选择默认host jvmRoute= # Tomcat做集群时的调度标志,类似于HAproxy的会话标识。 # 在基于cookie绑定时会用到 ... <Engine> 4.Host组件 Host组件位于engine内部用于接收请求并进行相应处理的主机或虚拟主机 <Host name="localhost" # 设定为主机名即可 appBase="webapps" # webapps的默认存放路径(相对路径,可以用绝对路径)。相当站点根 unpackWARs="true" # true为自动展开WAR文件 autoDeploy="true"> # 是否开启自动部署功能。 #unpackWARS、autoDeploy定义了WebAPP为WAR格式且在根下时自动部署 </Host> 5.Context组件 包含在Host标签里。 如果在一个主机上部署多个app的话,Context就可以用来定义不同app对应的路径。 <Context path="/PATH" # 网页的RUL docBase="/PATH/TO/SOMEDIR" # 真实路径。 reloadable=""/> # 如果为true说明可以重新装载 6.valve组件 Valve存在多种类型: 定义访问日志:org.apache.catalina.valves.AccessLogValve 定义访问控制:org.apache.catalina.valves.RemoteAddrValve <Valve className="org.apache.catalina.valves.AccessLogValve" # 定义记录日志要访问的类 directory="logs" # 日志文件的目录路径,默认在/var/log/tomcat下 prefix="node1_test_access_" # 日志文件的前缀 suffix=".log" # 日志文件的后缀 pattern="%h %l %u %t &quot;%r&quot; %s %b" /> # 记录日志的格式 pattern="%h %l %u %t &quot;%r&quot; %s %b" />
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。 一、Memcached简介 Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。 Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric为首开发的一款软件。现在已成为mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重要因素。 Memcached是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用、API调用或者是页面渲染的结果。 Memcached简洁而强大。它的简洁设计便于快速开发,减轻开发难度,解决了大数据量缓存的很多问题。它的API兼容大部分流行的开发语言。 本质上,它是一个简洁的key-value存储系统。 一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。 二、Memcached的特性 memcached作为高速运行的分布式缓存服务器,具有以下的特点。 协议简单 基于libevent的事件处理 内置内存存储方式 memcached不互相通信的分布式 三、Linux下的安装使用 yum install memcached 如果缺少其他包请安装以下组件 yum groupinstall "Development Tools" 四、Memcached配置文件 Memcached的配置文件非常的简单,如果不需要改动就按默认的然后直接启动即可。 主程序:/usr/bin/memcached 配置文件:/etc/sysconfig/memcached # cat /etc/sysconfig/memcached PORT="11211" # memechaced监听的端口 USER="memcached" # 运行程序的用户 MAXCONN="1024" # 最大并发连接数 CACHESIZE="64" # 缓存大小 OPTIONS="" 五、Memcached的运行命令 /usr/local/memcached/bin/memcached -h -d是启动一个守护进程; -m是分配给Memcache使用的内存数量,单位是MB; -u是运行Memcache的用户; -l是监听的服务器IP地址,可以有多个地址; -p是设置Memcache监听的端口,,最好是1024以上的端口; -c是最大运行的并发连接数,默认是1024; -P是设置保存Memcache的pid文件。 作为后台程序运行 /usr/local/memcached/bin/memcached -p 11211 -m 64m -d 六、Memcached的连接 memcached默认没有认证机制,可借用于SASL进行认证;所以要想连接memcahced的话直接使用最简单的telnet命令即可连接 telnet 127.0.0.1 11211 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. set foo 0 0 3 保存命令 bar 数据 STORED 结果 get foo 取得命令 VALUE foo 0 3 数据 bar 数据 END 结束行 quit 退出
Nginx的静态处理能力很强,但是动态处理能力不足,因此,在企业中常用动静分离技术。动静分离技术其实是采用代理的方式,在server{}段中加入带正则匹配的location来指定匹配项针对PHP的动静分离:静态页面交给Nginx处理,动态页面交给PHP-FPM模块或Apache处理。在Nginx的配置中,是通过location配置段配合正则匹配实现静态与动态页面的不同处理方式 一、项目简述 部署wordpress实现整个网站的动静分离,实现如下要求: 1.前端Nginx收到静态请求,直接从NFS中返回给客户端。 2.前端Nginx收到动态请求转交给通过FastCGI交给PHP服务器处理。 ----如果得到静态结果直接从NFS取出结果交给Nginx然后返回给客户端。 ----如果需要数据处理PHP服务器连接数据库后将结果返回给Nginx 3.前端Nginx收到图片请求以.jpg、.png、.gif等请求交给后端Images服务器处理。 二、整体架构图 三、配置详解 1.NFS服务器配置 vim /etc/exports /app/blog 10.10.0.0/24(ro,sync,root_squash,no_all_squash) # 只允许内网网段挂载,提高安全性。 # # cd /app/blog # 将wordpress文件解压 tar -xvf wordpress-4.8.1-zh_CN.tar.gz 2.Nginx服务器配置 首先Nginx与PHP服务器都要挂载NFS。实现统一部署方便管理 mount 10.10.0.72:/app/blog /app/blog # 将NFS的/app/blog挂载至本地的/app/blog 然后再配置Nginx Nginx主要是server中的location的配置。配置location将.php结尾的交给PHP服务器。将.jpg、gif结尾的交给Image。其他配置按默认即可。 vim /etc/nginx/nginx.conf http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; include /etc/nginx/conf.d/*.conf; server { listen 80 default_server; server_name www.shuaiguoxia.com; index index.php index.html; root /app/blog; # 根目录为挂载的NFS的挂载点 include /etc/nginx/default.d/*.conf; location ~* \.php$ { # location匹配将php结尾的交给PHP服务器 fastcgi_pass 10.10.0.22:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /app/blog$fastcgi_script_name; include fastcgi_params; } location ~* \.(jpg|gif)$ { # location匹配将图片交给Image处理 proxy_pass http://10.10.0.23:80; # Image服务器要开启web服务 } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } 3.PHP服务器配置 PHP服务器的配置比较简单,主要讲PHP以FPM模式安装后进行简单的配置即可 yum install php-fpm php-mysql vim /etc/php-fpm.d/www.conf listen = 9000 # 只写监听端口,即监听所有IP listen.allowed_clients = any # 允许所有IP进行访问。或者将这行注释。 4.MySQL服务器 yum install marirdb-server /usr/local/mysql/bin/myhsql_secure_installation #MySql初始化脚本,以下为每一项的翻译 是否设置root密码 输入密码 确认密码 是否设置匿名用户 是否允许root远程登录 删除test数据库 现在是否生效 mysql -uroot -p create database wpdb; # 创建wp数据库 grant all on wpdb.* to wpadm@'10.10.%' idenfied by 'centos'; # 授权用户。用户不存在系统会自动创建 5.Image服务器配置 yum install nginx # 安装Nginx cd /app/image # 将所有图片解压至此路径。图片的目录结构要保持原样 tar -xvf wordpress-4.8.1-zh_CN.tar.gz server { root /app/image; # 仅仅修改根目录这一行即可。Httpd同理 } # 如果使用apache要注意在CentOS7下默认拒绝所有 nginx start # 启动服务 6.配置wordpress cp wp-config-sample.php wp-config.php # 复制一个模板文件后改名作为主配置文件 vim wp-config.php /** WordPress数据库的名称 */ define('DB_NAME', 'wpdb'); # wpdb为MySQL中创建的数据库 /** MySQL数据库用户名 */ define('DB_USER', 'wpadm'); # wpadm为MySQL中授权的用户 /** MySQL数据库密码 */ define('DB_PASSWORD', 'centos'); # 授权用户的密码 /** MySQL主机 */ define('DB_HOST', '10.10.0.24'); # MySQL主机地址 至此配置就已经完成。达到了图片从图片服务器返回,静态nginx直接返回,动态交给PHP进行处理。 总结 1.前端Nginx要做好location匹配,将*.php与*.jpg等进行反向代理。 2.后端PHP服务器要修改配置文件,PHP自带配置文件只监听本地,且只允许本地访问 3.后端Image服务器,不论是apache还是Nginx要开启WEB服务。根目录要指向图片根目录,且根目录下的图片要与原本图片文件目录结构一致。
一、Nginx简介 1.1Nginx特性 模块化设计,较好的扩展性 高可靠性 支持热部署:不停机更新配置文件,升级版本,更换日志文件 低内存消耗:10000个keep-alive连接模式下的非活动连接,仅 需要2.5M内存event-driven,aio,mmap,sendfile 1.2Nginx的基本功能 静态资源的web服务器 http协议反向代理服务器 pop3/imap4协议反向代理服务器 FastCGI(lnmp),uWSGI(python)等协议 模块化(非DSO),如zip,SSL模块 1.3Nginx与web服务相关的功能 虚拟主机(server) 支持 keep-alive 和管道连接 访问日志(支持基于日志缓冲提高其性能) url rewirte 路径别名 基于IP及用户的访问控制 支持速率限制及并发数限制 重新配置和在线升级而无须中断客户的工作进程 Memcached 的 GET 接口 二、Nginx服务架构 master/worker结构 master进程:负责加载和分析配置文件、管理worker进程,平滑升级 worker进程:接收客户端请求、将请求一次送入各模块过滤、I/O调用、数据缓存、发送响应 cache相关进程:cache loader (缓存索引重建)与cache manager(缓存索引管理)组成 --Cache loader在Nginx服务启动后由主进程生成,根据本地磁盘上缓存建立索引元数据库后退出。 --Cache manager在元数据更新完成后,对元数据是否过期做出判断。 三、Nginx的配置文件结构 配置文件的组成部分 主配置文件:nginx.conf 子配置文件:include conf.d/*.conf fastcgi、uwsgi、scgi:等协议相关的配置文件。在根路径下 mime.types:支持的mime类型。在根路径下 四、基本配置实例讲解
在日常应用环境中,我们会遇到这样一种lvs部署环境,所有的dr以及的rs server都在一个局域网环境中,但只有一个公网ip,而又需要将应用发布到internet上,都知道lvs的最好的模式就是所有的server都有一个公网ip,但很多时候公网资源稀缺,当出现只有一个公网ip的时候,怎么实现lvs对外发布呢? 一、实验拓扑 二、整体环境 三、详细配置 路由器配置 eth0:公网IP接入INTERNET eth1:172.18.68.10(公网IP) #实验环境中使用172.18.68.10做公网IP eth2:10.10.0.1内网IP 在上面的配置中eth0、eth2、VIP一共使用了3个公网IP。还可以缩减成两个公网IP。 即eth1不配置公网IP,在路由上添加主机路由 route add -host 172.18.68.100 dev eth2 ,也能达到相同的效果。 VS调度器配置 在脚本中修改VIP、网卡名、端口、后端服务器然后执行脚本即可。 注意:关于vip,如果vip不在DIP所在的网段内,那么vip一定要配置在dr与后端RS Server直连的网卡上,不然就会出现无法访问的情况;也就是说VIP与RIP要配到同一个网卡上。 #!/bin/bash #Author:shuaiguoxia.com #Date:2017-10-23 vip='172.18.0.100' iface='eth0:1' mask='255.255.255.255' port='80' rs1='10.10.0.72' rs2='10.10.0.73' scheduler='wrr' type='-g' case $1 in start) ifconfig $iface $vip netmask $mask broadcast $vip up iptables -F ipvsadm -A -t ${vip}:${port} -s $scheduler ipvsadm -a -t ${vip}:${port} -r ${rs1} $type -w 1 ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w 1 echo "The VS Server is Ready!" ;; stop) ipvsadm -C ifconfig $iface down echo "The VS Server is Canceled!" ;; *) echo "Usage: $(basename $0) start|stop" exit 1 ;; esac 将以上代码保存为脚本,然后执行脚本即可 ./dr-vs.sh start #dr-vs.sh为脚本名 RS服务器配置 首先配置RS的内网IP地址,设定默认网关为10.10.0.1.然后运行下面脚本即可 #!/bin/bash #Author:shuaiguoxia.com #Date:2017-10-23 vip=172.18.68.100 mask='255.255.255.255' dev=lo:1 case $1 in start) echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce ifconfig $dev $vip netmask $mask broadcast $vip up route add -host $vip dev $dev echo "The RS Server is Ready!" ;; stop) ifconfig $dev down echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore3 echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce echo "The RS Server is Canceled!" ;; *) echo "Usage: $(basename $0) start|stop" exit 1 ;; esac 将以上代码保存为脚本,然后执行脚本即可 ./dr-rs.sh start #dr-rs.sh为脚本名 注意 注意:关于vip,如果vip不在DIP所在的网段内,那么vip一定要配置在dr与后端RS Server直连的网卡上,不然就会出现无法访问的情况;也就是说VIP与RIP要配到同一个网卡上。
一、lvs介绍 LVS的英文全名为“Linux Virtual Server”,即Linux虚拟服务器,是一个虚拟的四层交换器集群系统,根据目标地址和目标端口实现用户请求转发,本身不产生流量,只做用户请求转发,目前是负载均衡性能最好的集群系统。 二、lvs集群的类型: lvs-nat:修改请求报文的目标IP,多目标IP的DNAT lvs-dr:操纵封装新的MAC地址 lvs-tun:在原请求IP报文之外新加一个IP首部 lvs-fullnat:修改请求报文的源和目标IP 三、常用的名词 VS:Virtual Server,虚拟服务器,也称为Director RS:Real Server(lvs),真正的服务器,集群中各节点 CIP:客户端IP VIP:Director向外部提供服务的IP RIP:集群节点的服务器IP DIP:Director与RS通信的IP 四、LVS的三种类型 1、LVS-NAT 原理简述 客户端向VIP发起请求连接,Director在经过调度之后选取RS,将本地端口与RS的端口做映射,然后RS返还数据Director将数据返还客户端LVS-NAT特性 1.RIP的网关必须与网关指向DIP 2.可以使用端口映射;即Director将客户端请求的IP端口转换为真是服务器的iP与端口 3.Director会成为系统的瓶颈所在, 4.RS可以为任意的操作系统 5.每台后端服务器的网关必须为调度器的内网地址 2、LVS-DR 原理简述 当客户端向VIP发起请求时,[源CIP;目的VIP]数据包通过路由器发送到Director。然后Director不修改其源IP目的iP。经过调度后将目的MAC改为RS的MAC,RS收到数据之后发现目的IP为本机的L0接口就将其收下,然后找到数据再将源IP改为L0目的IP为CIP直接通过公网返回给客户端架构特性 1.必须保证前端路由通过ARP地址解析将数据转发至Director,数据不能被RS接收 2.RS可以使用私网地址,也可以使用公网IP 3.Director只负责调度。 4.Director与RS必须在同一物理段中 5.不支持端口映射 6.RS的网关为前端路由,不能为Director 7.RS支持大多出OS(可以拒绝ARP响应的系统) 3、LSV-tull 原理简述 客户端向VIP发送请求时,[源CIP;目的VIP],Director经过调度轮询后选择一个RS后使用隧道技术再次封装后向RS发送【源DIP;目的RIP [源CIP;目的VIP]】,RS通过隧道收到请求后拆开数据后得到[源CIP;目的VIP],发现目的IP为自己L0接口的IP得,后就把数据收下,找到数据后将数据直接通过公网返还给客户端[源VIP;目的CIP]特性 1.RIP、DIP、VIP必须为公网IP 2.RS网关不指向Director 3.请求报文由Director转发至RS,回复报文由RS直接发送至客户端 4.不支持端口映射 5.RS的OS必须支持隧道技术 6.Director与RS、RS与RS可以跨网段、跨机房。
一、需求分析 1.前端需支持更大的访问量,单台Web服务器已无法满足需求了,则需扩容Web服务器; 2.虽然动态内容可交由后端的PHP服务器执行,但静态页面还需要Web服务器自己解析,那是否意味着多台Web服务器都需要在各自的系统中都存有一份静态页面数据呢?那么如果能将静态页面集中存放,所有Web服务器都来集中地取文件,对于文件的一致性就有了保障,这个集中地就叫做“文件共享服务器”; 二、需求实现: 1.web1充当http服务器和DNS解析服务器,客户端到web1和web2的请求,如果是静态资源请求通过php主机的NFS服务挂载的存储返回结果 2.web1和web2对于客户端动态资源请求都反向代理到后端php服务器进行执行后返回结果 3.web1和web2实现DNS轮询,客户端访问博客网站是负载均衡的。 4.建立wordpress博客 5.数据库存储wordpress博客的各种数据 三、架构图 四、步骤概述 1.部署LAMP环境、配置NFS服务器 2.web1、web2、php服务器全部挂载NFS共享目录为网站根目录 3.配置httpd实现动静分离 4.配置DNS实现负载均衡 五、详细过程 1.web1、web2服务器编译安装Apache # 安装依赖包 yum groupinstall "development tools" yum install openssl-devel expat-devel pcre-devel # # 解压文件 tar xvf apr-1.6.2.tar.gz tar xvf apr-util-1.6.0.tar.gz tar xvf httpd-2.4.27.tar.bz2 cp -r apr-1.6.2 httpd-2.4.27/srclib/apr cp -r apr-util-1.6.0 httpd-2.4.27/srclib/apr-util # # 编译安装 cd httpd-2.4.27/ ./configure \ --prefix=/app/httpd24 \ --sysconfdir=/etc/httpd24 \ --enable-so --enable-ssl \ --enable-rewrite --with-zlib \ --with-pcre --with-included-apr \ --enable-modules=most \ --enable-mpms-shared=all \ --with-mpm=prefork # make && make install # #配置环境变量 vim /etc/profile.d/lamp.sh PATH=/app/httpd24/bin/:$PATH . /etc/profile.d/lamp.sh # # 启动服务 apachectl start 2.数据库服务器二进制安装mariadb # 解压文件 tar xvf mariadb-10.2.8-linux-x86_64.tar.gz -C /usr/local/ cd /usr/local # # 创建软连接,mariadb在/usr/local下必须名为mysql,可以创建软连接,可以改名 ln -s mariadb-10.2.8-linux-x86_64/ mysql # # 创建用户 useradd -r -m -d /app/mysqldb -s /sbin/nologin mysql cd mysql/ # # 初始化数据库 scripts/mysql_install_db --datadir=/app/mysqldb --user=mysql # # 创建配置文件 mkdir /etc/mysql cp support-files/my-large.cnf /etc/mysql/my.cnf # # 修改配置文件,指定数据库存放路径 vim /etc/mysql/my.cnf [mysqld] datadir = /app/mysqldb 在mysqld下添加这三行 innodb_file_per_table = ON skip_name_resolve = ON # # 复制启动脚本,添加开机自动启动 cp support-files/mysql.server /etc/init.d/mysqld chkconfig --add mysqld chkconfig --list service mysqld start # # 创建日志目录 mkdir /var/log/mariadb chown mysql /var/log/mariadb/ # #添加环境变量 vim /etc/profile.d/lamp.sh PATH=/app/httpd24/bin/:/usr/local/mysql/bin/:$PATH . /etc/profile.d/lamp.sh # #调用安全加固脚本,加固数据库。汉字为每一项的翻译 mysql_secure_installation 是否设置root密码 输入密码 确认密码 是否设置匿名用户 是否允许root远程登录 删除test数据库 现在是否生效 3.PHP应用服务器编译安装PHP7 # 安装依赖包 yum install libxml2-devel bzip2-devel libmcrypt-devel gcc openssl-devel tar xvf php-7.1.7.tar.bz2 # #编译安装 cd php-7.1.7.tar.bz2 ./configure \ --prefix=/app/php \ --enable-mysqlnd \ #mysqlnd 指明Mysql不再本地 --with-mysqli=mysqlnd \ --with-pdo-mysql=mysqlnd \ --with-openssl \ --enable-mbstring \ --with-freetype-dir \ --with-jpeg-dir \ --with-png-dir \ --with-zlib \ --with-libxml-dir=/usr \ --enable-xml \ --enable-sockets \ --enable-fpm \ #用FPM模式 --with-mcrypt \ --with-config-file-path=/etc/php \ --with-config-file-scan-dir=/etc/php.d \ --with-bz2 # # 创建PHP配置文件 mkdir /etc/php/ cp php.ini-production /etc/php/php.ini # # 复制服务脚本,添加开机自动启动 cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm chmod +x /etc/init.d/php-fpm chkconfig --add php-fpm chkconfig --list php-fpm # # 创建fpm的配置文件 cd /app/php/etc cp php-fpm.conf.default php-fpm.conf cd /app/php/etc/php-fpm.d/ cp www.conf.default www.conf vim www.conf listen = 172.18.68.23:9000 #设置监听的IP,注释监听所有, 只写端口监听鄋 ;listen.allowed_clients = 127.0.0.1. #把这项注释掉,分号为注释 systemctl start php-fpm 4.配置NFS服务器 NFS服务器的配置特别简单,最重要的时配置完后就赶紧将NFS共享目录挂载至web1、web2、PHP服务器的网站根目录。 mkdir -pv /app/nfs/web #创建共享目录,此目录为网站的根目录,实现统一管理。 vim /etc/exports /app/nfs/web 172.18.0.0/16(ro,sync,root_squash,no_all_squash) # 允许172.18.0.1网段挂载NFS共享,如果要提高安全性应该控制到主机 Web1服务器 mount 172.18.68.24:/app/nfs/web /app/httpd24/htdocs #/app/httpd24/htdocs为httpd.conf中的根目录 Web2服务器 mount 172.18.68.24:/app/nfs/web /app/httpd24/htdocs #/app/httpd24/htdocs为httpd.conf中的根目录 PHP应用服务器 mkdir /app/httpd24/htdocs #PHP没有根目录,/app/httpd24/htdocs为NFS的挂载点。 mount 172.18.68.24:/app/nfs/web /app/httpd24/htdocs 5.配置Apache实现动静分离 加载模块 vim /etc/httpd24/httpd.conf LoadModule proxy_module modules/mod_proxy.so #取消两行的注释,加载两模块 LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so 动静分离 在配置文件的末尾追加这四行,利用代理将所有以.php结尾的文件交给PHP服务器处理,实现动静分离 vim /etc/httpd24/httpd.conf AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps ProxyRequests Off 关闭正向代理 ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/app/httpd24/htdocs/$1 #要确保PHP服务器中有这个目录,(在NFS中创建这个目录,且将NFS挂载至此目录。) apachectl restart 6.部署wordpress博客 因为web1、web2、PHP服务器都使用NFS共享的目录作为根目录,所以只需要将wordpress博客系统部署在NFS服务器上即可让所有服务器得到同样的数据。 安装博客程序 # 解压博客程序 tar xvf wordpress-4.8.1-zh_CN.tar.gz -C /app/httpd24/htdocs cd /app/httpd24/htdocs mv wordpress/ blog/ # 创建配置文件 cd /app/httpd24/htdocs/blog/ cp wp-config-sample.php wp-config.php 配置数据库 wordpress需要数据库,所以在此先创建一个wordpress专用的数据库,且创建授权用户。 mysql -uroot -pcentos create datebase wpdb; grant all on wpdb.* to wpuser@'172.18.68.%' identified by 'centos'; 配置wordpress连接数据库 # 编辑配置文件,写入创建的IP、数据库、与用户性 vim wp-config.php define('DB_NAME', 'wpdb'); # /** MySQL数据库用户名 */ define('DB_USER', 'wpuser'); # /** MySQL数据库密码 */ define('DB_PASSWORD', 'centos'); # /** MySQL主机 */ define('DB_HOST', 'localhost'); 7.登录测试 浏览器打开,http://IP,设置管理员的用户名密码,点击安装 输入用户名密码,即可进入博客网站的后台页面。 默认风格的博客页面首页,还是比较好看滴、 8.配置DNS负载均衡 购买了单独域名后,在后台控制面板中添加两条A记录,就可以达到负载均衡。 到这里基于LAMP+NFS架构的双Web服务器、动静分离网站就搭建完成了。 双WEB服务器架构的好处在于如果有一台服务器宕机不会是整个网站瘫痪。 NFS共享存储的好处在于,DNS负载均衡后,不论用户被分配到哪台主机上,都能看到相同的页面得到相同的结果。
一、简介 1、LogAnalyzer 是一款syslog日志和其他网络事件数据的Web前端。它提供了对日志的简单浏览、搜索、基本分析和一些图表报告的功能。数据可以从数据库或一般的syslog文本文件中获取,所以LogAnalyzer不需要改变现有的记录架构。基于当前的日志数据,它可以处理syslog日志消息,Windows事件日志记录,支持故障排除,使用户能够快速查找日志数据中看出问题的解决方案。 2、LogAnalyzer 获取客户端日志会有两种保存模式,一种是直接读取客户端/var/log/目录下的日志并保存到服务端该目录下,一种是读取后保存到日志服务器数据库中,推荐使用后者。 3、LogAnalyzer 采用php开发,所以日志服务器需要php的运行环境,本文采用LAMP。 二、架构图 所有主机将日志都交给日志日志服务器管理,日志服务器配置将所有存储在MySQL数据库中。 搭建Loganalyzer将日志服务器中的所有日志进行web展现于管理。 三、服务器环境 作用 系统 IP 前端调度 CentOS7.3 172.18.68.71 Web服务器1 CentOS7.3 172.18.68.72 Web服务器2 CentOS7.3 172.18.68.73 MySQL服务器1 CentOS7.3 172.18.68.74 MySQL服务器2 CentOS7.3 172.18.68.75 日志服务器 CentOS7.3 172.18.68.10 四、部署过程 1.所有服务器日志汇集至日志服务器 客户端配置 CentOS6和CentOS7默认使用Rsyslog记录系统日志,他的优点在与多线程,可以通过TCP、UDP发送,可是下MySQL存储等等。 Rsyslog的主配置文件问为/etc/rsyslog.conf,所以要在所有客户端中编辑主配置文件,把所有的日志全部发送至远程主机管理。 # 在所有客户端服务器编辑一下配置文件 [root@tiaobanji ~]# vim /etc/rsyslog.conf *.info;mail.none;authpriv.none;cron.none @172.18.68.10 #重启服务 systemctl restart rsyslog 服务端配置 将Rsyslog默认不接受其他主机传来的日志信息。只要编辑配置文件加载TCP、UDP模块,并且监听端口,就可以接收其他主机传来的日志信息。 #将一下四行注释取消 [root@tiaobanji ~]# vim /etc/rsyslog.conf $ModLoad imudp $UDPServerRun 514 $ModLoad imtcp $InputTCPServerRun 514 2.配置服务端--将日志存储在数据库 Rsyslog默认将日志文件存储在本地,可以通过配置文件将其修改为存储在MySQL数据库中。不过这需要模块支持,需要先安装rsyslog-mysql软件包. # 安装rsyslog-mysql [root@tiaobanji ~]# yum install rsyslog-mysql -y 使用rpm -ql rsyslog-mysql看一下生成2个文件。一个是模块、一个是初始化数据库的SQL语句。只要编辑配置文件将模块加载,然后将sql语句导入至MySQL数据库服务器中即可。在数据库中创建的用户要与Rsyslog.conf的一致。 # 1.查看软件包 [root@tiaobanji ~]# rpm -ql rsyslog-mysql /usr/lib64/rsyslog/ommysql.so /usr/share/doc/rsyslog-7.4.7/mysql-createDB.sql # # 2.修改主配置文件 [root@tiaobanji ~]# vim /etc/rsyslog.conf $ModLoad ommysql #:ommysql:数据库IP,数据库名,用户名,密码 *.info;mail.none;authpriv.none;cron.none :ommysql:172.18.68.74,Syslog,logadmin,centos # # 3.初始化数据库 [root@tiaobanji ~]# mysql -h172.18.68.74 -uroot -p </usr/share/doc/rsyslog-7.4.7/mysql-createDB.sql # # 4.授权用户 [root@tiaobanji ~]# mysql -h172.18.68.74 -uroot -p MariaDB [(none)]> grent all on Syslog.* to 'logadmin'@'172.18.68.%' identified by 'centos'; 3.部署LogAnalyzer前端展示 以上两个步骤就将所有服务器的日志全部汇集至日志服务器并存储在数据库中。接下来部署LogAnalyzer将日志用前端展示。 安装LogAnalyzer LogAnalyzer的部署非常简单在官网http://loganalyzer.adiscon.com/下载并解压,然后将解压文件中的src文件复制到httpd可以访问到的页面即可。 tar xf loganalyzer-4.1.5.tar.gz cp -a loganalyzer-4.1.5/src /var/www/html/loganalyzer cd /var/www/html/loganalyzer 配置LogAnalyzer 1、浏览器打开http://IP/loganalyzer后点击here 2、点击下一步 3、创建配置文件 LogAnalyzer安装时会在系统创建./config.php配置文件用于存储数据库用户名、密码等信息。但是它并没有权限,所有要手动创建个文件,并且赋予666权限。./config.php存储数据库的账号密码信息,由于这个文件仅仅才安装LogAnalyzer时需要666权限,所以在安装完毕后将其权限改为644更为妥当。 touch /var/www/html/loganalyzer/config.php chmod 666 /var/www/html/loganalyzer/config.php 4、配置数据库文件 在第三部创建完配置文件之后,就一直点击next。直到如图所示 这里会填写数据库相关的信息,一定要注意大小写,一定要手动填写表名,因为默认的是小写。 5、点击安装 一切都配置完毕,最后点击安装。如果不能安装成功可能是之前的数据库配置错误。只要将config.php删除然后重新安装即可。 6、测试 进入页面之后可以看到一些日志,那就说明所有的部署工作完成! 7、安全加固 记得前面创建了config.php文件吗?这个文件保存了数据库的账号密码ip等等。在安装前权限为666,但是在安装后就不需要读权限了所将其其改为644。 chmod 644 /var/www/html/loganalyzer/config.php 五、安装中文语言包 LogAnalyzer默认为中文,个人也是推荐使用英文。这里也提供中文语言包。http://download.csdn.net/download/qq_36120510/10015028 解压后将整个目录方至/var/www/html/loganalyzer/lang目录下。然后再次访问页面在右上角选择中文即可。
1.DNS 在浏览器中输入URL后,首先要进行DNS解析,DNS解析的顺序为: 浏览器缓存 本地hosts文件 系统缓存 路由器缓存 DNS服务器迭代查询 2.发送请求 通过DNS得到目标的IP地址后,通过TCP协议向服务器发送请求即三次握手。 3.服务器永久重定向响应 大多数的网站会将用户访问的地址永久重定向,这主要与缓存和搜索排名有关。 搜索排名方面:例如www.test.com与test.com搜索引擎认为是两个网站,不会将排名合并。如果使用重定向将test.com定向到www.test.com搜索引擎就会认为是一个页面将排名信息合并。 缓存方面:如果使用不同的地址,在缓存中出现好几次,缓存友好性变差 4.跟踪重定向地址 根据返回新重定向地址,重新发送新的http请求 5.处理HTTP请求,返回响应 建立连接:服务器允许客户端建立连接 接受请求:从网络中读取HTTP报文交给Nginx或者Apache进行规则匹配 处理请求:根据方法,资源,首部和可选的主体部分对请求进行处理 访问资源:寻找存储对象,访问报文中指定的资源 构建响应报文:创建有正确首部的HTTP响应报文 6.处理HTTP响应 发送响应:将响应会送给客户端 记录日志:将与已经完成的事务记录在一个日志文件中 7.浏览器解析显示 浏览器得到页面后会进行展示,如果还包含其他外部资源如图片、视频等等则继续请求其他资源。
背景介绍:总公司与北京分公司均由总公司进行统一管理。总公司的主从DNS担任解析总公司服务器与北京分公司的服务器解析任务。总公司DNS委派其他两个公司管理自己域下的服务器解析任务。要求任何一个节点都能解析到公司全部域名的结果。这里仅仅是搭建DNS服务器,以解析的结果为验证。所以暂不考虑网络方面的事情,只要确保DNS能相互解析就算配置成功。 一、步骤梳理 设定主从服务器的配置 设定主服务器字节区域解析数据库 将bj.jd.com子域分配给自己管理 将yd.jd.com、sh.jd.com分别委派给各自的服务器 子域服务器设定各自的区域解析数据库 子域服务器设定将jd.com域转发至主从服务器中 二、bind配置文件结构 本地解析文件 /etc/hosts 主配置文件 /etc/named.conf /etc/named.rfc1912.zones /etc/rndc.key 解析库文件 /var/named \----slaves #文件夹,当为slave,则在master同步的数据放在此文件 \----named.ca #互联网根的信息 \----name #自定义的数据文件放在此目录下 三、搭建过程 1.主DNS服务器 安装bind并配置DNS的主配置文件 //安装bind yum install bind // //配置bind的主配置文件 vim /etc/named.conf listen-on port 53 { 10.0.0.57; }; //设置监听的IP allow-query { any; }; //设置允许所有人访问DNS服务 forwarders { 114.114.114.114; }; //设定转发,本机没有的记录全部转发至其他DNS dnssec-enable no; //关闭DNS安全认证 dnssec-validation no; //关闭DNS安全确认 include "/etc/named.rfc1912.zones"; //引入外部区域配置文件 在区域配置文件/etc/named.rfc1912.zones创建新的解析区域 //修改区域配置文件 vim /etc/named.rfc1912.zones zone "jd.com" IN { //创建jd.com域 type master; //在jd域为主DNS file "jd.com.zone"; //区域数据库的配置文件名称,默认路径在/var/named/..... }; zone "bj.jd.com" IN { //创建子域bj.jd.com type master; //在子域中为主DNS file "bj.jd.com.zone"; //区域数据库的配置文件名称,默认路径在/var/named/..... }; 创建解析数据库文件,数据库默认全部在/var/named目录下,创建的区域数据库文件名一定要与上面配置的区域数据库名称一致。NS类型的记录为设置管理此域的服务器,因为配置了主从两个服务器所以要将两个服务器都创建NS记录。但是仅仅创建NS记录是不够的,因为客户端访问的时候不能知道到底谁是NS服务器,所以还需要给管理此域的服务器建立一条A记录,解析出管理此域的服务器。 vim /var/named/jd.com.zone $TTL 1D @ IN SOA dns1 root.jd.com. ( 16 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS dns1 //NS指定管理此域的服务器 NS dns2 //NS指定管理此域的服务器 sh NS dns.sh //将sh子域委派给sh.jd.com进行管理 yd NS dns.yd //将yd子域委派给sh.yd.com进行管理 dns1 A 10.0.0.57 //为管理此域的服务器与子域服务器创建A记录 dns2 A 10.0.0.56 dns.sh A 10.0.0.66 dns.yd A 10.0.0.67 www A 10.10.0.10 //为主服务器直接管理的解析记录创建A记录 oa A 10.10.0.11 sql A 10.10.0.12 因在/etc/named.rfc1912.zones文件中创建了两个区域,所以一共要对应两个区域解析数据库。上面创建的数据库时给jd.com创建的数据文件。现在需要创建的是bj.jd.com的数据库文件,也就是Master服务器自己管理的子域。因为总公司与北京分公司都在北京,所以主DNS直接自己管理自己的子域。 $TTL 1D @ IN SOA dns1 root.bj.jd.com. ( 5 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS dns1 NS dns2 dns1 A 10.0.0.57 dns2 A 10.0.0.56 ftp A 10.20.0.12 oa A 10.20.0.13 2.从服务器 修改从服务器的主配置文件 vim /etc/named.conf options { listen-on port 53 { 10.0.0.56; }; allow-query { any; }; recursion yes; dnssec-enable no; dnssec-validation no; }; include "/etc/named.rfc1912.zones"; 创建区域文件,因为从服务器只是同步主服务器的数据,所以不需要解析的数据库文件,只需要设定好谁是主服务器即可。 zone "jd.com" IN { //设定需要同步的区域,主从是相对于区域而言的所以要设定区域。 type slave; //设定服务器类型为slave从 masters { 10.0.0.57 ;}; //设定主服务器的IP地址 file "slaves/jd.com.zone"; //主服务配置文件都会在/var/named/slaves目录下,设定同步回来的数据库文件名 }; zone "bj.jd.com" IN { //含义与上面类似,这里设置同步自己管理的子域 type slave; masters { 10.0.0.57 ;}; file "slaves/bj.jd.com.zone"; }; 3.印度 后面印度分公司与上海分公司的配置除了设定一下需要转发的区域,其他的跟之前的主服务器配置都是大同小异。所以下面的仅仅对不通配置进行标注。 options { listen-on port 53 { 10.0.0.67; }; // listen-on-v6 port 53 { ::1; }; allow-query { any; }; recursion yes; dnssec-enable no; dnssec-validation no; }; include "/etc/named.rfc1912.zones"; 设定转发区域。由于子公司仅仅管理自己的yd.jd.com域,那公司内部需要访问总公司的域名,就需要将其转发至上游的总公司。 zone "yd.jd.com" IN { type master; file "yd.jd.com.zone"; }; zone "jd.com" IN { //设定转发,客户端访问jd.com域时全部转发至指定的服务器 type forward; forward first; forwarders {10.0.0.57;}; //设定转发至10.0.0.57服务器。 }; 创建印度分公司的区域解析文件 $TTL 1D @ IN SOA dns root.yd.jd.com. ( 1 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS dns dns A 10.0.0.67 oa A 10.40.0.13 ftp A 10.40.0.12 4.上海 修改主配置文件 options { listen-on port 53 { 10.0.0.66; }; listen-on-v6 port 53 { ::1; }; allow-query { any; }; recursion yes; dnssec-enable no; dnssec-validation no; }; include "/etc/named.rfc1912.zones"; 创建区域记录,设定转发 zone "sh.jd.com" IN { type master; file "sh.jd.com.zone"; }; zone "jd.com" IN { //设定转发,客户端访问jd.com域时全部转发至指定的服务器 type forward; forward first; forwarders {10.0.0.57;}; //设定转发至10.0.0.57服务器。 }; 创建上海分公司自己管理的区域解析文件。 $TTL 1D @ IN SOA dns root.sh.jd.com. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS dns dns A 10.0.0.66 ftp A 10.30.0.12 oa A 10.30.0.1 四、结果测试 将windwos的DNS设置为10.0.0.66,然后尝试解析10.0.0.67管理的域。成功得到解析结果。 五、测试工具 dig [-t type] name [@SERVER] [query options] dig只用于测试dns系统,不会查询hosts文件进行解析 #常用组合 dig www.taobao.com @10.0.0.10 #指定以10.0.0.10为DNS进行解析 dig +trace taobao.com #跟踪解析的过程 六、注意事项 权限:BIND安装时会创建一个用户,BIND运行也是用此用户的身份运行的。所以在解析的时候要确保创建的namde用户拥有对数据可的读权限。 端口:在bind的主配置文件named.conf确保监听的端口已经设置、确保可以对所有人提供DNS服务。 主从更新机制:当Master的版本号变大时,Slave才会同步Master上的数据。 SELinux:SELinux安全的可能让自己也无法访问服务,索性直接关闭 Iptables:当任何配置都没有错误的时候注意防火墙是否配置正确 创建委派:创建委派一定要将主主配置文件dnssec-enable与dnssec-validation设置为no 其他疑问:鸟哥的文章或许能解开你的疑惑鸟哥官网 七、安全相关 在全局配置文件中/etc/named.conf可以配置与安全相关的选项 allow-query {}: 允许查询的主机;白名单 allow-transfer {}:允许区域传送的主机;白名单 allow-recursion {}: 允许递归的主机,建议全局使用 allow-update {}: 允许更新区域数据库中的内容 七、实验中遇到的坑 启动服务时提示:Failed to start Berkeley Internet Name Domain (DNS).解决办法:多半是因为配置文件写错,根据systemclt status named 查看报警的具体配置 rndc reload同步配置rndc: neither /etc/rndc.conf nor /etc/rndc.key was found解决办法:这个是由于key的问题,可以忽略不管付传送门 添加域后重启服务提示 loading from master file sh.jd.com.zone; failed: file not found解决办法:检查主配置文件与数据库文件的名字是否相符 创建委派后提示:zone jd.com/IN: sh.jd.com/NS 'sh.jd.com' (out of zone) has no addresses records (A or AAAA)配置文件检查无误,返回但是解析无返回结果解决办法:在父域中创建委派,然后通过named-checkzone命令检查区域配置文件,一直提示A记录不存在。检查父域到子域能否ping通,检查子域防火墙是否关闭
简介 Cobbler是一个快速网络安装linux的服务,而且在经过调整也可以支持网络安装windows。该工具使用python开发,小巧轻便(才15k行python代码),使用简单的命令即可完成PXE网络安装环境的配置,同时还可以管理DHCP、DNS、以及yum仓库、构造系统ISO镜像。今天这里只介绍在企业中利用cobbler进行批量自动化安装centos。其他更多的功能这里不做介绍。如果想详细了解cobbler请百度 Cobbler部署指南 一、实现过程 1.自动安装过程 简单的来说客户端的电脑网卡带有并开启pxe功能,开机会自动获取IP地址、tftp地址、pexlinux文件名----->加载pxelinux.0、内核文件vmlinuz、伪文件系统initrd.img----->启动系统----->到pxelinux指定的tftp地址下载ks.cfg文件----->根据ks.cfg文件的去http、ftp、nfs寻找镜像、安装操作系统 客户端<-------IP---------DHCP服务器 客户端<----pxelinux----tftp服务器 客户端<----default------tftp服务器 客户端<-----ks.cfg------http、ftp、nfs 客户端<----镜像地址---http、ftp、nfs 客户端<----安装系统---http、ftp、nfs 2.基本配置文件结构 pxe批量部署操作系统就是通过以下几个服务共同完成的,cobbler工具是将几者更加集中地进行管理,使运维人员不需要在乎底层的工作。这里只介绍了cobbler用于批量部署系统用到的服务以及相关的文件。 dhcp /etc/dhcp/dhcp.conf 提供IP地址,提供tftp服务器、pexlinux文件名 tftp /var/lib/tftpboot/ 提供初始内核以伪文件系统 \---vmlinuz 内核文件 \---initrd.img 伪文件系统 \---menu.c32 菜单风格 \---pxelinux.0 启动文件 \---pxelinux.cfg \---default 指定ks.cfg文件的路径.ks.cfg指定了镜像的地址与安装的方式 httpd /var/www/html/centos 提供ks.cfg或镜像 ftp /var/ftp/pub/centos 提供ks.cfg或镜像 cobbler 管理力工具,将几者集中管理 3.cobbler命令的使用 cobbler commands 介绍 cobbler check 核对当前设置是否有问题 cobbler list 列出所有的cobbler元素 cobbler report 列出元素的详细信息 cobbler sync 同步配置到数据目录,更改配置最好都要执行下 cobbler reposync 同步yum仓库 cobbler distro 查看导入的发行版系统信息 cobbler system 查看添加的系统信息 cobbler profile 查看配置信息 二、实现步骤 1. 前期准备 iptables -F systemctl stop firewalld.service systemctl disable firewalld.service setenforce 0 vim /etc/selinux/config 修改为SELINUX=disabled 2.安装软件 yum install cobbler dhcp tftp ftp httpd systemctl enable cobblerd systemctl start cobblerd systemctl enable tftp systemctl start tftp systemctl enable httpd systemctl start httpd 3.配置cobbler 检查cobbler配置文件,根据提示修改参数cobbler check可以检查cobbler的各项参数,以提示那些没有修改好的错误,如果有些报错你更改后还在提示那么可以忽略提示。 cobbler check 编辑cobbler配置文件 每次修改cobbler的配置文件后都要重启服务,并更新配置文件 vim /etc/cobbler/settings next_server: 192.168.25.107 #设置tftp地址 manage_dhcp: 1 #cobberl接管dhcp server: 192.168.25.107 #cobbler的地址,也就是本机地址。 pxe_just_once: 1 #cobbler接管pxe systemctl restart cobblerd #重启服务 cobbler sync #更新配置 生成dhcp模板dhcp.template时cobberl的dhcp模板文件,当cobberl更新配置时就会把这些模板文件覆盖服务的配置文件。比如这个dhcp模板一旦执行cobbler sync就会将dhcp的默认模板就行覆盖。 vim /etc/cobbler/dhcp.template #设定子网段,限定可以分配的地址范围 subnet 192.168.25.0 netmask 255.255.255.0 { range dynamic-bootp 192.168.25.100 192.168.25.254; } cobbler sync 生成启动文件 当安装完tftp服务后会自动在tftp的目录下生成菜单文件、启动文件。前面也说明了cobbler的机制时将自己的模板文件覆盖至服务的配置文件,但是cobbler默认没有菜单文件、启动文件的模板。那就需要手动创建cobbler的tftp模板文件,可以通过外网直接下载,也可以将tftp的文件复制到cobbler中然后在通过cobbler修改即可。 #服务器连接了外网 cobbler get-loaders #服务器没有连接外网可以直接复制 cp /var/lib/tftpboot/{menu.c32,pxelinux.0} /var/lib/cobbler/loaders 导入yum源 导入的过程也就是cobbler将源文件复制到/var/www/cobbler/ks_mirror的过程。/var/www时httpd服务目录cobbler将镜像源复制到httpd目录中,这个路径也就是ISO的镜像的路径。可以通过导入不同的yum源来实现多系统安装。 cobbler import --path=/mnt/cdrom/centos7 --name=centos7.3 --arch=x86_64 cobbler import --path=/mnt/cdrom/centos6 --name=centos6.9 --arch=x86_64 # --path 光盘的路径,也可以使用ftp、http等yum源地址 # --name 镜像名称可以随便写,便于cobbler的管理 # --acrh 指定架构如果不指定架构,cobbler会分别创建两个架构的镜像 # 但是镜像本身就是64位的所以创建两个没有必要,因此直接指定架构 cobbler distro list #查看创建的yum源 生成ks文件 生成ks.cfg文件有两种方式,一种是通过vim手动创建,一种是通过工具生成。我个人还是比较推荐工具生成,因为ks.cfg文件配置众多通过工具生成更加稳定。 cobbler在导入yum源时发现没有合适的ks文件,就默认创建了一个ks文件但这个ks文件是不可用的,直接将他删除 注意如果是手动创建ks文件的话,要将本地启动设为默认项,否则的话用户没有来得即选就直接安装操作系统,而你又正好配置了清空磁盘、清空分区表,那用户的系统将被重新安装。 # 删除默认创建的ks文件 cobbler profile list cobbler profile remove --name=centos6.9-x86_64 cobbler profile remove --name=centos7.3-x86_64 # 创建ks文件 system-config-kickstart #kickstart图形化生成工具,生成完毕后记得点击左上角的file将其保存 cp centos6.cfg centos7.cfg /var/lib/cobbler/kickstarts/ #将生成的ks文件复制到cobbler模板目录下 # 将创建的ks文件导入cobbler cobbler profile add --name=centos6.9_desktop --distro=centos6.9-x86_64 --kickstart=/var/lib/cobbler/kickstarts/centos6.cfg cobbler profile add --name=centos7.3_mini --distro=centos7.3-x86_64 --kickstart=/var/lib/cobbler/kickstarts/centos7.cfg # add 增加配置 # --name 名称可以随便写便于cobbler管理 # --distro 指定yum源,也就是之前导入的yum源,如果导入了多个yum源需要一一对应 # --kickstart 自己生成ks文件的路径,cobbler会将你自己生成的ks文件转换成cobbler可以识别的ks文件 cobbler sync 同步配置 #创建完成的ks文件中url这一项可以使用$tree来代替。cobbler会自动将其替代 三、测试 将机器与cobbler接入同一vlan中,开机后会自动进入pxelinux界面。让用户选择是通过本地启动还是安装操作系统。现在只需要敲下回车即可自动安装操作系统。 四、cobbler的web端管理 cobbler可以通过安装web服务使管理更加的便捷。 安装 yum install cobbler-web 配置认证方式 打开modules.conf配置文件,可以看到cobbler支持众多的用户登录认证方式。常用的认证方式有两种认证方式,第一种为cobbler默认的authn_configfile通过配置文件认证。第二种为authn_pam通过PAM模块来认证即系统用户。 基于配置文件的认证方式。此方式为系统默认的认证方式,确认 module = authn_configfile即可。 # 修改配置文件 vim /etc/cobbler/modules.conf [authentication] module = authn_configfile # <-------仅修改了这里 # 创建认证用户 aubin,仅在创建第一用户时使用 -c选项创建后续的用户则不在使用 # 倒数第二个参数是relam的名称必须为Cobbler且第一个字母为大写 htdigest -c /etc/cobbler/users.digest Cobbler aubin 基于PAM模块的认证,通过PAM模块将cobbler的认证方式交给系统来认证。 # 修改配置文件 vim /etc/cobbler/modules.conf [authentication] module = authn_pam # <-------仅修改了这里 #创建系统用户,且设置为不可登陆 useradd -s /sbin/nologin aubin # 修改用户文件 vim /etc/cobbler/users.conf [admins]admin = "aubin" # <-------写入刚刚创建的系统用户 测试登录 输入创建的用户即可登录,web界面的管理过于简单仅用鼠标点击点击再点击即可进行管理,如遇问题请自行百度。 五、常见错误 如下图的错误经常出现在虚拟机环境下,这时因为创建的虚拟机内存不够大。将虚拟机关机调整需虚拟机内最为1.5G以上,就不会出现如下错误。 提示TFTP连接超时,请检查防火墙是否关闭。 选择操作系统后可以出现下图所示,加载内核、加载伪文件系统。那么就说明各项服务包括cobbler配置没有错误,如果之后再出现问题,请排查yum源是否完整可用。
一、AIDE AIDE全称为(Adevanced Intrusion Detection Environment)是一个入侵检测工具,主要用于检查文件的完整性,审计系统中的工具是否被更改过。 AIDE会构造一个数据库文件,当系统在稳定时将全部或指定的文件属性以密文的形式保存至数据库中。文件属性包括:权限、索引节点号、所属用户、所属用户组、文件大小、mtime、atime、ctime以及连接数。 安装 [root@centos7 ~]$yum install -y aide 配置文件详解 #定义了数据库路径的变量与日志路径的变量 @@define DBDIR /var/lib/aide @@define LOGDIR /var/log/aide #开启压缩 gzip_dbout=yes # 将多个权限定义成规则赋给变量,便于后面引用 CONTENT_EX = sha256+ftype+p+u+g+n+acl+selinux+xattrs CONTENT = sha256+ftype PERMS = p+u+g+acl+selinux+xattrs # 采用哪种规则对哪些文件进行监控 /boot/ CONTENT_EX /bin/ CONTENT_EX /sbin/ CONTENT_EX /lib/ CONTENT_EX /lib64/ CONTENT_EX #采用CONTENT_EX定义的规则进行监测 /opt/ CONTENT #仅对opt目录进行校验码与文件类型监测 /root/\..* PERMS #PERMS并没有hash校验值,因为/root下的数据会经常变化 # 不监控的文件 !/etc/.*~ #p: permissions #i: inode: #n: number of links #u: user #g: group #s: size #b: block count #m: mtime #a: atime #c: ctime #S: check for growing size #acl: Access Control Lists #selinux SELinux security context #xattrs: Extended file attributes #md5: md5 checksum #sha1: sha1 checksum #sha256: sha256 checksum #sha512: sha512 checksum #rmd160: rmd160 checksum #tiger: tiger checksum 定义规则 编辑配置文件/etc/adie.conf,定义一个规则变量mon,监控/app目录下所有文件,不监控/app/saomiao.log。 [root@centos7 aide]$ vim /etc/aide.conf mon = p+u+g+sha512+m+a+c /app mon !/app/juli.sh 创建数据库 生成数据库文件,在配置文件中定义各文件计算各校验码放入数据库中,用于以后比对。从提示中看出生成了一个/var/lib/aide/aide.db.new.gz数据库文件,这个数据库文件为初始数据库,如果进行入侵检测将与/var/lib/aide/aide.db.gz数据库文件作比对,如果发现两个数据库不一致则提示被入侵。 [root@centos7 aide]$aide --init AIDE, version 0.15.1 ### AIDE database at /var/lib/aide/aide.db.new.gz initialized. 模拟文件被入侵更改 模拟文件被修改 : 向saomiao.sh文件添加换行,促使更改校验码、Mtime、Ctime [root@centos7 aide]$ echo >> /app/saomiao.sh 检测:AIDE的检测机制是计算出现在的数据库后与aide.db.gz比对。aide.db.gz默认又不存在,所以要将之前的创建的初始化数据库aide.db.new.gz改名为aide.db.gz。 [root@centos7 aide]$mv aide.db.new.gz aide.db.gz 入侵检测 最后使用aide -C注意是大写,将现在计算出的数据与aide.db.new.gz比对,查看数saomiao.sh文件的Mtime、CtimeSHA512被更改过 二、RKHunter RKHunter工具时专门检测系统是否遭受rootkit的一个工具,他通过自动执行一系列的脚本来全面的检测服务器是否感染rootkit。 RKHunter的功能 检测易受攻击的文件; 检测隐藏文件; 检测重要文件的权限; 检测系统端口号; 安装 [root@centos7 aide]$yum install rkhunter 检测 使用命令rkhunker -c对系统进行检测。RKHunter检测会分几部分,第一部分主要检测系统的二进制工具,因为这些工具时rootkit的首要感染目标。每检测完一部分需要Enter来确认继续。 [ ok ] 表示没有异常 [ no found ] 是没有找到此工具,不用理会 [ warning ] 如果是红色的Warnning那就需要进一步确认这些工具是否被感染或者被替换。 如果想让程序自动检测而不是每检测完一部分就让用户确认,可以使用 rkhunter --check --skip-keypress 同时如果要想达到每周或者每月自动检测就可以将他加入到计划任务中自动执行 crontab -e 1 10 7 * * * root /usr/bin/rkhunter --check --cronjob
CentOS7自带的SSH服务是OpenSSH中的一个独立守护进程SSHD。由于使用telnet在网络中是明文传输所以用其管理服务器是非常不安全的不安全,SSH协议族可以用来对服务器的管理以及在计算机之间传送文件。 一、配置文件 服务器配置文件 /etc/ssh/sshd_config 日志文件 /var/log/secure 二、配置文件详解 Port 22 #默认端口 ListenAddress IP #监听服务器端的IP,ss -ntl 查看22端口绑定的iP地址 LoginGraceTime 2m #登录时不输入密码时超时时间 HostKey # HostKey本地服务端的公钥路径 UseDNS no #禁止将IP逆向解析为主机名,然后比对正向解析的结果,防止客户端欺骗 PermitRootLogin yes #是否允许root使用SSH远程登录 MaxAuthTries 6 #密码错误的次数6/2=3(MAN帮助中写明要除2)次后断开连接 MaxSessions 10 #最大的会话连接数(连接未登录的会话最大值,默认拒绝旧的连接未登录的会话) StrictModes yes #检查用户家目录中ssh相关的配置文件是否正确 PubkeyAuthentication yes #是否使用基于key验证登录 AuthorizedKeysFile .ssh/authorized_keys #key验证登录的客户端公钥路径 PasswordAuthentication yes #是否允许使用密码登录 PermitEmptyPasswords no #用户使用空口令登录 GatewayPorts no #启用网关功能,开启后可以将建立的SSH隧道(端口转发)共享出去 ClientAliveCountMax 3 #探测3次客户端是否为空闲会话,↓3*10分钟后断开连接 ClientAliveInterval 10 #空闲会话时长,每10分钟探测一次 MaxStartups 10:30:100 #start:rate:full;当连接但为进行认证的用户超过10个,drop30%(rate/full)的连接当连接但未登录的连接达到100个后,新建立的连接将被拒绝 Banner /path/file #认证前输出的登录提示信息,指定文件路径 GSSAPIAuthentication no AllowUsers username #白名单,如果白名单有用户只有白名单的用户可以登陆 DenyUsers #黑名单,被拒绝的用户,如果即允许又拒绝则拒绝生效 AllowGroups #组白名单 DenyGroups #组黑名单 三、免密登录(基于KEY验证登录) 在客户端成功密钥对,然后将公钥复制到要免密登录的服务器即可。 注:名称只能为 authorized_keys ,添加多个公钥信息可以直接追加>> .ssh/authorized_keys ssh-keygen -t rsa -p “1234” #创建密钥对,-t类型为rsa,-p私钥密码为1234 ssh-copy-id -i ~/.ssh/id_rsa.pub IP #-i指定公钥路径后将公钥复制到远程IP ~/.ssh/authorized_keys 四、常见故障 提示 ssh_exchange_identification: Connection closed by remote host 多数情况为配置文件出错,可以使用 sshd -T对配置文件进行逐一检查 提示:server refused our key 免密登录被拒绝 使用免密登录 公钥文件的权限不正确所以会拒绝登录,检查客户端复制到服务端的公钥信息文件权限是否正确 五、优化加速 服务器端修改配置文件中一下两项进行修改 vim /etc/ssh/sshd_conf UseDNS no GSSAPIAuthentication no UseDNS 会对客户端进行DNS反向解析,然后在比对正向解析的结果查看是否一致。GSSAPIAuthentication大多数情况下使用密码验证或者秘钥验证所以关闭GSSAPI验证即可 六、日志分析 查看方式 手动查看日志文件 /var/log/secure systemctl查看日志文件systemctl suts sshd 常见警告 提示:Authentication refused:bad ownership or modes for diectory ssh连接的用户的家目录下.ssh目录所有者或者权限不正确(正确为700),sshd会发出警告但依然允许登录 七、安全相关 - DOS SSH也可能成为DOS攻击的对象,例如恶意用户连接SSH但不输入密码进行验证,由于设置了MaxStartups会导致正常用户无法进行登录。针对此情况建议: 修改默认端口 MaxStartups调大一些例如 MaxStartups 100:30:1000 LoginGraceTime 10 调整连接超时未10秒 MaxSessions 10 设置连接但未登录的用户最大值为10 - 其他优化 限制可登录用户 设定空闲会话超时时长 充分利用防火墙设置ssh访问策略 仅监听指定IP的ssh 禁止使用空口令登录 禁止使用root直接进行登录 做好日志分析 加强用户登录的密码口令
加密技术是为了保护敏感数据在网络传输中的安全,就像日常生活中使用的淘宝、支付宝、微信等等软件,如果涉及到金额的数据在网络中不加密传输,那是极易被别人窃取、篡改的,通信中的数据加密技术就显得尤为重要。各类加密工具的原理都是大同小异,这里对常见加密原理进行解读。 *** 一、对称加密 加密数据与解密数据使用相同的密钥,这种加密方法称为对称加密 特点 加密与解密使用相同密钥,加密解密速度快 将原始数据进行切块,逐个进行加密。 缺点 每一个通信的对象都有一把密钥,如果通信对象过多导致密钥过多。 密钥分发问题,如何保证密钥不被窃取 二、非对称加密 加密数据与解密数据使用一堆不相同的密钥,公钥公开给所有人,私钥自己保存。使用公钥加密的数据只有自己的私钥可以解开。 特点 用公钥加密数据,只能使用配对的私钥进行解密。 用私钥加密的数据,只能使用配对的私钥进行解密 缺点 加密解密速度慢、时间长,不适用于对大数据进行加密解密。 三、单项散列 单项散列又称为hash算法,把任意长度的数据、字符加密后得到一个固定长度的特征码。 特点 加密后输出的特征码长度固定 加密后的特征码只跟数据内容有关,与数据名称无关 可以用作数据的指纹 得到数据的特征码无法推算出原数据的内容 缺点 相同内容的文件加密后的结果相同 通常随数据一同发出,极易被窃取 四、加密通信的综合应用 以上三种如果单独使用任何一种对数据进行数据加密的话都是不安全的,那么现在在互联网中的数据时如何传输的呢?其实数据在互联网中并不会使用单一加密技术,往往都是各类技术混合使用,互补优缺点使数据的传输更加安全。 首先通过TCP三次握手进行连接,然后客户端发送hello包到服务端,服务端回应一个hello包,如果客户端需要再次发送数字证书, 则发送数字证书到客户端。 客户端得到服务器的证书后通过CA服务验证真伪、验证证书的主体与访问的主体是否一致,验证证书是否在吊销证书列表中。如果全部通过验证则与服务器端进行加密算法的协商。 然后是用证书中服务器的公钥加密【对称秘钥】发送给服务器端,【对称秘钥】只能用服务器的私钥进行解密,当服务器通过私钥解密【对称秘钥】后。使用对称秘钥将客户端请求的数据发送到客户端,客户端在用对称秘钥进行解密,从而得到想要的数据。 注:对称秘钥非长期有效,每隔一段时间甚至每一次数据的传输都使用不同的对称秘钥。
三次握手所谓的“三次握手”即对每次发送的数据量是怎样跟踪进行协商使的发送和接收同步,根据所接收到的数据量而确定的数据确认数及数据发送、接收完毕后何时撤消联系,并建立虚连接。 一、七字真言解读三次握手 二、为什么需要三次握手? 主机建立连接为什么需要三次握手?为了防止已经是失效连接突然又重新回到了服务端而产生的错误。“比如一个客户端发出一个连接请求报文虽然没有丢失,但是由于一些原因在在某个网络节点中长时间滞留,以至于在断开连接后才到达服务端。这本身就是一个已经失效的报文。但是服务器误以为是客户端的又一个新的请求。假设没有三次握手那么只要服务端发出确认链接就建立了。由于客户端也没有给服务端发请求,因此也不回复服务端的确认。但是服务端确认为新的连接开始了,等待客户端发数据。这样就容易造成服务端的资源的浪费。采用三次握手可以防止这种情况发生。 三、图解三次握手、四次挥手 三次握手 第一次握手:客户端申请连接(SYN=1),发送seq=j的数据包 第二次握手:服务器端申请连接(SYN=1),确认收到客户端的申请(ACK=1).;服务器期望下次收到J+1数据包(ack=j+1),发送seq=k的数据包 第三次握手:客户端确认收到请求(SYN=1),发送服务器期望的数据包(j+1).完成连接 四次挥手 第一次挥手:客户端请求断开连接(FIN=1),发送序号为j的数据(seq=u) 第二次挥手:确认收到请求(ACK=1),我期望收到u+1d的数据包(ack=u+1),发送序号为k的数据(seq=k) 第三次挥手:服务器申请断开连接(FIN=1),确认收到你之前的请求(ACK=1);期望收到u+1的数据(ack=u+1),发送序号为v的数据 第四次挥手:确认收到请求(ACK=1),发送序号为u+1的数据(seq=u+1)。断开连接 四、为什么握手三次,挥手四次? 三次握手 因为要保证信道的可靠,就需要双方沟通并且达成一致。而要解决这个文件3次是最小值。所以三次握手并不是真对TCP来说的,而是为了保证信道的可靠。 个人理解:三次握手并不准确,准确的说是双方各一次握手,各确认一次。中间第二次是握手与确认合并在一起 为什么挥手比握手多一次 因为tcp连接是全双工的,因此每个方向都必须单独的断开连接客户端申请断开连接,只是不再发送数据,还能接收数据。需要等待服务端将数据发送完毕后,等待服务端申请断开连接。
boot分区是系统启动中最重要的部分,如果服务器由于病毒攻击又或者被管理员误删除了boot分区。那么就会存在潜在的风险。为什么说是潜在的风险?因为boot分区被删除后系统仍在继续运行,看似无状况但是在执行关机操作后就会无法启动。 大致步骤 1.挂载CentOS系统镜像 2.进入救援模式 3.修复fstab文件 4.再次进入救援模式 5.从新安装内核文件 6.安装grub 7.手动修复grub 8.重启进入系统 恢复过程 1.首先查看系统的磁盘情况,根目录在逻辑卷,boot分区为普通文件系统。注:boot分区只能在基本文件系统。 然后将fstab文件移出,将boot分区下所有文件删除,模拟系统出现故障。确认boot分区下没有任何文件。 2.重新启动操作系统会出现如下图所示,为什么这个磁盘设备连boot分区都没了系统还将这个设备当做启动设备呢?那是因为BIOS根据设定好的顺序寻找第一个有MBR信息的磁盘设备,只要有MBR信息不论能不能启动都会把这个设备当做启动设备。如图所示即/boot分区与fstab文件全部丢失的情况 3.再重新启动,设定bios优先从光盘启动,然后选择第三个,进入救援模式 4.一路回车一路yes,直到下图所示选择no不开启网络功能,因为这次主要演示从光盘的救援模式修复,所以没有必要启动网络服务。如果当前环境下没有光驱,那么可以开启网络服务进行修复,网络修复等下次再演示。 5.救援系统启动后有一个任务就是将你原操作系统的根挂在到救援系统中/mnt/sysimage。由于fstab文件也被我删除了,所以救援系统无法找到原系统的磁盘路径,也就谈不上挂载原系统的根了,所以首要任务就是先修复/etc/fstab文件。 6.使用blkid命令查看当前系统中的设备信息,发现只有2个分区。一个为ext4格式,一个为逻辑卷格式。我这里搭建的环境比较简单如果在生产中应该会有多个分区。从图上新信息分析出/dev/sda1为boot分区,/dev/sda2卷组。 7.既然知道根分区在在逻辑卷中,那么使用lvdispaly命令查看逻辑卷分区。黄色框中说明逻辑卷是非激活状态。 8.lvsacn查看逻辑卷的状态,此时显示为非激活状态。vgchange -ay激活所有逻辑卷。lvscan再次查看逻辑卷状态,对比第一次已经从inactive变为active(激活) 9.再使用blkid命令查看设备信息,发现多了2个设备信息,这就是逻激活逻辑卷后显示出来的。如果分区多的话那就通过手动逐一挂载后进到分区中去,查看分区中的各目录分析各分区的作用。在这里很容易分辨出一个是root分区一个是swap分区。 10.创建挂载点,将root分区挂载至挂载点 11.手动创建fstab文件,按照fstab文件的格式填写相应的分区信息 12.重新启动后再次进入救援模式,救援模式会提示将原操作系统的根挂载到/mnt/sysimage,此时标志着/etc/fstab文件已经修复完成 13.进入救援模式,首先要切根,然后挂在光盘,安装kernel文件 14.查看boot分区,目录内出现一堆文件,包括内和文件与伪根文件系统表明kernel安装完成 15.安装grub,安装时指定磁盘设备,而不是分区。然后sync同步分区一定要多同步几次。 16.再次查看boo分区,如果出现grub目录,就表示grub已经安装完成。 17.手动创建grub,红色框中为设定根目录,一定要写根分区而不是磁盘。 18.再次开机出现grub界面,按下回车系统正常启动!
SELinux是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统。但是SELinux的并不能与众多服务很好的兼容,有些人会关闭SELinux一了百了。在日常的运维过程中很少去频繁的开启关闭SElinux,今天我就写一个关闭与开启SELinux的脚本来锻炼我的脚本能力。 脚本代码 #!/bin/bash # -------------+-------------------- # * Filename : selinux.sh # * Revision : 2.0 # * Date : 2017-09-02 # * Author : Aubin # * Description : # -------------+--------------------- # www.shuaiguoxia.com # path=/app/selinux selinux=`sed -rn "/^(SELINUX=).*\$/p" $path` case $1 in enforcing|en) sed -ri "s@^(SELINUX=).*\$@\1enforcing@g" $path if [ $selinux == 'SELINUX=disabled' ];then read -p "SELinux enforcing. you need reboot system ( yes or no ):" input [ $input == 'yes' -o $input == 'y' ] && reboot || echo "please Manual operation reboot" else echo "SELinux enforcing." fi ;; permissive|per|pe) sed -ri "s@^(SELINUX=).*\$@\1permissive@g" $path if [ $selinux == 'SELINUX=disabled' ];then read -p "SELinux permissive. you need reboot system ( yes or no ):" input [ $input == 'yes' -o $input == 'y'] && reboot || echo "please Manual operation reboot" else echo "SELINUX permissive" fi ;; disabled|dis|di) sed -ri "s@^(SELINUX=).*\$@\1disabled@g" $path if [ $selinux == 'SELINUX=enforcing' ];then read -p "SELinux permissive. you need reboot system ( yes or no ):" input [ $input == 'yes' -o $input == 'y' ] && reboot || echo "please Manual operation reboot" else echo "SELINUX disabled" fi ;; l|a) echo `sed -nr 's@(^SELINUX=.*)@\1@p' $path` ;; help|--help) echo "$0 [ enforcing | permissive | disabled ]" ;; *) echo "$0 [ enforcing | permissive | disabled ]" ;; esac 脚本测试 叨叨叨 根据case语句对用户的位置变量(输入的参数)进行判断,进而根据不同的参数实现不同的效果。 SELinux在enforcing状态与disabled状态切换时必须要进行重启才能生效,所以要在脚本中判断用户之前的SELinux的状态是什么样的,询问用户是否进程重启操作系统。
SecureCRT默认不显示语法高亮,整个界面颜色单一,用起来很不舒服,也没有效率,所有通过设置一下语法高亮还是很有必要的, 默认字体也看着不是很清晰。所以还是修改一下预告高亮比较好 设置语法高亮,多色显示 Options -> Session Options -> Emulation (Terminal) 其中Terminal选择 【Xterm】,勾选【ANSI Color】和【Select an alternate keyboard emulation】 设置完成,重新连接。 设置字体 Options->SessionOptions->Appearance->font,然后改成【Courier New】,OK 搞定~
要执行周期性任务,要保证服务运行。服务名为crond;service crond start ; systemctl start crond; 配置文件 /etc/crontab cron的日志文件 cat /var/log/cron 一、简介 crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。 二、任务调度的分类 Linux下的任务调度分为两类,系统任务调度和用户任务调度。 系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。 1.系统任务调度 通过编辑配置文件/etc/crontab,以下图的格式标明需要运行的时间即可。一行对应一个任务,格式如下图。 2.用户任务调度 在当前用户下使用命令crontab -e,会以当前用户的身份建立任务调度。与系统任务调度文件格式不同的是不需要指名以哪个用户的身份运行。 3.时间表示 指定值:指定具体的数字 范围值:* 表示每,每到这这个时间段执行一次任务。 离散取值:10 2,3,4 * * *;每天的2,3,4点的10分执行一次。(总共执行了3次) 连续范围: 10 2-10 * * *;每天的2点10分到10点10分分别执行(总共执行了8次) 步长范围:/3 * * ;每分钟内执行3次(即每20秒执行一次) 举例: 10 10 /6 * *;每6天的10点10分执行一次任务 日期与星期 10 10 1-10 * 0,6 #每个月的1-10号的10点10分,或者周六日的10点10分都执行 举例: 1 1 /6 * root echo "hello word " ;每隔6天的1点1分执行一次任务。 1 1-10/3 * * * root echo “hello word”;在每天1-10点范围内每3小时内的第一分钟执行一次 4.创建周期性任务 crontab -e * * * * * /bin/echo "`date +\%F \%H:\%M:\%S`" #命令要写绝对路径。除非标明变量 #如果在用户下新建crontab的话%需要转义 5.创建时的其他设置 创建周期性任务时,默认的编辑器为vi所以没有语法高亮。可以通过以下办法将默认编辑器修改为vim #写入/etc/porfile.d 对所有用户生效 #写入~/bash_profile 对当前用户 export EDITOP=vim 6.创建任务的权限 允许指定用户创建任务 cat /etc/cron.deny #在文件内写入用户名,使其不能创建新任务,但已创建的依然会执行 拒绝指定用户创建任务 cat /etc/cron.allow #默认文件不存在 允许与拒绝优先级 如果allow文件存在,那么deny文件不生效。 如果allow为空,拒绝所有用户 如果allow、deny都不存在,任何用户不能创建计划任务 7.实现毫秒、秒级别的周期性任务 利用usleep实现微妙级别的运行 usleep 1000000;1秒 usleep 1000;1毫秒 usleep 1;1微秒 利用循环体加sleep实现秒级别的。在每分钟要执行的任务中sleep20秒。
网络之间的通信主要是依靠路由器,当然生成环境中是拥有路由器的,但是系统中的路由配置也是需要了解一下地,今天讲解一下在CentOS6环境下搭建路由器,此乃入门级的简单实验。拓扑如上图已经规划好,暂且使用静态路由演示。 配置 1.如图所示先配置所有的IP地址 2.针对不同的机器配置路由 Aubin-CentOS1 route add default gw 10.0.1.1 CentOS-R1 route add -net 10.0.3.0/24 gw 10.0.2.2 route add -net 10.0.4.0/24 gw 10.0.2.2 echo 1 > /proc/sys/net/ipv4/ip_forward #启用转发功能(可以理解为启用路由功能) iptables -F #关闭防火墙 CentOS-R2 route add -net 10.0.1.0/24 gw 10.0.2.1 route add -net 10.0.4.0/21 gw 10.0.3.1 echo 1 > /proc/sys/net/ipv4/ip_forward iptables -F CentOS-R3 route add -net 10.0.2.0/24 gw 10.0.3.2 route add -net 10.0.1.0/24 gw 10.0.3.2 echo 1 > /proc/sys/net/ipv4/ip_forward iptables -F Aubin-CentOS1 route add default gw 10.0.4.1 以上就是全部配置,然后用CentOS1区测试,ping CentOS2的ip地址10.0.4.100。如果ping通则所有配置均没问题。如果没有通请参展以下几点做检查 0.虽然配置简单,但是足够繁琐,如果遇到问题请耐心检查以下几条。 1.使用route -n查看路由是否生效。 2.cat /proc/sys/net/ipv4/ip_forward查看输出是否为1,如果为0说明没有开启转发功能。 检查echo 1 > /proc/sys/net/ipv4/ip_forward是否执行成功。 3.检查IP 与 掩码是否配置正确,因为有多个IP地址容易搞混,所以好好检查。 4.检查是是否关闭防火墙,执行iptables -F。 5.如果在虚拟机环境下做实验,检查MAC地址是否冲突
bondingLinux bonding 驱动提供了一个把多个网络接口设备捆绑为单个的网络接口设置来使用,用于网络负载均衡及网络冗余。他是解决同一个IP下突破网卡的流量限制的工具,网卡网线对吞吐量是有限制的。在资源有限的情况下,bonding做负载均衡是再好不过的办法。 一、bonding的常用的四种工作模式 Mode0:轮询模式,对于加入bonding的网卡一次进行数据包的传输 Mode1:主备模式(高可用),当指定的主网卡出现问题时,备用网卡立刻接替主网卡的工作 Mode3:广播模式,加入有2个网卡加入了bonding,在传输数据时数据将会从两个网卡各传输一份到客户端,类似于镜像。提高了对客户端的容错能力 Mode6:适配器负载均衡,根据算法算出最优的路径传输数据 二、CentOS6下bonding的配置 步骤一:首先查看当前的操作系统是否支持bondingmodinfo bonding能出线bonding的介绍信息就说名当前系统支持bonding,截图只展示了一小部门 步骤二:查看有没有负载均衡的执行文件(使用到的工具就是bonding) 步骤三:创建bonding设备驱动配置文件 [root@shuaiguoxia ~]# cd /etc/sysconfig/network-scripts/ [root@shuaiguoxia network-scripts]# vi ifcfg-bond0 DEVICE=bond0 #bonding名称 BONDING_OPTS="miimon=100 mode=1" #设置模式为1,探测其他网卡状态时间为100毫秒 IPADDR=10.0.0.100 #IP地址 NETMAST=255.255.255.0 #掩码 PREFIX=24 #掩码 GATEWAY=10.0.0.1 #网关 USERCTL=no #普通用户不可控制 BOOTPROTO=static #IP获取方式 NOBOOT=on #引导式是否启动 步骤四:创建要加入bonding的网卡的配置文件 配置网卡一 [root@shuaiguoxia network-scripts]# vi ifcfg-eth1 DEVICE=eth1 TYPE=Ethernet ONBOOT=yes MASTER=bond0 #将eth1绑定到bond0 SLAVE=yes USERCTL=no 配置网卡二 [root@shuaiguoxia network-scripts]# vi ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet ONBOOT=yes MASTER=bond0 SLAVE=yes USERCTL=no 步骤五:重启网络服务 service network restart 步骤六:查看bonding的状态 注意事项: 1.要更改bonding的模式只修改该bonding中的参数即可 2.在配置网卡绑定bonding时要去除MAC地址 3.在启用bongding时要关闭NnetworkManger,否则会与bond冲突 service NetworkManager stop #临时关闭 chkconfig NetworkManager off #永久关闭
CentOS7.3昨天用的还好好的的,但是今天开机提示如下(如图提示): welcome to emergency mode!after logging in ,type “journalctl -xb” to view system logs,“systemctl reboot” to reboot ,“systemctl default” to try again to boot into default mode。 give root password for maintenance (?? Control-D???): 经过排查是因为我之前在/etc/fstab写入了光盘自动挂载,但开机有没有挂载成功导致的。 处理办法:自动挂载的那个fstab文件有问题,你在这个界面直接输入密码,然后把你增加的删除,重启就OK 1:登陆root 乱码也输入密码 2: vim /etc/fstab ,检查磁盘挂载信息 3:注释掉自己增加的内容,如果确定不在使用可以删除 4:重启OK。 报这个错误多数情况下是因为/etc/fstab文件的错误。注意一下是不是加载了外部硬盘、存储器或者是网络共享空间,在重启时没有加载上导致的。
CentOS6之前基于传统的命名方式如:eth1,eth0.... Centos7提供了不同的命名规则,默认是基于固件、拓扑、位置信息来分配。这样做的优点是命名是全自动的、可预知的,缺点是比eth0、wlan0更难读。比如enp5s0 一、网卡命名的策略 systemd对网络设备的命名方式 规则1:如果Firmware或者BIOS提供的设备索引信息可用就用此命名。比如eno1。否则使用规则2 规则2:如果Firmware或Bios的PCI-E扩展插槽可用就用此命名。比如ens1,否则使用规则3 规则3:如果硬件接口的位置信息可用就用此命名。比如enp2s0 规则4:根据MAC地址命名,比如enx7d3e9f。默认不开启。 规则5:上述均不可用时回归传统命名方式 上面的所有命名规则需要依赖于一个安装包:biosdevname 二、前两个字符的含义 en 以太网 Ethernet wl 无线局域网 WLAN ww 无线广域网 WWLAN 三、第三个字符根据设备类型来选择 format description o 集成设备索引号 s 扩展槽的索引号 x s 基于MAC进行命名 p s PCI扩展总线 四、配置回归传统命名方式 1.编辑内核参数 在GRUB_CMDLINE_LINUX中加入net.ifnames=0即可 [root@centos7 ~]$vim /etc/default/grub GRUB_CMDLINE_LINUX="crashkernel=auto net.ifnames=0 rhgb quiet" 2.为grub2生成配置文件 编辑完grub配置文件以后不会立即生效,需要生成配置文件。 [root@centos7 ~]$grub2-mkconfig -o /etc/grub2.cfg 3.操作系统重启 [root@centos7 ~]$reboot 4.验证
dd是一个非常使用高效的命令,他的作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。 一、备份 备份整个磁盘到磁盘 #将sdx整盘备份到sdy中去 dd if=/dev/sdx of=/dev/dev/sdy 备份整盘到目录 #将sdx整盘被分到目录中去 dd if=/dev/sdx of=/PATH/back 整盘备份并压缩 #整盘压缩后备份到制动路径 dd if=/dev/sdx | gzip > /path/back.gz 二、恢复 整盘恢复 #磁盘到磁盘 dd if=/dev/sdy of=/dev/md0 #目录到磁盘 dd if=/PATH/dir of=/dev/md0 整盘的压缩文件恢复 #将文件解压缩到标准输出,通过管道用dd输出到磁盘 #-d解压;-c解压缩到标准输出 gzip -dc /path/back.gz | dd of=/dev/md0 三、测试 得到最恰当的block size #通过执行时间确定系统的最佳block size dd if=/dev/zero bs=1024 count=1000000 of=/1G.file dd if=/dev/zero bs=2048 count=500000 of=/1G.file dd if=/dev/zero bs=4096 count=250000 of=/1G.file 测试读写速度 #测试读 dd if=/dev/zero of=/1G.file bs=1024 count=1000000 #测试写 dd if=/1G.file bs=64k | dd of=/dev/null 四、MBR表的备份与恢复 dd if=/dev/sdx of=sdxmbr.bak bs=512 count=1 dd if=sdxmbr.bak of=/dev/sdx bs=512 count=1 四、其他 修复硬盘 当硬盘长时间未使用,磁盘会产生消磁点。当磁头读到这些区域时会遇到困难,容易产生I/O错误。如果这些情况发生到第一个扇区时,可能会导致报废。所以使用磁盘修复功能,这个过程安全高效 dd if=/dev/sda of=/dev/sda 复制内存中的数据 dd if=/dev/mem of=/root/mem.bin bs=1024 生成镜像 dd if=/dev/cdrom of=/root/cdrom.iso 销毁磁盘数据 #利用随机数填充数据, dd if=/dev/urandom of=/dev/sda1
在用户home目录越来越大时,就可以考虑将home目录迁移至新的分区。 1.创建新分区。 fidisk /dev/sda:用磁盘管理器打开磁盘 n:新建 +10g :设置分区为10G w :保存 保存后使用 partprobe命令同步分区表 2.更新分区后格式化 保存后使用 partprobe命令同步分区表mkfs.ext4 /dev/sda6 格式化分区 3.创建挂载点,将新建立的分区挂载到挂载点,最后将home下的所有人间备份到分区中。 4.核对一下原home目录与复制后的是否一致。 5.查看当前系统是否有其他用户登录在系统上,否则在做迁移时会影响用户数据。 6.输入命令init 1,切换到单用户模式,确保其他用户无法访问。 7.创建homeback文件夹,将home目录下所有文件移动至里面做备份。 mkdir /homeback mv /home/* /homeback 8.将之前新分区挂载至home目录,添加到fatab文件夹下,做自动挂载 mount /dev/sda6 /home #添加自动挂载文件夹以UUID方式自动挂载 vim /etc/fstab UUID=184ec81f-50fb-4033-af53-2a40e48b31c2 /home defaults 0 0 init 3 reboot
Linux中Swap(即:交换分区),类似于Windows的虚拟内存,就是当内存不足的时候,把一部分硬盘空间虚拟成内存使用,从而解决内存容量不足的情况。swap分区在非高内存的服务器上必不可少,但是swap不能充当内存使用。 一、swap分区扩展的方法 新建swap分区:以分区的形式创建swap 新建swap file:以文件的形式创建swap 分区与file的区别:文件可以随时扩大缩小,可以随时移动。分区不行。 二、以分区的形式扩展swap 1.首先用磁盘管理工具fdisk打开磁盘,然后将新建的分区/dev/sda6的ID更改为82,然后保存退出。 2.退出后会提示警告,这是因为分区表没有同步到内存中时,使用partprobe将磁盘中的分区表同步到内存中。 3.格式化swap分区并启用swap分区 [root@centos7 ~]$mkswap /dev/sda6 #格式化swap分区 [root@centos7 ~]$swapon -a #激活所有swap分区 4.使用lsblk确认已经有两个swap 5.使用swapon -s查看所有的swap分区,此时swap分区已经扩展1G。free可以看到内存与swap的使用情况 6.配置自动挂载,将swap分区写入/etc/fstab使其可以再开机自动挂载。UUID为/dev/sda6分区的UUID可以通过blkid /dev/sda6查看UUID。这里要注意UUID不能添加双引号。 添加完后mount -a立即更新 三、以文件的形式创建swap 1.首先要有一个分区,此分区的剩余空间要比计划的swap空间大。我这里以sda7做演示。分区也可以时现有的分区 2.创建一个挂载点,然后将分区挂载到挂载点。并进入到此分区 3.创建一个文件,用于创建swap分区。count=1024代表此文件为1G 4.mkswap swapfle将文件格式化为swap格式,然后使用blkid swapfile查看文件格式是否为swap 5.设置自动挂载。vim /etc/fstab写入swapfile的UUID等信息。mount -a自动挂载立即生效 6.swapon -a 激活所有的swap分区。提示文件权限为0644不安全,所以我改为600. 7.swapon -s查看所有swap分区使用情况。最后一个类型为file的就是刚刚创建好的文件式swap 四、总结 swap分区只能作为内存不够时的暂时应急,不能直接替代内存使用。 文件式swap:可以随时改变大小,可以移动至其他分区 分区式swap:不能更改大小,不能移动
一、多系统服务器搭建 1.首先挂载光盘 2.安装vsftp 3.使用rpm -ql vsftpd查看vsftpd安装时都产生了哪些文件,找到以.server结尾的文件路径。此文件的文件名就是vsftp的服务名。 4.systemctl start vsftpd启动服务,然后用ss -tnl命令查看ftp使用的21端口是否启动,21端口时vsftp使用的端口启用则说明ftp服务正常启动。 5.将ftp服务设为开机启动 6.测试ftp服务器发现无法访问,这时因为防火墙的原因,直接关闭防火墙就好了。 7.再次测试确认ftp没有问题 8.进入到ftp的pub目录,然后创建文件夹CentOS,在CentOS下在创建两个目录,分别用于对CentOS6、CnotOS7提供不同的仓库。 9.分别将CentOS6与CentOS7的光盘内所有内容复制到文件夹内 二、客户端测试 1.在另一台CentOS7客户端中设置配置文件。 2.使用yum list查看yum仓库软件包列表,如果能列出大量的软件包名称,说明客户端没有问题 3.安装一个小软件tree进行测试,安装完毕没有任何问题。 多系统的yum服务器就搭建完成了,此时yum服务器可以分别对CentOS6与CentOS7分别提供服务了。 如果你还不会配置客户端的话,请查看以下文章。yum仓库客户端配置详细解读最简化配置yum
一个黑客突破你的层层防御后,修改你的程序或者覆盖了你的工具时。确定一个已安装程序的所有文件,有没有被修改过的途径之一就是使用RPM包校验功能 如果图片无法加载或者乱码,欢迎访问我的简书 RPM包校验功能 此功能可以将你现在的程序所有文件,与当初安装时记录到数据库中的信息进行比对。从而查出哪些文件目录的权限、内容等等是否被修改过。 1.安装一个zsh软件用来进行实验 [root@centos6 app]# rpm -ivh zsh-4.3.11-4.el6.centos.2.x86_64.rpm 2.查看数据库文件 在/var/lib/rpm中都是是安装软件时留下的数据库文件,其中以__db开头的是缓存文件并非正真的数据文件,这个文件会保留程序包名称及版本、依赖关系、功能说明、包安装后生成的各文件路径及校验码信息 3.查看zsh软件所有的文件以及目录 使用rpm -ql zsh可以查看出这个软件安装时的所有目录以及文件,待会我随机挑选一个模拟被黑客所修改。 4.挑选出一个文件 随机挑选出一个文件,使用file查看文件类型为文本。 然后往文本中随机添加一些字符,来模拟被黑客修改。 5.向vcs_info这个文件中随机添加一些字符。 6.使用RPM包校验功能,发现已经有3个地方被修改过 S代表文件大小 5代表MD5 T代表mtime 使用 rpm -v csh 即可查看哪些文件与当初安装时有所不同。如果全是.....没有任何字母代表软件没有被修改过。 7.包校验各项参数的含义 在日常运维中就可以利用RPM自带的包校验功能即可查验出哪些软件,被认为的修改过、破坏过。使自己的系统更加安全
1.进入apache官网https://www.apache.org/,点击Download 2.如图选择 3.选择httpd 4.下载两个包,2.2为CentOS6使用,2.4为CentOS7使用 一、CentOS6 1.输入命令rz,会弹出对话框可以把windows的文件传到linux中去。 2.在弹出对话框中选择软件包--->添加--->确定。注意尽量将软件放在桌面,我把软件放在D盘,然后通过桌面的快捷方式添加后传到linux中的文件就已经被损坏。传进来的文件会存放到当前目录下。/usr/local/src/目录多为存放软件源码包的地方,所以将他移动到此目录下,但是也不是绝对的只是推荐这么做而已。 3.将传进来的文件解压 4.下面的编译需要用到httdp目录下的脚本,所以我用cd httpd把目录切换到http中去.configure 这个是个脚本文件, 可以指定软件的安装路径、配置文件路径等等一列参数。--prefix软件安装路径--sysconfigdir配置文件的安装路径 还有更多的参数可以通过./configure --help来查看 5.$?可以查询上一命令的执行结果是成功还是失败。通过此命令可以查看./configure是否成功,如果提示需要那么安装包,根据提示安装即可。echo $? 0为上一命令执行成功,1为上一命令执行失败。 6.如果上一命令执行成果了,那么执行make根据配置构建程序make install安装 我这里就把两条命令写在一起了 7.查看安装目录,此时apache就安装完成了 8.软件配置,接下来的步骤就不属于安装的范畴了,为了测试安装没问题,就把软件简单配置一下然后做测试。 设置环境变量要将apache的安装目录写在前面,设置此路径优先于系统中的路径 [root@centos6 htdocs]echo 'export PATH=/app/httpd22/bin:$PATH' >/etc/profile.d/https22.sh [root@centos6 htdocs]. /etc/profile.d/https22.sh [root@centos6 htdocs]echo $PATH 确认方框中的变量在最前面,所以优先于系统变量。 开启服务 查看80端口是否启用 在本机上输入127.0.0.1查看是否能够提供http服务,显示出页面后说明服务成功启动 此时的页面只能是本地访问,要相对外提供服务要把防火墙关闭 使用其他电脑打开页面验证服务没问题 二、一键部署脚本 此脚本适用于centos6与centos7。链接:http://pan.baidu.com/s/1gfu0qiv 密码:j2qf [root@centos7 httpd]# cat install.sh #!/bin/bash # -------------+-------------------- # * Filename : install.sh # * Revision : 2.0 # * Date : 2017-08-05 # * Author : Aubin # * Description : install httpd # * www.shuaiguoxia.com # -------------+--------------------- rm -rf /var/run/yum.pid #mkdir mkdir /etc/yum.repos.d/back/ #back default repo mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/back #new repo cat > /etc/yum.repos.d/aubin.repo <<end [aubin] name=aubin baseurl=http://mirrors.sohu.com/centos/\$releasever/os/\$basearch enable=1 gpgcheck=0 end #remove old httpd yum remove httpd -y #install Package yum groupinstall "Development tools" -y yum install apr-devel.x86_64 apr-util-devel.x86_64 openssl-devel -y #judge version ver=`cat /etc/centos-release | grep [[:digit:]] -o|head -1` if [ $ver -eq 6 ] then tar xf httpd-2.2.34.tar.bz2 cd ./httpd-2.2.34 ./configure --prefix=/app/httpd22/ --sysconfdir=/etc/httpd22/ --enable-ssl make && make install /app/httpd22/bin/apachectl start echo 'export PATH=/app/httpd22/bin:$PATH' > /etc/profile.d/httpd22.sh . /etc/profile.d/httpd22.sh echo "MANPATH /app/httpd22/man" >> /etc/man.config else tar xf httpd-2.4.27.tar.bz2 cd ./httpd-2.4.27 ./configure --prefix=/app/httpd24/ --sysconfdir=/etc/httpd24/ --enable-ssl make && make install /app/httpd24/bin/apachectl start echo 'export PATH=/app/httpd24/bin:$PATH' > /etc/profile.d/httpd24.sh . /etc/profile.d/httpd24.sh echo "MANPATH /app/httpd24/man" >> /etc/man_db.conf fi echo "Installation Complete !! Ctrl+c exit music" play ./music.wav &>/dev/null
Yum:Yellowdog Updater,Modified的简称,起初由yellow dog发行版的开发者Terra Soft研发,用Python编写,后经杜克大学的Linux@Duke开发团队进行改进,遂有此名。Yum是一个shell前端软件包管理器,基于RPM包管理,能够从指定的服务器自动下载RPM包并安装,可以自动处理依赖关系,并且一次安装所有依赖的软件包。 一、yum的分类 1.客户端:客户端的配置非常简单,只要配置要一些基本的参数,就可以通过客户端来安装软件,并且解决软件包的依赖性。 2.服务端:将所有需要的软件包同统一放在一个目录下,该目录可以通过ftp、http、https、file将需要使用软件的客户端传输需要的软件。 二、yum的配置文件 全局配置:/etc/yum.conf yum cachedir:软件包缓存目录 keepcache:缓存是否保存,1保存0不保存 debuglevel:调试级别(默认为2) logfile:日志文件路径 gpgcheck:是否检查密钥,一种检验软件完整性的方式 仓库配置:/etc/yum.repo.d/name.repo yum [name]:仓库id name :仓库名字 baseurl: 为仓库的地址 gpgkey:公钥地址,若是需要检查完整性的话可以添加密钥地址 enable:是否开启当前仓库 gpgcheck:是否使用密钥验证 三、yum仓库中的变量信息 $releasever:当前OS的主版本号 $arch:处理器平台,i386,x86_64,i486,i586\(basearch:基础平台:i386,x86_64 在搭建yum客户端仓库时,可以使变量让自己能够让repo配置文件在多个版本的系统中使用。但是yum服务器必须遵循命名规则。下面以阿里云举例。 `https://mirrors.aliyun.com/centos/\)releaserver/os/$basearch/https://mirrors.aliyun.com/centos/6.9/os/x86_64/` 四、yum命令 1.启用与禁用仓库 禁用仓库:yum-config-manager --disable “仓库名" 启用仓库:yum-config-manager --enable “仓库名” 2.显示软件仓库列表yum repolist 3.显示软件包列表yum list 4.安装卸载与更新 安装:yum install package1 package2... 重新安装:yum reinstall package 卸载:yum remove package 更新:yum update package 降级:yum downgrage package 检查可用的更新:yum check-update 5.缓存命令 清除缓存:yum clean all 构建缓存:yum makecache 6.查看依赖性yum deplist package1 7.包组相关命令 安装:yum groupinstall group1 [group2] [...] 更新yum groupupdate group1 [group2] [...] 列表yum grouplist [hidden] [groupwildcard] [...] 删除yum groupremove group1 [group2] [...] 信息yum groupinfo group1 [...]
在经常使用ftp传输文件的环境中,每次上传和下载文件都需要重新连接然后登录是非常繁琐的一件事情。我们可以将FTP空间映射到本地磁盘空间,免去输入地址以及账号、密码。方便我们日常中文件的上传和下载。 1. 双机桌面上的我的电脑,然后点击映射网络驱动器 2. 选择映射网络驱动器 3. 选择 连接到可用于存储文档和图片的网站 4. 下一步 5. 下一步 5. 根据示例,填写FTP地址 6. 输入用户名。 匿名登录是连接到FTP的默认目录。 输入用户名则连接到用户目录下。 这里我经常使用用户名下的目录就,所以输入用户名。 7. 给连接起个名字,默认即可 8. 点击完成 9. 此时在双击打开我的电脑,就能看到FTP已经连接好了。以后再使用FTP就不用每次都输入地址、用户名、密码了。 10. 打开FTP就能看到里面的文件了
在使用rpm安装软件包时,时常会遇到一些软件依赖性问题,如果是简单的一两个依赖性还是可以手动解决。要是出现大量的依赖性问题的话会让增大工作量。yum是一个很好的前端程序,可解决软件包相关依赖性,可在多个库之间定位软件包,up2date的替代工具。 一、yum配置文件解读 公共配置文件: /etc/yum.conf yum仓库配置文件 : /etc/yum.repo.d/name.repo yum工具会自动生成几个仓库的配置文件,指向官方的仓库站点。由于官方站点网路较慢所以我们使用国内镜像站点或者自己搭建的站点。但是官方站repo文件也不要删除,建立一个文件夹当做备份即可。 二、yum仓库客户端的配置 在yum.repo.d目录下新建一个以repo结尾的配置文件。 [name]:仓库id name :仓库名字 baseurl: 为仓库的地址 外网的话可以使用阿里云的镜像站https://mirrors.aliyun.com/centos/6.9/os/x86_64/ gpgcheck:是否验证密钥信息 三、yum仓库的验证 yum仓库验证,如果能看到红圈内的仓库名就说明yum仓库搭建完成了。 当然也可以使用yum list查看软件列表的方式进行验证,如果能看到大量的列表信息的话就说明yum仓库没有任何问题了。 好了现在可以通过yum 软件包名进行软件的安装了,此时再安装软件时yum仓库会自动解决依赖性问题。这只是适合新手入门的最简化配置,详细的文件解读期待我的下篇文章。
一个黑客突破你的层层防御后,修改你的程序或者覆盖了你的工具时。确定一个已安装程序的所有文件,有没有被修改过的途径之一就是使用RPM包校验功能 如果图片排版有任何错误,欢迎访问我的简书www.jianshu.com/p/906e39353e09 RPM包校验功能 此功能可以将你现在的程序所有文件,与当初安装时记录到数据库中的信息进行比对。从而查出哪些文件目录的权限、内容等等是否被修改过。 1.安装一个zsh软件用来进行实验 [root@centos6 app]# rpm -ivh zsh-4.3.11-4.el6.centos.2.x86_64.rpm 2.查看数据库文件 在/var/lib/rpm中都是是安装软件时留下的数据库文件,其中以__db开头的是缓存文件并非正真的数据文件,这个文件会保留程序包名称及版本、依赖关系、功能说明、包安装后生成的各文件路径及校验码信息 3.查看zsh软件所有的文件以及目录 使用rpm -ql zsh可以查看出这个软件安装时的所有目录以及文件,待会我随机挑选一个模拟被黑客所修改。 4.挑选出一个文件 随机挑选出一个文件,使用file查看文件类型为文本。 然后往文本中随机添加一些字符,来模拟被黑客修改。 5.向vcs_info这个文件中随机添加一些字符。 6.使用RPM包校验功能,发现已经有3个地方被修改过 S代表文件大小 5代表MD5 T代表mtime 使用 rpm -v csh 即可查看哪些文件与当初安装时有所不同。如果全是.....没有任何字母代表软件没有被修改过。 7.包校验各项参数的含义 在日常运维中就可以利用RPM自带的包校验功能即可查验出哪些软件,被认为的修改过、破坏过。使自己的系统更加安全
CentOS系统上使用rpm命令管理程序包:安装、卸载、升级、查询、校验、数据库维护 1.基本安装 rpm -ivh PackageFile 2.rpm选项 rpm -ivh --test PackageFile --test 测试安装 --nodeps 忽略依赖性 --nosignature: 不检查来源合法性 --nodigest:不检查包完整性 3.软件包脚本 --nopre 安装前脚本 --nopost 安装时脚本 --nopreun 卸载前脚本 --nopostun 卸载后脚本 #所有脚本均不执行的话直接使用 --noscript 4.软件包的升级 升级时的注意事项: 不要对内核进行升级操作,linux支持多内核并存,所以直接安装新内核就好. 如果升级时原程序的配置文件被更改过的话,新程序不会覆盖配置文件。会把就配置文件重命名名(FILENAME.rpmnew)后保存。 rpm -Uvh PackageFIle #软件存在就升级,不存在就安装 rpm -Fvh PackageFile #存在则升级,软件不存在不升级 # --oldpackage:降级 --force: 强制安装 5.软件包的查询 rmp -qa -p为包的查询,a为列出所有包rpm -qa | grep "mysql" 配合grep模糊搜索使用rpm -qf file 查询配置文件是用哪个包提供的rpm -q --whatprovides webserver 查询能力是那个软件包提供,包括服务和文件,相比于-qf来说范围更宽rpm -q --whatrequires 查询指定的能力依赖于哪个包 6.包查询 rpm -q --changelog httpd 查询rpm包的日志文件,非程序的日志文件 -c: 查询程序的配置文件 -d: 查询程序的文档 -i: information -l: 查看指定的程序包安装后生成的所有文件 7.rpm包的数据库 rpm包在安装时会生成一个数据库文件,程序包名称及版本、依赖关系、功能说明、包安装后生成的各文件路径及校验码信息. 数据库目录 存放在/var/lib/rpm中以__db开头的文件 初始化数据库rpm -initdb数据库不存在就创建,存在不执行任何操作 重建数据库 rpm -rebuilddb 8.rpm包校验 在rpm数据库中存放了软件初始安装时的数据信息,当使用包校验的会拿数据库中的信息比对现在的信息,可以查出哪些被认为的修改或者覆盖过。 使用rpm -V 软件包名 校验是否被修改过。 校验参数的详细解读 传送门: 软件包校验实验