Linux企业服务(上)

一、远程管理

1、ssh协议

2、ssh客户端使用

[root@node1 ~]# ssh root@192.168.46.128
# 登录远程ssh主机
[root@node1 ~]# ssh -p22 root@192.168.46.128
# 指定端口号登录远程主机
[root@node1 ~]# ssh -p22 root@192.168.46.128 ls -lha /etc
# 让远程主机执行指定命令
[root@node1 ~]# cat .ssh/known_hosts
# 查看已经链接过的主机
[root@node1 ~]# scp -P22 -r -p /root/file root@192.168.46.128:/tmp
# 将本地文件复制给远程主机,-r递归复制整个目录,-p保留源文件的时间和权限属性
[root@node1 ~]# scp -P22 -r -p root@192.168.46.128:/tmp/file /root/
# 将远程主机的文件复制到本地
[root@node1 ~]# sftp -oPort=22 root@192.168.46.128
root@192.168.46.128 password: 
Connected to 192.168.46.128.
sftp> put /etc/hosts /tmp  
sftp> get /etc/hosts /root
# 使用sftp在两台主机之前互相传递文件

3、sshd配置文件

参数 作用
Port 22 默认的sshd服务端口
ListenAddress 0.0.0.0 设定sshd服务器监听的IP地址
Protocol 2 SSH协议的版本号
HostKey /etc/ssh/ssh_host_key SSH协议版本为1时,DES私钥存放的位置
HostKey /etc/ssh/ssh_host_rsa_key SSH协议版本为2时,RSA私钥存放的位置
HostKey /etc/ssh/ssh_host_dsa_key SSH协议版本为2时,DSA私钥存放的位置
PermitRootLogin yes 设定是否允许root管理员直接登录
StrictModes yes 当远程用户的私钥改变时直接拒绝连接
MaxAuthTries 6 最大密码尝试次数
MaxSessions 10 最大终端数
PasswordAuthentication yes 是否允许密码验证
PermitEmptyPasswords no 是否允许空密码登录(很不安全)

4、安全密钥验证

  1. 在客户端主机中生成“密钥对”
