一、web服务器简介
1、什么是www
- www 是 world wide web 的缩写,也就是全球信息广播的意思。通常说的上网就是使用 www 来查询用户所需要的信息。 www 可以结合文字、图形、影像以及声音等多媒体,并通过可以让鼠标单击超链接的方式将信息以 Internet 传递到世界各处去。
- 与其他服务器类似,当你连接上 www 网站,该网站肯定会提供一些数据,而你的客户端则必须要使用可以解析这些数据的软件来处理,那就是浏览器。 www 服务器与客户端浏览器之间的连接图。
-
www所用的协议: 浏览器怎样向web服务器请求数据以及服务器怎样把文档传送给浏览器呢?这就是由http协议来定义的,(Hyper Text Transport Protocol,HTTP,超文本传输协议)。
-
www服务器需要提供可让客户端浏览的平台。目前最主流的Web服务器是Apache、Microsoft的Internet信息服务器(Internet Information Services,IIS)和unix nginx。
-
服务器所提供的最主要数据是超文本标记语言(Hyper Text Markup Language,HTML)、多媒体文件(图片、影像、声音、文字等,都属于多媒体或称为超媒体),HTML只是一些纯文本数据,通过所谓的标记来规范所要显示的数据格式。
-
客户端收到服务器的数据之后需要软件解析服务器所提供的数据,最后将效果呈现在用户的屏幕上。那么著名的浏览器就有内建在Windows操作系统内的IE浏览器了,还有Firefox浏览器和Google的chrome浏览器。
2.网址及HTTP简介
web 服务器提供的这些数据大部分都是文件,那么我们需要在服务器端先将数据文件写好,并且放置在某个特殊的目录下面,这个目录就是我们整个网站的首页,在nginx 中,这个目录默认在 /usr/share/nginx/html/ 。浏览器是通过你在地址栏中输入你所需要的网址来取得这个目录的数据
的。
- URL:Uniform Resource Locator,统一资源定位符,对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。
- 网址格式:<协议>://<主机或主机名>[:port]/<目录资源,路径>
- 浏览器常支持的协议有:http、https、ftp等。
- 主机地址或者主机名:主机地址就是服务器在因特网所在的IP地址。如果是主机名的话,那么就需要域名解析了。
- 端口号(port):http为80,https为443 (IANA:互联网数字分配机构)
- 0-1023:众所周知,永久地分配给固定的应用程序使用,特权端口(只有管理员有权限
启用并让进程监听) - 024-41951:亦为注册端口,但要求不是特别严格,分配给程序注册为某应用使用:
3306/TCP - 41952-60000:客户端程序随机使用的端口,动态端口,或私有端口
-
http 请求方法:在 http 通信中,每个 http 请求报文都包含一个方法,用以告诉 web 服务器端需要执 行哪些具体的动作,这些动作包括:获取指定web 页面、提交内容到服务器、删除服务器上资源文件等
- http 响应报文由起始行、响应头部、空行和响应报文主体这几个部分组成
MIME ( Multipurpose Internet Mail Extension ,多用途因特网邮件扩展)最初是为了解决在不同的电子邮件系统之间搬移报文时存在的问题。后来 http 也支持了这个功能,用它来描述数据并标记不同的数据内容类型。
当 web 服务器响应 http 请求时,会为每一个 http 对象数据加一个 MIME 类型。当 web 浏览器获取到服务器返回的对象时,会去查看相关的 MIME 类型,并进行相应的处理。
MIME 类型存在于 HTTP 响应报文的响应头部信息里,它是一种文本标记,表示一种主要的对象类型和一个特定的子类型。常见的MIME 类型:
3.http协议请求的工作流
终端客户在web浏览器地址栏输入访问地址http://www.ceshi.com:80/index.html
web浏览器请求DNS服务器把域名www.ceshi.com解析成web服务器的IP地址
web浏览器将端口号(默认是80)从访问地址(URL)中解析出来
web浏览器通过解析后的ip地址及端口号与web服务器之间建立一条TCP连接
建立TCP连接后,web浏览器向web服务器发送一条HTTP请求报文
web服务器响应并读取浏览器的请求信息,然后返回一条HTTP响应报文。
web服务器关闭HTTP连接,关闭TCP连接,web浏览器显示访问的网站内容到屏幕上。
二、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是一种“程序语言”,这种程序语言可以直接在网页当中编写,不需要经过编译即可执行。
三、web服务器基本配置
服务器端:此处使用 nginx 提供 web 服务, RPM 包获取: http://nginx.org/packages/
[root@localhost ~]# dnf install nginx -y
[root@localhost ~]# nginx -v
[root@localhost ~]# nginx -V
[root@localhost ~]# rpm -ql nginx
[root@localhost httpd]# tree /etc/nginx
[root@localhost ~]# 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
[root@localhost ~]# tree /usr/share/nginx/html/ #默认的nginx网站根目录
[root@localhost ~]# tree /var/log/nginx/ #nginx的日志文件所在目录
#nginx服务主配置文件nginx.conf的结构
[root@localhost nginx]# grep ^[^#] /etc/nginx/nginx.conf
=========全局配置(无{}标志)=======================
user nginx; #进程所属用户
worker_processes auto; #worker数量
error_log /var/log/nginx/error.log; #错误日志存放路径
pid /run/nginx.pid; #pid文件路径
include /usr/share/nginx/modules/*.conf; #include导入的功能模块配置文件
=========全局配置(无{}标志)=======================
==========性能配置(有{}标志)=================
events {
worker_connections 1024; #TCP连接数
}
==========性能配置(有{}标志)=================
=========http模块配置(有{}标志)==================
http { #http区块开始
log_format main '$remote_addr - $remote_user [$time_local] "$request"
'
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'; #错误日
志格式
access_log /var/log/nginx/access.log main; #访问日志路径
sendfile on; #开启高效文件传输模式
tcp_nopush on; #性能优化参数
tcp_nodelay on; #性能优化参数
keepalive_timeout 65; #持久连接时间或超时时间
types_hash_max_size 4096; #性能优化参数
include /etc/nginx/mime.types; #可解析的静态资源类型
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf; #子配置文件存放路径
server { #server区块开始
listen 80; #监听端口
listen [::]:80;
server_name _; #服务器的名字
root /usr/share/nginx/html; #主页存放路径
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf; #子配置文件存放路径
error_page 404 /404.html; #404错误返回的页面
location = /40x.html { #使用location定义用户请求的uri
}
error_page 500 502 503 504 /50x.html; #500、502、503、504返回的页面
location = /50x.html {
}
} #server区块结束
} #http区块结束
=========http模块配置(有{}标志)==================
[root@localhost ~]#systemctl disable firewalld --now
[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforce
Permissive
[root@localhost ~]# systemctl restart nginx
#测试可以使用curl命令访问web服务器或者使用浏览器访问
[root@localhost ~]# curl -I localhost
HTTP/1.1 200 OK
Server: nginx/1.21.5
Date: Fri, 17 Nov 2023 08:40:28 GMT
Content-Type: text/html
Content-Length: 3510
Last-Modified: Mon, 23 Oct 2023 15:48:29 GMT
Connection: keep-alive
ETag: "653695cd-db6"
Accept-Ranges: bytes
四、虚拟主机配置实战
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
[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
2.搭建静态网站——基于https协议的静态网站
2.1https简介
超文本传输协议 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 之间。
2.2https协议加密所使用的算法
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 采用的加密方式。在交换密钥阶段使用公开密钥加密方式,之后建立通信交换报文阶段则使用共享密钥加密方式。
如何证明公开密钥本身是货真价实的公开密钥?如,正准备和某台服务器建立公开密钥加密方式下的通信时,如何证明收到的公开密钥就是原本预想的那台服务器发行的公开密钥。或许在公开密钥传输过程中,真正的公开密钥已经被攻击者替换掉了。这个时候就需要第三方公证单位来帮忙啦。CA 就是一个公认的公证单位,你可以自行产生一把密钥且制作出必要的证书数据并向 CA 单位注册,那么当客户端的浏览器在浏览时,该浏览器会主动向CA 单位确认该证书是否为合法注册过,如果是,那么该次连接才会建立,如果不是,浏览器会发出警告信息,告知用户应避免建立连接。所以说,如此一来WWW服务器不但有公证单位的证书,用户在建立连接时也比较有保障。
2.3浏览器访问https网站的通信过程
HTTPS 的安全通信工作流程可大致分为三个阶段:
认证服务器 :浏览器内置一个受信任的 CA 机构列表,并保存了这些 CA 机构的证书。第一阶段服务器会提供经CA 机构认证颁发的服务器证书,如果认证该服务器证书的 CA 机构,存在于浏览器的受信任 CA 机构列表中,并且服务器证书中的信息与当前正在访问的网站(域名等)一致,那么浏览器就认为服务端是可信的,并从服务器证书中取得服务器公钥,用于后续流程。否则,浏览器将提示用户,根据用户的选择,决定是否继续。当然,我们可以管理这个受信任CA 机构列表,添加我们想要信任的 CA 机构,或者移除我们不信任的CA 机构。
协商会话密钥 :客户端在认证完服务器,获得服务器的公钥之后,利用该公钥与服务器进行加密通信,协商出两个会话密钥,分别是用于加密客户端往服务端发送数据的客户端会话密钥,用于加密服务端往客户端发送数据的服务端会话密钥。在已有服务器公钥,可以加密通讯的前提下,还要协商两个对称密钥的原因,是因为非对称加密相对复杂度更高,在数据传输过程中,使用对称加密,可以节省计算资源。另外,会话密钥是随机生成,每次协商都会有不一样的结果,所以安全性也比较高。
加密通讯 :此时客户端服务器双方都有了本次通讯的会话密钥,之后传输的所有 http 数据,都通过会话密钥加密。这样网路上的其它用户,将很难窃取和篡改客户端和服务端之间传输的数据,从而保证了数据的私密性和完整性。
2.4https网站配置
#https功能由ngx_http_ssl_module模块提供
[rootlocalhost ~]# nmcli connection modify ens33 +ipv4.addresses
192.168.168.156/24
[root@localhost ~]# nmcli connection up ens33
[root@localhost ~]# mkdir -pv /www/https/
[root@localhost ~]# echo https > /www/https/index.html
[root@localhost conf.d]# cd /etc/pki/tls/certs/
#key是私钥文件
[root@localhost certs]# openssl genrsa -out https.key
#crt是由证书颁发机构(CA)签名后的证书,或者是开发者自签名的证书,包含证书持有人的信息,持
有人的公钥,以及签署者的签名等信息
[root@localhost certs]# openssl req -utf8 -new -key https.key -x509 -days
100 -out https.crt
[[root@localhost ~]# cat /etc/nginx/conf.d/test_https.conf
server {
# listen 80;
listen 192.168.168.156:443 ssl;
root /www/https;
ssl_certificate /etc/pki/tls/certs/https.crt;
ssl_certificate_key /etc/pki/tls/certs/https.key;
location / {
}
}
[root@localhost ~]# systemctl restart nginx
[root@localhost ~]# curl --insecure https://192.168.168.156
https
[root@localhost ~]# curl -k https://192.168.168.156
https
3.搭建动态网站
动态网站并不是指具有动画功能的网站,而是指网站内容可根据不同情况动态变更的网站,一般情况下动态网站通过数据库进行架构。 动态网站除了要设计网页外,还要通过数据库和编程序来使网站具有更多自动的和高级的功能。动态网页:使用网页脚本语言,比如php 、 JSP 等,通过脚本将网站内容动态存储到数据库,用户访问网站是通过读取数据库来动态生成网页的方法。
[root@localhost nginx]# nmcli connection modify ens33 +ipv4.addresses
192.168.168.157/24
[root@localhost nginx]# nmcli conection up ens33
[root@localhost ~]# dnf install php php-fpm -y
[root@localhost ~]# systemctl restart nginx php-fpm
[root@ntp-server ~]# echo "<?php phpinfo(); ?>" >
/usr/share/nginx/html/index.php
#使用浏览器访问