目录
实验1:搭建一个web服务器,访问该服务器时显示“hello world”欢迎界面 。
一、web服务器简介
1、什么是www

2、网址及HTTP简介

(4)状态代码:由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。
- 请求行:包括请求方法(如GET、POST)、请求URI和HTTP版本号。例如,
GET /index.html HTTP/1.1
。 - 请求头部:包含若干个属性,格式为“属性名: 属性值”,提供客户端环境信息、请求体的大小、客户端支持的压缩类型等。常见的请求头包括Host、User-Agent、Accept、Accept-Encoding、Content-Length等。
- 空行:请求头和请求体之间的分隔符,表示请求头的结束。
- 请求体:在某些类型的HTTP
- 起始行:包含协议版本、状态码和原因短语。例如,
HTTP/1.1 200 OK
。 - 响应头部:包含服务器的基本信息以及数据的描述信息,使用key-value形式。例如,
Content-Type: text/html
表示返回的内容类型为HTML。 - 空行:用于分隔响应头和响应体,表示响应头的结束。
- 响应体:实际传输的数据,可以是文本、图片、视频等二进制数据
3、http协议请求的工作过程:
-
地址解析:客户端需要通过域名系统(DNS)将URL中的域名解析为对应的IP地址。例如,访问http://www.baidu.com时,DNS服务器会将该域名解析为对应的IP地址。
-
建立TCP连接:客户端与服务器之间需要建立TCP连接。这通常涉及“三次握手”过程,确保双方能够进行可靠的数据传输。
-
发送HTTP请求:客户端通过已建立的TCP连接向服务器发送HTTP请求报文。请求报文包括请求方法(如GET、POST)、请求的URL、协议版本以及可选的头部字段和主体内容。
-
服务器处理请求:服务器接收到请求后,会根据请求的内容进行处理。这可能包括查找资源、执行程序或生成响应数据等。
-
返回HTTP响应:服务器处理完请求后,会向客户端返回HTTP响应报文。响应报文包括状态行(包含协议版本、状态码和原因短语)、响应头部字段以及可选的响应体内容。
-
浏览器解析响应:客户端(通常是Web浏览器)接收到服务器的响应后,会根据响应状态码和响应内容进行解析和展示。如果状态码表示成功(如200 OK),则展示响应体中的内容;否则,显示错误信息。
-
关闭连接:在默认情况下,HTTP是无状态且短连接的,即每个请求完成后都会关闭TCP连接。不过,为了提高效率,也可以使用Keep-Alive头来保持连接,以便后续请求复用同一连接。
二、web服务器的类型
1、仅提供用户浏览的单向静态网页
2、提供用户互动接口的动态网站
搭建动态网站的需求通常包括以下几个方面:
- 服务器环境:需要一台或多台服务器来托管网站,服务器上需要安装操作系统(如Linux、Windows Server等)和Web服务器软件(如Apache、Nginx、IIS等)。
- 数据库支持:动态网站通常需要与数据库进行交互,因此需要安装数据库管理系统(如MySQL、PostgreSQL、Oracle、SQL Server等),并配置好数据库。
- 编程语言支持:需要选择一种或多种编程语言来编写网站的后端逻辑,常见的有PHP、Python、Java、Ruby、Node.js等。
- 框架和库:为了提高开发效率和代码质量,通常会使用一些Web开发框架和库,如Django(Python)、Spring(Java)、Laravel(PHP)、Express(Node.js)等。
- 前端技术:虽然动态网站主要依赖于后端技术,但也需要一些前端技术来构建用户界面,如HTML、CSS、JavaScript以及前端框架(如React、Vue.js、Angular等)。
- 安全性需求:需要考虑网站的安全性,包括数据加密、身份验证、权限控制、防止SQL注入、跨站脚本攻击(XSS)等。
- 性能优化:需要对网站进行性能优化,以提高响应速度和并发处理能力,如使用缓存、负载均衡、CDN等技术。
- 版本控制:为了管理代码和协作开发,需要使用版本控制系统(如Git、SVN等)来管理代码库。
- 部署和发布:需要一套自动化的部署和发布流程,以便快速将新功能或修复部署到生产环境中。
- 监控和维护:需要对网站进行实时监控,及时发现和解决问题,并进行定期维护和更新。
三、web服务器基本配置
#安装nginx软件包:
[root@server ~]# yum install nginx -y
#显示nginx的版本信息:
[root@server ~]# nginx -v
#显示Nginx的详细配置信息,包括编译时使用的所有参数和模块:
[root@server ~]# nginx -V
#显示nginx的用法和选项:
[root@server ~]# nginx -help
用法:nginx [-?hvVtTq] [-s信号][-p前缀]
[-e文件名][-c文件名][-g指令]
选项:
- - - - - - ?,-h:这有帮助
-v:显示版本并退出
-V:显示版本并配置选项,然后退出
-t:测试配置并退出
-T:测试配置,转储并退出
-q:在配置测试时抑制非错误信息
-s signal:向主进程发送信号:停止,退出,重新打开,重新加载
-p prefix:设置前缀路径(默认:/usr/share/nginx/)
-e文件名:设置错误日志文件(默认:/var/log/nginx/error.log)
-c filename:设置配置文件(默认:/etc/nginx/nginx.conf)
-g directives:将全局指令从配置文件中设置出来
#列出nginx中的所有文件:
[root@server ~]# rpm -ql nginx
#以树状图显示nginx配置文件目录:
[root@server ~]# tree /etc/nginx/
/etc/nginx/
├── conf.d #子配置文件目录
├── default.d
├── fastcgi.conf
├── fastcgi.conf.default
├── fastcgi_params #用以翻译nginx的变量供php识别
├── fastcgi_params.default
├── koi-utf
├── koi-win
├── mime.types #用以配置支持的媒体文件类型
├── mime.types.default
├── nginx.conf #主配置文件
├── nginx.conf.default
├── scgi_params
├── scgi_params.default
├── uwsgi_params #用以配置nginx的变量供python识别
├── uwsgi_params.default
└── win-utf
#以树状图显示nginx默认的网站根目录(通常包含静态网页文件)
[root@server ~]# tree /usr/share/nginx/html/
#以树状图显示nginx日志目录(通常包含访问日志和错误日志)
[root@server ~]# tree /var/log/nginx
#搜索匹配nginx的主配置文件中不以#开头的行(即非注释行)
[root@server ~]# grep ^[^#] /etc/nginx/nginx.conf
#关闭防火墙并且立即生效:
[root@server ~]# systemctl disable firewalld --now
#将SELinux设置为宽容模式,并检查SELinux的状态:
[root@server ~]# setenforce 0
[root@server ~]# getenforce
Permissive
#重启nginx进程:
[root@server ~]# systemctl restart nginx
curl:这是一个命令行进行数据传输的工具,支持多种协议包括http、https、ftp等等
#获取HTTP响应的头部信息:
[root@server ~]# curl -I localhost
HTTP/1.1 200 OK #表示使用的HTTP协议版本
Server: nginx/1.20.1 #服务器软件的名称和版本。这里显示的是Nginx 1.20.1
Date: Thu, 24 Oct 2024 08:34:17 GMT
Content-Type: text/html #返回内容的MIME类型。这里表示返回的内容是HTML文档
Content-Length: 2713881 #返回内容的长度(以字节为单位)。这里表示返回的HTML文档大小为2,713,881字节。
Last-Modified: Tue, 04 Jun 2024 22:57:12 GMT
Connection: keep-alive #连接管理方式。这里表示保持连接打开
ETag: "665f9bc8-296919" #实体标签,用于缓存验证。ETag是一个唯一标识符,用于判断资源是否被修改
Accept-Ranges: bytes #指示服务器是否接受范围请求。这里表示服务器接受按字节范围请求,允许客户端请求部分内容
四、虚拟主机配置实战
1、搭建静态网站--基于http协议的静态网站
实验1:搭建一个web服务器,访问该服务器时显示“hello world”欢迎界面 。
#输出字符串"hello world"到标准输出,重定向操作符,将标准输出的内容写入到Nginx服务器的默认网页文件index.html中:
[root@server ~]# echo "hello world" > /usr/share/nginx/html/index.html
#使用curl工具向本地主机(即运行在当前机器上的Web服务器)发送HTTP请求:
[root@server ~]# curl localhost
hello world
#使用curl工具向IP地址为192.168.88.5的服务器发送HTTP请求:
[root@server ~]# curl 192.168.88.5
hello world
实验成功!!!
实验2:建立两个基于ip地址访问的网站,要求如下:
nmtui:这是NetworkManager的命令行文本用户界面(TUI)。它提供了一个基于文本的界面来管理网络连接。运行这个命令会启动一个交互式的菜单,允许您配置和管理网络连接。
nmcli:这是NetworkManager的命令行接口工具。它允许您通过命令行与NetworkManager进行交互。
#进入图形界面更改网络连接:
[root@server ~]# nmtui
#激活名为ens160的网络连接:
[root@server ~]# nmcli connection up ens160
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/3)
#显示所有网络接口的信息,包括IP地址、MAC地址等:
[root@server ~]# 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 fq_codel state UP group default qlen 1000
link/ether 00:0c:29:37:d2:d7 brd ff:ff:ff:ff:ff:ff
altname enp3s0
inet 192.168.88.5/24 brd 192.168.88.255 scope global noprefixroute ens160
valid_lft forever preferred_lft forever
inet 192.168.88.100/24 brd 192.168.88.255 scope global secondary noprefixroute ens160
valid_lft forever preferred_lft forever
inet 192.168.88.200/24 brd 192.168.88.255 scope global secondary noprefixroute ens160
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe37:d2d7/64 scope link noprefixroute
valid_lft forever preferred_lft forever
#递归创建目录,并且显示每一个被创建的目录:
[root@server ~]# mkdir -pv /www/ip/{1,2}00
mkdir: created directory '/www'
mkdir: created directory '/www/ip'
mkdir: created directory '/www/ip/100'
mkdir: created directory '/www/ip/200'
#将内容写入到指定文件中:
[root@server ~]# echo this is 100 > /www/ip/100/index.html
[root@server ~]# echo this is 200 > /www/ip/200/index.html
#更改SELinux设置:
[root@server ~]# setenforce 0
[root@server ~]# getenforce
Permissive
#编辑nginx配置文件下的ip测试文件:
[root@server ~]# vim /etc/nginx/conf.d/test_ip.conf
server {
listen 192.168.88.100:80;
root /www/ip/100;
location / {
}
}
server {
listen 192.168.88.200:80;
root /www/ip/200;
location / {
}
}
#重启nginx服务:
[root@server ~]# systemctl restart nginx
#使用curl向配置文件中写入的IP地址发送HTTP请求:
[root@server ~]# curl 192.168.88.100
this is 100
[root@server ~]# curl 192.168.88.200
this is 200
实验成功!!!
实验3:建立两个基于不同端口访问的网站,要求如下:
#递归创建目录,并且显示每一个被创建的目录:
[root@server ~]# mkdir -pv /www/port/{80,10000}
mkdir: created directory '/www/port'
mkdir: created directory '/www/port/80'
mkdir: created directory '/www/port/10000'
#创建对应的网页文件并写入内容:
[root@server ~]# echo this port is 80 > /www/port/80/index.html
[root@server ~]# echo this port is 10000 > /www/port/10000/index.html
#进入图形界面更改网络连接,并且激活网络:
[root@server ~]# nmtui
[root@server ~]# nmcli connection up ens160
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)
#编辑nginx的配置文件:
[root@server ~]# vim /etc/nginx/conf.d/test_port.conf
server {
listen 192.168.88.120:80;
root /www/port/80;
location / {
}
}
server {
listen 192.168.88.120:10000;
root /www/port/10000;
location / {
}
}
#重启nginx服务:
[root@server ~]# systemctl restart nginx
#向指定端口的IP地址进行HTTP的请求测试:
[root@server ~]# curl 192.168.88.120
this port is 80
[root@server ~]# curl 192.168.88.120:80
this port is 80
[root@server ~]# curl 192.168.88.120:10000
this port is 10000
实验成功!!!
实验4:建立两个基于域名访问的网站,要求如下:

#进入图形界面更改网络连接,并且激活网络:
[root@server ~]# nmtui
[root@server ~]# nmcli connection up ens160
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)
#以递归的方式创建文件,并且显示被创建的文件:
[root@server ~]# mkdir -pv /www/{name,ce}
mkdir: created directory '/www/name'
mkdir: created directory '/www/ce'
#向指定文件写入内容:
[root@server ~]# echo this is a test > /www/name/index.html
[root@server ~]# echo today is first day of class > /www/ce/index.html
#编辑nginx网页配置文件:
[root@server ~]# vim /etc/nginx/conf.d/test_servername.conf
server {
listen 192.168.88.130:80;
server_name www.ceshi.com; #server_name 指令用于指定该服务器块处理的域名
root /www/name;
location / {
}
}
server {
listen 192.168.88.130:80;
server_name rhce.first.day ce.first.day;
root /www/ce;
location / {
}
}
[root@server ~]# vim /etc/hosts
192.168.88.130 www.ceshi.com rhce.first.day ce.first.day
#更改SELinux状态,并且检查其状态:
[root@server ~]# setenforce 0
[root@server ~]# getenforce
Permissive
使用curl进行测试:
[root@server ~]# curl www.ceshi.com
this is a test
[root@server ~]# curl rhce.first.day
today is first day of class
[root@server ~]# curl ce.first.day
today is first day of class
测试成功!!!
实验5:基于虚拟目录和用户控制的web网站

