第四章 web服务器

发布于:2024-04-20 ⋅ 阅读:(24) ⋅ 点赞:(0)

web服务器

web服务器简介

(1)什么是www

www是world wide web的缩写,也就是全球信息广播的意思。通常说的上网就是使用www来查询用户所需要的信息。www可以结合文字、图形、影像以及声音等多媒体,并通过可以让鼠标单击超链接的方式将信息以Internet传递到世界各处去。

与其他服务器类似,当你连接上www网站,该网站肯定会提供一些数据,而你的客户端则必须要使用可以解析这些数据的软件来处理,那就是浏览器。

1、 www所用的协议: http协议(Hyper Text Transport Protocol,HTTP,超文本传输协议)
2、www服务器需要提供可让客户端浏览的平台。目前最主流的Web服务器是Apache、Microsoft的Internet信息服务器(Internet Information Services,IIS)和unix nginx。
3、服务器所提供的最主要数据是超文本标记语言(Hyper Text Markup Language,HTML)、多媒体文件(图片、影像、声音、文字等,都属于多媒体或称为超媒体),HTML只是一些纯文本数据,通过所谓的标记来规范所要显示的数据格式。
4、客户端收到服务器的数据之后需要软件解析服务器所提供的数据,最后将效果呈现在用户的屏幕上。那么著名的浏览器就有内建在Windows操作系统内的IE浏览器了,还有Firefox浏览器和Google的chrome浏览器。

(2)网址及HTTP简介

web服务器提供的这些数据大部分都是文件,那么我们需要在服务器端先将数据文件写好,并且放置在某个特殊的目录下面,这个目录就是我们整个网站的首页,在redhat中,这个目录默认在 /var/www/html 。浏览器是通过你在地址栏中输入你所需要的网址来取得这个目录的数据的。

  • URL:Uniform Resource Locator,统一资源定位符,对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。

  • 网址格式:<协议>://<主机或主机名>[:port]/<目录资源,路径>

    • 浏览器常支持的协议有:http、https、ftp等。
    • 主机地址或者主机名:主机地址就是服务器在因特网所在的IP地址。如果是主机名的话,那么就需要域名解析
    • 端口号(port):http为80,https为443 (IANA:互联网数字分配机构)
      • 0-1023:永久地分配给固定的应用程序使用,特权端口(只有管理员有权限启用并让进程监听)
      • 1024-41951:亦为注册端口,但要求不是特别严格,分配给程序注册为某应用使用:3306/TCP
      • 41952-60000:客户端程序随机使用的端口,动态端口,或私有端口
  • http请求方法:在http通信中,每个http请求报文都包含一个方法,用以告诉web服务器端需要执行哪些具体的动作,这些动作包括:获取指定web页面、提交内容到服务器、删除服务器上资源文件等。
    在这里插入图片描述

  • 状态代码:由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。

    • 1xx:指示信息 —— 表示请求已接收,继续处理
    • 2xx:成功 —— 表示请求已被成功接收、理解、接受
    • 3xx:重定向 —— 要完成请求必须进行更进一步的操作
    • 4xx:客户端错误 —— 请求有语法错误或请求无法实现
    • 5xx:服务器端错误 —— 服务器未能实现合法的请求
    • 常见状态代码、状态描述的说明如下:
      • 200 OK:客户端请求成功
      • 400 Bad Request:客户端请求有语法错误,不能被服务器所理解
      • 401 Unauthorized:请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用
      • 403 Forbidden:服务器收到请求,但是拒绝提供服务
      • 404 Not Found:请求资源不存在,举个例子:输入了错误的URL
      • 500 Internal Server Error:服务器发生不可预期的错误
      • 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常
  • HTTP报文:http报文中有很多行内容,这些行的字段内容都是由一些ASCII码串组成,但各个字段的长度是不同的。http报文可分为两种,一种是从web客户端发往web服务器的http报文,称为请求报文。另外一种是从web服务器发往web客户端的报文,称为响应报文 。

    • http请求报文由请求行、请求头部、空行和请求报文主体几个部分组成

      报文格式 报文信息 说明
      请求行 请求方法 URL 协议版本 请求行是请求报文的第一行,用来说明客户端想要做什么
      请求头 字段名1:值1 字段名2:值2 …… Accept:image/gif,image/jpeg 媒体类型
      Accept-Language:zh-cn 语言类型
      Accept-Encoding:gzip,deflate 支持压缩
      User-Agent:Mozilla/4.0(compatible:MSIE6.0;Windows NT;……) 客户端类型
      Host:www.ceshi.com 主机名
      空行 空白无内容 通知web服务器空行以下不会有请求头部的信息了
      请求报文主体 GET方法没有请求报文主体,POST方法才有 请求报文主体中包括了要发送给web服务器的数据信息。请求报文主体不会应用于http的GET命令方法,而是应用于post方法。
    • http响应报文由起始行、响应头部、空行和响应报文主体这几个部分组成

      报文格式 报文信息 说明
      起始行 协议及版本号 数字状态码 状态信息 用来说明服务器响应客户端请求的状况,例如:HTTP/1.1 200 OK
      响应头部 字段名1:值1 字段名2:值2 常见的头部信息: Content-Length: 81 说明响应主体的长度 Content-Type: text/html; charset=UTF-8 说明文档的MIME类型
      空行 空白无内容 通知客户端空行以下无头部信息了
      响应报文主体 test this is test 响应报文主体中装载了要返回给客户端的数据,这些数据可以是文本,也可以是二进制的(如图片,视频)。
  • MIME(Multipurpose Internet Mail Extension,多用途因特网邮件扩展)最初是为了解决在
    不同的电子邮件系统之间搬移报文时存在的问题。后来http也支持了这个功能,用它来描述数据并
    标记不同的数据内容类型。
    当web服务器响应http请求时,会为每一个http对象数据加一个MIME类型。当web浏览器获
    取到服务器返回的对象时,会去查看相关的MIME类型,并进行相应的处理。
    MIME类型存在于HTTP响应报文的响应头部信息里,它是一种文本标记,表示一种主要的对象
    类型和一个特定的子类型。常见的MIME类型:

    MIME类型 文件类型
    text/html html、htm、shtml文本类型
    text/css css文本类型
    text/xml xml文本类型
    image/gif gif图像类型
    image/jpeg jpeg、jpg图像类型
    application/javascript js文本类型
    text/plain txt文本类型
    application/json json文本类型
    video/mp4 mp4视频类型
    video/quicktime mov视频类型
    video/x-flv flv视频类型
    video/x-ms-wmv wmv视频类型
    video/x-msvideo avi视频类

