Linux企业服务(上)
一、远程管理
1、ssh协议
- ssh客户端是一种使用Secure Shell(ssh)协议连接到运行了ssh服务端的远程服务器上的工具
- ssh是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议
- 有效防止远程管理过程中的信息泄漏
- 传输数据加密,能够防止DNS和IP欺骗
- 传输数据压缩,加快传输速度
- OpenSSH 是 SSH协议的免费开源实现。OpenSSH提供了服务端程序(openssh-server)和客户端工具(openssh-client)
- Mac和Linux中默认已安装ssh客户端,可直接在终端中使用ssh命令
- Windows需手动安装ssh客户端,较常用的Windows SSH客户端有PuTTY和XShell
- SSH能够提供两种安全验证的方法:
- 基于口令的验证—用账户和密码来验证登录
- 基于密钥的验证—需要在本地生成密钥对,然后把密钥对中的公钥上传至服务器,并与服务器中的公钥进行比较;该方式相较来说更安全
2、ssh客户端使用
- 下面的客户端指令均来自于linux版本的ssh客户端,
xshell
和putty
的使用方法并不一样
[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
# 查看已经链接过的主机
- 通过scp来远程管理文件
[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/
# 将远程主机的文件复制到本地
- ssh自带的sftp功能
[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配置文件
- sshd服务的配置信息保存在
/etc/ssh/sshd_config
文件中。运维人员一般会把保存着最主要配置信息的文件称为主配置文件,而配置文件中有许多以井号开头的注释行,要想让这些配置参数生效,需要在修改参数后再去掉前面的井号 - 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、安全密钥验证
- 在客户端主机中生成“密钥对”
[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]-----+
- 把客户端主机中生成的公钥文件传送至远程主机
[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.
- 对远程主机进行设置,使其只允许密钥验证,拒绝传统的口令验证方式。记得在修改配置文件后保存并重启sshd服务程序
[root@localhost ~]# vim /etc/ssh/sshd_config
..................
65 PasswordAuthentication no
PubkeyAuthentication yes
...................
[root@localhost ~]# systemctl restart sshd
- 在客户端尝试登录到服务器,此时无须输入密码也可成功登录
[root@localhost ~]# ssh 192.168.46.129
Last login: Fri Apr 19 17:12:37 2019 from 192.168.91.1
5、mobaxterm使用密钥登录
一、生成密钥
二、分别保存公私钥对
三、linux .ssh目录下新建文件,将上面生成的密钥粘进去
二、FTP
1、FTP简介
FTP协议:文件传输协议(File Transfer Protocol)
-
- 协议定义了一个在远程计算机系统和本地计算机系统之间传输文件的一个标准
- FTP运行在OSI模型的应用层,并利用传输协议TCP在不同的主机之间提供可靠的数据传输
- FTP 在文件传输中还支持断点续传功能,可以大幅度减少CPU网络带宽的开销
FTP模型
-
- 用户接口:提供一个用户接口并使用客户端协议解释器的服务
- 客户端协议解释器:向远程服务器发送命令 并建立客户数据传输过程
- 服务端协议解释器:响应客户协议机发出的命令并驱动服务端数据传输过程
- 客户端数据传输协议:负责完成和服务器数据传输过程及客户端本地文件系统的通信
- 服务端数据传输协议:负责完成和客户数据过程及服务器端文件系统的通信
控制连接(端口号21)
-
- 主要用来传送在实际通信过程中需要执行的FTP命令以及命令的响应
- 只需要很小的网络带宽
- FTP服务端监听21端口号来等待控制连接建立
- 建立控制连接后,还需要验证客户身份,决定是否建立数据连接
- 当需要目录列表,传输文件时,才建立数据连接,并且每次客户端都是用不同的端口号来建立数据连接。数据 传输完毕,就中断这条临时的数据连接
- 在FTP连接期间,控制连接始终保持通常的连接状态。在数据连接存在期间,控制连接必须存在;一旦控制连接断开,数据连接会自动关闭。
数据连接(端口号20)
-
- FTP服务端监听20端口来等待数据连接
- 数据连接依赖于控制连接
- 建立方式(主动被动都是相对服务器而言)
主动模式
-
- 通过三次握手,建立控制连接;客户端的源端口是高位随机端口,目标端口是21端口
- 控制连接建立后,客户端进行身份验证,协商数据连接采用主动模式;随后客户端会向FTP服务器发送Port报文,表明自己监听的IP+端口,并等待FTP服务器(20端口)向自己监听的IP+端口发起数据连接请求。
- 服务端发起数据连接请求,建立数据连接
被动模式
-
- 通过三次握手,建立控制连接;客户端的源端口是高位随机端口,目标端口是21端口;
- 控制连接建立后,客户端进行身份验证,协商数据连接采用被动模式;随后客户端会向服务器发送PASV报文,表示我们用被动模式
- 服务端收到PASV报文,于是向客户端发送Port报文,表明自己监听的IP+端口
- 客户端发起数据连接请求,建立数据连接
2、VSFTPD服务介绍
- 服务包:vsftpd
- 服务类型:由Systemd启动的守护进程
- 配置单元:
/usr/lib/systemd/system/vsftpd.service
- 守护进程:
/usr/sbin/vsftpd
- 端口:
21(ftp)
,20(ftp‐data)
- 主配置文件:
/etc/vsftpd/vsftpd.conf
- 用户访问控制配置文件:
/etc/vsftpd/ftpusers /etc/vsftpd/user_list
- 日志文件:
/etc/logrotate.d/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、基础配置
- 安装vsftp
[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工具是一定要输入用户名称和密码的,登录成功或者失败会给出提示。lftp不会直接给出登录成功或者失败的
- 提示,需要输入ls工具才可以发现是否连接成功,优点在于连接更加方便
- 注意:
ftp默认禁止root等用户登录,禁止名单如下
vim /etc/vsftpd/user_list
2.2.2、Windows中
第一种
- 可以在浏览器、运行窗口或者资源管理器中输入
ftp://IP地址/
,这样访问的是ftp的根位置,如果需要访问相关- 目录可以输入
ftp://IP地址/目录/文件名
- 目录可以输入
第二种
- 在cmd窗口中,输入命令
ftp <IP地址192.168.46.128>
即可访问
需要注意的是直接访问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,虚拟用户访问
- 创建用于进行FTP认证的用户数据库文件,其中奇数行为账户名,偶数行为密码。
[root@localhost ~]# cd /etc/vsftpd/
[root@localhost vsftpd]# vi vuser.list
picaj
centos
cisco
centos
huawei
centos
- 使用db_load命令用哈希(hash)算法将原始的明文信息文件转换成数据库文件
- 降低数据库文件的权限(避免其他人看到数据库文件的内容)
- 把原始的明文信息文件删除。
[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
- 创建一个本地用户,用来做虚拟用户在本地的代理,为了安全起见,禁止这个本地用户登录
[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/
- 新建一个用于虚拟用户认证的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
- 配置文件
[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
- 如果想要针对不同的用户设置不同的权限
[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简介
- NFS最早是希望可以把一台电脑的硬盘挂载到另一台电脑给另一台电脑用
- 如果想使用 ftp 资源的话,必须要下载到本地之后才可以打开,所以 ftp 的资源是一个纯网络资源,nfs 就可以直接打开共享的文件
- NFS: Network File System 网络文件系统,基于内核的文件系统。Sun 公司开发, 通过使用 NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件,不过他是基于RPC协议的
- RPC (Remote Procedure Call Protocol 远程过程调用) 采用 C/S 模式,客户机请求程序调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行
- 我们可以通过
modinfo nfs
查看 Linux 内核支持的 nfs 驱动 - 下图是 NFS 工作原理简图
2、RPC 远程过程调度
- NFS 协议本身并没有网络传输功能,而是基于远程过程调用协议实现的
- 提供一个面向过程的远程服务的接口
- 可以通过网络从远程主机程序上请求服务,而不需要了解底层网络技术的协议
- 工作在 OSI 模型的会话层,它可以为遵从 RPC 协议应用层协议提供端口注册功能
- 事实上,有很多服务(NFS 和 NIS 等)都可以向 RPC 注册端口
- RPC 使用网络端口 111 来监听客户端的请求
3、RPC 协议模型
- 基于 rpc 的服务(此处是指 nfs 服务,在别处有可能是代表其他服务)在启动时向 portmapper 注册端口
- 基于 rpc 的客户端联系服务端 portmapper 询问服务的端口号
- portmapper 告知客户端基于 rpc 服务使用的端口号
- 基于 rpc 的客户端访问被告知单某基于 rpc 服务的端口
- 基于 rpc 的服务响应客户端的请求
4、NSF 部署
- 安装 rpcbind
[root@node2 ~]# yum -y install rpcbind
- 安装 nfs 服务
[root@node2 ~]# yum -y install nfs-utils
# 其实直接装 nfs-utils 也会以依赖的方式自动装上 rpcbind
[root@node2 ~]# systemctl start nfs-server
[root@node2 ~]# systemctl enable nfs-server
- 比较 nfs 启动前后的 rpcbind 的状态
[root@node2 ~]# systemctl status rpcbind.socket
# nfs 启动前,只是监听 111 端口,但是并没有启动对应的服务
[root@node2 ~]# systemctl status rpcbind
# nfs 启动后,可以看到 rpcbind 自动启动了,也说明了 nfs 对 rpc 的依赖
- 查看已经监听的端口,在重启 nfs 之后,端口号会随机变化,所以需要 rpc 做注册
[root@node2 ~]# ss -ntulp
[root@node2 ~]# systemctl restart nfs
[root@node2 ~]# ss -ntulp
[root@node2 ~]# rpcinfo -p
# 可以查看到注册的端口号
5、NFS 软件介绍
- 软件包
- nfs-utils
- 相关软件包
- rpcbind(必须),tcp_wrappers
- kernel 支持
- nfs.ko
- 端口
- 2049(nfsd), 其它端口由 portmap(111)分配
- 说明: CentOS 6 开始 portmap 进程由 rpcbind 代替
- NFS 服务主要进程
- rpc.nfsd 最主要的 NFS 进程, 管理客户端是否可登录
- rpc.mountd 挂载和卸载 NFS 文件系统,包括权限管理
- rpc.lockd 非必要,管理文件锁,避免同时写出错
- rpc.statd 非必要, 检查文件-致性, 可修复文件
- 日志:/var/lib/nfs
- NFS 配置文件
- /etc/exports
- /etc/exports.d/*.exports
6、NFS 共享配置文件格式
/dir 主机 1(opt1,opt2) 主机 2(opt1,opt2)
- 主机格式
- 单个主机: ipv4, ipv6, FQDN
- IP networks: 两种掩码格式均支持
- 172.18.0.0/255.255.0.0
- 172.18.0.0/16
- wildcards:主机名通配,例如*.iproute.cn,IP 不可以
- netgroups: NIS 域的主机组,@group_ name
- anonymous:表示使用*通配所有客户端
- 选项格式
- 默认选项
- (ro,sync,root_squash, no_all_squash)
- ro, rw
- 只读和读写
- async
- 异步,数据变化后不立即写磁盘,等磁盘空闲时再写入,性能高
- sync
- 同步(1.0.0 后为默认),数据在请求时立即写入共享存储磁盘
- root_squash
- 远程 root 映射为 nfsnobody(默认),UID 为 65534,Centos8 为 nobody, 早期版本是 4294967294 (nfsnobody)
- no_root_squash
- 远程 root 映射成 root 用户
- all_squash
- 所有远程用户(包括 root)都变成 nfsnobody , Centos8 为 nobody
- no_all_squash
- 保留共享文件的 UID 和 GID (默认)
- anonuid 和 anongid
- 指明匿名用户映射为特定用户 UID 和组 GID,而非 nfsnobody ,可配合 all_squash 使用
7、NFS 工具
7.1、rpcinfo
rpcinfo 工具可以查看 RPC 相关信息
查看注册在指定主机的 RPC 程序
rpcinfo -p hostname
查看 rpc 注册程序
rpcinfo -s hostname
7.2、exportfs
可用于管理 NFS 导出的文件系统
常见选项:
- -v:查看本机所有 NFS 共享
- -r:重读配置文件,并共享目录
- -a:输出本机所有共享
- -au:停止本机所有共享
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
- fg:(默认)前台挂载
- bg:后台挂载
- hard:(默认)持续请求
- soft:非持续请求
- intr 和 hard 配合:请求可中断
- rsize 和 wsize:一次读和写数据最大字节数,rsize=32768
- _netdev:无网络不挂载
提示:基于安全考虑,建议使用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、相关包和文件
- 软件包: autofs
- 服务文件: /usr/lib/systemd/system/autofs.service
- 配置文件: /etc/auto.master
8.2、配置文件格式
参看帮助: man 5 autofs
所有导出到网络中的NFS启用特殊匹配-host至"browse"
范例: /net目录可以自动挂载NFS共享
cat /etc/auto.master
/net -hosts
cd /net/192.168.46.128
- 自动挂载资源有两种格式
- 相对路径法:将mount point路径分成dirname和basename分别配置,可能会影响现有的目录结构
- 绝对路径法:直接匹配全部绝对路径名称,不会影响本地目录结构
8.2.1、相对路径法
/etc/auto.master
格式
挂载点的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、绝对路径法
- /etc/auto.master格式
/- 指定配置文件路径
- 指定配置文件格式
绝对路径 挂载选项 选项设备
# 案例
- 绝对路径法
[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 发布出来,做为远程主机用户的家目录
9.1、环境准备
将node1中的用户家目录共享出来,node2在登陆这个用户的到时候,看到家目录下的文件是一致的
9.2、步骤
- NFS服务器创建用户和相应的目录,将用户user的家目录共享
[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)
- 在nfs客户端上实现autofs
[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
- 在nfs客户端上创建用户user
[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的功能:
- 共享文件和打印,实现在线编辑
- 实现登录SAMBA用户的身份认证
- 可以进行NetBIOS名称解析
- 外围设备共享
Windows计算机网络管理模式:
- 工作组WORKGROUP:计算机对等关系,帐号信息各自管理
- 域DOMAIN:C/S结构,帐号信息集中管理,DC,AD
2、软件介绍
2.1、相关包
samba
提供smb服务samba-client
客户端软件samba-common
通用软件cifs-utils smb
客户端工具samba-winbind
和AD相关
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-common-tools
- 工具:smbpasswd pdbedit
- 用户数据库:/var/lib/samba/private/passdb.tdb
说明: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
- 把系统账号加入samba账号
[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
- 查看samba用户列表
[root@localhost ~]# pdbedit -L -v
- 查看samba服务器状态
[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
宏定义:
- %m:客户端主机的NetBIOS名
- %M:客户端主机的FQDN
- %H:当前用户家目录路径
- %U:当前用户用户名
- %g:当前用户所属组
- %h:samba服务器的主机名
- %L:samba服务器的NetBIOS名
- %I:客户端主机的IP
- %T:当前日期和时间 %S 可登录的用户名
- %S:可登录的用户名
- %D:当前用户所属域或工作组名称
- %w:系统分隔符
5、配置特定目录共享
每个共享目录应该有独立的[ ]部分
- [共享名称]
- 远程网络看到的共享名称 #真正被共享的名称有Path指定
- comment
- 注释信息
- path
- 所共享的目录路径
- public
- 能否被guest访问的共享,默认no,和guest ok 类似 #默认不允许匿名访问
- browsable
- 是否允许所有用户浏览此共享,默认为yes,no为隐藏
- writable=yes
- 可以被所有用户读写,默认为no #打开之后还需要把文件夹的权限开放
- 对smb虚拟账户授权:setfacl -m u:smbuser:rwx /path/share 这样就可以上传了
- 当然也可以 chomd 777 /path/share 最大权限 文件系统级别不控制 在smb级别控制即可
- read only=no
- 和writable=yes等价,如与以上设置冲突,放在后面的设置生效,默认只读
- write list 用户,@组名,+组名,用,分隔,如writable=no,列表中用户或组可读写,不在列表中用户只读
- valid users 特定用户才能访问该共享,如为空,将允许所有用户,用户名之间用空格分隔
范例:基于特定用户和组的共享
[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
- 添加相应的samba账户
[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
- 检查139和445端口号
[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-Q
和Send-Q
是与TCP连接相关的两个队列的大小。
Recv-Q
表示接收队列的大小。它指示了尚未被应用程序(进程)接收的来自网络的数据的数量。当接收队列的大小超过一定限制时,可能会发生数据丢失。-
Send-Q
表示发送队列的大小。它指示了应用程序(进程)等待发送到网络的数据的数量。当发送队列的大小超过一定限制时,可能会导致发送缓冲区已满,从而阻塞应用程序发送更多的数据。 -
客户端验证
# 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 清空用户缓存信息
# 别的部门需要先检查秘钥文件
- 在Linux上进行挂载
[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介绍
- HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议
- HTTP是基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)的
- HTTP有不同版本号,不同版本号区别如下
- HTTP0.9:仅支持GET方法,仅能访问HTML格式的资源
- HTTP1.0:增加POST和HEAD方法,MIME支持多种数据格式,开始支持Cache,支持tcp短连接
- HTTP1.1:支持持久连接(长连接),一个TCP连接允许多个请求,新增PUT、PATCH、DELETE等
- HTTP2.0:性能大幅提升,新的二进制格式,多路复用,header压缩,服务端推送。
2、HTTP 工作原理
- HTTP协议工作于客户端-服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。
- Web服务器有:Apache服务器,IIS服务器(Internet Information Services)等。
- Web服务器根据接收到的请求后,向客户端发送响应信息。
- HTTP默认端口号为80,但是你也可以改为8080或者其他端口。
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包括以下几部分:
- 协议部分:该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等本例中使用的是HTTP协议。在"HTTP"后面的“//”为分隔符
- 域名部分:该URL的域名部分为“iproute.cn”。一个URL中,也可以使用IP地址作为域名使用
- 端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口
- 虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。本例中的虚拟目录是“/news/”
- 文件名部分:从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“search”。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名
- 锚部分:从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL必须的部分
- 参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“keyword=123&enc=utf8”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。
4、HTTP注意事项
- HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
- HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
- HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
5、HTTP 消息结构
- HTTP是基于客户端/服务端(C/S)的架构模型,通过一个可靠的链接来交换信息,是一个无状态的请求/响应协议。
- 一个HTTP"客户端"是一个应用程序(Web浏览器或其他任何客户端),通过连接到服务器达到向服务器发送一个或多个HTTP的请求的目的。
- 一个HTTP"服务器"同样也是一个应用程序(通常是一个Web服务,如Apache Web服务器或IIS服务器等),通过接收客户端的请求并向客户端发送HTTP响应数据。
- HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。
- 一旦建立连接后,数据消息就通过类似Internet邮件所使用的格式[RFC5322]和多用途Internet邮件扩展(MIME)[RFC2045]来传送。
- HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文,下面是一个HTTP响应示例
5.1、HTTP请求头部
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:
- 使用burpsuit抓包如下
- GET请求案例
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请求案例
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请求报文头部属性
- Accpet
- 告诉服务端,客户端接收什么类型的响应
- Referer
- 表示这是请求是从哪个URL进来的,比如想在网上购物,但是不知道选择哪家电商平台,你就去问百度,说哪家电商的东西便宜啊,然后一堆东西弹出在你面前,第一给就是某宝,当你从这里进入某宝的时候,这个请求报文的Referer就是www.baidu.com
- Cache-Control
- 对缓存进行控制,如一个请求希望响应的内容在客户端缓存一年,或不被缓可以通过这个报文头设置
- Accept-Encoding
- 这个属性是用来告诉服务器能接受什么编码格式,包括字符编码,压缩形式(一般都是压缩形式)
- 例如:Accept-Encoding:gzip, deflate(这两种都是压缩格式)
- Host
- 指定要请求的资源所在的主机和端口
- User-Agent
- 告诉服务器,客户端使用的操作系统、浏览器版本和名称
- 更多的头部属性可以参见脚本之家提供的http请求头部大全
- http://tools.jb51.net/table/http_header
5.3、HTTP响应头部
服务的相应信息格式如下:
- 使用burpsuit抓包如下
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请求方法区别
- 提交的过程
- GET提交,请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,多个参数用&连接
- POST提交:把提交的数据放置在是HTTP包的包体中
- 传输数据的大小
- 首先声明:HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制
- GET提交,特定浏览器和服务器对URL长度有限制
- POST提交,由于不是通过URL传值,理论上数据不受限
- 安全性
- POST的安全性要比GET的安全性高
- 登录页面有可能被浏览器缓存,而缓存的是URL
- 其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了
- 使用GET提交数据还可能会造成Cross-site request forgery攻击
5.5、常见http响应报文头部属性
- Cache-Control
- 响应输出到客户端后,服务端通过该属性告诉客户端该怎么控制响应内容的缓存
- ETag
- 表示你请求资源的版本,如果该资源发生啦变化,那么这个属性也会跟着变
- Location
- 在重定向中或者创建新资源时使用
- Set-Cookie
- 服务端可以设置客户端的cookie
- 更多的头部属性可以参见脚本之家提供的http请求头部大全
- http://tools.jb51.net/table/http_header
6、HTTP状态码
- 状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
- 1xx:指示信息--表示请求已接收,继续处理
- 2xx:成功--表示请求已被成功接收、理解、接受
- 3xx:重定向--要完成请求必须进行更进一步的操作
- 4xx:客户端错误--请求有语法错误或请求无法实现
- 5xx:服务器端错误--服务器未能实现合法的请求
- 常见状态码
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
- 更多状态码属性可以参见脚本之家提供的状态码大全
- http://tools.jb51.net/table/http_status_code
7、HTTP请求方法
根据HTTP标准,HTTP请求可以使用多种请求方法。
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
- GET 请求指定的页面信息,并返回实体主体。
- HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
- POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
- PUT 从客户端向服务器传送的数据取代指定的文档的内容。
- DELETE 请求服务器删除指定的页面。
- CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
- OPTIONS 允许客户端查看服务器的性能。
- TRACE 回显服务器收到的请求,主要用于测试或诊断。
- 更多http请求方法可以参见脚本之家提供的http请求方法大全
- http://tools.jb51.net/table/http_request_method
8、HTTP工作原理
在浏览器地址栏键入URL,按下回车之后会经历以下流程:
- 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
- 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
- 浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
- 服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
- 释放 TCP连接;
- 浏览器将该 html 文本并显示内容;
9、长连接与短连接
HTTP1.1规定了默认保持长连接(HTTP persistent connection ,也有翻译为持久连接),数据传输完成了保持TCP连接不断开(不发RST包、不四次握手),等待在同域名下继续用这个通道传输数据;相反的就是短连接。
在实际使用中,HTTP头部有了Keep-Alive这个值并不代表一定会使用长连接,客户端和服务器端都可以无视这个值,也就是不按标准来。毕竟TCP是一个双向连接的协议,双方都可以决定是不是主动断开。
客户端的长连接不可能无限期的拿着,会有一个超时时间,服务器有时候会告诉客户端超时时间。下图中的Keep-Alive: timeout=20,表示这个TCP通道可以保持20秒
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、常用的网站服务软件
- https://w3techs.com/technologies/overview/web_server
- Apache是什么
- Apache HTTP Server简称为Apache,是Apache软件基金会的一个高性能、功能强大、见状可靠、又灵活的开放源代码的web服务软件,它可以运行在广泛的计算机平台上如Linux、Windows。因其平台型和很好的安全性而被广泛使用,是互联网最流行的web服务软件之一
- 特点
- 功能强大
- 高度模块化
- 采用MPM多路处理模块
- 配置简单
- 速度快
- 应用广泛
- 性能稳定可靠
- 可做代理服务器或负载均衡来使用
- 双向认证
- 支持第三方模块
- 应用场合
- 使用Apache运行静态HTML网页、图片
- 使用Apache结合PHP、Linux、MySQL可以组成LAMP经典架构
- 使用Apache作代理、负载均衡等
- MPM工作模式
- prefork:多进程I/O模型,一个主进程,管理多个子进程,一个子进程处理一个请求。
- worker:复用的多进程I/O模型,多进程多线程,一个主进程,管理多个子进程,一个子进程管理多个线程,每个线程处理一个请求。
- event:事件驱动模型,一个主进程,管理多个子进程,一个进程处理多个请求。
2、apache安装
- centos7的软件仓库中存在此软件包,可以直接通过yum进行安装
[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
- 使用curl或者浏览器测试网页是否正常
[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
2.1、httpd命令
httpd为Apache HTTP服务器程序。直接执行程序可启动服务器的服务
httpd [-hlLStvVX][-c<httpd指令>][-C<httpd指令>][-d<服务器根目录>][-D<设定文件参数>][-f<设定文件>]
2.1.1、选项
- -c:在读取配置文件前,先执行选项中的指令。
- -C:在读取配置文件后,再执行选项中的指令。
- -d<服务器根目录>:指定服务器的根目录。
- -D<设定文件参数>:指定要传入配置文件的参数。
- -f<设定文件>:指定配置文件。
- -h:显示帮助。
- -l:显示服务器编译时所包含的模块。
- -L:显示httpd指令的说明。
- -S:显示配置文件中的设定。
- -t:测试配置文件的语法是否正确。
- -v:显示版本信息。
- -V:显示版本信息以及建立环境。
- -X:以单一程序的方式来启动服务器。
2.2、指定服务器名字
- 服务器名指定了之后,需要保障域名能够解析到这台服务器上,不然将无法访问
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
ServerName www.example.com:80
[root@localhost ~]# httpd -t # 检查语法
Syntax OK
- 指定服务器监听地址,默认是80端口
[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
- 特殊场景下,可以设置超时时间为毫秒级,指定 ms 时间单位即可
[root@localhost ~]#cat /etc/httpd/conf/httpd.conf|grep Keepalive
Keepalive on
Keepalivetimeout 30000ms
3、apache功能模块
- httpd 有静态功能模块和动态功能模块组成,分别使用 httpd -l 和 httpd -M 查看
- Dynamic Shared Object,加载动态模块配置,不需重启即生效
- 动态模块所在路径:
/usr/lib64/httpd/modules/
- 主配置
/etc/httpd/conf/httpd.conf
文件中指定加载模块配置文件 - apache模块功能介绍
- http://httpd.apache.org/docs/2.4/zh-cn/mod/
- 加载模块示例
[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
- MPM工作模式
- prefork:多进程I/O模型,一个主进程,管理多个子进程,一个子进程处理一个请求。
- worker:复用的多进程I/O模型,多进程多线程,一个主进程,管理多个子进程,一个子进程管理多个线程,每个 线程处理一个请求。
- event:事件驱动模型,一个主进程,管理多个子进程,一个进程处理多个请求。
- 查看centos7中默认的mpm
[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)
- 修改MPM工作模式为
mod_mpm_worker.so
[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模式
默认的工作模式是Prefork MPM,这种模式采用的是预派生子进程方式,用单独的子进程来处理请求,子进程间互相独立,互不影响,大大的提高了稳定性,但每个进程都会占用内存,所以消耗系统资源过高。
Prefork MPM 工作原理:控制进程Master首先会生成“StartServers”个进程,“StartServers”可以在Apache主配置文件里配置,然后为了满足“MinSpareServers”设置的最小空闲进程个数,会建立一个空闲进程,等待一秒钟,继续创建两个空闲进程,再等待一秒钟,继续创建四个空闲进程,以此类推,会不断的递归增长创建进程,最大同时创建32个空闲进程,直到满足“MinSpareServers”设置的空闲进程个数为止。Apache的预派生模式不必在请求到来的时候创建进程,这样会减小系统开销以增加性能,不过Prefork MPM是基于多进程的模式工作的,每个进程都会占用内存,这样资源消耗也较高。
- 将apache切换到prefork的模式下,可以通过
httpd -V
来查看
[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)
- 通过调整配置文件,可以修改prefork的参数
[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)
- 修改prefork参数
[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)
- 使用ab进行压力测试
[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
- 结束ab的压力测试,等待一段时间,可以看到进程数慢慢减少
[root@localhost ~]# ps aux |grep httpd |wc -l
12
4.2、worker模式
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的值
- 修改mpm文件为官方提供的默认数值,然后切换模式到worker模式
[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模式
这个是 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>
- DocumentRoot指向的路径为URL路径的起始位置
- 路径必须显式授权后才可以访问
[root@localhost ~]# httpd -M |grep dir
dir_module (shared)
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
# 用于指定当请求一个目录时,服务器应该提供的默认文件
- 关于dir_mod可以查看中文手册
- https://www.php.cn/manual/view/17830.html
- 当访问的URL只是指定的一个目录,并没有给出具体访问的文件的时候,这个模块会在
/
后面自动加上index.html
(默认的行为是重定向到index.html上面) - 可以修改httpd的配置文件来修改这个默认的首页文件
5.1、案例-修改默认网址目录
- 默认情况下主页存放于
/var/www/html
目录下,下面修改默认资源存放路径,指定为/data/html
[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>
- 在dir_mod中添加
index.htm
[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
- 访问这个页面,发现index.html优先于index.htm
[root@localhost ~]# curl 127.0.0.1
<h1>hello world</h1>
- 修改index.html和index.htm的顺序
[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、默认页面
- 如果在
DocumentRoot
目录下没有任何文件,会发现有一个默认的页面,也就是显示Testing 123..
的那个页面,这个是因为有一个welcome.conf
的配置文件导致的
[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
- 上面的配置显示,当访问服务器时,提示的 http 错误代码为 403 时,使用
/.noindex.html
页面响应用户请求。 - 如果将其注释,或者修改这个文件,将会就会显示apache的403报错页面
- 如果我们想自定义报错页面,可以修改这个文件
6、访问控制
6.1、URI匹配规则
Apache httpd的URL匹配规则主要包括以下几种指令:
<Location>
: 基于URL路径进行匹配。<LocationMatch>
: 使用正则表达式进行URL路径匹配。<Directory>
: 基于服务器文件系统的目录路径进行匹配。<DirectoryMatch>
: 使用正则表达式进行目录路径匹配。<Files>
: 基于文件名进行匹配。<FilesMatch>
: 使用正则表达式进行文件名匹配。
优先级:
这些指令的优先级从高到低为:
<Files>
和<FilesMatch>
<Directory>
和<DirectoryMatch>
<Location>
和<LocationMatch>
指令常用选项:
<Location>
指令:
path
: 指定需要匹配的 URL 路径。可以使用通配符。Order
: 控制允许和拒绝操作的顺序。可以是Allow,Deny
或Deny,Allow
。Allow
: 指定允许访问的主机或 IP 地址。Deny
: 指定拒绝访问的主机或 IP 地址。Require
: 指定需要通过身份验证才能访问的用户或组。
<LocationMatch>
指令:
regex
: 指定一个正则表达式来匹配 URL。- 其他选项同
<Location>
指令。
<Directory>
指令:
path
: 指定需要匹配的目录路径。可以使用通配符。Options
: 设置目录的访问选项,如FollowSymLinks
、Indexes
等。AllowOverride
: 控制 .htaccess 文件的覆盖范围。- 其他选项同
<Location>
指令。
<Files>
指令:
filename
: 指定需要匹配的文件名。可以使用通配符。- 其他选项同
<Location>
指令。
<FilesMatch>
指令:
regex
: 指定一个正则表达式来匹配文件名。- 其他选项同
<Files>
指令
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指令
- 后跟1个或多个以空白字符分隔的选项列表, 在选项前的+,- 表示增加或删除指定选项
- 常见选项(默认是全部禁用):
- Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户
- FollowSymLinks:允许访问符号链接文件所指向的源文件
- None:全部禁用
- All: 全部允许
- 在html目录下产生如下目录和文件,然后通过浏览器访问这个目录
[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
- 这样是不安全的。因为如果没有index.html文件就会把其他的目录显示出来。所以要修改配置
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
<Directory "/data/html">
Options -Indexes
#Options Indexes FollowSymLinks 注释掉,默认就会关闭
[root@localhost html]# systemctl restart httpd
- 创建一个软连接,把/etc的软连接放到
html/dir
中,同时关闭上述的options -Indexes
[root@localhost dir]# ln -s /etc/hosts /data/html/dir/hosts
- 可以访问软连接指定文件中的内容。这样也会导致很大的安全风险。
- 关闭FollowSymLinks选项后再次查看,发现软链接文件已经不显示了
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
<Directory "/data/html">
Options -FollowSymLinks
# Options Indexes #把FollowSymLinks删掉
[root@localhost html]# systemctl restart httpd
6.5、AllowOverride指令
AllowOverride指令与访问控制相关的哪些指令可以放在指定目录下的.htaccess(由AccessFileName 指令指定,AccessFileName .htaccess 为默认值)文件中,覆盖之前的配置指令,只对语句有效,直接在对应的文件目录中新建一个.htaccess的文件
- 常见用法:
- AllowOverride All:.htaccess中所有指令都有效
- AllowOverride None:.htaccess 文件无效,此为httpd 2.3.9以后版的默认值
- AllowOverride AuthConfig:.htaccess 文件中,除了AuthConfig 其它指令都无法生效,指定精确指令
6.5.1、案例
- 在主配置文件中禁止
Indexes
和FollowSymLinks
,但是在.htaccess
中打开
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
<Directory "/data/html">
Options -Indexes -FollowSymLinks
AllowOverride options=FollowSymLinks,Indexes
[root@localhost ~]# systemctl reload httpd
- 创建
.htaccess
文件,然后发现主配置文件中的设置被修改了
[root@localhost ~]# echo "Options FollowSymLinks Indexes" > /data/html/dir/.htaccess
[root@localhost ~]# systemctl reload httpd
- 因为有主配置文件中设置了
.htaccess
对应的文件拒绝全部访问,所以相对是安全的
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
<Files ".ht*">
Require all denied
</Files>
6.6、基于IP地址的访问控制
-
针对各种资源,可以基于以下两种方式的访问控制
-
客户端来源地址
-
用户账号
-
基于客户端的IP地址的访问控制
-
无明确授权的目录,默认拒绝
-
允许所有主机访问:
Require all granted
-
拒绝所有主机访问:
Require all denied
-
授权指定来源的IP访问:
Require ip <IPADDR>
-
拒绝特定的IP访问:
Require not ip <IPADDR>
-
授权特定主机访问:
Require host <HOSTNAME>
-
拒绝特定主机访问:
Require not host <HOSTNAME>
需要注释掉Directory下的 Require all granted。在Directory标签下编辑。
-
黑名单
[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、基于用户的访问控制
- 认证质询:WWW-Authenticate,响应码为401,拒绝客户端请求,并说明要求客户端需要提供账号和密码
- 认证:Authorization,客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的资源
- 认证方式两种
- basic:明文
- digest:消息摘要认证,兼容性差
- 安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便于告知用户认证的原因用户的账号和密码
- 虚拟账号:仅用于访问某服务时用到的认证标识
6.7.1、配置方法
- 定义安全域
- 允许账号文件中的所有用户登录访问:
- Require valid-user #表示只要在这个文件里面的用户都是有效用户,都可以访问
<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
- 选项
- -c:自动创建文件,仅应该在文件不存在时使用,不然就会覆盖
- -p:明文密码
- -d:CRYPT格式加密,默认
- -m:md5格式加密
- -s:sha格式加密
- -D:删除指定用户
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
- 在访问的时候就需要输入密码
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
- 设置
AllowOverride
选项为All
[root@localhost ~]# vim /etc/httpd/conf.d/test.conf
<Directory "/data/html/admin">
AllowOverride Authconfig
Require all granted
</Directory>
- 写入
.htaccess
文件
[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
- 最后测试是否成功
6.8、基于组账号进行认证
- 可以对htpasswd产生的虚拟用户进行分组管理
<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
- 修改httpd配置文件
[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、日志配置
- httpd有两种日志类型
- 访问日志
- 错误日志
- 日志等级:debug, info, notice, warn,error, crit, alert,emerg
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>
- 变量参考
- %h 客户端IP地址
- %l 远程用户,启用mod_ident才有效,通常为减号“-”
- %u 验证(basic,digest)远程用户,非登录访问时,为一个减号“-”
- %t 服务器收到请求时的时间
- %r First line of request,即表示请求报文的首行;记录了此次请求的“方法”,“URL”以及协议版本
- %>s 对于已在内部重定向的请求,这是原始请求的状态。使用%>s 的最终状态。类型脚本中的exit 数字
- %b 响应报文的大小,单位是字节;不包括响应报文http首部
- %{Referer}i 请求报文中首部“referer”的值;即从哪个页面中的超链接跳转至当前页面。 { }里面内容就是报文中的一个键值对
- %{User-Agent}i 请求报文中首部“User-Agent”的值;即发出请求的应用程序,多数为浏览器型号
- 日志存放位置
[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访问文件路径,从而起到隐藏真实文件系统路径的目的。
- 我们让
dir
目录隐藏,让其可以被news
路径访问
[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
8.1、Alias 案例
通过alias配置,实现访问路径到本地文件系统的映射
- 新增一个子配置文件,内容如下:
[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
- 创建相关目录及访问文件
[root@localhost ~]# mkdir -p /data/html/pub
[root@localhost ~]# echo "in /data/html/pub" > /data/html/pub/index.html
- 赋予该目录及子目录权限
[root@localhost ~]# chmod 755 -R /data
- 检查配置并且重启httpd服务
[root@localhost ~]# httpd -t
[root@localhost ~]# systemctl restart httpd
- 访问测试:
访问:http://192.168.88.136/pub
9、httpd服务状态信息显示
当我们需要获取 httpd 服务器在运行过程中的实时状态信息时可以使用该功能
- 新建子配置文件,并且内容如下:
[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
- 检查配置并且重启httpd服务
[root@localhost ~]# httpd -t
[root@localhost ~]# systemctl restart httpd
- 访问测试:
在浏览器中访问http://192.168.88.136/status
获取 httpd 服务状态信息成功
10、虚拟主机
- httpd 支持在一台物理主机上实现多个网站,即多虚拟主机
- 网站的唯一标识
- IP相同,但端口不同
- IP不同,但端口均为默认端口
- FQDN不同
- 多虚拟主机有三种实现方案
- 基于ip:为每个虚拟主机准备至少一个ip地址
- 基于port:为每个虚拟主机使用至少一个独立的port
- 基于FQDN:为每个虚拟主机使用至少一个FQDN
- 虚拟主机的基本配置方法
<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的虚拟主机
- 先通过nmtui命令给linux系统配置多个IP地址
- 重启网络配置,并且检查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
- 配置基于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、网页压缩技术
- 使用mod_deflate模块压缩页面优化传输速度
- 适用场景
- 节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持
- 压缩适于压缩的资源,例如文本文件
- 确认是否加载浏览器压缩模块
[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是基于IP地址实现,单IP的httpd主机,仅可以使用一个https虚拟主机
- 实现多个虚拟主机站点,apache不能支持,nginx支持
- SSL实现过程
- 客户端发送可供选择的加密方式,并向服务器请求证书
- 服务器端发送证书以及选定的加密方式给客户端
- 客户端取得证书并进行证书验证,如果信任给其发证书的CA
- 验证证书来源的合法性;用CA的公钥解密证书上数字签名
- 验证证书的内容的合法性:完整性验证
- 检查证书的有效期限
- 检查证书是否被吊销
- 证书中拥有者的名字,与访问的目标主机要一致
- 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换
- 服务用此密钥加密用户请求的资源,响应给客户端
- 安装 mod_ssl 软件包,并且检查443端口是否开放
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
- 可以使用curl命令查看证书,可以看到一个非权威机构的证书
[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进行加密,所以传输的数据都是加密后的数据。
https 实现过程如下:
客户端发起HTTPS请求
客户端访问某个web端的https地址,一般都是443端口
服务端的配置
采用https协议的服务器必须要有一套证书,可以通过权威机构申请,也可以自己制作,目前国内很多⽹站都⾃⼰做的,当你访问⼀个⽹站的时候提示证书不可信任就表示证书是⾃⼰做的,证书就是⼀个公钥和私钥匙,就像⼀把锁和钥匙,正常情况下只有你的钥匙可以打开你的锁,你可以把这个送给别⼈让他锁住⼀个箱⼦,⾥⾯放满了钱或秘密,别⼈不知道⾥⾯放了什么⽽且别⼈也打不开,只有你的钥匙是可以打开的。
对称加密与非对称加密区别
对称加密只有密钥
非对称加密有公私钥,公钥加密,私钥解密
传送证书
服务端给客户端传递证书,其实就是公钥,⾥⾯包含了很多信息,例如证书得到颁发机构、过期时间等等。
客户端解析证书
这部分⼯作是有客户端完成的,⾸先回验证公钥的有效性,⽐如颁发机构、过期时间等等,如果发现异常则会弹出⼀个警告框提示证书可能存在问题,如果证书没有问题就⽣成⼀个随机值,然后⽤证书对该随机值进⾏加密,就像2步骤所说把随机值锁起来,不让别⼈看到。
传送4步骤的加密数据
就是将⽤证书加密后的随机值传递给服务器,⽬的就是为了让服务器得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值进⾏加密解密了。
服务端解密信息
服务端用私钥解密5步骤加密后的随机值之后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进⾏对称加密,对称加密就是将信息和私钥通过算法混合在⼀起,这样除非你知道私钥,不然是⽆法获取其内部的内容,而正好客户端和服务端都知道这个私钥,所以只要机密算法够复杂就可以保证数据的安全性。
传输加密后的信息
服务端将⽤私钥加密后的数据传递给客户端,在客户端可以被还原出原数据内容
客户端解密信息
客户端⽤之前⽣成的私钥获解密服务端传递过来的数据,由于数据⼀直是加密的,因此即使第三⽅获取到数据也⽆法知道其详细内容。
12.2、HTTPS加解密过程
HTTPS 中使用的加密技术主要包括以下几个步骤:
-
密钥协商
-
在 SSL/TLS 握手过程中,客户端和服务器协商出一个对称加密密钥。
-
这个对称密钥是用于后续数据加密和解密的临时密钥。
-
对称加密
-
客户端和服务器使用协商好的对称密钥对 HTTP 请求和响应数据进行加密和解密。
-
对称加密算法通常包括 AES、DES、3DES 等,速度快且计算开销小。
-
非对称加密
-
在握手过程中,服务器使用自己的私钥对对称密钥进行加密,发送给客户端。
- 客户端使用服务器的公钥解密获得对称密钥。
-
非对称加密算法通常包括 RSA、ECC 等,安全性高但计算开销大。
-
摘要算法
-
客户端和服务器使用摘要算法(如 SHA-256)计算数据的数字签名。
-
数字签名用于验证数据的完整性,确保数据在传输过程中未被篡改。
-
证书验证
-
客户端使用预先内置的受信任根证书颁发机构(CA)公钥,验证服务器证书的合法性。
- 这确保连接的服务器是真实的,而不是中间人攻击者伪造的。
13、URL重定向
- URL重定向,即将httpd 请求的URL转发至另一个的URL
- 重定向指令
# httpd.conf 文件中的配置
Redirect [status] /old-url /new-url
- status状态
- permanent: 返回永久重定向状态码 301
- temp:返回临时重定向状态码302. 此为默认值
文档演示:
假设您有一个旧网站 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 路径。常见的重定向状态码有:
301 Moved Permanently
: 永久重定向302 Found
: 临时重定向307 Temporary Redirect
: 临时重定向(保留请求方法)
除了使用 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代码
请求示意图:
2、LAMP架构部署
2.1、安装Apache
yum install -y httpd
# 启动httpd
systemctl start httpd
# 关闭防火墙和SElinux
systemctl stop filewalld
setenforce 0
访问测试:http://IP
2.2、安装php环境
- 由于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
- 安装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
- 重启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
测试
这里如果可以看到上述页面,说明我们的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
测试:
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
进行测试
用户名和密码为我们刚才初始化数据库时设置的root和123456,登陆后,会进入图形化管理界面
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、创建数据库
点击数据库
输入数据库名之后,就可以点击创建
3.3、安装博客系统
下面就可以开始进入网站安装的部分了,访问博客系统页面
填写数据库密码和网站后台管理员密码
点击开始安装之后,会出现了如下页面
我们手动在typecho目录中创建这个文件,并且把内容复制进去
vim config.inc.php
配置文件创建完成之后,可以点击创建完毕,继续安装>>
下面是安装成功的页面
3.4、切换主题
默认的主题如下,界面比较的简洁,我们可以给这个网站替换主题,也可以借此加深熟悉我们对Linux命令行的熟练程度
打开官方主题站:https://typecho.me/
第三方主题商店:https://www.typechx.com/
这边以这个主题为例
点击模板下载
点击下载压缩包
将主题上传到博客主题的目录/var/www/html/typecho/usr/themes
# 解压压缩包,并且将主题文件夹重命名
unzip typecho-theme-sagiri-master.zip
mv typecho-theme-sagiri-master sagiri
# 可以删除旧的压缩包文件
rm -rf typecho-theme-sagiri-master.zip
进入网站后台切换主题,在地址后面加上/admin
就可以进入后台登录页面了
启用我们刚刚安装的主题
访问网页前端,查看最终的效果
评论区