#进入图形界面更改网络连接,并且激活网络:
[root@server ~]# nmtui
[root@server ~]# nmcli connection up ens160
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)
[root@server ~]# mkdir /www/real/
[root@server ~]# echo real_virtual > /www/real/index.html
[root@server ~]# systemctl restart nginx
[root@server ~]# vim /etc/nginx/conf.d/test_virtualdir.conf
server {
listen 192.168.88.140:80;
root /usr/share/nginx/html;
location /real { #指令用于定义如何处理特定的 URL 路径。在这个例子中,它定义了对路径 /real 的处理方式
alias /www/real; #alias 指令将指定的路径映射到另一个文件系统路径。在这个例子中,当客户端请求 /real 路径时,Nginx 会将其映射到 /www/real 目录
auth_basic on; #auth_basic 指令启用基本认证(Basic Authentication)。这意味着访问该路径需要用户名和密码。
auth_basic_user_file /etc/nginx/conf.d/auth-password; #auth_basic_user_file 指令指定存储用户名和密码的文件
}
}
#使用yum安装httpd-tools包
[root@server ~]# yum install httpd-tools -y
htpasswd:生成或更新HTTP基本认证密码文件的工具
#添加一个新用户,并且创建一个密码文件从命令行中读取密码:
[root@server ~]# htpasswd -cb /etc/nginx/conf.d/auth-password user1 123
Adding password for user user1
[root@server ~]# systemctl restart nginx
[root@server ~]# curl 192.168.88.140
hello world
[root@server ~]# curl 192.168.88.140/real/
<html>
<head><title>401 Authorization Required</title></head>
<body>
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
[root@server ~]# curl 192.168.88.140/real/ -u user1
Enter host password for user 'user1':
real_virtual
2、搭建静态网站--基于https协议的静态网站
(1)https简介

