1 、 web 服务器简介
( 1 )什么是 www
www 是 world wide web 的缩写,也就是全球信息广播的意思。通常说的上网就是使用 www 来查询用户
所需要的信息。 www 可以结合文字、图形、影像以及声音等多媒体,并通过可以让鼠标单击超链接的方
式将信息以 Internet 传递到世界各处去。
与其他服务器类似,当你连接上 www 网站,该网站肯定会提供一些数据,而你的客户端则必须要使用可
以解析这些数据的软件来处理,那就是浏览器。 www 服务器与客户端浏览器之间的连接图。

( 2 )网址及 HTTP 简介
web 服务器提供的这些数据大部分都是文件,那么我们需要在服务器端先将数据文件写好,并且放置在
某个特殊的目录下面,这个目录就是我们整个网站的首页,在 nginx 中,这个目录默认
在 /usr/share/nginx/html/ 。浏览器是通过你在地址栏中输入你所需要的网址来取得这个目录的数据
的。
URL : Uniform Resource Locator ,统一资源定位符,对可以从互联网上得到的资源的位置和访问
方法的一种简洁的表示,是互联网上标准资源的地址。
网址格式: < 协议 >://< 主机或主机名 >[:port]/< 目录资源 , 路径 >
浏览器常支持的协议有: http 、 https 、 ftp 等。
主机地址或者主机名:主机地址就是服务器在因特网所在的 IP 地址。如果是主机名的话,那么
就需要域名解析了。
端口号( port ): http 为 80 , https 为 443 ( IANA :互联网数字分配机构)
# 创建密钥对
[root@web ~] # ssh-keygen -t rsa
ssh-keygen 生成、管理和转换认证密钥 -t 制定类型 RSA
/root/.ssh/id_rsa 私钥文件
/root/.ssh/id_rsa.pub 公钥文件
# 复制该公钥文件到服务端的该目录下
[root@web ~] # ssh-copy-id root@192.168.40.132
# 在本地服务器上登陆对端服务器
[root@web ~] # ssh root@192.168.40.132
1 、 www 所用的协议: 浏览器怎样向 web 服务器请求数据以及服务器怎样把文档传送给浏览器呢?这就是
由 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 浏览器。
4 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 请求报文由请求行、请求头部、空行和请求报文主体几个部分组成