[root@localhost ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:9+KE/GYBG6wjbCQ4o9j139nD9kkrL29bdAYd49kTvLo root@localhost.localdomain
The key randomart image is:
+---[RSA 2048]----+
|              .+ |
|              .o*|
| .     .      .++|
|+ . o   +      o.|
|o+ = . .S+.   . +|
|o . + +..o.. . o.|
|   . . oo.o=. o .|
|        .+=.BE.+ |
|         oo. OB. |
+----[SHA256]-----+
  1. 把客户端主机中生成的公钥文件传送至远程主机
[root@localhost ~]# ssh-copy-id 192.168.46.129
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.46.129 (192.168.46.129)' can't be established.
ECDSA key fingerprint is SHA256:PWPGI+gebAxdFtOfQe66cO/RnTBEV/Qw5AEoZv6w5lM.
ECDSA key fingerprint is MD5:61:3d:ae:39:43:65:70:f4:9a:10:ff:48:67:6f:ef:54.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.91.128's password: 
Number of key(s) added: 1
Now try logging into the machine, with:   "ssh '192.168.46.129'"
and check to make sure that only the key(s) you wanted were added.
  1. 对远程主机进行设置,使其只允许密钥验证,拒绝传统的口令验证方式。记得在修改配置文件后保存并重启sshd服务程序
[root@localhost ~]# vim /etc/ssh/sshd_config
..................
65 PasswordAuthentication no
PubkeyAuthentication yes
...................
[root@localhost ~]# systemctl restart sshd
  1. 在客户端尝试登录到服务器,此时无须输入密码也可成功登录
[root@localhost ~]# ssh 192.168.46.129
Last login: Fri Apr 19 17:12:37 2019 from 192.168.91.1

5、mobaxterm使用密钥登录

一、生成密钥

image-116

二、分别保存公私钥对

image-117

三、linux .ssh目录下新建文件,将上面生成的密钥粘进去

image-118

二、FTP

1、FTP简介

FTP协议:文件传输协议(File Transfer Protocol)

FTP模型

控制连接(端口号21)

数据连接(端口号20)

主动模式

被动模式

image-119

2、VSFTPD服务介绍

参数 作用
listen=NO 是否以独立运行的方式监听服务
listen_address=ip地址 设置要监听的IP地址
listen_port=21 设置FTP服务的监听端口
download_enable=YES 是否允许下载文件
userlist_enable=YES 设置用户列表为"允许"
userlist_deny=YES 设置用户列表为"禁止"
max_clients=0 最大客户端连接数,0为不限制
max_per_ip=0 同一IP地址的最大连接数,0为不限制
anonymous_enable=YES 是否允许匿名用户访问
anon_upload_enable=YES 是否允许匿名用户上传文件
anon_umask 匿名用户上传文件的umask
anon_root=/var/ftp 匿名用户的ftp根目录
anon_mkdir_write_enable=YES 是否允许匿名用户创建目录
anon_other_write_enable=YES 是否开放匿名用户的其他写入权限(重命名、删除等)
anon_max_rate=0 匿名用户的最大传输速率,0为不限制
local_enable=yes 是否允许本地用户登录
local_umask=022 本地用户上传文件的umask值
local_root=/vat/ftp 本地用户的ftp根目录
chroot_local_user=YES 是否将用户权限禁锢在ftp目录,以确保安全
local_max_rate=0 本地用户的最大传输速率,0为不限制
2.1、基础配置
[root@localhost ~]#yum -y install vsftpd
[root@localhost ~]#touch /var/ftp/abc.txt
[root@localhost ~]#systemctl start vsftpd
[root@localhost ~]#systemctl enable vsftpd
[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#setenforce 0
2.2、客户端工具
2.2.1、Linux中
[root@localhost ~]# yum install ftp -y
[root@localhost ~]# ftp <IP地址192.168.46.128>
Name (192.168.46.128:root):anonymous
password:直接回车
[root@localhost ~]# yum install lftp -y
[root@localhost ~]# lftp <IP地址192.168.46.128>

ftp默认禁止root等用户登录,禁止名单如下

vim /etc/vsftpd/user_list
2.2.2、Windows中

第一种

第二种

需要注意的是直接访问ftp服务器的IP地址时访问的根位置目录是/var/ftp如下图,比如如果需要访问pub里的test可以访问ftp://192.168.46.128/pub/test

2.3、案例1,匿名用户访问(默认开启)
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
anon_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
[root@localhost ~]# systemctl restart vsftpd
linux的目录权限会限制我们不允许往里面新建文件,但是如果直接添加目录的w权限又会导致触发他的安全判断问题,所以就把ftp目录里的pub目录的属主和属主改为ftp解决,并且添加写权限
chown ftp:ftp /var/ftp/pub
chmod 777 /var/ftp/pub
现在就可以往里面写文件了
2.4、案例2,本地用户访问

使用本地用户登录成功时位置在家目录的位置

[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
[root@localhost ~]# systemctl restart vsftpd
[root@localhost ~]# systemctl enable vsftpd
注意:出现在/etc/vsftpd/ftpusers  /etc/vsftpd/user_list这两个文件
中的内容将会被定义为黑名单
2.5、案例3,虚拟用户访问
  1. 创建用于进行FTP认证的用户数据库文件,其中奇数行为账户名,偶数行为密码。
[root@localhost ~]# cd /etc/vsftpd/
[root@localhost vsftpd]# vi vuser.list
picaj
centos
cisco
centos
huawei
centos
  1. 使用db_load命令用哈希(hash)算法将原始的明文信息文件转换成数据库文件
  2. 降低数据库文件的权限(避免其他人看到数据库文件的内容)
  3. 把原始的明文信息文件删除。
[root@localhost vsftpd]# db_load -T -t hash -f vuser.list vuser.db
[root@localhost vsftpd]# file vuser.db
vuser.db: Berkeley DB (Hash, version 9, native byte-order)
[root@localhost vsftpd]# vi vuser.db
[root@localhost vsftpd]# chmod 600 vuser.db
[root@localhost vsftpd]# rm -f vuser.list
  1. 创建一个本地用户,用来做虚拟用户在本地的代理,为了安全起见,禁止这个本地用户登录
[root@localhost vsftpd]# useradd -d /var/ftproot -s /sbin/nologin virtual
[root@localhost vsftpd]# ls -ld /var/ftproot/
drwx------. 2 virtual virtual 59 8月 10 23:04 /var/ftproot/
[root@localhost vsftpd]# chmod -Rf 755 /var/ftproot/
  1. 新建一个用于虚拟用户认证的PAM文件vsftpd.vu,利用pam模块(linux内核的一个认证模块)做一个认证
[root@localhost vsftpd]# vi /etc/pam.d/vsftpd.vu
auth required pam_userdb.so db=/etc/vsftpd/vuser
account required pam_userdb.so db=/etc/vsftpd/vuser
  1. 配置文件
[root@localhost vsftpd]# cat /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
guest_enable=YES
guest_username=virtual
allow_writeable_chroot=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd.vu 
#记得修改这里为我们自己的认证文件
userlist_enable=YES
tcp_wrappers=YES
[root@localhost vsftpd]# systemctl restart vsftpd
用刚刚创建好的用户登录,但是只能登录,不能写文件,想要给权限,这个用户的权限是被匿名用户权限控制的

客户端
[root@atopos ~]# ftp 192.168.46.128
Connected to 192.168.46.128 (192.168.46.128).
220 (vsFTPd 3.0.2)
Name (192.168.46.128:root): picaj
331 Please specify the password.
Password:
# password:centos
  1. 如果想要针对不同的用户设置不同的权限
[root@localhost vsftpd]# mkdir /etc/vsftpd/vusers_dir/
[root@localhost vsftpd]# cd /etc/vsftpd/vusers_dir/
[root@localhost vusers_dir]# touch huawei
[root@localhost vusers_dir]# vim cisco
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
[root@localhost vusers_dir]# vi /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
guest_enable=YES
guest_username=virtual
allow_writeable_chroot=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd.vu
userlist_enable=YES
tcp_wrappers=YES
user_config_dir=/etc/vsftpd/vusers_dir 
#告诉主配置文件我们这里还有配置
[root@localhost vusers_dir]# systemctl restart vsftpd
huawei没权限,cisco有权限

三、NFS

1、NFS简介

image-120

image-121

2、RPC 远程过程调度

3、RPC 协议模型

  1. 基于 rpc 的服务(此处是指 nfs 服务,在别处有可能是代表其他服务)在启动时向 portmapper 注册端口
  2. 基于 rpc 的客户端联系服务端 portmapper 询问服务的端口号
  3. portmapper 告知客户端基于 rpc 服务使用的端口号
  4. 基于 rpc 的客户端访问被告知单某基于 rpc 服务的端口
  5. 基于 rpc 的服务响应客户端的请求

4、NSF 部署

[root@node2 ~]# yum -y install rpcbind
[root@node2 ~]# yum -y install nfs-utils
# 其实直接装 nfs-utils 也会以依赖的方式自动装上 rpcbind
[root@node2 ~]# systemctl start nfs-server
[root@node2 ~]# systemctl enable nfs-server
[root@node2 ~]# systemctl status rpcbind.socket
# nfs 启动前,只是监听 111 端口,但是并没有启动对应的服务
[root@node2 ~]# systemctl status rpcbind
# nfs 启动后,可以看到 rpcbind 自动启动了,也说明了 nfs 对 rpc 的依赖
[root@node2 ~]# ss -ntulp
[root@node2 ~]# systemctl restart nfs
[root@node2 ~]# ss -ntulp
[root@node2 ~]# rpcinfo -p
# 可以查看到注册的端口号

5、NFS 软件介绍

6、NFS 共享配置文件格式

/dir    主机 1(opt1,opt2)    主机 2(opt1,opt2)

7、NFS 工具

7.1、rpcinfo

rpcinfo 工具可以查看 RPC 相关信息

查看注册在指定主机的 RPC 程序

rpcinfo -p hostname

查看 rpc 注册程序

rpcinfo -s hostname
7.2、exportfs

可用于管理 NFS 导出的文件系统

常见选项:

7.3、showmount

常见用法:

showmount -e hostname
7.3.1、手动挂载案例
服务端
[root@localhost ~]# vim /etc/exports
/myshare 192.168.46.0/24
[root@localhost ~]# mkdir /myshare
[root@localhost ~]# cd /myshare
[root@localhost myshare]# echo "hello" > file
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
客户端:
[root@localhost ~]# yum -y install nfs-utils
[root@localhost ~]# showmount -e 192.168.46.128
Export list for 192.168.46.128:
# 虽然我们自己配置共享了,但是没有重读配置文件,所以读不到
服务端:
[root@localhost ~]# exportfs -r
exportfs: No options for /myshare 192.168.46.0/24: suggest 192.168.46.0/24(sync) to avoid warning
[root@localhost ~]# exportfs -v
/myshare        192.168.46.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
客户端:
[root@localhost ~]# showmount -e 192.168.46.128
Export list for 192.168.46.128:
/myshare 192.168.46.0/24
[root@localhost ~]# mkdir /mnt/nfs
[root@localhost ~]# mount -t nfs 192.168.46.128:/myshare /mnt/nfs
[root@localhost ~]# df -h
[root@localhost ~]# rm file
[root@localhost ~]# umount /mnt/nfs
现在是只读模式,想要修改模式要去改配置文件
服务端:
[root@localhost ~]# vim /etc/exports
/myshare 192.168.46.0/24(rw,sync,root_squash,no_all_squash)
[root@localhost ~]# exportfs -v
/myshare        192.168.46.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
[root@localhost ~]# exportfs -r
[root@localhost ~]# exportfs -v
/myshare        192.168.46.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
客户端:
[root@localhost ~]# showmount -e 192.168.46.128
Export list for 192.168.46.128:
/myshare 192.168.46.0/24
[root@localhost ~]# mount -t nfs 192.168.46.128:/myshare /mnt/nfs
[root@localhost ~]# df -h
[root@localhost ~]# cd /mnt/nfs/
[root@localhost nfs]# rm file
rm:是否删除普通空文件 "file"?y
rm: 无法删除"file": 权限不够
# 虽然给了rw权限,但是目录权限被linux控制
服务端:
[root@localhost ~]# ll -d /myshare/
drwxr-xr-x. 2 root root 18 7月  13 21:05 /myshare/
[root@localhost ~]# chmod a+w /myshare
[root@192 myshare]# ll -d /myshare/
drwxrwxrwx. 2 root root 18 7月  13 21:05 /myshare/
客户端:
[root@localhost nfs]# rm file
rm:是否删除普通空文件 "file"?y
[root@localhost nfs]# echo "hello" >> file
[root@localhost nfs]# ll
总用量 4
-rw-r--r-- 1 nfsnobody nfsnobody 6 7月  13 21:23 file
[root@localhost nfs]# su - user01
[user01@localhost ~]$ cd /mnt/nfs/
[user01@localhost nfs]$ touch file1
[user01@localhost nfs]$ ll
总用量 4
-rw-r--r-- 1 nfsnobody nfsnobody 6 7月  13 21:23 file
-rw-rw-r-- 1 user01    user01    0 7月  13 21:23 file1
服务端:
[root@localhost myshare]# ll
总用量 4
-rw-r--r--. 1 nfsnobody nfsnobody 6 7月  13 21:27 file
-rw-rw-r--. 1      1000      1000 0 7月  13 21:27 file1
[root@localhost myshare]# useradd -u1000 zhangsan
[root@localhost myshare]# ll
总用量 4
-rw-r--r--. 1 nfsnobody nfsnobody 6 7月  13 21:30 file
-rw-rw-r--. 1 zhangsan  zhangsan  0 7月  13 21:30 file1
[root@localhost ~]# vim /etc/exports
/myshare 192.168.46.0/24(rw,sync,no_root_squash,all_squash)
[root@localhost myshare]# exportfs -r
[root@localhost myshare]# exportfs -v
/myshare        192.168.46.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,all_squash)
客户端:
[root@localhost ~]# umount /mnt/nfs/
[root@localhost ~]# mount -t nfs 192.168.46.128:/myshare /mnt/nfs
[root@localhost ~]# df -h
[root@localhost ~]# cd /mnt/nfs/
[root@localhost ~]# touch file{1,2,3}
[root@localhost nfs]# ll
总用量 4
-rw-r--r-- 1 nfsnobody nfsnobody 6 7月  13 21:35 file
-rw-rw-r-- 1 user01    user01    0 7月  13 21:35 file1
-rw-r--r-- 1 nfsnobody nfsnobody 0 7月  13 21:35 file2
-rw-r--r-- 1 nfsnobody nfsnobody 0 7月  13 21:36 file3
7.4、mount.nfs

客户端 NFS 挂载

NFS 相关的挂载选项:man 5 nfs

提示:基于安全考虑,建议使用nosuid,_netdev,noexec挂载选项

范例:临时挂载 NFS 共享

mount -o rw,nosuid,fg,hard,intr 192.168.46.128:/test/dir /mnt/nfs

范例:开机挂载

vim /etc/fstab
192.168.46.128:/public    /mnt/nfs    nfs    defaults,_netdev  0 0

8、自动挂载

可使用autofs服务按需要挂载外围设备,NFS共享等,并在空闲5分钟后后自动卸载

8.1、相关包和文件
8.2、配置文件格式

参看帮助: man 5 autofs

所有导出到网络中的NFS启用特殊匹配-host至"browse"

范例: /net目录可以自动挂载NFS共享

cat /etc/auto.master
/net    -hosts
cd /net/192.168.46.128
8.2.1、相对路径法
挂载点的dirname    指定目录的配置文件路径
挂载点的basename    挂载选项    选项设备
# 案例
客户端:
[root@localhost ~]# vim /etc/auto.master
/misc    /etc/auto.misc
[root@localhost ~]# mkdir /misc 
[root@localhost ~]# vim /etc/auto.misc
# 表示/misc下面的子目录和nfs共享/export目录的子目录同名
* -fstype=nfs,vers=3 192.168.46.128:/myshare/&
[root@localhost ~]# systemctl restart autofs
服务端:
[root@localhost myshare]# mkdir -p dir/dir1
客户端:
[root@localhost ~]# df -h
[root@localhost misc]# ll /misc
总用量 0
[root@localhost misc]# cd /misc/dir
[root@localhost dir]# ll
总用量 0
drwxr-xr-x 2 root root 6 7月  13 21:39 dir1
[root@localhost dir]# df -h
8.2.2、绝对路径法
/-      指定配置文件路径
绝对路径      挂载选项      选项设备
# 案例
[root@localhost dir]# vim /etc/auto.misc
#* -fstype=nfs,vers=3 192.168.46.128:/myshare/&
#把之前挂载的注释掉,防止重复挂载出问题
[root@localhost dir]# vim /etc/auto.master
/-      /etc/auto.direct
#添加一行,/-表示直接挂在根目录下
[root@localhost dir]# vim /etc/auto.direct
/nfsdir -fstype=nfs 192.168.46.128:/myshare
[root@localhost dir]# mkdir /nfsdir
[root@localhost dir]# systemctl restart autofs
[root@localhost dir]# df -h
[root@localhost ~]# cd /nfsdir/
[root@localhost ~]# df -h

9、实战案例

将NFS的共享目录,通过autofs 发布出来,做为远程主机用户的家目录

image-122

9.1、环境准备

将node1中的用户家目录共享出来,node2在登陆这个用户的到时候,看到家目录下的文件是一致的

9.2、步骤
[root@NFSserver ~]# mkdir /data
[root@NFSserver ~]# useradd -d /data/user user
[root@NFSserver ~]# id user
uid=1000(user) gid=1000(user) =1000(user)
[root@NFSserver ~]# vim /etc/exports
#/myshare 192.168.46.0/24(rw,sync,no_root_squash,all_squash)
/data/user    *(rw,sync,anonuid=1000,anongid=1000,all_squash)
[root@NFSserver ~]# exportfs -r
[root@NFSserver ~]# exportfs -v
/data/user      <world>(sync,wdelay,hide,no_subtree_check,anonuid=1000,anongid=1000,sec=sys,rw,secure,root_squash,all_squash)
[root@localhost ~]# vim /etc/auto.master
/-      /etc/auto.direct
[root@NFSclient ~]# vim /etc/auto.direct
/data/user -fstype=nfs,vers=3 192.168.46.128:/data/user
[root@NFSclient ~]# systemctl restart autofs
[root@NFSclient ~]# mkdir /data
[root@NFSclient ~]# useradd -d /data/user -u 1000 user
[root@NFSserver ~]# su - user
[user@NFSserver ~]$ touch file
# 在NSF服务器上登录user用户,创建文件在家目录中
[root@NFSclient /]# su - user
[user@NFSclient ~]$ ll
总用量 0
-rw-rw-r--. 1 user user 0 7月  13 21:50 file
# 在NSF客户机上登录user用户,发现文件已经被共享了

四、samba

1、samba简介

SMB:Server Message Block服务器消息块,IBM发布,最早是DOS网络文件共享协议

CIFS:common internet file system,微软基于SMB发布

SAMBA:1991年Andrew Tridgell,实现windows和UNIX相通

SAMBA的功能:

Windows计算机网络管理模式:

2、软件介绍

2.1、相关包
2.2、相关服务进程

smbd 提供smb(cifs)服务 TCP:139,445

nmbd NetBIOS名称解析 UDP:137,138

2.3、主配置文件

主配置文件:/etc/samba/smb.conf 帮助参看:man smb.conf

语法检查: testparm [-v] [/etc/samba/smb.conf]

3、管理SAMBA用户

说明:samba用户须是Linux用户,建议使用/sbin/nologin

yum -y install samba
yum -y install samba-client
systemctl start smb
systemctl start nmb
[root@localhost ~]# useradd -r -s /sbin/nologin smb1
[root@localhost ~]# smbpasswd -a smb1
New SMB password:
Retype new SMB password:
Added user smb1.
[root@localhost ~]# pdbedit -a -u smb1
# 这个是pdbedit工具的使用
[root@localhost ~]# smbpasswd smb1
[root@localhost ~]# smbpasswd -x smb1
[root@localhost ~]# pdbedit -x -u smb1
[root@localhost ~]# pdbedit -L -v
[root@localhost ~]# yum install -y samba
[root@localhost ~]# smbstatus

4、samba服务器配置

samba 配置文件/etc/samba/smb.conf格式 ,使用.ini文件的格式

[root@localhost ~]# vim /etc/samba/smb.conf
[global] #全局参数。
    workgroup = MYGROUP #工作组名称
    server string = Samba Server Version %v #服务器介绍信息,参数%v为显示SMB版本号
    log file = /var/log/samba/log.%m #定义日志文件的存放位置与名称,参数%m为来访的主机名
    max log size = 50 #定义日志文件的最大容量为50KB
    security = user #安全验证的方式,总共有4种
      #share:来访主机无需验证口令;比较方便,但安全性很差
      #user:需验证来访主机提供的口令后才可以访问;提升了安全性
      #server:使用独立的远程主机验证来访主机提供的口令(集中管理账户)
      #domain:使用域控制器进行身份验证
    passdb backend = tdbsam #定义用户后台的类型,共有3种
      #smbpasswd:使用smbpasswd命令为系统用户设置Samba服务程序的密码
      #tdbsam:创建数据库文件并使用pdbedit命令建立Samba服务程序的用户
      #ldapsam:基于LDAP服务进行账户验证
    load printers = yes #设置在Samba服务启动时是否共享打印机设备
    cups options = raw #打印机的选项
    hosts allow = 172.16. .example.com
      # 配置允许访问的主机,可以写成hosts deny来配置拒绝访问的主机
    max log size=50
      # 日志文件达到50K,将轮循rotate,单位KB
[homes] #共享参数
    comment = Home Directories #描述信息
    valid users = %S, %D%w%S
    browseable = no #指定共享信息是否在“网上邻居”中可见
    writable = yes #定义是否可以执行写入操作,与“read only”相反
[printers] #打印机共享参数
    comment = All Printers
    path = /var/spool/samba #共享文件的实际路径(重要)。
    browseable = no
    guest ok = no #是否所有人可见,等同于"public"参数。
    writable = no
    printable = yes
[print$]    # $符号表示隐藏
    comment = Printer Drivers
    path = /var/lib/samba/drivers
    write list = @printadmin root
    force group = @printadmin
    create mask = 0664
    directory mask = 0775

宏定义:

5、配置特定目录共享

每个共享目录应该有独立的[ ]部分

范例:基于特定用户和组的共享

[root@localhost ~]# vim /etc/samba/smb.conf
#最后追加
[share]
path = /app/dir
vaild user=smb1,@smb1
writeable = no
browseable = yes
[root@localhost ~]# mkdir -p /app/dir
[root@localhost dir]# systemctl stop firewalld
[root@localhost dir]# setenforce 0
[root@localhost ~]# systemctl restart smb
没有写权限
[root@localhost ~]# vim /etc/samba/smb.conf
[share]
path = /app/dir
vaild user=smb1,@smb1
writeable = yes
browseable = yes
[root@localhost ~]# systemctl restart smb
[root@localhost dir]# chmod o+w /app/dir

客户端工具:smbclient,mount.cifs

yum -y install samba
yum -y install samba-client
systemctl start smb
systemctl start nmb

6、SAMBA客户端工具

UNC路径: Universal Naming Convention,通用命名规范,格式如下

\\sambaserver\sharename     #中间为samba服务器名或者ip地址

使用smbclient 访问SAMBA服务器

smbclient -L instructor.example.com
smbclient -L instructor.example.com -U smb用户

smbclient //192.168.112.132/share -U smb1
#可以使用-U选项来指定用户%密码,或通过设置和导出USER和PASSWD环境变量来指定
smbclient //instructor.example.com/shared -U user
>cd directory
>get file1 /root/file
>get 1.txt /root/1.txt
>put file2
>put 相对路径

挂载CIFS文件系统 范例:手动挂载

yum -y install cifs-utils
mkdir /mnt/smb1
mount -o user=smb1,password=123 //192.168.175.10/share /mnt/smb

[root@localhost ~]# mount -o user=smb1,password=123 //192.168.175.19/share /mnt/smb
[root@localhost ~]# df -h

范例:开机自动挂载

[root@localhost ~]# cat /etc/fstab
//server/homes /mnt cifs defaults,username='username',password='your password' 0 0

[root@localhost ~]# cat /etc/fstab
//192.168.175.19/share /mnt/smb cifs defaults,username=smb1,password=123 0 0

7、案例:通过用户名共享文件

共享销售部/xsb这个目录,只有知道用户名和密码的同时可以看这个共享,在/xsb目录中存放销售部重要的数据。需要将security设置为user级别,这样可以启用samba身份验证机制,然后在共享目录/xsb下设置valid user 字段,配置只允许销售部员工能访问这个共享目录

[root@server1 ~]# vim /etc/samba/smb.conf
[global]
        workgroup = SAMBA
        security = user
#       passdb backend = tdbsam
        passdb backend = smbpasswd
        smb passwd file = /etc/samba/smbpasswd
        printing = cups
        printcap name = cups
        load printers = yes
        cups options = raw
# 重启smb服务之后,会自动生成/etc/samba/smbpasswd该文件
[root@server1 ~]# systemctl restart smb
[root@server1 ~]# ll /etc/samba/smbpasswd
-rw-------. 1 root root 0 7月  17 21:54 /etc/samba/smbpasswd
[root@server1 ~]# groupadd xsb
[root@server1 ~]# useradd -g xsb -M -s /sbin/nologin xsb01
[root@server1 ~]# useradd -g xsb -M -s /sbin/nologin xsb02
[root@server1 ~]# useradd jsb01
[root@server1 ~]# smbpasswd -a xsb01
New SMB password:
Retype new SMB password:
Added user xsb01.
[root@server1 ~]# smbpasswd -a xsb02
New SMB password:
Retype new SMB password:
Added user xsb02.
[root@server1 ~]# mkdir /xsb
[root@server1 ~]# cp /etc/hosts /xsb
[root@server1 ~]# vim /etc/samba/smb.conf
[xsb]
comment = 销售部重要文件
path = /xsb
valid user = xsb01 xsb02
#valid user = xsb01,@xsb
[root@server1 ~]# systemctl restart smb.service 
[root@server1 ~]# systemctl restart nmb.service
[root@server1 ~]# ss -tanl
State       Recv-Q Send-Q  Local Address:Port                 Peer Address:Port              
LISTEN      0      50                  *:139                             *:*                  
LISTEN      0      50                  *:445                             *:*                  
LISTEN      0      50                 :::139                            :::*                  
LISTEN      0      50                 :::445                            :::*

ss命令的输出中,Recv-QSend-Q是与TCP连接相关的两个队列的大小。

# linux上验证
[root@server2 ~]# yum install samba-client -y
[root@server2 ~]# smbclient -L //192.168.80.151/xsb -U xsb01
Enter SAMBA\xsb01 password: 
    Sharename       Type      Comment
    ---------       ----      -------
    print$          Disk      Printer Drivers
    xsb             Disk      Xsb Data
    IPC$            IPC       IPC Service (Samba 4.10.16)
    xsb01           Disk      Home Directories
Reconnecting with SMB1 for workgroup listing.
    Server               Comment
    ---------            -------
    Workgroup            Master
    ---------            -------
    SAMBA                SERVER1
# 在windows上进行验证
    windows验证:
    在Window运行输入地址:\\192.168.10.10
    用户名:******
    密码:******
    可以在DOS窗口中使用命令net use * /delete 清空用户缓存信息


# 别的部门需要先检查秘钥文件
[root@server2 ~]# mkdir /xsbdata
[root@server2 ~]# yum install cifs-utils -y
[root@server2 ~]# vim auth.smb
username=xsb01
password=1
[root@server2 ~]# vim /etc/fstab
//192.168.175.19/xsb /xsbdata cifs defaults,credentials=/root/auth.smb 0 0
[root@server2 ~]# mount -a
[root@server2 ~]# df -h
[root@server2 ~]# ls /xsbdata/
hosts

8、案例:不同账户访问不同目录

#创建三个samba用户,并指定密码为centos
useradd -s /sbin/nologin -r smb1   #加选项-r 不创建家目录
useradd -s /sbin/nologin -r smb2
useradd -s /sbin/nologin -r smb3
smbpasswd -a smb1       #创建对应账号的口令  ,不加-a表示修改已经存在的账号的口令
smbpasswd -a smb2
smbpasswd -a smb3
[root@SMB ~]#pdbedit -L    #查看samba账号
smb1:995:
smb3:993:
smb2:994:
#修改samba配置文件
vim /etc/samba/smb.conf
#在[global]的workgroup下加一行 
config file= /etc/samba/conf.d/%U 说明:%U表示用户名  #这个步骤为关键步骤
[share]               #共享文件夹在最后添加
    Path=/data/dir        #指定分享文件夹的路径
    writeable = yes
    browseable = yes       
    Guest ok=yes        #是否所有人可见,等同于"public"参数。
[root@SMB ~]# mkdir -p /data/dir
[root@SMB ~]# mkdir -p /data/dir1
[root@SMB ~]# mkdir -p /data/dir2
[root@SMB ~]# touch /data/dir/share.txt  #新建共享文件
[root@SMB ~]# touch /data/dir1/smb1.txt  #新建给smb1用户访问特定文件
[root@SMB ~]# touch /data/dir2/smb2.txt  #新建给smb2用户访问特定文件
[root@SMB ~]# tree /data/
/data/
├── dir
│   └── share.txt
├── dir1
│   └── smb1.txt
└── dir2
    └── smb2.txt

3 directories, 3 files
#针对smb1和smb2用户创建单独的配置文件
[root@SMB ~]# mkdir /etc/samba/conf.d/ -pv
[root@SMB ~]# vim /etc/samba/conf.d/smb1
[share]
Path=/data/dir1
Read only= NO #等价于writable = yes
Create mask=0644
#说明:默认为744
[root@SMB ~]# vim /etc/samba/conf.d/smb2
[share]
path=/data/dir2
[root@SMB ~]# systemctl restart smb nmb    #重启对应的服务
# 如果失败,将多余缩进删除
cat -A /etc/samba/smb.conf

#用户smb1,smb2,smb3访问share共享目录,看到目录是不同目录,smb3访问的是默认的share目录
[root@client ~]#smbclient //192.168.32.18/share -U smb1%centos
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Fri Dec 20 13:11:40 2019
  ..                                  D        0  Fri Dec 20 13:10:56 2019
  smb1.txt                            N        0  Fri Dec 20 13:11:40 2019
        52403200 blocks of size 1024. 52004560 blocks available
smb: \> exit
[root@client ~]#smbclient //192.168.32.18/share -U smb2%centos
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Fri Dec 20 13:12:53 2019
  ..                                  D        0  Fri Dec 20 13:10:56 2019
  smb2.txt                            N        0  Fri Dec 20 13:12:53 2019
        52403200 blocks of size 1024. 52004560 blocks available
smb: \> exit
[root@client ~]#smbclient //192.168.32.18/share -U smb3%centos
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Fri Dec 20 13:13:12 2019
  ..                                  D        0  Fri Dec 20 13:10:56 2019
  share.txt                           N        0  Fri Dec 20 13:11:26 2019
        52403200 blocks of size 1024. 52004560 blocks available
smb: \> exit
[root@client ~]#

五、HTTP协议

1、HTTP介绍

2、HTTP 工作原理

3、URL

HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息

URL,全称是UniformResourceLocator, 中文叫统一资源定位符,是互联网上用来标识某一处资源的地址。以下面这个URL为例,介绍下普通URL的各部分组成:

http://iproute.cn:80/news/search?keyword=123&enc=utf8#name=321

从上面的URL可以看出,一个完整的URL包括以下几部分:

  1. 协议部分:该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等本例中使用的是HTTP协议。在"HTTP"后面的“//”为分隔符
  2. 域名部分:该URL的域名部分为“iproute.cn”。一个URL中,也可以使用IP地址作为域名使用
  3. 端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口
  4. 虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。本例中的虚拟目录是“/news/”
  5. 文件名部分:从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“search”。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名
  6. 锚部分:从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL必须的部分
  7. 参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“keyword=123&enc=utf8”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。

4、HTTP注意事项

  1. HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  2. HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
  3. HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

5、HTTP 消息结构

image-123

5.1、HTTP请求头部

客户端发送一个HTTP请求到服务器的请求消息包括以下格式:

image-124

image-125

GET / HTTP/1.1
Host: iproute.cn
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: close
POST / HTTP/1.1
Host: d2.s.iproute.cn
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://d2.s.iproute.cn/
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 27
# m_name=admin&m_pwd=admin888
5.2、常见http请求报文头部属性
5.3、HTTP响应头部

服务的相应信息格式如下:

image-126

image-127

HTTP/1.1 200 OK
Server: nginx
Date: Sun, 02 May 2021 00:27:06 GMT
Content-Type: text/html
Last-Modified: Wed, 05 Aug 2020 11:25:56 GMT
Connection: close
Vary: Accept-Encoding
ETag: W/"5f2a9744-aff7"
Strict-Transport-Security: max-age=31536000
Content-Length: 45047
<h1>hello world</h1>
5.4、POST和GET请求方法区别
5.5、常见http响应报文头部属性

6、HTTP状态码

200 OK                        //客户端请求成功
400 Bad Request               //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized              //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 
403 Forbidden                 //服务器收到请求,但是拒绝提供服务
404 Not Found                 //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error     //服务器发生不可预期的错误
503 Server Unavailable        //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

7、HTTP请求方法

根据HTTP标准,HTTP请求可以使用多种请求方法。

HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。

HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

8、HTTP工作原理

在浏览器地址栏键入URL,按下回车之后会经历以下流程:

  1. 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
  2. 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
  3. 浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
  4. 服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
  5. 释放 TCP连接;
  6. 浏览器将该 html 文本并显示内容;

9、长连接与短连接

HTTP1.1规定了默认保持长连接(HTTP persistent connection ,也有翻译为持久连接),数据传输完成了保持TCP连接不断开(不发RST包、不四次握手),等待在同域名下继续用这个通道传输数据;相反的就是短连接。

在实际使用中,HTTP头部有了Keep-Alive这个值并不代表一定会使用长连接,客户端和服务器端都可以无视这个值,也就是不按标准来。毕竟TCP是一个双向连接的协议,双方都可以决定是不是主动断开。

客户端的长连接不可能无限期的拿着,会有一个超时时间,服务器有时候会告诉客户端超时时间。下图中的Keep-Alive: timeout=20,表示这个TCP通道可以保持20秒

image-128

10、python实现http协议

import socket
sk = socket.socket()
sk.bind(("127.0.0.1",80))
sk.listen()
while True:
    conn, addr = sk.accept()
    data = conn.recv(8096)
    conn.send(b"HTTP/1.1 200 OK\r\n\r\n")
    conn.send(b"<h1>OK</h1>")
    conn.close()
10.1、根据不同的路径返回不同的内容
import socket
sk = socket.socket()
sk.bind(("127.0.0.1",80))
sk.listen()
while True:
    conn, addr = sk.accept()
    data = conn.recv(8096)
    ret = str(data,encoding='utf-8')
    url = ret.split()[1]
    conn.send(b"HTTP/1.1 200 OK\r\n\r\n")
    if url == '/home':
        respone = b"<h1>in home</h1>"
    elif url == '/index':
        respone = b"<h1>in index</h1>"
    else:
        respone = b"<h1>404 not found!</h1>"
    conn.send(respone)
    conn.close()

六、Apache

1、常用的网站服务软件

image-129

2、apache安装

[root@localhost ~]# firewall-cmd --add-port=80/tcp --permanent
[root@localhost ~]# firewall-cmd --reload
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# systemctl enable httpd
[root@localhost ~]# httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Nov 16 2020 16:18:20
[root@localhost ~]# curl -I 127.0.0.1
HTTP/1.1 403 Forbidden
Date: Sun, 02 May 2021 02:00:32 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Thu, 16 Oct 2014 13:20:58 GMT
ETag: "1321-5058a1e728280"
Accept-Ranges: bytes
Content-Length: 4897
Content-Type: text/html; charset=UTF-8

image-130

2.1、httpd命令

httpd为Apache HTTP服务器程序。直接执行程序可启动服务器的服务

httpd [-hlLStvVX][-c<httpd指令>][-C<httpd指令>][-d<服务器根目录>][-D<设定文件参数>][-f<设定文件>]
2.1.1、选项
2.2、指定服务器名字
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
ServerName www.example.com:80
[root@localhost ~]# httpd -t    # 检查语法
Syntax OK
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
Listen 80
[root@localhost ~]# systemctl reload httpd
2.3、持久连接

Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成,默认关闭持久连接 断开条件:时间限制:以秒为单位, 默认5s,httpd-2.4 支持毫秒级 副作用:对并发访问量大的服务器,持久连接会使有些请求得不到响应折中:使用较短的持久连接时间

[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
Keepalive On|Off
KeepaliveTimeout 15 #连接持续15s,可以以ms为单位,默认值为5s
MaxKeepaliveRequests 500 #持久连接最大接收的请求数,默认值100
[root@localhost ~]# yum -y install telnet
[root@localhost ~]# telnet 127.0.0.1 80
GET / HTTP/1.1
Host:127.0.0.1
* 修改默认的超时时间
[root@localhost ~]# telnet 127.0.0.1 80
GET / HTTP/1.1
Host:127.0.0.1
[root@localhost ~]#cat /etc/httpd/conf/httpd.conf|grep Keepalive
Keepalive on
Keepalivetimeout 30000ms

3、apache功能模块

[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
Include conf.modules.d/*.conf
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
LoadModule <mod_name> <mod_path>

模块文件路径可使用相对路径:相对于ServerRoot(默认/etc/httpd) 范例:查看模块加载的配置文件

root@localhost ~]# ls /etc/httpd/conf.modules.d/
00-base.conf  00-dav.conf  00-lua.conf  00-mpm.conf  00-proxy.conf  00-systemd.conf  01-cgi.conf
# 可以指定加载的模块
[root@localhost ~]# cat /etc/httpd/conf.modules.d/00-base.conf
#
# This file loads most of the modules included with the Apache HTTP
# Server itself.
#
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule actions_module modules/mod_actions.so
LoadModule alias_module modules/mod_alias.so
LoadModule allowmethods_module modules/mod_allowmethods.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule authn_anon_module modules/mod_authn_anon.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authn_dbd_module modules/mod_authn_dbd.so
LoadModule authn_dbm_module modules/mod_authn_dbm.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_socache_module modules/mod_authn_socache.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule authz_dbd_module modules/mod_authz_dbd.so
LoadModule authz_dbm_module modules/mod_authz_dbm.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_owner_module modules/mod_authz_owner.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule cache_module modules/mod_cache.so
LoadModule cache_disk_module modules/mod_cache_disk.so
LoadModule data_module modules/mod_data.so
LoadModule dbd_module modules/mod_dbd.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule dir_module modules/mod_dir.so
LoadModule dumpio_module modules/mod_dumpio.so
LoadModule echo_module modules/mod_echo.so
LoadModule env_module modules/mod_env.so
LoadModule expires_module modules/mod_expires.so
LoadModule ext_filter_module modules/mod_ext_filter.so
LoadModule filter_module modules/mod_filter.so
LoadModule headers_module modules/mod_headers.so
LoadModule include_module modules/mod_include.so
LoadModule info_module modules/mod_info.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule logio_module modules/mod_logio.so
LoadModule mime_magic_module modules/mod_mime_magic.so
LoadModule mime_module modules/mod_mime.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule remoteip_module modules/mod_remoteip.so
LoadModule reqtimeout_module modules/mod_reqtimeout.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule slotmem_plain_module modules/mod_slotmem_plain.so
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
LoadModule socache_dbm_module modules/mod_socache_dbm.so
LoadModule socache_memcache_module modules/mod_socache_memcache.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule status_module modules/mod_status.so
LoadModule substitute_module modules/mod_substitute.so
LoadModule suexec_module modules/mod_suexec.so
LoadModule unique_id_module modules/mod_unique_id.so
LoadModule unixd_module modules/mod_unixd.so
LoadModule userdir_module modules/mod_userdir.so
LoadModule version_module modules/mod_version.so
LoadModule vhost_alias_module modules/mod_vhost_alias.so

#LoadModule buffer_module modules/mod_buffer.so
#LoadModule watchdog_module modules/mod_watchdog.so
#LoadModule heartbeat_module modules/mod_heartbeat.so
#LoadModule heartmonitor_module modules/mod_heartmonitor.so
#LoadModule usertrack_module modules/mod_usertrack.so
#LoadModule dialup_module modules/mod_dialup.so
#LoadModule charset_lite_module modules/mod_charset_lite.so
#LoadModule log_debug_module modules/mod_log_debug.so
#LoadModule ratelimit_module modules/mod_ratelimit.so
#LoadModule reflector_module modules/mod_reflector.so
#LoadModule request_module modules/mod_request.so
#LoadModule sed_module modules/mod_sed.so
#LoadModule speling_module modules/mod_speling.so

4、MPM多路处理模块

httpd 支持三种MPM工作模式:prefork, worker, event

[root@localhost ~]# cat /etc/httpd/conf.modules.d/00-mpm.conf |grep mpm
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
#LoadModule mpm_event_module modules/mod_mpm_event.so
[root@localhost ~]# ps aux |grep httpd
root       7116  0.0  0.2 224072  5016 ?        Ss   10:39   0:00 /usr/sbin/httpd -DFOREGROUND
apache     7124  0.0  0.1 224072  2960 ?        S    10:39   0:00 /usr/sbin/httpd -DFOREGROUND
apache     7125  0.0  0.1 224072  2960 ?        S    10:39   0:00 /usr/sbin/httpd -DFOREGROUND
apache     7126  0.0  0.1 224072  2960 ?        S    10:39   0:00 /usr/sbin/httpd -DFOREGROUND
apache     7127  0.0  0.1 224072  2960 ?        S    10:39   0:00 /usr/sbin/httpd -DFOREGROUND
apache     7128  0.0  0.1 224072  2960 ?        S    10:39   0:00 /usr/sbin/httpd -DFOREGROUND
root       7214  0.0  0.0 112724   984 pts/0    S+   10:50   0:00 grep --color=auto httpd
[root@localhost ~]# pstree -p 7116
httpd(7116)─┬─httpd(7124)
            ├─httpd(7125)
            ├─httpd(7126)
            ├─httpd(7127)
            └─httpd(7128)
[root@localhost ~]# cat /etc/httpd/conf.modules.d/00-mpm.conf |grep mpm
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
LoadModule mpm_worker_module modules/mod_mpm_worker.so
#LoadModule mpm_event_module modules/mod_mpm_event.so
[root@localhost ~]# systemctl restart httpd
[root@localhost ~]# ps aux |grep httpd
root       7231  0.2  0.2 224276  5224 ?        Ss   10:52   0:00 /usr/sbin/httpd -DFOREGROUND
apache     7232  0.0  0.1 224024  2928 ?        S    10:52   0:00 /usr/sbin/httpd -DFOREGROUND
apache     7233  0.0  0.3 576640  7560 ?        Sl   10:52   0:00 /usr/sbin/httpd -DFOREGROUND
apache     7234  0.0  0.3 511104  7564 ?        Sl   10:52   0:00 /usr/sbin/httpd -DFOREGROUND
apache     7235  0.0  0.3 576640  7568 ?        Sl   10:52   0:00 /usr/sbin/httpd -DFOREGROUND
root       7318  0.0  0.0 112724   984 pts/0    S+   10:52   0:00 grep --color=auto httpd
[root@localhost ~]# pstree -p 7231
httpd(7231)─┬─httpd(7232)
            ├─httpd(7233)─┬─{httpd}(7241)
                         ├─{httpd}(7259)
                         ├─{httpd}(7261)
                         ├─{httpd}(7263)
                         ├─{httpd}(7265)
                         ├─{httpd}(7267)
4.1、prefork模式

image-131

默认的工作模式是Prefork MPM,这种模式采用的是预派生子进程方式,用单独的子进程来处理请求,子进程间互相独立,互不影响,大大的提高了稳定性,但每个进程都会占用内存,所以消耗系统资源过高。

Prefork MPM 工作原理:控制进程Master首先会生成“StartServers”个进程,“StartServers”可以在Apache主配置文件里配置,然后为了满足“MinSpareServers”设置的最小空闲进程个数,会建立一个空闲进程,等待一秒钟,继续创建两个空闲进程,再等待一秒钟,继续创建四个空闲进程,以此类推,会不断的递归增长创建进程,最大同时创建32个空闲进程,直到满足“MinSpareServers”设置的空闲进程个数为止。Apache的预派生模式不必在请求到来的时候创建进程,这样会减小系统开销以增加性能,不过Prefork MPM是基于多进程的模式工作的,每个进程都会占用内存,这样资源消耗也较高。

[root@localhost ~]# httpd -V
Server version: Apache/2.4.6 (CentOS)
Server built:   Nov 16 2020 16:18:20
Server Module Magic Number: 20120211:24
Server loaded:  APR 1.4.8, APR-UTIL 1.5.2
Compiled using: APR 1.4.8, APR-UTIL 1.5.2
Architecture:   64-bit
Server MPM:     prefork
  threaded:     no
    forked:     yes (variable process count)
[root@localhost ~]# vim /etc/httpd/conf.d/mpm.conf
StartServers 5              #开始访问进程
MinSpareServers 5           #最小空闲进程
MaxSpareServers 10           #无人访问时,留下空闲的进程
ServerLimit 256               #最多进程数,最大值 20000
MaxRequestWorkers 256         #最大的并发连接数,默认256
MaxConnectionsPerChild 4000    
#子进程最多能处理的请求数量。在处理MaxRequestsPerChild 个请求之后,子进程将会被父进程终止,这时候子进程占用的内存就会释放(为0时永远不释放)
MaxRequestsPerChild 4000
#从 httpd.2.3.9开始被MaxConnectionsPerChild代替
[root@localhost ~]# systemctl restart httpd
[root@localhost ~]# pstree -p 7606
httpd(7606)─┬─httpd(7607)
            ├─httpd(7608)
            ├─httpd(7609)
            ├─httpd(7610)
            └─httpd(7611)
[root@localhost ~]# vim /etc/httpd/conf.d/mpm.conf
StartServers 10
MaxSpareServers 15
MinSpareServers 10
MaxRequestWorkers 256
MaxRequestsPerChild 4000
[root@localhost ~]# systemctl restart httpd
[root@localhost ~]# pstree -p 7628
httpd(7628)─┬─httpd(7629)
            ├─httpd(7630)
            ├─httpd(7631)
            ├─httpd(7632)
            ├─httpd(7633)
            ├─httpd(7634)
            ├─httpd(7635)
            ├─httpd(7636)
            ├─httpd(7637)
            └─httpd(7638)
[root@localhost ~]# ab -c 1000 -n 1000000 http://127.0.0.1/
# -c    即concurrency,用于指定的并发数
# -n    即requests,用于指定压力测试总共的执行次数
[root@localhost ~]# ps aux |grep httpd |wc -l
258
[root@localhost ~]# ps aux |grep httpd |wc -l
12
4.2、worker模式

image-132

Worker MPM是Apche 2.0版本中全新的支持多进程多线程混合模型的MPM,由于使用线程来处理HTTP请求,所以效率非常高,而对系统的开销也相对较低,Worker MPM也是基于多进程的,但是每个进程会生成多个线程,由线程来处理请求,这样可以保证多线程可以获得进程的稳定性;

Worker MPM工作原理: 控制进程Master在最初会建立“StartServers”个进程,然后每个进程会创建“ThreadPerChild”个线程,多线程共享该进程内的资源,同时每个线程独立的处理HTTP请求,为了不在请求到来的时候创建线程,Worker MPM也可以设置最大最小空闲线程,Worker MPM模式下同时处理的请求=ThreadPerChild*进程数,也就是MaxClients,如果服务负载较高,当前进程数不满足需求,Master控制进程会fork新的进程,最大进程数不能超过ServerLimit数,如果需要,可以调整这些对应的参数,比如,如果要调整StartServers的数量,则也要调整 ServerLimit的值

[root@localhost ~]# vim /etc/httpd/conf.d/mpm.conf
ServerLimit         16
StartServers         2
MaxRequestWorkers  150
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25
[root@localhost ~]# cat /etc/httpd/conf.modules.d/00-mpm.conf |grep mpm
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
LoadModule mpm_worker_module modules/mod_mpm_worker.so
#LoadModule mpm_event_module modules/mod_mpm_event.so
[root@localhost ~]# systemctl restart httpd
[root@localhost ~]# httpd -V
Server version: Apache/2.4.6 (CentOS)
Server built:   Nov 16 2020 16:18:20
Server Module Magic Number: 20120211:24
Server loaded:  APR 1.4.8, APR-UTIL 1.5.2
Compiled using: APR 1.4.8, APR-UTIL 1.5.2
Architecture:   64-bit
Server MPM:     worker
  threaded:     yes (fixed thread count)
    forked:     yes (variable process count)
[root@localhost ~]# ps aux |grep httpd |wc -l
5
[root@localhost ~]# pstree -p 8615 | wc -l
53
[root@localhost ~]# ab -c 1000 -n 1000000 http://127.0.0.1/
[root@localhost ~]# ps aux |grep httpd |wc -l
9
[root@localhost ~]# pstree -p 8393 | wc -l
157
4.3、event模式

image-133

这个是 Apache中最新的模式,在现在版本里的已经是稳定可用的模式。它和 worker模式很像,最大的区别在于,它解决了 keep-alive 场景下 ,长期被占用的线程的资源浪费问题(某些线程因为被keep-alive,挂在那里等待,中间几乎没有请求过来,一直等到超时)。

event MPM中,会有一个专门的线程来管理这些 keep-alive 类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样,一个线程就能处理几个请求了,实现了异步非阻塞。

event MPM在遇到某些不兼容的模块时,会失效,将会回退到worker模式,一个工作线程处理一个请求。官方自带的模块,全部是支持event MPM的。

5、主配置文件 httpd.conf

[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
DocumentRoot "/var/www/html"
<Directory "/var/www">
    Require all granted
</Directory>
[root@localhost ~]# httpd -M |grep dir
 dir_module (shared)
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>
# 用于指定当请求一个目录时,服务器应该提供的默认文件
5.1、案例-修改默认网址目录
[root@localhost ~]# mkdir -p /data/html
[root@localhost ~]# echo "<h1>hello world</h1>" > /data/html/index.html
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
DocumentRoot "/data/html"    # 修改资源存放路径
<Directory "/data/html">      # 资源匹配
    AllowOverride None
    Require all granted
</Directory>
[root@localhost ~]# systemctl restart httpd
[root@localhost ~]# chcon -R -t httpd_sys_content_t /data/html  # 设置selinux权限
[root@localhost ~]# setenforce 0    # 或者临时关闭selinux
[root@localhost ~]# curl 127.0.0.1
<h1>hello world</h1>
[root@localhost ~]# echo "<h1>hello linux</h1>" > /data/html/index.htm
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
<IfModule dir_module>
    DirectoryIndex index.html index.htm
</IfModule>
[root@localhost ~]# systemctl restart httpd
[root@localhost ~]# curl 127.0.0.1
<h1>hello world</h1>
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
<IfModule dir_module>
    DirectoryIndex index.htm index.html
</IfModule>
[root@localhost ~]# systemctl restart httpd
[root@localhost ~]# curl 127.0.0.1
<h1>hello linux</h1>
5.2、默认页面
[root@localhost ~]# cat /etc/httpd/conf.d/welcome.conf
<LocationMatch "^/+$">
    Options -Indexes
    ErrorDocument 403 /.noindex.html
</LocationMatch>

[root@localhost ~]# vim /usr/share/httpd/noindex/index.html

6、访问控制

6.1、URI匹配规则

Apache httpd的URL匹配规则主要包括以下几种指令:

  1. <Location>: 基于URL路径进行匹配。
  2. <LocationMatch>: 使用正则表达式进行URL路径匹配。
  3. <Directory>: 基于服务器文件系统的目录路径进行匹配。
  4. <DirectoryMatch>: 使用正则表达式进行目录路径匹配。
  5. <Files>: 基于文件名进行匹配。
  6. <FilesMatch>: 使用正则表达式进行文件名匹配。

优先级:

这些指令的优先级从高到低为:

  1. <Files><FilesMatch>
  2. <Directory><DirectoryMatch>
  3. <Location><LocationMatch>

指令常用选项:

<Location>

指令:

<LocationMatch>

指令:

<Directory>

指令:

<Files>

指令:

<FilesMatch>

指令:

6.2、配置方法
#基于目录
<Directory “/path">
...
</Directory>
#基于文件
<File “/path/file”>
...
</File>
#基于文件通配符
<File “/path/*file*”>
...
</File>
#基于正则表达式
<FileMatch “regex”>
...
</FileMatch>
6.3、匹配案例

精确匹配:

<Location "/admin"> AuthType Basic AuthName "Admin Area" AuthUserFile "/path/to/htpasswd" Require valid-user </Location>

在这个例子中,任何访问 /admin URL 的请求都会被要求进行基本认证(Basic Authentication)。只有通过验证的用户才能访问这个 URL。

前缀匹配:

bash <Location "/documents"> Options Indexes FollowSymLinks AllowOverride None Require all granted </Location>

在这个例子中,任何访问 /documents 的 URL 的请求都会被允许执行目录索引和跟踪符号链接。所有用户都被允许访问这些 URL。

正则表达式匹配:

<LocationMatch "\.php$"> SetHandler application/x-httpd-php </LocationMatch>

在这个例子中,任何访问以 .php 结尾的 URL 的请求都会被 Apache 识别为 PHP 脚本,并使用 PHP 处理器来执行它们。

通配符匹配:

bash <Directory "/var/www/*/images"> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory>

在这个例子中,任何位于 /var/www/*/images 目录下的文件都会被允许通过目录索引和符号链接访问,所有用户都被允许访问这些文件

特定文件类型匹配:

bash <Files "*.html"> SetOutputFilter INCLUDES # SetOutputFilter INCLUDES 是 Apache httpd 中一个非常有用的配置指令,它可以启用 Server-Side Includes (SSI) 功能。 </Files>

在这个例子中,任何以 .html 结尾的文件都会被 Apache 处理为包含服务器端包含指令(Server-Side Includes)的文件。

主机名匹配:

bash <VirtualHost www.example.com:80> DocumentRoot "/var/www/example" ServerName www.example.com </VirtualHost>

在这个例子中,任何发送到 www.example.com:80 的请求都会被映射到 /var/www/example 目录,并由 Apache 配置为 www.example.com 的虚拟主机。

6.4、Options指令
[root@localhost ~]vim /etc/httpd/conf/httpd.conf
<Directory "/var/www/html">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>
把/var/www/html改到/data/html
[root@localhost ~]# mkdir -p /data/html/dir
[root@localhost ~]# cd /data/html/dir
[root@localhost dir]# touch f1 f2

image-134

[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
<Directory "/data/html">
    Options -Indexes
    #Options Indexes FollowSymLinks 注释掉,默认就会关闭
[root@localhost html]# systemctl restart httpd

image-135

[root@localhost dir]# ln -s /etc/hosts /data/html/dir/hosts

image-136

[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
<Directory "/data/html">
    Options -FollowSymLinks
    # Options Indexes #把FollowSymLinks删掉
[root@localhost html]# systemctl restart httpd

image-137

6.5、AllowOverride指令

AllowOverride指令与访问控制相关的哪些指令可以放在指定目录下的.htaccess(由AccessFileName 指令指定,AccessFileName .htaccess 为默认值)文件中,覆盖之前的配置指令,只对语句有效,直接在对应的文件目录中新建一个.htaccess的文件

6.5.1、案例
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
<Directory "/data/html">
    Options -Indexes -FollowSymLinks
    AllowOverride options=FollowSymLinks,Indexes
[root@localhost ~]# systemctl reload httpd
[root@localhost ~]# echo "Options FollowSymLinks Indexes" > /data/html/dir/.htaccess
[root@localhost ~]# systemctl reload httpd
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
<Files ".ht*">
    Require all denied
</Files>
6.6、基于IP地址的访问控制
[root@localhost dir]# vim /etc/httpd/conf/httpd.conf
<Directory "/data/html">
  <RequireAll>
    Require all granted
    Require not ip 192.168.175.1 #拒绝特定IP
  </RequireAll>
# Require all granted 这一行记得注释掉,要不然里面写的生效不了
</Directory>
<RequireAny>
Require all denied
require ip 172.16.1.1 #允许特定IP
</RequireAny>
<directory "/data/html">
<requireany>
    require all denied
    Require ip 192.168.175.0/24
</requireany>
</directory>
<Directory "/data/html">
<Requireany>
        Require all denied
        Require ip 192.168.175.10        #只允许特定的主机访问
</Requireany>
</Directory>
6.7、基于用户的访问控制
6.7.1、配置方法
<Directory “/path">
Options None
AllowOverride None
AuthType Basic
AuthName "String“                              #文字提示描述
AuthUserFile "/PATH/HTTPD_USER_PASSWD_FILE"    #指定存放密码文件
Require user username1 username2 ...           #限制特定的人才能访问
</Directory>
htpasswd [options] /PATH/HTTPD_PASSWD_FILE username
6.7.2、方法一:修改主配置文件
[root@localhost ~]# htpasswd -c /etc/httpd/conf.d/.httpuser user01
New password: 
Re-type new password: 
Adding password for user user
[root@localhost ~]# htpasswd /etc/httpd/conf.d/.httpuser user02
New password: 
Re-type new password: 
Adding password for user user02
[root@localhost ~]# cat /etc/httpd/conf.d/.httpuser
user01:$apr1$yE3jfs2/$77r76q0l6lTtREczR6uQf1
user02:$apr1$gpNpvZZr$acEh6USVYPR6/WboOMUl91
[root@localhost ~]# mkdir /data/html/admin
[root@localhost ~]# echo "<h1>Hello Linux</h1>" > /data/html/admin/index.html
[root@localhost ~]# vim /etc/httpd/conf.d/test.conf
<directory /data/html/admin>
    AuthType Basic
    AuthName "FBI warning"
    AuthUserFile "/etc/httpd/conf.d/.httpuser"
    Require user user01 
</directory>
[root@localhost ~]# systemctl reload httpd

image-138

6.7.3、方法二:修改.htaccess文件
[root@localhost ~]# htpasswd -c /etc/httpd/conf.d/.httpuser user01
New password: 
Re-type new password: 
Adding password for user user
[root@localhost ~]# htpasswd /etc/httpd/conf.d/.httpuser user02
New password: 
Re-type new password: 
Adding password for user user02
[root@localhost ~]# cat /etc/httpd/conf.d/.httpuser 
user01:$apr1$yE3jfs2/$77r76q0l6lTtREczR6uQf1
user02:$apr1$gpNpvZZr$acEh6USVYPR6/WboOMUl91
[root@localhost ~]# vim /etc/httpd/conf.d/test.conf
<Directory "/data/html/admin">
    AllowOverride Authconfig
    Require all granted
</Directory>
[root@localhost ~]# vim /data/html/admin/.htaccess
AuthType Basic
AuthName "FBI warning"
AuthUserFile "/etc/httpd/conf.d/.httpuser"
Require user user01
[root@localhost ~]# systemctl reload httpd

image-139

6.8、基于组账号进行认证
<Directory “/path">
AuthType Basic
AuthName "String“
AuthUserFile "/PATH/HTTPD_USER_PASSWD_FILE"
AuthGroupFile "/PATH/HTTPD_GROUP_FILE"
Require group grpname1 grpname2 ...
</Directory>
6.8.1、案例
[root@localhost ~]# htpasswd -c /etc/httpd/conf.d/.httpuser user01
New password: 
Re-type new password: 
Adding password for user user
[root@localhost ~]# htpasswd /etc/httpd/conf.d/.httpuser user02
New password: 
Re-type new password: 
Adding password for user user02
[root@localhost ~]# cat /etc/httpd/conf.d/.httpuser 
user01:$apr1$yE3jfs2/$77r76q0l6lTtREczR6uQf1
user02:$apr1$gpNpvZZr$acEh6USVYPR6/WboOMUl91
[root@localhost ~]# vim /etc/httpd/conf.d/.httpgroup
webadmin: user01 user02
[root@localhost ~]# vim /etc/httpd/conf.d/test.conf
<Directory "/data/html/admin">
AuthType Basic
AuthName "FBI warning"
AuthUserFile "/etc/httpd/conf.d/.httpuser"
AuthGroupFile "/etc/httpd/conf.d/.httpgroup"
Require group webadmin
</Directory>

7、日志配置

7.1、日志格式
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
<IfModule log_config_module>
    #
    # The following directives define some format nicknames for use with
    # a CustomLog directive (see below).
    #
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common

    <IfModule logio_module>
      # You need to enable mod_logio.c to use %I and %O
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>
    CustomLog "logs/access_log" combined
</IfModule>
[root@localhost ~]# ls /var/log/httpd/
access_log  error_log
[root@localhost ~]# ll -d /etc/httpd/logs
lrwxrwxrwx. 1 root root 19 5月   2 09:30 /etc/httpd/logs -> ../../var/log/httpd

8、别名模块alias_module

alias 别名,可以隐藏真实文件系统路径。这里实现的目的是用news文件目录来替代newsdir/index.html访问文件路径,从而起到隐藏真实文件系统路径的目的。

[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
<IfModule alias_module>
    ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
    Alias /news/ /data/html/dir/
    <Directory "/data/html/dir">
        Require all granted
    </Directory>
</IfModule>
[root@localhost ~]# systemctl reload httpd

image-140

8.1、Alias 案例

通过alias配置,实现访问路径到本地文件系统的映射

  1. 新增一个子配置文件,内容如下:
[root@localhost ~]# vim /etc/httpd/conf.d/pub.conf
<VirtualHost 192.168.88.136:80 >
        ServerName 192.168.88.136
        DocumentRoot /data
        alias /pub /data/html/pub
</Virtualhost>

<Directory /data>
        AllowOverride none
        Require all granted
</Directory>
# 通过alias模块,使得我们访问/pub的时候,自动帮我们映射到/data/html/pub
  1. 创建相关目录及访问文件
[root@localhost ~]# mkdir -p /data/html/pub
[root@localhost ~]# echo "in /data/html/pub" > /data/html/pub/index.html
  1. 赋予该目录及子目录权限
[root@localhost ~]# chmod 755 -R /data
  1. 检查配置并且重启httpd服务
[root@localhost ~]# httpd -t
[root@localhost ~]# systemctl restart httpd
  1. 访问测试:

访问:http://192.168.88.136/pub

image-141

9、httpd服务状态信息显示

当我们需要获取 httpd 服务器在运行过程中的实时状态信息时可以使用该功能

  1. 新建子配置文件,并且内容如下:
[root@localhost ~]# vim /etc/httpd/conf.d/test.conf
<Location "/status">
    <requireany>
        require all denied
        require ip 192.168.88.0/24
        #定义特定的网段能够访问
    </requireany>
        SetHandler server-status
        #指定状态信息
</Location>
ExtendedStatus On
  1. 检查配置并且重启httpd服务
[root@localhost ~]# httpd -t
[root@localhost ~]# systemctl restart httpd
  1. 访问测试:

在浏览器中访问http://192.168.88.136/status

获取 httpd 服务状态信息成功

image-142

10、虚拟主机

<VirtualHost IP:PORT>
ServerName FQDN
DocumentRoot “/path"
</VirtualHost>
# 建议:上述配置存放在独立的配置文件中
ServerAlias:虚拟主机的别名;可多次使用
ErrorLog: 错误日志
CustomLog:访问日志
<Directory “/path"> </Directory>
10.1、基于端口的虚拟主机
[root@localhost ~]#mkdir /data/website{1,2,3}
[root@localhost ~]#echo "This is NO.1 website!" > /data/website1/index.html
[root@localhost ~]#echo "This is NO.2 website!" > /data/website2/index.html
[root@localhost ~]#echo "This is NO.3 website!" > /data/website3/index.html
[root@localhost ~]#tree /data/
/data/
├── website1
│   └── index.html
├── website2
│   └── index.html
└── website3
    └── index.html
3 directories, 3 files
[root@localhost ~]#vim /etc/httpd/conf.d/test.conf 
[root@localhost ~]#cat /etc/httpd/conf.d/test.conf
listen 8001                     
listen 8002
listen 8003
<virtualhost *:8001>      #指定端口                    
    documentroot /data/website1/              #指定定义的路径
    CustomLog logs/website1_access.log combined    #增加对应的日志
<directory /data/website1>              #对于文件给与访问权限
    require all granted
</directory>
</virtualhost>
<virtualhost *:8002>
    documentroot /data/website2/
    CustomLog logs/website2_access.log combined
<directory /data/website2>
    require all granted
</directory>
</virtualhost>
<virtualhost *:8003>
    documentroot /data/website3/
    CustomLog logs/website3_access.log combined
<directory /data/website3>
    require all granted
</directory>
</virtualhost>
[root@localhost ~]#systemctl restart httpd
[root@localhost ~]#[root@localhost ~]#ll /var/log/httpd/   #各有各的访问日志
total 24
-rw-r--r-- 1 root root 2084 Dec 12 21:41 access_log
-rw-r--r-- 1 root root 4441 Dec 12 21:40 error_log
-rw-r--r-- 1 root root  506 Dec 12 21:42 website1_access.log
-rw-r--r-- 1 root root  506 Dec 12 21:43 website2_access.log
-rw-r--r-- 1 root root  570 Dec 12 21:44 website3_access.log
[root@localhost ~]#
[root@localhost ~]#curl 192.168.32.8:8001
This is NO.1 website!
[root@localhost ~]#curl 192.168.32.8:8002
This is NO.2 website!
[root@localhost ~]#curl 192.168.32.8:8003
This is NO.3 website!
[root@localhost ~]#
10.2、基于IP的虚拟主机
  1. 先通过nmtui命令给linux系统配置多个IP地址

image-143

  1. 重启网络配置,并且检查IP地址是否添加成功
[root@localhost CSDN]# systemctl restart network
[root@localhost CSDN]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:cb:d5:1a brd ff:ff:ff:ff:ff:ff
    inet 192.168.88.136/24 brd 192.168.88.255 scope global noprefixroute dynamic ens33
       valid_lft 5185795sec preferred_lft 5185795sec
    inet 192.168.88.137/24 brd 192.168.88.255 scope global secondary noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::a49c:12c9:1ebd:8fb2/64 scope link tentative noprefixroute dadfailed
       valid_lft forever preferred_lft forever
    inet6 fe80::70a:e8e6:d043:dcf2/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
  1. 配置基于IP地址的虚拟主机
[root@localhost data]# vim /etc/httpd/conf.d/site.conf
<Directory "/site/">
        Require all granted
</Directory>
<VirtualHost 192.168.88.136:80>
        Servername 192.168.88.136
        DocumentRoot "/site/136/"
</VirtualHost>
<VirtualHost 192.168.88.137:80>
        Servername 192.168.88.137
        DocumentRoot "/site/137/"
</VirtualHost>

[root@localhost ~]# mkdir -p /site/137
[root@localhost ~]# mkdir -p /site/136
[root@localhost ~]# echo "in 136" > /site/136/index.html
[root@localhost ~]# echo "in 137" > /site/137/index.html
[root@localhost ~]# curl 192.168.88.136
in 136

[root@localhost ~]# curl 192.168.88.137
in 137
10.3、基于FQDN虚拟主机
[root@localhost ~]# cat /etc/httpd/conf.d/site.conf
#Listen 80    因为/etc/httpd/conf/httpd.conf文件里面有IncludeOptional conf.d/*.conf文件包括site.conf,与本文件里的Listen 80
<Directory "/data/">
    Require all granted
</Directory>
<VirtualHost 192.168.80.100:80>
    Servername www.site5.com
    DocumentRoot "/data/site5/"
</VirtualHost>
<VirtualHost 192.168.80.100:80>
    Servername www.site6.com
    DocumentRoot "/data/site6/"
</VirtualHost>
~              
[root@localhost ~]# cat /etc/hosts
192.168.0.142 www.site5.com
192.168.0.142 www.site6.com
[root@localhost ~]# curl www.site5.com:10101
<h1>This is site5</h1>
[root@localhost ~]# curl www.site6.com:10101
<h1>This is site6</h1>

11、网页压缩技术

[root@localhost ~]# httpd -M |grep deflate
 deflate_module (shared)
#可选项
SetOutputFilter DEFLATE
# 指定对哪种MIME类型进行压缩,必须指定项
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/css
#压缩级别 (Highest 9 - Lowest 1) ,默认gzip  默认级别是有库决定
DeflateCompressionLevel 9
#排除特定旧版本的浏览器,不支持压缩
#Netscape 4.x 只压缩text/html
BrowserMatch ^Mozilla/4 gzip-only-text/html
#Netscape 4.06-08 三个版本 不压缩
BrowserMatch ^Mozilla/4\.0[678] no-gzip
#Internet Explorer标识本身为“Mozilla / 4”,但实际上是能够处理请求的压缩。如果用户代理首部
匹配字符串“MSIE”(“B”为单词边界”),就关闭之前定义的限制
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
11.1、压缩对比实验
[root@localhost ~]#vim /etc/httpd/conf.d/test.conf
[root@localhost ~]#cat /etc/httpd/conf.d/test.conf 
<virtualhost *:80>
        documentroot /data/website1/
        servername www.aaa.com
        <directory /data/website1/>
                require all granted
        </directory>
                CustomLog "logs/a_access_log" combined
                AddOutputFilterByType DEFLATE text/plain     #增加压缩机制
                AddOutputFilterByType DEFLATE text/html      #增加压缩机制
                DeflateCompressionLevel 9                    #选择默认压缩比
</virtualhost>
<virtualhost *:80>
        documentroot /data/website2/
        servername www.bbb.com
        <directory /data/website2/>
                require all granted
        </directory>
                CustomLog "logs/a_access_log" combined
                #AddOutputFilterByType DEFLATE text/plain    #注释掉 形成对比
                #AddOutputFilterByType DEFLATE text/html     #注释掉 形成对比
                #DeflateCompressionLevel 9                   #注释掉 形成对比
</virtualhost>
[root@localhost ~]#vim /etc/hosts
[root@localhost ~]#cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.32.8 www.aaa.com  www.bbb.com      #新增DNS解析
[root@localhost ~]#
#或通过命令tree /etc > /data/website2/index.html
[root@localhost ~]#cp blog.txt /data/website1/blog_test1.html  #拷贝一个测试文件到网页
[root@localhost ~]#cp blog.txt /data/website2/blog_test2.html
[root@localhost ~]#cd /data/website1
[root@localhost website1]#ll
total 20
-rw-r--r-- 1 root root 15422 Dec 13 10:14 blog_test1.html   #注意大小为15422
-rw-r--r-- 1 root root    22 Dec 13 09:25 index.html
[root@localhost website1]#cd /data/website2
[root@localhost website2]#ll
total 20
-rw-r--r-- 1 root root 15422 Dec 13 10:14 blog_test2.html   #注意大小为15422
-rw-r--r-- 1 root root    22 Dec 13 09:25 index.html
如果文件的权限不是644则需要增加对应的权限:
chmod 644 blog_testX.html 
[root@localhost website2]#cd
[root@localhost ~]#systemctl restart httpd
[root@localhost ~]#curl www.aaa.com
This is NO.1 website!
[root@localhost ~]#curl www.bbb.com
This is NO.2 website!
[root@localhost ~]#curl -I --compressed www.aaa.com/blog_test1.html  #默认curl没有压缩,需要加参数--compressed
HTTP/1.1 200 OK
Date: Fri, 13 Dec 2019 02:22:29 GMT
Server: Apache/2.4.37 (centos)
Last-Modified: Fri, 13 Dec 2019 02:14:32 GMT
ETag: "3c3e-5998c6c2c195b-gzip"
Accept-Ranges: bytes
Vary: Accept-Encoding
Content-Encoding: gzip     #压缩机制工具gzip
Content-Length: 2155       #压缩后的大小
Content-Type: text/html; charset=UTF-8
[root@localhost ~]#curl -I --compressed www.bbb.com/blog_test2.html
HTTP/1.1 200 OK
Date: Fri, 13 Dec 2019 02:22:45 GMT
Server: Apache/2.4.37 (centos)
Last-Modified: Fri, 13 Dec 2019 02:14:45 GMT
ETag: "3c3e-5998c6ce8741a"
Accept-Ranges: bytes         
Content-Length: 15422       #没有压缩的大小,配置文件中website2压缩被注释
Content-Type: text/html; charset=UTF-8

12、HTTPS

SSL证书颁发:自己跟自己玩
1.安装mod_ssl和openssl
[root@node1 ~]# yum install mod_ssl openssl -y
2.生成2048位的加密私钥
[root@node1 ~]# openssl genrsa -out server.key 2048
3.生成证书签名请求(CSR)
[root@node1 ~]# openssl req -new -key server.key -out server.csr
4.生成类型为X509的自签名证书。有效期设置3650天,即有效期为10年
[root@node1 ~]# openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
5.复制文件到相应的位置
[root@node1 ~]# cp server.crt /etc/pki/tls/certs/
[root@node1 ~]# cp server.key /etc/pki/tls/private/     
[root@node1 ~]# cp server.csr /etc/pki/tls/private/
生产环境中需要去权威机构进行申请:
6.修改配置文件
[root@node1 ~]# vim /etc/httpd/conf.d/ssl.conf
    Servername 192.168.175.10:443
    # SSLCertificateFile /etc/pki/tls/certs/server.crt        # 指定证书的存储位置
    # SSLCertificateKeyFile /etc/pki/tls/private/server.key   # 加密密钥的存储位置        

[root@node1 ~]# systemctl restart httpd
[root@localhost ~]# curl -kv https://127.0.0.1
#k表示支持https
#v表示显示详细的信息
12.1、HTTPS请求过程

Web网站的登录页面都是使用https加密传输的,加密数据以保障数据的安全,HTTPS能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议,HTTPS其实是有两部分组成: HTTP + SSL/ TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据。

image-144

https 实现过程如下:

客户端发起HTTPS请求

客户端访问某个web端的https地址,一般都是443端口

服务端的配置

采用https协议的服务器必须要有一套证书,可以通过权威机构申请,也可以自己制作,目前国内很多⽹站都⾃⼰做的,当你访问⼀个⽹站的时候提示证书不可信任就表示证书是⾃⼰做的,证书就是⼀个公钥和私钥匙,就像⼀把锁和钥匙,正常情况下只有你的钥匙可以打开你的锁,你可以把这个送给别⼈让他锁住⼀个箱⼦,⾥⾯放满了钱或秘密,别⼈不知道⾥⾯放了什么⽽且别⼈也打不开,只有你的钥匙是可以打开的。

对称加密与非对称加密区别 对称加密只有密钥 非对称加密有公私钥,公钥加密,私钥解密

传送证书

服务端给客户端传递证书,其实就是公钥,⾥⾯包含了很多信息,例如证书得到颁发机构、过期时间等等。

客户端解析证书

这部分⼯作是有客户端完成的,⾸先回验证公钥的有效性,⽐如颁发机构、过期时间等等,如果发现异常则会弹出⼀个警告框提示证书可能存在问题,如果证书没有问题就⽣成⼀个随机值,然后⽤证书对该随机值进⾏加密,就像2步骤所说把随机值锁起来,不让别⼈看到。

传送4步骤的加密数据

就是将⽤证书加密后的随机值传递给服务器,⽬的就是为了让服务器得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值进⾏加密解密了。

服务端解密信息

服务端用私钥解密5步骤加密后的随机值之后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进⾏对称加密,对称加密就是将信息和私钥通过算法混合在⼀起,这样除非你知道私钥,不然是⽆法获取其内部的内容,而正好客户端和服务端都知道这个私钥,所以只要机密算法够复杂就可以保证数据的安全性。

传输加密后的信息

服务端将⽤私钥加密后的数据传递给客户端,在客户端可以被还原出原数据内容

客户端解密信息

客户端⽤之前⽣成的私钥获解密服务端传递过来的数据,由于数据⼀直是加密的,因此即使第三⽅获取到数据也⽆法知道其详细内容。

12.2、HTTPS加解密过程

HTTPS 中使用的加密技术主要包括以下几个步骤:

  1. 密钥协商

  2. 在 SSL/TLS 握手过程中,客户端和服务器协商出一个对称加密密钥。

  3. 这个对称密钥是用于后续数据加密和解密的临时密钥。

  4. 对称加密

  5. 客户端和服务器使用协商好的对称密钥对 HTTP 请求和响应数据进行加密和解密。

  6. 对称加密算法通常包括 AES、DES、3DES 等,速度快且计算开销小。

  7. 非对称加密

  8. 在握手过程中,服务器使用自己的私钥对对称密钥进行加密,发送给客户端。

  9. 客户端使用服务器的公钥解密获得对称密钥。
  10. 非对称加密算法通常包括 RSA、ECC 等,安全性高但计算开销大。

  11. 摘要算法

  12. 客户端和服务器使用摘要算法(如 SHA-256)计算数据的数字签名。

  13. 数字签名用于验证数据的完整性,确保数据在传输过程中未被篡改。

  14. 证书验证

  15. 客户端使用预先内置的受信任根证书颁发机构(CA)公钥,验证服务器证书的合法性。

  16. 这确保连接的服务器是真实的,而不是中间人攻击者伪造的。

13、URL重定向

# httpd.conf 文件中的配置
Redirect [status] /old-url /new-url

文档演示:

假设您有一个旧网站 www.example.com,需要将其重定向到新网站 www.newexample.com。可以在 Apache 的配置文件中添加以下内容来实现这个重定向:

<VirtualHost *:80>
    ServerName www.example.com
    Redirect permanent / https://www.newexample.com/
</VirtualHost>

<VirtualHost *:443>
    ServerName www.example.com
    Redirect permanent / https://www.newexample.com/
</VirtualHost>

这个配置会对两种情况进行重定向:

当用户访问 http://www.example.com 时,会被永久重定向(301 Moved Permanently)到 https://www.newexample.com/

当用户访问 https://www.example.com 时,也会被永久重定向到 https://www.newexample.com/

可以根据需要调整重定向的 HTTP 状态码和目标 URL 路径。常见的重定向状态码有:

除了使用 Redirect 指令,也可以使用 RedirectMatch 指令来基于正则表达式进行更复杂的重定向规则。例如:

bash RedirectMatch 301 ^/old-page\.html$ https://www.newexample.com/new-page

这将把 /old-page.html 重定向到 https://www.newexample.com/new-page

七、LAMP架构实践

1、LAMP架构概述

1.1、什么是LAMP

LAMP就是由Linux+Apache+MySQL+PHP组合起来的架构

并且Apache默认情况下就内置了PHP解析模块,所以无需CGI即可解析PHP代码

请求示意图:

image-145

2、LAMP架构部署

2.1、安装Apache
yum install -y httpd

# 启动httpd
systemctl start httpd

# 关闭防火墙和SElinux
systemctl stop filewalld
setenforce 0

访问测试:http://IP

image-146

2.2、安装php环境
  1. 由于php源在国外,下载较慢,所以可以使用英格提供的php源
# 添加英格php的yum源
vim /etc/yum.repos.d/eagle.repo
[eagle]
name=Eagle lab
baseurl=http://file.eagleslab.com:8889/%E8%AF%BE%E7%A8%8B%E7%9B%B8%E5%85%B3%E8%BD%AF%E4%BB%B6/%E4%BA%91%E8%AE%A1%E7%AE%97%E8%AF%BE%E7%A8%8B/Centos7%E6%BA%90/
gpgcheck=0
enabled=1
  1. 安装php71w全家桶
yum -y install php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb
  1. 重启httpd.service
systemctl restart httpd.service
2.3、安装Mysql数据库
# 安装mariadb数据库软件
yum install mariadb-server mariadb -y

# 启动数据库并且设置开机自启动
systemctl start mariadb
systemctl enable mariadb

# 设置mariadb的密码
mysqladmin password '123456'

# 验证数据库是否工作正常
mysql -uroot -p123456 -e "show databases;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
2.4、PHP探针测试

在默认的网站根目录下创建info.php

vim /var/www/html/info.php
<?php
    phpinfo();
?>

写一个简单的php代码,可以使用phpinfo函数查看php的信息,从而检测是否成功解析php代码

编写好以后,我们访问:http://IP/info.php测试

image-147

这里如果可以看到上述页面,说明我们的php代码成功被解析了

2.5、数据库连接测试

编写php代码,用php来连接数据库测试

vim /var/www/html/mysql.php
<?php
    $servername = "localhost";
    $username = "root";
    $password = "123456";

    // 创建连接
    $conn = mysqli_connect($servername, $username, $password);

    // 检测连接
    if (!$conn) {
         die("Connection failed: " . mysqli_connect_error());
    }
    echo "连接MySQL...成功!";
?>

编写好以后,我们访问:http://IP/mysql.php测试:

image-148

2.6、安装phpmyadmin

由于我们还没有学习mysql如何管理,我们可以部署phpmyadmin工具,该工具可以让我们可视化管理我们的数据库

# 移动到网站根目录
cd /var/www/html

# 下载phpmyadmin源码
wget https://files.phpmyadmin.net/phpMyAdmin/5.1.1/phpMyAdmin-5.1.1-all-languages.zip

# 解压软件包,并且重命名
unzip phpMyAdmin-5.1.1-all-languages.zip
mv phpMyAdmin-5.1.1-all-languages phpmyadmin

访问http://IP/phpmyadmin进行测试

image-149

用户名和密码为我们刚才初始化数据库时设置的root和123456,登陆后,会进入图形化管理界面

image-150

3、部署typecho个人博客

3.1、源码获取

下载typecho博客系统源码到/var/www/html/typecho

cd /var/www/html

# 创建typecho目录
mkdir typecho
cd typecho

wget http://file.eagleslab.com:8889/%E8%AF%BE%E7%A8%8B%E7%9B%B8%E5%85%B3%E8%BD%AF%E4%BB%B6/%E4%BA%91%E8%AE%A1%E7%AE%97%E8%AF%BE%E7%A8%8B/%E8%AF%BE%E7%A8%8B%E7%9B%B8%E5%85%B3%E6%96%87%E4%BB%B6/typecho.zip

# 解压源码
unzip typecho.zip
3.2、创建数据库

点击数据库

image-151

输入数据库名之后,就可以点击创建

image-152

3.3、安装博客系统

下面就可以开始进入网站安装的部分了,访问博客系统页面

image-153

填写数据库密码和网站后台管理员密码

image-154

点击开始安装之后,会出现了如下页面

image-155

我们手动在typecho目录中创建这个文件,并且把内容复制进去

vim config.inc.php

配置文件创建完成之后,可以点击创建完毕,继续安装>>

下面是安装成功的页面

image-156

3.4、切换主题

默认的主题如下,界面比较的简洁,我们可以给这个网站替换主题,也可以借此加深熟悉我们对Linux命令行的熟练程度

image-157

打开官方主题站:https://typecho.me/

第三方主题商店:https://www.typechx.com/

这边以这个主题为例

image-158

点击模板下载

image-159

点击下载压缩包

image-160

将主题上传到博客主题的目录/var/www/html/typecho/usr/themes

image-161

# 解压压缩包,并且将主题文件夹重命名
unzip typecho-theme-sagiri-master.zip
mv typecho-theme-sagiri-master sagiri

# 可以删除旧的压缩包文件
rm -rf typecho-theme-sagiri-master.zip

进入网站后台切换主题,在地址后面加上/admin就可以进入后台登录页面了

image-162

启用我们刚刚安装的主题

image-163

访问网页前端,查看最终的效果

image-164

评论区