(2)https协议加密所使用的算法
公开密钥加密是一种使用一对非对称密钥的加密方式,其中一个是私有密钥(只有持有者知道),另一个是公开密钥(可以公开给任何人)。在这种方式中,发送方使用接收方的公开密钥来加密信息,而接收方则使用自己的私有密钥来解密。这种方法的优点在于不需要传输用于解密的私有密钥,从而降低了被窃取的风险。
常见的非对称加密算法包括RSA、ECC(常用于移动设备)、Diffie-Hellman、El Gamal和DSA(主要用于数字签名)。然而,由于公开密钥加密比共享密钥加密要慢,因此通常将两者结合使用。例如,HTTPS协议在交换密钥阶段使用公开密钥加密,而在之后的通信过程中使用共享密钥加密。
为了确保收到的公开密钥确实是预期服务器发布的,需要第三方公证单位的帮助。CA(证书颁发机构)就是一个公认的公证单位。用户可以自行生成密钥对并向CA注册,以获得一个证书。当客户端浏览器访问网站时,它会向CA确认该证书是否合法。如果证书合法,连接才会建立;否则,浏览器会发出警告,提示用户避免建立连接。这样一来,WWW服务器不仅拥有公证单位的证书,用户在建立连接时也更加安全。
(3)浏览器访问https网站的通信过程
- 客户端(通常是浏览器)向服务器的443端口发起请求,建立TCP连接。
[2]SSL/TLS握手:
- 客户端向服务器发送“ClientHello”消息,其中包含支持的加密算法、随机数和会话信息等。
- 服务器收到后,回复“ServerHello”消息,选择双方共同支持的加密算法、随机数和会话信息等。
- 服务器将自己的数字证书发送给客户端,证书中包含了服务器的公钥、证书颁发机构的信息等。
- 客户端验证数字证书的真实性和有效性。如果证书没有问题,客户端生成一个随机数,并使用服务器的公钥对随机数进行加密。
- 客户端将加密后的随机数发送给服务器。
- 服务器用自己的私钥解密得到随机数,然后基于这个随机数生成会话密钥。
[3]安全数据传输:
- 握手完成后,客户端和服务器之间的通信将使用会话密钥进行加密和解密。数据在传输过程中通过对称加密算法(如AES)进行加密,确保在网络上传输的数据是加密的。
- 客户端发送经过加密的HTTP请求给服务器。
- 服务器接收到请求后,用会话密钥解密数据,处理请求并生成响应。
- 服务器将响应通过会话密钥加密后发送给客户端。
[4]断开连接:HTTPS连接可以是持久连接,也可以在每次请求/响应后关闭。客户端和服务器可以选择在通信结束后终止SSL/TLS会话,释放资源。
(4)HTTPS的安全通信工作流程可大致分为三个阶段:
[1]认证服务器:
- 浏览器内置了一个受信任的CA机构列表和这些CA机构的证书。
- 服务器提供经CA机构认证的服务器证书。
- 如果该证书由受信任的CA机构颁发且信息与访问的网站一致,则浏览器认为服务器可信,并从证书中获取服务器公钥用于后续流程。否则,浏览器会提示用户决定是否继续。
- 用户可以管理受信任的CA机构列表,添加或移除信任的CA机构。
[2]协商会话密钥:
- 客户端在认证完服务器并获得服务器公钥后,利用该公钥与服务器进行加密通信,协商出两个会话密钥:一个用于加密客户端到服务器的数据,另一个用于加密服务器到客户端的数据。
- 使用对称加密(会话密钥)而非非对称加密,是因为对称加密计算资源消耗较低。
- 会话密钥是随机生成的,每次协商结果不同,安全性较高。
[3]加密通讯:
- 客户端和服务器都有了本次通讯的会话密钥,之后传输的所有HTTP数据都通过会话密钥加密。
- 这确保了数据的私密性和完整性,防止其他用户窃取或篡改传输的数据。
(5)https网站配置
#启动 NetworkManager 图形界面工具:
[root@server certs]# nmtui
[root@server certs]# nmcli connection up ens160
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/3)
#禁用并立即停止firewalld服务:
[root@server ~]# systemctl disable firewalld --now
#将SElinux模式设置为宽松:
[root@server ~]# setenforce 0
[root@server ~]# getenforce
Permissive
#创建相关的目录以及文件:
[root@server ~]# mkdir -pv /www/https/
mkdir: created directory '/www/https/'
[root@server ~]# echo https > /www/https/index.html
[root@server ~]# cd /etc/pki/tls/certs/
#生成一个私钥文件:
[root@server certs]# openssl genrsa -out https.key
#生成一个自签名证书:
[root@server certs]# openssl req -utf8 -new -key https.key -x509 -days 100 -out https.crt
#编辑nginx的配置文件:
[root@server certs]# vim /etc/nginx/conf.d/test_https.conf
server { #定义一个新的服务器块。Nginx 使用这种结构来组织和管理不同的虚拟主机(Virtual Host)
listen 192.168.88.150:443 ssl; #指定服务器监听的 IP 地址和端口。在这里,服务器监听 192.168.88.150 的 443 端口,并且启用了 SSL(HTTPS)
root /www/https; #指令设置服务器的根目录。当客户端请求一个文件时,Nginx 会从这个目录中查找文件
ssl_certificate /etc/pki/tls/certs/https.crt; #指令指定 SSL 证书文件的位置
ssl_certificate_key /etc/pki/tls/certs/https.key; #指令指定 SSL 私钥文件的位置
location / { #指令用于定义如何处理特定的 URL 路径
}
}
#重启nginx服务:
[root@server certs]# systemctl restart nginx
#命令发送一个不验证服务器证书的 HTTPS 请求,并输出响应内容:
[root@server certs]# curl --insecure https://192.168.88.150
https
#使用 curl 命令发送一个忽略服务器证书验证的 HTTPS 请求,并输出响应内容:
[root@server certs]# curl -k https://192.168.88.150
https
3、搭建动态网站:
#启动 NetworkManager 图形界面工具:
[root@server certs]# nmtui
[root@server certs]# nmcli connection up ens160
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/3)
#安装 PHP 和 PHP-FPM:
[root@server certs]# yum install php php-fpm -y
#重启 Nginx 和 PHP-FPM 服务:
[root@server ~]# systemctl restart nginx php-fpm
#创建一个包含 PHP 信息的 PHP 文件:
[root@server ~]# echo "<?php phpinfo(); ?>" >/usr/share/nginx/html/index.php
#通过 curl 命令访问服务器:
[root@server ~]# curl 192.168.88.160
在浏览器中测试:
测试成功!!!