( 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 浏览器显示访问的网站内容到屏幕上。
2 、 web 服务器的类型
( 1 )仅提供用户浏览的单向静态网页
单纯是由服务器单向提供数据给客户端, Server 不需要与 client 端有互动,所以你可以到该网站上去浏
览,但是无法进行数据的上传。
( 2 )提供用户互动接口的动态网站
这种类型的网站可以让服务器与用户互动,常见的例如留言板,博客。这种类型的网站需要通过 “ 网页程
序语言 ” 来实现与用户互动的行为。常见的例如: PHP 网页程序语言,配合数据库系统来进行数据的读、
写。当你在向服务器请求数据时,其实是通过服务器端同一个网页程序在负责将数据读出或写入数据
库,变动的是数据库的内容,网页程序并没有任何改变。
另外一种交互式的动态网页主要是在客户端实现。服务端将可执行的程序代码( JavaScript )传送给客户 端,客户端的浏览器如果提供 JavaScript 的功能,那么该程序就可以在客户端的计算机上面工作了;另外
一种可在客户端执行的就是 flash 动画格式,在这种动画格式内还可以进行程序设计。搭建动态网站的需
求:
LAMP ( linux+Apache+MySQL+PHP )
lnmp ( linux+nginx+Mysql+php )
Apache 主要提供 www 的服务器平台
MySQL :传统的文件读取是很麻烦的,如果你只要读取该文件当中的一小部分,系统还是会将整
个文件读出来,若又有人同时读取同一个文件时,那就会造成效率与系统上的问题,所以才会有数
据库系统的推出。数据库其实是一种特殊格式的文件,这种文件要通过特殊接口(数据库软件)来
进行读写。由于这个特殊接口已经针对数据的查询、写入做过优化设计,因此很适合多人同时写入
与查询工作。
PHP : PHP 可以被用来建立动态网页, PHP 程序代码可以直接在 HTML 网页当中嵌入,就像编辑
HTML 网页一样简单。 PHP 是一种 “ 程序语言 ” ,这种程序语言可以直接在网页当中编写,不需要经
过编译即可执行。
3 、 web 服务器基本配置
服务器端:此处使用 nginx 提供 web 服务, RPM 包获取: http://nginx.org/packages/


4.1 搭建静态网站 —— 基于 http 协议的静态网站
实验 1 :搭建一个 web 服务器,访问该服务器时显示 “hello world” 欢迎界面
[root@localhost ~] # echo "hello world" > /usr/share/nginx/html/index.html
[root@localhost ~] # curl localhost
hello world
[root@localhost ~] # curl 192.168.168.153
hello world
实验 2 :建立两个基于 ip 地址访问的网站,要求如下
该网站 ip 地址的主机位为 100 ,设置首页目录为 /www/ip/100 ,网页内容为: this is 100 。
该网站 ip 地址主机位为 200 ,设置首页目录为 /www/ip/200 ,网页内容为: this is 200 。
# 添加 ip 地址
[root@localhost ~] # nmcli connection modify ens33 +ipv4.addresses
192.168.168.100/24 +ipv4.gateway 192.168.168.2 ipv4.dns 114.114.114.114
ipv4.method manual autoconnect yes
[root@localhost ~] # nmcli connection modify ens33 +ipv4.addresses
192.168.168.200/24
[root@localhost ~] # nmcli connection up ens33
# 创建两个网页文件根目录,并定义网页内容
[root@localhost ~] # mkdir -pv /www/ip/{100,200}
[root@localhost ~] # echo this is 100 > /www/ip/100/index.html
[root@localhost ~] # echo this is 200 > /www/ip/200/index.html
# 设置 selinux ,必须设置,否则无法看到网页页面内容
[root@server html] # setenforce 0
[root@server html] # getenforce
Permissive
# 定义基于不同 ip 地址来访问网站的配置文件
# 新建文件,写入如下配置
[root@localhost ~] # vim /etc/nginx/conf.d/test_ip.conf
server {
listen 192 .168.168.100:80;
root /www/ip/100;
location / {
}
}
server {
listen 192 .168.168.200:80;
root /www/ip/200;
location / {
}
}
[root@localhost ~] # systemctl restart nginx
[root@localhost ~] # curl 192.168.168.100
this is 100
[root@localhost ~] # curl 192.168.168.200
this is 200
实验 3 :建立两个基于不同端口访问的网站,要求如下:
建立一个使用 web 服务器默认端口的网站,设置网站首页目录为 /www/port/80 ,网页内容为: the
port is 80 。
建立一个使用 10000 端口的网站,设置网站首页目录为 /www/port/10000 ,网页内容为: the port
is 10000 。
[root@localhost ~] # mkdir -pv /www/port/{80,10000}
[root@localhost ~] # echo the port is 80 > /www/port/80/index.html
[root@localhost ~] # echo the port is 10000 > /www/port/10000/index.html
[root@localhost ~] # nmcli connection modify ens33 +ipv4.addresses
192.168.168.153/24
[root@localhost ~] # nmcli connection up ens33
[root@localhost ~] # cat /etc/nginx/conf.d/test_port.conf
server {
listen 192 .168.168.153:80;
root /www/port/80;
location / {
}
}
server {
listen 192 .168.168.153:10000;
root /www/port/10000;
location / {
}
}
[root@localhost ~] # systemctl restart nginx
[root@localhost ~] # curl 192.168.168.153:10000
the port is 10000
[root@localhost ~] # curl 192.168.168.153
the port is 80
实验 4 :建立两个基于域名访问的网站,要求如下:
新建一个网站,域名为 www.ceshi.com ,设置网站首页目录为 /www/name ,网页内容为 this is
test 。
新建一个网站,域名为 rhce.first.day ,同时可通过 ce.first.day 访问,设置网站首页目录
为 /www/ce, 网页内容为: today is first day of class 。
基于域名的网站,需要用到域名解析。 域名 ------->ip 地址
浏览器如何通过域名去查询 URL 对应的 IP (对应服务器地址):
1 、浏览器缓存:浏览器会按照一定的频率缓存 DNS 记录。
2 、操作系统缓存:如果浏览器缓存中找不到需要的 DNS 记录,那就去操作系统中的 hosts 文件
找。 hosts 是一个没有扩展名的系统文件,其作用就是将一些常用的网址域名与其对应的 IP 地址建
立一个关联 " 数据库 " ,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从 Hosts 文
件中寻找对应的 IP 地址,一旦找到,系统会立即打开对应网页,如果没有找到,则系统会再将网址
提交 DNS 域名解析服务器进行 IP 地址的解析。
[root@localhost conf.d] # nmcli connection modify ens33 +ipv4.addresses
192.168.168.154/24
[root@localhost conf.d] # nmcli connection up ens33
[root@localhost ~] # mkdir /www/{name,ce}
[root@localhost ~] # echo this is test > /www/name/index.html
[root@localhost ~] # echo today is first day of class > /www/ce/index.html
[root@localhost ~] # vim /etc/nginx/conf.d/test_servername.conf
server {
listen 192 .168.168.154:80;
server_name www.ceshi.com;
root /www/name;
location / {
}
}
server {
listen 192 .168.168.154:80;
server_name rhce.first.day ce.first.day;
root /www/ce;
location / {
}
}
[root@localhost ~] # vim /etc/hosts
192 .168.168.154 www.ceshi.com rhce.first.day ce.first.day
[root@localhost ~] # systemctl restart nginx
[root@localhost ~] # curl www.ceshi.com
this is test
[root@localhost ~] # curl rhce.first.day
today is first day of class
[root@localhost ~] # curl ce.first.day
today is first day of class
实验 5 :基于虚拟目录和用户控制的 web 网站
# 虚拟目录实现
[root@localhost conf.d] # nmcli connection modify ens33 +ipv4.addresses
192.168.168.155/24
[root@localhost conf.d] # nmcli connection up ens33
[root@localhost ~] # vim /etc/nginx/conf.d/test_virtualdir.conf
server {
listen 192 .168.168.155:80;
root /usr/share/nginx/html;
location /real {
alias /www/real;
}
}
[root@localhost ~] # mkdir /www/real/
[root@localhost ~] # echo real-virtual > /www/real/index.html
[root@localhost ~] # systemctl restart nginx
[root@localhost ~] # curl 192.168.168.155/real/
real-virtual
# 用户访问控制
[root@localhost ~] # vim /etc/nginx/conf.d/test_virtualdir.conf
server {
listen 192 .168.168.155:80;
root /usr/share/nginx/html;
location /real {
alias /www/real;
auth_basic on;
auth_basic_user_file /etc/nginx/conf.d/auth-password;
}
}
[root@localhost ~] # dnf install httpd-tools -y
[root@localhost ~] # htpasswd -cb /etc/nginx/conf.d/auth-password user1
123456
[root@localhost ~] # systemctl restart nginx
[root@localhost ~] # curl 192.168.168.155/real/
<html>
<head><title>401 Authorization Required</title></head>
<body>
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx/1.21.5</center>
</body>
</html>
[root@localhost ~] # curl 192.168.168.155/real/ -u user1
Enter host password for user 'user1' :
real-virtual
[root@localhost ~] # curl user1:123456@192.168.168.155/real
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.21.5</center>
</body>
</html>
[root@localhost ~] # curl user1:123456@192.168.168.155/real/
real-virtual