(3)http协议请求的工作流程

(1)终端客户在web浏览器地址栏输入访问地址http://www.ceshi.com:80/index.html
(2)web浏览器请求DNS服务器把域名www.ceshi.com解析成web服务器的IP地址
(3)web浏览器将端口号(默认是80)从访问地址(URL)中解析出来
(4)web浏览器通过解析后的ip地址及端口号与web服务器之间建立一条TCP连接
(5)建立TCP连接后,web浏览器向web服务器发送一条HTTP请求报文
(6)web服务器响应并读取浏览器的请求信息,然后返回一条HTTP响应报文。
(7)web服务器关闭HTTP连接,关闭TCP连接,web浏览器显示访问的网站内容到屏幕上。

web服务器的类型

(1)仅提供用户浏览的单向静态网页
单纯是由服务器单向提供数据给客户端,Server不需要与client端有互动,所以你可以到该网站上去浏览,但是无法进行数据的上传。

(2)提供用户互动接口的动态网站
这种类型的网站可以让服务器与用户互动,常见的例如留言板,博客。这种类型的网站需要通过“网页程序语言”来实现与用户互动的行为。常见的例如:PHP网页程序语言,配合数据库系统来进行数据的读、写。当你在向服务器请求数据时,其实是通过服务器端同一个网页程序在负责将数据读出或写入数据库,变动的是数据库的内容,网页程序并没有任何改变。
另外一种交互式的动态网页主要是在客户端实现。服务端将可执行的程序代码(JavaScript)传送给客户端,客户端的浏览器如果提供JavaScript的功能,那么该程序就可以在客户端的计算机上面工作了;另外一种可在客户端执行的就是flash动画格式,在这种动画格式内还可以进行程序设计。搭建动态网站的需求:

LAMP(linux+Apache+MySQL+PHP)
Apache主要提供www的服务器平台
MySQL:传统的文件读取是很麻烦的,如果你只要读取该文件当中的一小部分,系统还是会将整个文件读出来,若又有人同时读取同一个文件时,那就会造成效率与系统上的问题,所以才会有数据库系统的推出。数据库其实是一种特殊格式的文件,这种文件要通过特殊接口(数据库软件)来进行读写。由于这个特殊接口已经针对数据的查询、写入做过优化设计,因此很适合多人同时写入与查询工作。
PHP:PHP可以被用来建立动态网页,PHP程序代码可以直接在HTML网页当中嵌入,就像编辑HTML网页一样简单。PHP是一种“程序语言”,这种程序语言可以直接在网页当中编写,不需要经过编译即可执行。

web服务器基本配置


案例一

apache http server 静态网站访问

S/C

C (客户端)

打开浏览器

输入网址:http://ip (服务器的ip)

效果:

S (服务端)

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
#如果没有配置仓库,需要进行以下命令
#[root@localhost yum.repos.d]mount  /dev/sr0    /mnt
#[root@localhost yum.repos.d]rm -rf /etc/yum.repos.d/*
#[root@localhost yum.repos.d]vim  /etc/yum.repos.d/base.repo
#[BaseOS]
#name=BaseOS
#baseurl=file:///mnt/BaseOS
#gpgcheck=0
#[AppStream]
#name=AppStream
#baseurl=file:///mnt/AppStream
#gpgcheck=0
[root@localhost ~]# yum install httpd -y
[root@localhost ~]# systemctl start httpd

#cd /var/www/html

#echo helloworld > index.html

[root@localhost ~]# cd /etc/httpd/
[root@localhost httpd]# ll
total 4
drwxr-xr-x. 2 root root 37 Apr 4 21:10 conf –主配置目录
drwxr-xr-x. 2 root root 82 Apr 4 21:10 conf.d –辅助配置目录
drwxr-xr-x. 2 root root 4096 Apr 4 21:10 conf.modules.d –模块配置目录
lrwxrwxrwx. 1 root root 19 Jul 22 2022 logs -> …/…/var/log/httpd –程序的日志目录
lrwxrwxrwx. 1 root root 29 Jul 22 2022 modules -> …/…/usr/lib64/httpd/modules --模块所加载的库文件
lrwxrwxrwx. 1 root root 10 Jul 22 2022 run -> /run/httpd --对应程序(http)相关的进程文件
lrwxrwxrwx. 1 root root 19 Jul 22 2022 state -> …/…/var/lib/httpd --状态信息

http主配置文件:/etc/httpd/conf/httpd.conf

服务器端:在linux上面实现网页服务器需要Apache这套服务器软件,httpd提供Apache主程序 http://httpd.apache.org/docs/2.4/

