一、web 服务器简介
-
www 简介
- www 是全球信息广播的意思,上网即使用 www 来查询信息,它结合多种多媒体,通过超链接以 Internet 传递信息。上网时,网站提供数据,客户端用浏览器解析数据。
- www 所用协议为 HTTP(超文本传输协议)。
- 主流 Web 服务器有 Apache、Microsoft 的 Internet 信息服务器(IIS)和 Unix nginx。
- 服务器提供的数据主要是 HTML 和多媒体文件,HTML 用标记规范数据格式。
- 著名浏览器有 Windows 内的 IE、Firefox 和 Google 的 chrome。
-
网址及 HTTP 简介
- URL(统一资源定位符)是互联网上标准资源的地址,包括协议、主机或主机名、端口号和目录资源。
- 浏览器常支持的协议有 http、https、ftp 等。主机地址是服务器 IP 地址或需域名解析的主机名。端口号方面,http 为 80,https 为 443。端口号分为特权端口(0 - 1023)、注册端口(1024 - 41951)和动态端口(41952 - 60000)。
- http 请求方法告诉 web 服务器执行具体动作,状态代码由三位数字组成,分为五类表示不同响应情况。
- HTTP 报文分为请求报文和响应报文。请求报文由请求行、请求头部、空行和请求报文主体组成;响应报文由起始行、响应头部、空行和响应报文主体组成。
- MIME 用于描述数据并标记不同数据内容类型,存在于 HTTP 响应报文的响应头部信息里。
-
http 协议请求的工作流程
- 终端客户在浏览器输入访问地址。
- 浏览器请求 DNS 服务器解析域名成 IP 地址。
- 浏览器解析出端口号。
- 浏览器与服务器建立 TCP 连接。
- 浏览器向服务器发送 HTTP 请求报文。
- 服务器响应并返回 HTTP 响应报文。
- 服务器关闭连接,浏览器显示网站内容。
二、web 服务器的类型
-
单向静态网页
- 服务器单向提供数据,用户只能浏览,无法上传数据。
-
提供用户互动接口的动态网站
- 可让服务器与用户互动,如留言板、博客等。实现方式有服务器端网页程序语言(如 PHP 配合数据库系统)和客户端可执行程序代码(如 JavaScript、flash 动画)。
- 搭建动态网站需求 LAMP(linux+Apache+MySQL+PHP),Apache 提供服务器平台,MySQL 是优化过读写的数据库系统,PHP 可建立动态网页且可直接在 HTML 网页中嵌入。
三、静态页面资源特征
- 处理文件类型包括.html 等多种格式。
- 地址中不含有问号或特殊符号。
- 保存在服务器文件系统上,是实体文件。
- 内容固定,易被搜索引擎收录。
- 交互性差,不能与数据库配合。
- 网页程序在客户端浏览器解析,服务器直接从磁盘文件系统返回数据。
四、动态网页资源
- URL 后缀为.asp 等形式。
- 页面交互性强,可与数据库配合。
- 地址中含有问号或特殊符号。
- 不便于被搜索引擎收录。
五、不同服务器特点
- Apache:模块化服务器,支持模块多,性能稳定,可支持多种语言,本身静态解析,可扩展支持动态页面,使用 java 需 tomcat 后台支持。
- Tomcat:应用服务器,是 servlet 容器,可独立运行或作为 Apache 的扩展。
- Nginx:轻量级服务器,高性能的 http 和反向代理服务器,同时也是 IMAP/POP3/SMTP 代理服务器,相对 Apache 占用更少内存及资源。
web服务基本配置
使用nginx提供web服务
[root@server ~]# yum 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 notice; #错误日志存放路径
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 #每次启动虚拟机时都需要做以上操作后才能开启服务器,也可以/etc/selinux/config修改 SELINUX=enforcing为SELINUX=permissive
[root@localhost ~]# systemctl restart nginx
#测试可以使用curl命令访问web服务器或者使用浏览器访问
[root@localhost ~]# curl -I localhost
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Sun, 03 Nov 2024 07:26:42 GMT
Content-Type: text/html
Content-Length: 2713881
Last-Modified: Tue, 04 Jun 2024 22:57:12 GMT
Connection: keep-alive
ETag: "665f9bc8-296919"
Accept-Ranges: bytes
虚拟主机配置实战
搭建静态网站--基于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.121.10
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.121.100/24 +ipv4.gateway 192.168.121.2 ipv4.dns 114.114.114.114
ipv4.method manual autoconnect yes
[root@localhost ~]# nmcli connection modify ens33 +ipv4.addresses
192.168.121.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.121.100:80;
root /www/ip/100;
location / {
}
}
server {
listen 192.168.121.200:80;
root /www/ip/200;
location / {
}
}
[root@localhost ~]# systemctl restart nginx
[root@localhost ~]# curl 192.168.121.100
this is 100
[root@localhost ~]# curl 192.168.121.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.121.153/24
[root@localhost ~]# nmcli connection up ens33
[root@localhost ~]# cat /etc/nginx/conf.d/test_port.conf
server {
listen 192.168.121.153:80;
root /www/port/80;
location / {
}
}
server {
listen 192.168.121.153:10000;
root /www/port/10000;
location / {
}
}
[root@localhost ~]# systemctl restart nginx
[root@localhost ~]# curl 192.168.121.153:10000
the port is 10000
[root@localhost ~]# curl 192.168.121.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。
基于域名的网站,需要用到域名解析。
浏览器如何通过域名去查询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域名服务器,依次类
推)
[root@localhost conf.d]# nmcli connection modify ens33 +ipv4.addresses
192.168.121.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.121.154:80;
server_name www.ceshi.com; #server_name 指令用于指定该服务器块处理的域名
root /www/name;
location / {
}
}
server {
listen 192.168.121.154:80;
server_name rhce.first.day ce.first.day;
root /www/ce;
location / {
}
}
[root@localhost ~]# vim /etc/hosts
192.168.121.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.121.155/24
[root@localhost conf.d]# nmcli connection up ens33
[root@localhost ~]# vim /etc/nginx/conf.d/test_virtualdir.conf
server {
listen 192.168.121.155: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 指令指定存储用户名和密码的文件
}
}
[root@localhost ~]# mkdir /www/real/
[root@localhost ~]# echo real-virtual > /www/real/index.html
[root@localhost ~]# yum install httpd-tools -y
[root@localhost ~]# htpasswd -cb /etc/nginx/conf.d/auth-password user1
123
[root@localhost ~]# systemctl restart nginx
[root@server ~]# curl 192.168.121.155/real/
<html>
<head><title>401 Authorization Required</title></head>
<body>
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx/1.26.1</center>
</body>
</html>
[root@server ~]# curl 192.168.121.155/real/ -u user1
Enter host password for user 'user1':
real-virtual
[root@server ~]# curl user1:123@192.168.121.155/real/
real-virtual
[root@server ~]#
搭建静态网站--基于https协议的静态网站
(一)https 简介
- HTTP 协议以明文方式发送内容,存在安全缺陷,不适合传输敏感信息。
- HTTPS 是以安全为目标的 HTTP 通道,并非新协议,而是 HTTP + SSL(TLS)。
- SSL 被嵌在 HTTP 和 TCP 之间,分为两层:
- SSL 记录协议:为高层协议提供数据封装、压缩、加密等基本功能。
- SSL 握手协议:用于通讯双方进行身份认证、协商加密算法、交换加密密钥等。
- SSL 协议提供的服务包括认证用户和服务器、加密数据、维护数据完整性。
(二)https 协议加密所使用的算法
- HASH 算法是一种单向算法,常用于不可还原的密码存储、信息完整性校验等。常见的 HASH 算法有 MD2、MD4、MD5 等。
- 共享密钥加密(对称密钥加密):加密和解密使用相同密钥。常见对称加密算法有 DES、AES 等。
- 公开密钥加密(非对称密钥加密):使用一对非对称的密钥,一把私有密钥,一把公开密钥。常见非对称加密算法有 RSA、ECC 等。
- HTTPS 采用综合对称密钥加密和非对称密钥加密的方式,在交换密钥阶段使用公开密钥加密方式,之后建立通信交换报文阶段则使用共享密钥加密方式。
- 为证明公开密钥的真实性,需要第三方公证单位 CA。客户端浏览器向 CA 单位确认服务器证书是否合法注册,若合法则建立连接,否则发出警告信息。
(三)浏览器访问 https 网站的通信过程
- 客户端浏览器向服务器端发送:
- 客户端支持的 SSL/TLS 协议的版本号。
- Cipher Suite(密钥算法套件)。
- 客户端产生的随机数,用于生成"对话密钥"。
- 服务器端向客户端发送:
- 确认使用的加密通信协议版本,若不一致则关闭加密通信。
- 确认使用的加密方法。
- 服务器证书。
- 服务器生成的随机数,用于生成"对话密钥"。
- 客户端利用服务器传过来的信息验证服务器的合法性:
- 若合法性验证未通过,通讯断开。
- 若通过,则可知认证服务器的公开密钥是真实有效的数字证书认证机构,且服务器的公开密钥值得信赖。多数浏览器开发商发布版本时,会事先在内部植入常用认证机关的公开密钥。
- 客户端随机产生一个对称密钥,用服务器的公钥对其加密后传给服务器。
- HTTPS 的安全通信工作流程分为三个阶段:
- 认证服务器:浏览器内置受信任的 CA 机构列表,若服务器证书的 CA 机构在列表中且证书信息与当前访问网站一致,则认为服务端可信,从服务器证书中取得服务器公钥。否则,提示用户决定是否继续。
- 协商会话密钥:客户端获得服务器公钥后,利用该公钥与服务器进行加密通信,协商出客户端会话密钥和服务端会话密钥。使用对称密钥加密可节省计算资源,且会话密钥随机生成,安全性高。
- 加密通讯:客户端和服务器双方有了会话密钥后,所有 http 数据通过会话密钥加密,保证数据的私密性和完整性。
https网站配置
#https功能由ngx_http_ssl_module模块提供
[rootlocalhost ~]# nmcli connection modify ens33 +ipv4.addresses
192.168.121.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 { #定义一个新的服务器块。Nginx 使用这种结构来组织和管理不同的虚拟主机(Virtual Host)
listen 192.168.121.156: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 路径
}
}
[root@localhost ~]# systemctl restart nginx
[root@server certs]# curl --insecure https://192.168.121.156
https
[root@server certs]# curl -k https://192.168.121.156
https
[root@server certs]#
搭建动态网站
动态网站并不是指具有动画功能的网站,而是指网站内容可根据不同情况动态变更的网站,一般情况下
动态网站通过数据库进行架构。 动态网站除了要设计网页外,还要通过数据库和编程序来使网站具有更
多自动的和高级的功能。
动态网页:使用网页脚本语言,比如php、JSP等,通过脚本将网站内容动态存储到数据库,用户访问网
站是通过读取数据库来动态生成网页的方法。
[root@localhost nginx]# nmcli connection modify ens33 +ipv4.addresses
192.168.121.157/24
[root@localhost nginx]# nmcli connection 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
#使用浏览器访问
完成!!