[root@xixi ~]# systemctl stop firewalld
[root@xixi ~]# setenforce 0
[root@localhost ~]# yum install httpd -y
[root@localhost ~]# rpm -ql httpd
[root@localhost httpd]# tree /etc/httpd
/etc/httpd
├── conf
│ ├── httpd.conf
│ └── magic
├── conf.d
│ ├── autoindex.conf
│ ├── README
│ ├── userdir.conf
│ └── welcome.conf
├── conf.modules.d
│ ├── 00-base.conf
│ ├── 00-dav.conf
│ ├── 00-lua.conf
│ ├── 00-mpm.conf
│ ├── 00-proxy.conf
│ ├── 00-systemd.conf
│ └── 01-cgi.conf
├── logs -> ../../var/log/httpd
├── modules -> ../../usr/lib64/httpd/modules
└── run -> /run/httpd
配置文件:
1. 主要的配置文件 /etc/httpd/conf/httpd.conf 。
2. 额外的参数文件 /etc/httpd/conf.d/*.conf 。
如果你不想要修改原始配置文件httpd.conf的话,那么你可以将你自己的额外参数文件独立出来,例如你想要有自己的额外设置值,可以将它写入 /etc/httpd/conf.d/zhuji.conf (注意,扩展名一定是.conf),而启动Apache时,这个文件就会被读入主要配置文件当中了。
3. 默认的首页所在目录 /var/www/html/ ,当输入网址时所显示的数据,就是放在这个目录当中的首页文件(默认为index.html)。
4. 默认给一些可执行的CGI(网页程序)程序放置的目录 /var/www/cgi-bin/ ,当输入网址/cgi-bin/时所显示的数据所在。
5. 默认的Apache日志文件都放在 /var/log/httpd/ ,对于流量比较大的网站来说,一个星期的日志文件的数据可以达到1GB左右。
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
31 ServerRoot "/etc/httpd" #http服务的顶级目录为/etc/httpd
42 Listen 80 #监听在80端口,80为web服务器的默认端口
66 User apache #服务的用户(ps -ef | grep httpd,先以root用户把/usr/sbin/httpd服务启动起来)。启动服务后转换的身份,在启动服务时通常以root身份,然后转换身份,这样增加系统安全 
67 Group apache
95 #ServerName www.example.com:80 ServerName 0.0.0.0:80匹配任意IP地址,监听端口在80端口
注:默认是不需要指定的,服务器通过名字解析过程来获得自己的名字,但如果解析有问题(如反向解析不正确),或者没有DNS名字,也可以在这里指定ip地址,当这项不正确的时候服务器不能正常启动。解决办法就是启动该项把www.example.com:80修改为自己的域名或者直接修改为localhost
102 <Directory /> #目录为根,<>为起始标志,</>为结束标志,里面的配置是局部生效的
103 AllowOverride none #不允许覆盖
104 Require all denied #请求所有拒绝,允许是gtanted
105 </Directory> #和<Directory />是一组标签,目录控制容器
119 DocumentRoot "/var/www/html" #文本主目录网页文件的路径
163 <IfModule dir_module> #加载一个目录模块
164 DirectoryIndex index.html
165 </IfModule>

默认查找网页文件路径是/var/www/html/index.html如果文件存在查看给文件内容,如果不存在查找的是/var/www/html/.noindex.html (redhat测试界面)

<Directory /usr/share/httpd/noindex>
AllowOverride None
Require all granted

#DocumentRoot “/var/www/html”
Alias /.noindex.html /usr/share/httpd/noindex/index.html

案例二

创建一个自定义界面,显示helloworld

[root@localhost ~]# vim /var/www/html/index.html
helloworld

效果:
在这里插入图片描述

[root@localhost ~]#systemctl disable firewalld --now
[root@localhost ~]# systemctl restart httpd
[root@localhost ~]# systemctl status httpd | less
Aug 31 03:35:09 localhost.localdomain httpd[7374]: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
#httpd:无法使用localhost.localdomain可靠地确定服务器的完全限定域名。 全局设置“ServerName”指令以禁止显示此消息
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
servername 0.0.0.0:80
[root@localhost ~]# systemctl restart httpd
#测试可以使用curl命令访问web服务器或者使用浏览器访问

虚拟主机配置实战

搭建静态网站——基于http协议的静态网站

实验1:搭建一个web服务器,访问该服务器时显示“hello world”欢迎界面 。

[root@localhost ~]# echo hello world > /var/www/html/index.html
[root@localhost ~]# curl 192.168.126.140
hello world

实验2:建立两个基于ip地址访问的网站,要求如下

  • 该网站ip地址的主机位为100,设置DocumentRoot为/www/ip/100,网页内容为:this is 100。
  • 该网站ip地址主机位为200,设置DocumentRoot为/www/ip/200,网页内容为:this is 200。

步骤

(1)当前主机添加多个地址

给当前网卡添加多个ip地址,进入图形界面

[root@localhost ~]# nmtui
在这里插入图片描述
做出以下配置,移向OK回车
在这里插入图片描述

#激活网卡操作
[root@localhost ~]# nmcli connection up ens160
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/6)
[root@localhost ~]# 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: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:17:61:72 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    inet 192.168.126.140/24 brd 192.168.126.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet 192.168.126.100/24 brd 192.168.126.255 scope global secondary noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet 192.168.126.200/24 brd 192.168.126.255 scope global secondary noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe17:6172/64 scope link tentative noprefixroute 
       valid_lft forever preferred_lft forever

地址生效

(2)配置文件虚拟主机标签(通过不同虚拟主机提供不同的网站界面)

[root@localhost ~]# vim /etc/httpd/conf.d/vhosts.conf
<virtualhost 192.168.126.140:80>
        documentroot /www/140
        servername 192.168.126.140
</virtualhost>
<virtualhost 192.168.126.100:80>
        documentroot /www/100
        servername 192.168.126.100
</virtualhost>
<virtualhost 192.168.126.200:80>
        documentroot /www/200
        servername 192.168.126.200
</virtualhost>
<directory /www>
  allowoverride none
  require all granted
</directory>

(3)根据配置创建资源文件

[root@localhost ~]# mkdir /www/{100,200,140} -pv
mkdir: created directory '/www'
mkdir: created directory '/www/100'
mkdir: created directory '/www/200'
mkdir: created directory '/www/140'
[root@localhost ~]# echo this is 100 > /www/100/index.html
[root@localhost ~]# echo this is 200 > /www/200/index.html
[root@localhost ~]# echo this is 140 > /www/140/index.html

[root@localhost ~]# systemctl restart httpd

在这里插入图片描述

实验3:建立两个基于不同端口访问的网站,要求如下:

  • 建立一个使用web服务器默认端口的网站,设置DocumentRoo为/www/80,网页内容为:the is 80。
  • 建立一个使用8909端口的网站,设置DocumentRoot为/www/8909,网页内容为:the is 8909。
[root@localhost ~]# vim /etc/httpd/conf.d/vhosts.conf
#########################################################
#多端口提供多网站配置
#默认没有监听8909端口,需要手动配置
Listen 8909
<virtualhost 192.168.126.140:80>
        documentroot /www/140
        servername 192.168.126.140
</virtualhost>
<virtualhost 192.168.126.140:8909>
        documentroot /www/8909
        servername 192.168.126.140
</virtualhost>
[root@localhost ~]# mkdir /www/8909
[root@localhost ~]# echo this is 8909 > /www/8909/index.html
[root@localhost ~]# systemctl restart httpd
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# curl http://192.168.126.140:80
this is 140
[root@localhost ~]# curl http://192.168.126.140:8909
this is 8909

通过curl(web测试工具)命令来连接到web界面,不同于实验二

实验4:建立两个基于域名访问的网站,要求如下:

  • 新建一个网站,域名为www.haha.com,设置DocumentRoot为/www/haha,网页内容为this is haha。
  • 新建一个网站,域名为www.xixi.com,设置DocumentRoot为/www/xixi,网页内容为this is xixi。

基于域名的网站,需要用到域名解析。 域名------->ip地址
浏览器如何通过域名去查询URL对应的IP(对应服务器地址):
1、浏览器缓存:浏览器会按照一定的频率缓存DNS记录。
2、操作系统缓存:如果浏览器缓存中找不到需要的DNS记录,那就去操作系统中的hosts文件找。hosts是一个没有扩展名的系统文件,其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联"数据库",当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应网页,如果没有找到,则系统会再将网址提交DNS域名解析服务器进行IP地址的解析。
windows下的hosts文件路径:C:\Windows\System32\drivers\etc\hosts
Linux下的hosts文件路径:/etc/hosts
3、路由缓存:路由器也有DNS缓存。
4、ISP的DNS服务器:ISP是互联网服务提供商(Internet Service Provider)的简称,ISP有专门的DNS服务器应对DNS查询请求。
5、根服务器:ISP的DNS服务器还找不到的话,它就会向根服务器发出请求,进行递归查询(DNS服务器先问根域名服务器.com域名服务器的IP地址,然后再问.com域名服务器,依次类推)

找到Linux下的hosts文件路径,给ip地址添加两个域名

[root@localhost ~]# vim /etc/127.0.0.1   
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.126.140  www.haha.com  www.xixi.com 
[root@localhost ~]# vim /etc/httpd/conf.d/vhosts.conf
#多域名配置
<virtualhost 192.168.126.140:80>
        documentroot /www/haha
        servername www.haha.com
</virtualhost>
<virtualhost 192.168.126.140:80>
        documentroot /www/xixi
        servername www.xixi.com
</virtualhost
[root@localhost ~]# mkdir /www/{haha,xixi} -pv
mkdir: created directory '/www/haha'
mkdir: created directory '/www/xixi'
[root@localhost ~]# echo this is haha > /www/haha/index.html
[root@localhost ~]# echo this is xixi > /www/xixi/index.html
[root@localhost ~]# systemctl restart httpd
[root@localhost ~]# curl http://www.haha.com
this is haha
[root@localhost ~]# curl http://www.xixi.com
this is xixi

实验5:基于虚拟目录和用户控制的web网站

虚拟目录 — 灵活管理资源界面文件

案例使用r66

[root@localhost ~]# cd /www/r66/
[root@localhost xixi]# ll
[root@localhost r66]# ll
total 4
-rw-r--r--. 1 root root 12 Apr 14 11:37 index.html
[root@localhost r66]# echo this 1 page > 1.html
[root@localhost r66]# mkdir test
[root@localhost r66]# echo this 2 page > test/2.html
[root@localhost r66]# tree
.
├── 1.html
├── index.html
└── test
    └── 2.html

1 directory, 3 files
[root@localhost r66]# curl http://www.r66.com
this is r66
[root@localhost r66]# curl http://www.r66.com/1.html
this 1 page
[root@localhost r66]# curl http://www.r66.com/test/2.html
this 2 page
[root@localhost r66]# mkdir /pub
[root@localhost r66]# echo this 3 page > /pub/3.html
[root@localhost r66]# vim /etc/httpd/conf.d/vhosts.conf 
<virtualhost 192.168.126.100:80>
        documentroot /www/100
        servername 192.168.126.100
</virtualhost>
<virtualhost 192.168.126.200:80>
        documentroot /www/200
        servername 192.168.126.200
</virtualhost>
<directory /www>
        Allowoverride none
        Require all granted
</directory>
<virtualhost 192.168.126.140:80>
        documentroot /www/r66
        servername www.r66.com
        alias /3   /pub/3.html
</virtualhost>
# alias后第一个斜杠代表网站根目录(documentroot这个目录),后面一个斜杠代表系统根目录(/)
<Directory /pub>
        AllowOverride none
        Require all granted
</Directory>
[root@localhost r66]# systemctl restart httpd
[root@localhost r66]# curl http://www.r66.com/3
this 3 page

用户控制

htpasswd命令是Apache的Web服务器内置工具,用于创建和更新储存用户名、域和用户基本认证的密码文件。

htpasswd 参数 用户和密码

常用参数

-c 创建一个加密文件
-n 不更新加密文件,只将加密后的用户名密码显示在屏幕上
-m 默认采用MD5算法对密码进行加密
-d 采用CRYPT算法对密码进行加密
-p 不对密码进行进行加密,即明文密码
-s 采用SHA算法对密码进行加密
-b 在命令行中一并输入用户名和密码而不是根据提示输入密码
-D 删除指定的用户

r66的虚拟目录(/pub)设置只允许zhangsan用户访问

[root@localhost ~]# htpasswd -c /etc/httpd/users zhangsan
输入密码
[root@localhost ~]# htpasswd /etc/httpd/users lisi
输入密码
[root@localhost ~]# mkdir /etc/httpd/users
[root@localhost ~]# vim /etc/httpd/conf.d/vhosts.conf
<virtualhost 192.168.126.140:80>
        servername 192.168.126.140
        documentroot /www/r66
        alias /3   /pub/3.html
</virtualhost>
<Directory /pub>
        AuthType Basic
        AuthName "Login......"
        AuthUserFile /etc/httpd/users
        Require user zhangsan
</Directory>
[root@localhost ~]# systemctl restart httpd
[root@localhost ~]#curl 192.168.126.140/3  -u zhangsan:123

在这里插入图片描述在这里插入图片描述

对目前服务运行的状态以及状态的日志显示

systemctl status httpd.service

journalctl -xeu httpd.service

web程序提供的管理命令:httpd -t 检测语法

搭建静态网站——基于https协议的静态网站

(1)https简介

超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer 或 Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的HTTP通道。HTTPS并不是一个新协议,而是HTTP+SSL(TLS)。原本HTTP先和TCP(假定传输层是TCP协议)直接通信,而加了SSL后,就变成HTTP先和SSL通信,再由SSL和TCP通信,相当于SSL被嵌在了HTTP和TCP之间。
在这里插入图片描述
SSL 是“Secure Sockets Layer”的缩写,中文叫做“安全套接层”。它是在上世纪90年代中期,由网景公司设计的。到了1999年,SSL 应用广泛,已经成为互联网上的事实标准。IETF 就把SSL 标准化。标准化之后SSL被改为 TLS(Transport Layer Security传输层安全协议)。

SSL协议分为两层:

  • SSL记录协议 (SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能。
  • SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。

SSL协议提供的服务:
1)认证用户和服务器,确保数据发送到正确的客户机和服务器
2)加密数据以防止数据中途被窃取
3)维护数据的完整性,确保数据在传输过程中不被改变

(2)https协议加密所使用的算法

HASH是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。Hash算法特别的地方在于它是一种单向算法,用户可以通过hash算法对目标信息生成一段特定长度的唯一hash值,却不能通过这个hash值重新获得目标信息。因此Hash算法常用在不可还原的密码存储、信息完整性校验等。
常见的HASH算法:MD2、MD4、MD5、HAVAL、SHA、SHA-1、HMAC、HMAC-MD5、HMACSHA1。
共享密钥加密(对称密钥加密):加密和解密使用相同密钥。
对称加密算法:DES、3DES、DESX、Blowfish、IDEA、RC4、RC5、RC6和AES。
公开密钥加密(非对称密钥加密):公开密钥加密使用一对非对称的密钥。一把叫做私有密钥,一把叫做公开密钥。私有密钥不能让其他任何人知道,而公开密钥则可以随意发布,任何人都可以获得。使用此加密方式,发送密文的一方使用公开密钥进行加密处理,对方收到被加密的信息后,再使用自己的私有密钥进行解密。利用这种方式,不需要发送用来解密的私有密钥,也不必担心密钥被攻击者窃听盗走。
常见的非对称加密算法:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)。
但由于公开密钥比共享密钥要慢,所以我们就需要综合一下他们两者的优缺点,使他们共同使用,而这也是HTTPS采用的加密方式。在交换密钥阶段使用公开密钥加密方式,之后建立通信交换报文阶段则使用共享密钥加密方式。
如何证明公开密钥本身是货真价实的公开密钥?如,正准备和某台服务器建立公开密钥加密方式下的通信时,如何证明收到的公开密钥就是原本预想的那台服务器发行的公开密钥。或许在公开密钥传输过程中,真正的公开密钥已经被攻击者替换掉了。这个时候就需要第三方公证单位来帮忙啦。

对称加密
我的理解是: 首先我们需要协商使用什么算法(AES), 接着我们通过相同的密钥对数据进行加密即可实现:明文 + 密钥 ==> 密文 密文 + 密钥 ==> 明文。由此我们可以看出, 都使用相同的密钥,一旦密钥泄露, 那么数据相当于公开。 优点: 效率高。 改进:能不能提前把密钥加密,只能由服务端才能解密。

非对称加密
是网络通信的基石, 保证了非对称加密 密钥的安全。 首先, 非对称加密需要 私钥 和 公钥, 公钥加密的数据只能由私钥解开, 而私钥加密的数据只能由公钥解开。 公钥存储在客服端, 私钥存储在服务端, 永远不对外暴漏。
流程:首先客服端请求公钥, 服务端响应公钥, 之后客服端通过公钥加密数据传输, 服务端通过私钥解密获取信息。
存在的安全隐患: 我们的公钥是直接进行传输的, 那么黑客就可以得到我们的公钥从而获取信息。

非对称加密 + 对称加密

客服端请求公钥响应后, 客服端通过公钥可以加密一串随机数,作为以后信息传输对称加密的密钥, 而这串随机数也只能由服务端的私钥才能解析。

服务端通过私钥解析后, 通过对称加密对数据进行加密。
问题: 假如在客服端请求公钥的时候, 就被黑客拦截, 充当了服务器, 给了黑客的公钥给客服端, 此问题产生的主要原因是: 报文可能被篡改, 客服端完全相信服务端!

数字签名 解决报文被篡改
(1). 能确定消息确实是由发送方签名并发出来的,因为别人假冒不了发送方的签名。
(2). 数字签名能确定消息的完整性 , 证明数据是否未被篡改过。
发送者将数据先于hash算法生成信息摘要, 然后用私钥加密生成数字签名, 一起发送给接收方。
接收方只有用发送者的公钥才能解密被加密的数据, 然后通过hash对原文参数一个摘要信息, 进行比对, 即可确认报文是否被篡改。
问题: 我们的公钥在网络中传输还是不安全的

证书 ( 解决服务端身份问题)
有专门的机构进行颁发, 而证书中包含了你的公钥, 同时包含数字签名
此后我们请求公钥改为请求证书, 如何保证不会得到一个假证书了! 我们CA机构在已把证书嵌套在了浏览器以及操作系统, 所以证书都不用经过网络自然不会出现假的。

1、请求连接tcp三次握手 确认版本

2、密钥套件的协商,开始身份认证(非对称算法)证书认证 协商对称算法

3、建立ssl会话连接

4、加密会话交互

5、断开会话链接

TLS完整的通信流程

第一阶段:客户端端申请建立https连接

1.浏览器向服务器发送一个clientHello的报文

客户端产生一个随机数Random(ClientRandom)
会话ID:第一次肯定为空
Cipher suite: 加密套件(秘钥交换,完整性校验算法,对称机密算法 ,算法列表)

第二阶:段服务器相应确认加密版本以及提供证书

2.服务端向客户端回复一个ServerHello(确认使用的TLS的版本,以及加密套件)

Random随机数:服务产生的(ServerRandom)

SessionID: 0

Cipher suite:确认使用加密套件

Compression method: null 不压缩

Extension: 扩展字段

3.服务器向客户端发送Certificate (服务器的身份证,证书由第三方权威机构颁发)

4.服务器向客户端发送serverkey Exchange(通过和客户端协商的密码算法套件发送Pubkey结合HD算法生成Premastersecret(最终加密的会话秘钥))

5.certificate Request 可选报文(认证可以是单向也可以是双向,一般都是单向客户端验证服务端身份,服务端验证客户端客户端也需要发送证书)

6.ServerHello Done 服务端发送握手信息完毕

第三阶段:客户端验证证书取出公钥,用公钥加密生成的对称秘钥发送个服务器开通知改变加密信息传递

7.客户端回复服务器报文Certificate如果有第五阶段则提交客户端的证书进行认证

8.ClientKey Exchange 秘钥交换信息和步骤4类似

9.ChangeCiper Spec: 通知消息(消息改变通知,及后面消息要进行加密了)

10.Encrypted Handshake Messges 校验数据包的完整性MD5(hash)将数据包的值进行散列最后和服务端的散列值进行比较一致意味着沟通过程中没有第三者的介入

第四阶段:服务收到消息,用私钥解密取,确认对称秘钥通知客户端ssl通道建立完成

11.服务器向客户端回包:NewSession Ticket(建立会话票据,提供会话票据)

12.change cipher Spec: 改变密码通知加密发送信息

13.encrypted Handshake message (Finished)

第五阶段:客户端和服务端可以通过加密通道开始数据通信

Application Data(http)客户端和服务端可以通过加密通道开始数据通信

第六阶段:客户端断开连接

Encrypted Alert

秘钥交换的大概过程:
ClientHello客户端产生一个随机数C,Serverhello服务端产生一个随机数S--公开, 还需要一个随机数(加密)
serverhello过程中发送serverkeyexchange发送公钥pubkey给客户端
客户端通过clientkeychange发送通过pubkey加密的随机数Pre_master
服务端对客户端的发送的加密Pre_master进行解密
最终客户端和服务端各自掌握了三个随机数利用复杂的交换算法进行计算协商出彼此的对称秘钥
注:
TLS1.3 提供 1-RTT 的握手机制,还是以 ECDHE 密钥交换过程为例,握手过程如下。将客户端发送 ECDH 临时公钥的过程提前到 ClientHello ,同时删除了 ChangeCipherSpec 协议简化握手过程,使第一次握手时只需要1-RTT,来看具体的流程:
	• 客户端发送 ClientHello 消息,该消息主要包括客户端支持的协议版本、DH密钥交换参数列表KeyShare;
	• 服务端回复 ServerHello,包含选定的加密套件;发送证书给客户端;使用证书对应的私钥对握手消息签名,将结果发送给客户端;选用客户端提供的参数生成 ECDH 临时公钥,结合选定的 DH 参数计算出用于加密 HTTP 消息的共享密钥;服务端生成的临时公钥通过 KeyShare 消息发送给客户端;
	• 客户端接收到 KeyShare 消息后,使用证书公钥进行签名验证,获取服务器端的 ECDH 临时公钥,生成会话所需要的共享密钥;
	• 双方使用生成的共享密钥对消息加密传输,保证消息安全。

(4)https网站配置

https 加密网站搭建
(1)安装mod_ssl

mod_ssl是一种以openssl 的工具箱为基础专门为apache webserver 提供密码保护的软件

[root@localhost ~]# yum install mod_ssl -y

安装好这个验证模块之后在web的子配置目录下多了一个ssl配置文件,确保启动web服务直接加载该模块
在这里插入图片描述
(2)虚拟主机标签开启加密验证,标记证书文件的位置和私钥文件的位置

key是私钥文件
crt是由证书颁发机构(CA)签名后的证书,或者是开发者自签名的证书,包含证书持有人的信息,持有人的公钥,以及签署者的签名等信息

[root@localhost ~]# vim /etc/httpd/conf.d/vhosts.conf
<VirtualHost  192.168.126.100:443>
        DocumentRoot    /www/private
        ServerName      192.168.126.100
        #服务器启用SSL/TLS引擎
        SSLEngine on
        #定义证书文件的位置
        SSLCertificateFile /etc/pki/tls/certs/openlab.crt
        #定义私钥文件的位置
        SSLCertificateKeyFile /etc/pki/tls/private/openlab.key
</VirtualHost>

建议用第二种和第三种

(第一种 – 用户RHEL7)

[root@www certs]# openssl req -utf8 -new -key jiami.key -x509 -days 100 -out jiami.crt

[root@localhost certs]# make jiami.crt

(第二种)

#openssl req -newkey rsa:4096 -keyout haha.key -x509 -days 365 -out haha.crt

(第三种)

[root@www certs]# openssl genrsa -aes128 2048 > openlab.key

#openssl req -utf8 -new -key openlab.key -x509 -days 365 -out openlab.crt

(3)创建对应的资源文件

[root@localhost ~]# mkdir /www/private
[root@localhost ~]# echo this is https > /www/private/index.html

(4)自签名证书(公钥)

[root@localhost ~]# openssl req -newkey rsa:4096 -keyout /etc/pki/tls/private/openlab.key -x509 -days 365 -out /etc/pki/tls/certs/openlab.crt
#接下来需要输入一个私钥密码,这个密码只要要是四个字符,否则会报错,后面需要输入一些证书信息
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:

Country Name (2 letter code) [XX]:86
State or Province Name (full name) []:guangxi
Locality Name (eg, city) [Default City]:guilin
Organization Name (eg, company) [Default Company Ltd]:openlab
Organizational Unit Name (eg, section) []:ce
Common Name (eg, your name or your server's hostname) []:localhost       
Email Address []:admin@admin.com

(5)重启服务进行测试

#重启服务前要关闭防火墙等操作
[root@localhost ~]# systemctl restart httpd
?? Enter TLS private key passphrase for 192.168.126.100:443 (RSA) : ****    
#这里需要输入上一步设置的私钥密码

测试:

方法一:
在这里插入图片描述
方法二:

[root@localhost ~]# curl -k https://192.168.126.100
this is https

cockpit – 图像化服务管理工具

Cockpit 是红帽开发的网页版图像化服务管理工具,优点是无需中间层,且可以管理多种服务。

1、安装httpd

2、安装cockpit(RHEL9 默认已安装)

3、启动httpd cockpit服务

4、浏览器进入
在这里插入图片描述

搭建动态网站

LAMP LNMP= linux + Apache/nginx + Mysql/mariadb + PHP

动态网站并不是指具有动画功能的网站,而是指网站内容可根据不同情况动态变更的网站,一般情况下动态网站通过数据库进行架构。 动态网站除了要设计网页外,还要通过数据库和编程序来使网站具有更多自动的和高级的功能。
动态网页:使用网页脚本语言,比如php、JSP等,通过脚本将网站内容动态存储到数据库,用户访问网站是通过读取数据库来动态生成网页的方法。

[root@localhost ~]# yum install php -y
[root@localhost ~]# rm -rf /www/200/index.html
[root@localhost ~]# vim /www/200/index.php
<?php phpinfo(); ?>
#浏览器访问