一、理论铺垫

(1)浏览器功能:

1.输入网址

2.显示页面窗口

3.渲染引擎是浏览器内核的一部分,负责解析HTML、CSS和JavaScript,并将它们转为可视化的页面内容。渲染引擎的性能和优化直接影响浏览器的渲染效果和用户体验。

(2)web服务器:Apache httpd、nginx、Apache tomcat

(3)网址组成:

URI:Uniform Resource Identifier,统一资源标识,分为 URL 和 URN 。

URN:Uniform Resource Naming,统一资源命名。如 P2P 下载使用的磁力链接就是 URN 的一种实现:magnet:?xt=urn:btih:2d2a66e12ec4f61a5a8f5e8fdfed89d2f70859fb

URL:Uniform Resource Locator,统一资源定位符,用于描述某服务特定资源位置。

两者区别:URN 如同一个人的名称,而 URL 代表一个人的住址。换言之,URN 定义某事物的身份,而 URL 提供查询该事物的方法。

1.scheme:方案,访问服务器以获取资源时要使用哪种协议。

2.user:用户,某些方案访问资源时需要的用户名。

3.password:密码,用户对应的密码,中间用冒号 : 分隔。

4.Host:主机,资源宿主服务器的主机名或IP地址。

5.Port:端口,资源宿主服务器正在监听的端口号,很多方案有默认端口号。

6.path:路径,服务器资源的本地名,由一个 / 将其与前面的URL组件分隔。

7.params:参数,指定输入的参数,参数为名/值对,多个参数用逗号 , 分隔。

8.query:查询,传递参数给程序,如数据库,用?分隔,多个查询用 & 分隔。

9.frag:片段,一小片或一部分资源的名字,此组件在客户端使用,用 # 分隔。

(4)端口号:http为80,https为443 (IANA:互联网数字分配机构)

0-1023:永久地分配给固定的应用程序使用。

1024-41951:注册端口,但要求不是特别严格,分配给程序注册为某应用使用。

41952-60000:客户端程序随机使用的端口,动态端口,或私有端口。

(5)http协议(超文本传输协议)

1.请求方法

GET:请求指定的资源。

POST:提交数据以处理请求。

HEAD:请求资源的响应头信息。

PUT:上传文件或者更新资源。

DELETE:删除指定的资源。

OPTIONS:请求获取服务器支持的请求方式。

TRACE:回显服务器收到的请求,主要用于诊断。

CONNECT:建立一个隧道用于代理服务器的通信,通常用于 HTTPS 。

2.响应状态码

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

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:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。

(6)web服务器传输的内容:

HTML (HyperText Markup Language):所有静态网页的基础,用于定义网页的结构和内容。

CSS (Cascading Style Sheets):用于描述网页的外观和格式。

JavaScript(客户端脚本语言):虽然主要用于动态交互,但也可以用来增强静态网页的功能,例如响应用户操作、动态修改内容等。

MIME(Multipurpose Internet Mail Extensions)类型通常用于指定文件类型的互联网标准,它最初是为了在电子邮件中附加不同类型的文件而设计的,但后来也被广泛应用于Web服务器上,以告诉浏览器如何处理和显示接收到的文件。

(7)web服务类型:

静态网站:静态网站的内容通常是固定不变的,除非手动更新网页文件。

动态网站:动态网站的内容通常是根据用户请求、数据库交互或其他因素动态生成的 LNMP。

静态文件:无需服务端做出额外处理,服务器端和客户端的文件内容相同。常见文件后缀:.html、.txt、.jpg、.js、.css、.mp3、.avi 等。

动态文件:服务端执行程序,返回执行的结果,服务端和客户端的文件内容不相同。常见文件后缀:.php、.jsp、.asp、.py、.go 等。

服务器端脚本语言:

PHP:一种广泛使用的服务器端脚本语言。

Python:常与Django、Flask等框架一起使用。

Ruby:与Ruby on Rails框架一起使用。

Java:常用于企业级应用,与Spring、Java EE等框架一起用。

C#:与.NET框架一起用于构建动态网站,特别是ASP.NET。

Node.js:允许使用JavaScript进行服务器端编程。

数据库技术:

SQL:用于与数据库(如MySQL、PostgreSQL、SQL Server等)进行交互。

NoSQL:如MongoDB、CouchDB等,用于处理非关系型数据。

客户端脚本语言:
JavaScript:与Ajax、React、Angular、Vue.js等前端框架和库一起使用,用于创建动态的用户界面。

(8)网站访问量统计的重要指标

IP:即 Internet Protocol,指独立IP数,一天内来自相同客户机 IP 地址只计算一次,记录远程客户机 IP 地址的计算机访问网络的次数,是衡量网站流量的重要指标。

PV:即 Page View,页面浏览量或点击量,用户每次刷新被计算一次,PV 反映的是浏览某网站的页面数, PV 与来访者的数量成正比,PV 并不是页面的来访者数量,而是网站被访问的页面数量。

UV:即 Unique Visitor,访问网站的一台电脑为一个访客。一天内相同的客户端只被计算一次。可以理解成访问某网站的电脑的数量。网站判断来访电脑的身份是通过 coolies 实现的。如果更换了 IP 后但不清楚 Cookies,再访问相同的网站,该网站的统计中 UV 数不变。

二、web服务在HTTP协议通信原理

HTTP协议从Web浏览器到服务器返回信息的过程可以分为4个部分:

1.建立连接:HTTP协议的建立是通过申请Socket套接字实现,用户通过Socket在服务器上申请一个端口号,然后在网络中通过该端口号传输数据。

2.发送请求。用户和服务器之间建立连接后,可以向指定的目的主机发送请求。

3.返回响应。服务器对用户提交的请求进行处理,并返回请求码(如404)或数据。

4.关闭连接。通信结束后,通信双方均可通过关闭套接字来关闭连接,断开访问。

客户端通过浏览器访问页面过程:

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浏览器显示访问的网站内容到屏幕上。

一次完整的 http 请求处理过程:

1.建立连接:接收或拒绝连接请求。

2.接收请求:接收客户端请求报文中对某资源的一次请求的过程。

3.处理请求:服务器对请求报文进行解析,并获取请求的资源及请求方法等相关信息,根据方法、资源、首部和可选的主体部分对请求进行处理。常用请求Method:GET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS。

4.访问资源:服务器获取请求报文中请求的资源web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态运行后生成的资源。

5.构建响应报文:一旦Web服务器识别除了资源,就执行请求方法中描述的动作,并返回响应报文。响应报文中包含有响应状态码、 响应首部,如果生成了响应主体的话,还包括响应主体:

(1)响应实体:如果事务处理产生了响应主体,就将内容放在响应报文中回送过去。响应报文中通常包括:描述了响应主体MIME类型的 Content-Type 首部描述了响应主体长度的 Content-Length 实际报文的主体内容;

(2)URL重定向:web服务构建的响应并非客户端请求的资源,而是资源另外一个访问路径;

(3)MIME类型:Web服务器要负责确定响应主体的MIME类型。多种配置服务器的方法可将MIME类型与资源管理起来【1.魔法分类:Apache web服务器可以扫描每个资源的内容,并将其与一个已知模式表(被称为魔法文件)进行匹配,以决定每个文件的MIME类型。这样做可能比较慢,但很方便,尤其是文件没有标准扩展名时;2.显式分类:可以对Web服务器进行配置,使其不考虑文件的扩展名或内容,强制特定文件或目录内容拥有某个MIME类型;3.类型协商:有些Web服务器经过配置,可以以多种文档格式来存储资源。在这种情况下,可以配置Web服务器,使其可以通过与用户的协商来决定使用哪种格式(及相关的MIME类型)】。

6.发送响应报文:Web服务器通过连接发送数据时也会面临与接收数据一样的问题。服务器可能有很多条到各个客户端的连接,有些是空闲的,有些在向服务器发送数据,还有一些在向客户端回送响应数据。服务器要记录连接的状态,还要特别注意对持久连接的处理。对非持久连接而言,服务器应该在发送了整条报文之后,关闭自己这一端的连接。对持久连接来说,连接可能仍保持打开状态,在这种情况下,服务器要正确地计算Content-Length首部,不然客户端就无法知道响应什么时候结束。

7.记录日志:最后,当事务结束时,Web服务器会在日志文件中添加一个条目,来描述已执行的事务。

三、Apache和nginx

Nginx 的工作进程是多进程的,每个 Worker 进程可以异步处理大量的用户请求,因此在高并发下 Nginx 能保持低资源低消耗高性能。

Apache有一共有三种稳定的 MPM(Multi-Processing Module,多进程处理模块)模式,其中最常用和默认的是 prefork 模式。prefork 是一个非线程型的、预派生的 MPM,使用多个进程,每个进程在某个确定的时间只单独处理一个连接,效率高,但内存使用比较大。一个进程相对占用更多的系统资源,消耗更多的内存。

因此,Apache 并不擅长处理高并发请求。 在这种场景下,它会将请求放进队列中,一直等到有可用进程,请求才会被处理。因此 Apache 是阻塞型的。当用户请求过多时,开启的进程较多,占用内存大,每秒最多的并发连接请求最 多不超过 3000 个,而 Nginx 则可以每秒并发连接超过 10 万请求。

虽然Apache HTTP Server依旧是一个强大且稳定的Web服务器解决方案,但在追求高性能、高效率的当下,Nginx的学习和应用无疑具有更加显著的价值和前瞻性。

四、nginx详解

nginx架构:

nginx自带指令:

nginx # 启动nginx
nginx restart # 重启服务
nginx -s reload # 重新加载配置文件
nginx -s stop # 强行停止服务
nginx -s quit # 优雅停止服务,即所有请求处理完后退出服务
nginx -v # 查看版本号
nginx -t # 检查配置文件的语法错误,无错返回ok

nginx配置文件解读:

# 过滤掉注释行和空行查看nginx的主配置文件
[root@localhost ~]# grep -v "^.*#" /etc/nginx/nginx.conf | grep -v ^$
user nginx;    # 服务运行的用户
worker_processes auto;     # worker进程数量
error_log /var/log/nginx/error.log;    # 错误日志路径
pid /run/nginx.pid;    # 主进程的PID文件路径
include /usr/share/nginx/modules/*.conf;    # 加载该路径下以.conf结尾的文件
events {     # 事件区块
    worker_connections 1024;    # 每个worker进程可以处理的连接数
}
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;    # 访问日志路径,使用main格式
    sendfile            on;    # 高效传输模式
    tcp_nopush          on;    # 多个响应包合成一个包,减少网络开销
    tcp_nodelay         on;    # 对于长连接,立即发送数据而不是等待更多数据
    keepalive_timeout   65;    # 超时时间
    types_hash_max_size 4096;    # MIME类型哈希表的最大大小
    include             /etc/nginx/mime.types;    # 支持的配体文件
    default_type        application/octet-stream;    # 默认的媒体类型
    include /etc/nginx/conf.d/*.conf;     # 同上
    server {    # server区块
        listen       80;    # 监听端口号
        listen       [::]:80;    # ipv6
        server_name  _;    # 域名
        root         /usr/share/nginx/html;    # 根目录
        include /etc/nginx/default.d/*.conf;    # 同上
        error_page 404 /404.html;    # 当发生404时返回错误页面
        location = /404.html {    # 精确匹配404页面的location块
        }
        error_page 500 502 503 504 /50x.html;    # 错误信息配置
        location = /50x.html {    # 同上
        }
    }
}

nginx配置文件组成:

主配置文件:nginx.conf

子配置文件:conf.d/*.conf

#/usr/share/nginx/modules/*.conf 配置影响Nginx的核心功能和模块行为。 生效范围:这些配置文件中的设置将在Nginx启动时加载,并且对整个Nginx服务器的操作都有效。它们通常用于定义Nginx模块的行为,而不是特定服务或location的配置。

#/etc/nginx/conf.d/*.conf 配置影响特定的虚拟主机和服务配置。 这个 include 指令位于 http 块内部,通常用于包含定义了虚拟主机(server blocks)和服务配置的文件。每个 .conf 文件可以定义一个或多个服务器块(server blocks),这些服务器块可以监听不同的端口、处理不同的域名以及提供不同的网站内容。 生效范围:这些配置文件中的设置仅对它们各自定义的虚拟主机或服务有效。例如,如果你在 /etc/nginx/conf.d/ 目录下有一个名为 example.com.conf 的文件,那么该文件中的配置只会应用于 example.com 这个域名。

五、nginx实验

实验1:基本实现

# 安装nginx
[root@localhost ~]# yum install nginx -y

# 在主配置文件中找到根目录
[root@server ~]# cat  /etc/nginx/nginx.conf | grep root
        root         /usr/share/nginx/html;

# 对根目录下的测试页面进行改写
[root@localhost ~]# echo "this is my test page" > /usr/share/nginx/html/index.html 

# 重启服务,没启动服务的可以直接start开启服务(后面实验都是在关闭防火墙和SElinux的环境下)
[root@localhost ~]# systemctl restart nginx.service 

# 测试获取页面
[root@localhost ~]# curl 192.168.121.131
this is my test page

实验2:修改端口、默认目录、默认文件访问web页面

# 不同端口访问页面
[root@localhost ~]# vim /etc/nginx/nginx.conf    # 修改端口号
        #listen       80;
        listen       666;
[root@localhost ~]# systemctl restart nginx.service 
[root@localhost ~]# netstat -lntup | grep nginx    # nginx服务正在监听的所有TCP端口
tcp        0      0 0.0.0.0:666             0.0.0.0:*               LISTEN      35608/nginx: master 
tcp6       0      0 :::80                   :::*                    LISTEN      35608/nginx: master 
[root@localhost ~]# curl 192.168.121.131:666
this is my test page
# 不同默认目录访问同一web页面
[root@localhost ~]# vim /etc/nginx/nginx.conf
        #root         /usr/share/nginx/html;
        root         /web;
[root@localhost ~]# mkdir /web
[root@localhost ~]# echo "my new dir is /web" > /web/index.html
[root@localhost ~]# systemctl restart nginx.service 
[root@localhost ~]# curl 192.168.121.131
my new dir is /web
# 通过不同文件访问web页面
[root@localhost ~]# vim /etc/nginx/default.d/web.conf
location /haha {
        root  /web;    # 如果root在location里面,那么会覆盖server模块里的root
        index  haha.html;
}
[root@localhost ~]# mkdir /web/haha/
[root@localhost ~]# echo "my location is /haha" > /web/haha/haha.html
[root@localhost ~]# systemctl restart nginx.service 
[root@localhost ~]# curl 192.168.121.131    
this is my test page    # 这里是/usr/share/nginx/html目录下的index.html
[root@localhost ~]# curl 192.168.121.131/haha/
my location is /haha    # 这里是/web/haha目录下的haha.html

实验3:虚拟主机:基于不同端口、不同目录、不同IP、不同域名访问不同页面

Nginx的虚拟主机功能在多种场景下非常有用,以下是一些典型的使用场景:

1、共享主机服务:服务提供商可以使用Nginx的虚拟主机功能在同一台服务器上为多个客户托管不同的网站,每个客户拥有独立的域名和资源,互不干扰。

2、开发与生产环境分离:在同一台服务器上配置不同的虚拟主机,分别用于开发、测试和生产环境,以便于管理和维护。

3、多域名单站点:有时一个站点可能需要多个域名访问,例如,国际化的网站可能根据不同地区有不同的域名,但指向同一站点。

4、多站点托管:企业或个人可能需要在同一台服务器上托管多个独立的网站,每个网站有自己独特的配置和资源需求。

5、子域名管理:通过虚拟主机可以为不同的子域名配置不同的网站或服务,例如blog.example.com 和 store.example.com 可以是两个完全独立的网站。

6、基于路径的虚拟主机:Nginx可以根据请求的URL路径将请求转发到不同的应用程序或服务。

7、HTTPS和HTTP分离:可以在同一服务器上为同一个站点配置HTTP和HTTPS的虚拟主机,以便于管理安全连接和非安全连接。

# 基于不同端口访问不同页面
[root@localhost ~]# vim /etc/nginx/conf.d/port.conf
server {
   listen 80;
   location / {
        root /web;
        index port80.html;
   }
}
server {
   listen 666;
   location / {
        root /web;
        index port666.html;
   }
}
[root@localhost ~]# vim /etc/nginx/nginx.conf
        #root         /usr/share/nginx/html;
        root         /web;
[root@localhost ~]# echo "my port is 80" > /web/port80.html
[root@localhost ~]# echo "my port is 666" > /web/port666.html
[root@localhost ~]# systemctl restart nginx.service
[root@localhost ~]# curl 192.168.121.131:80
my port is 80
[root@localhost ~]# curl 192.168.121.131:666
my port is 666
# 基于不同目录访问不同页面
[root@localhost ~]# vim /etc/nginx/conf.d/dir.conf
server {
   listen 80;
   root /web;
   location /dir1/ {
        index dir1.html;
   }
   location /dir2/ {
        index dir2.html;
   }
}
[root@localhost ~]# mkdir /web/dir1
[root@localhost ~]# mkdir /web/dir2
[root@localhost ~]# echo "my location is /dir1" > /web/dir1/dir1.html
[root@localhost ~]# echo "my location is /dir2" > /web/dir2/dir2.html
[root@localhost ~]# systemctl restart nginx.service
[root@localhost ~]# curl 192.168.121.131/dir1/
my location is /dir1
[root@localhost ~]# curl 192.168.121.131/dir2/
my location is /dir2
# 基于不同IP访问不同页面
[root@localhost ~]# nmcli connection modify ens160 +ipv4.addresses 192.168.121.132/24    # 添加一个ip地址
[root@localhost ~]# nmcli connection up ens160 
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/5)
[root@localhost ~]# vim /etc/nginx/conf.d/ip.conf
server {
       listen 192.168.121.131:80;
       root /web/131;
       location / {
               index ip131.html;
       }
}
server {
       listen 192.168.121.132:80;
       root  /web/132;
       location / {
               index ip132.html;
       }
}
[root@localhost ~]# mkdir /web/{131,132}
[root@localhost ~]# echo "my ip is 131" > /web/131/ip131.html
[root@localhost ~]# echo "my ip is 132" > /web/132/ip132.html
[root@localhost ~]# systemctl restart nginx.service 
[root@localhost ~]# curl 192.168.121.131
my ip is 131
[root@localhost ~]# curl 192.168.121.132
my ip is 132
# 基于不同域名访问不同
[root@localhost ~]# vim /etc/nginx/conf.d/ip.conf
server {
       listen 80;
       root /web/131;
       server_name haha131.com;
       location / {
               index ip131.html;
       }
}
server {
       listen 80;
       root  /web/132;
       server_name haha132.com;
       location / {
               index ip132.html;
       }
}
[root@localhost ~]# vim /etc/hosts
192.168.121.131 haha131.com haha132.com
[root@localhost ~]# systemctl restart nginx.service
[root@localhost ~]# curl haha131.com
my ip is 131
[root@localhost ~]# curl haha132.com
my ip is 132

实验4-1:访问控制:基于不同用户的访问控制

[root@localhost ~]# yum install httpd-tools.x86_64 -y
[root@localhost ~]# mkdir /auth
[root@localhost ~]# htpasswd -cb /auth/pwd1 z3 123
Adding password for user z3
[root@localhost ~]# htpasswd -cb /auth/pwd2 l4 124
Adding password for user l4
[root@localhost ~]# vim /etc/nginx/conf.d/ip.conf 
server {
       listen 192.168.121.131:80;       
       location / {
                root  /web/131;
                index ip131.html;
                auth_basic  on;
                auth_basic_user_file  /auth/pwd1;
       }
}
server {
       listen 192.168.121.132:80;
       location / {
                root  /web/132;
                index ip132.html
                auth_basic  on;
                auth_basic_user_file  /auth/pwd2;
       }
}
[root@localhost ~]# systemctl restart nginx.service 
[root@localhost ~]# curl 192.168.121.131 -u z3
Enter host password for user 'z3':
my ip is 131
[root@localhost ~]# curl 192.168.121.132 -u l4
Enter host password for user 'l4':
my ip is 132

实验4-2:访问控制:基于源ip的访问控制

 server {
    listen       80;
    server_name  localhost;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    # 基于源端口的访问控制
    location /test.html {
        root   /usr/share/nginx/html;
        allow 192.168.1.0/24;  # 允许来自192.168.1.0/24网段的请求
        deny all;              # 拒绝其他所有请求
    }
 }

 #如果只有allow 192.168.1.0/24; 表示允许所有ip,包括192.168.1.0/24,
 #如果要实现允许192.168.1.0/24,并且拒绝其他的ip访问服务器:
        allow 192.168.1.0/24;  # 允许来自192.168.1.0/24网段的请求
        deny all; 
#表示拒绝所有ip访问服务器, allow  192.168.5.1;配置不会生效:
        deny   all;
        allow  192.168.5.1;

实验5:传输协议的加密

SSL 即安全套接字层,它在 OSI 七层网络模型中处于第五层,SSL 在 1999 年被 IETF(互联网工程组)更名为 TLS ,即传输安全层,直到现在,TLS 一共出现过三个版本,1.1、1.2 和 1.3 ,目前最广泛使用的是 1.2,所以接下来的探讨都是基于 TLS 1.2 的版本上的。

SSL 是一个独立的协议,不只有 HTTP 可以使用,其他应用层协议也可以使用,比如 SMTP(电子邮件协议)、 Telnet(远程登录协议)等都可以使用。

TLS(Transport Layer Security)是 SSL(Secure Socket Layer) 的后续版本,它们是用于在互联网两台计算机之间用于身份验证和加密的一种协议。

很多在线业务(如在网站购物)最重要的一个步骤是创建一个高度安全的交易系统,这样客户就可以放心地把钱转过去,SSL和TLS可以实现这个目的。

SSL/TLS = X.509 证书(一种数字文档,将网站和公司的实体信息绑定到加密密钥来进行工作)+ 密钥对(key pairs) (私有密钥(private key)和 公有密钥(public key))。

TLS 用于两个通信应用程序之间提供保密性和数据完整性。TLS 由记录协议、握手协议、警告协议、变更密码规范协议、扩展协议等几个子协议组成,综合使用了对称加密、非对称加密、身份认证等许多密码学前沿技术。

HTTPS 并不是一项新的应用层协议,只是 HTTP 通信接口部分由 SSL 和 TLS 替代而已。通常情况下,HTTP 会先直接和 TCP 进行通信。在使用 SSL 的 HTTPS 后,则会先演变为和 SSL 进行通信,然后再由 SSL 和 TCP 进行通信。也就是说,HTTPS 就是身披了一层 SSL 的 HTTP。这个衣服加在了应用层与传输层之间。这样我们应用层看到的是明文,传出层传输的都是密文。

https实现过程如下:

  1. 客户端发起https请求:客户端访问某个web端的https地址,一般都是443端口;
  2. 服务端的配置:采用https协议的服务器必须要有一套证书,可以通过一些组织申请,也可以自己制作。目前国内很多网站都自己做的,当你访问一个网站的时候,提示证书不可信任就是表示证书是自己做的。证书就是一个公钥和私钥,就像一把锁和钥匙;
  3. 传送证书:服务端给客户端传递证书,其实就是公钥,里面包含了很多信息,例如证书得到颁发机构、过期时间等;
  4. 客户端解析证书:这部分工作是由客户端完成。首先回验证公钥的有效性,如颁发机构、过期时间等。如果发现异常则会弹出一个警告框,提示证书可能存在问题,如果证书没有问题,就生成一个随机值,然后用证书对该随机值进行加密;
  5. 传送4步骤的加密数据:就是将证书加密后的随机值传递给服务器,目的就是为了让服务器得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值进行加密解密了;
  6. 服务端解密信息:服务端用私钥解密5步骤加密后的随机值之后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密,对称加密就是将信息和私钥通过算法混合在一起,这样除非你知道私钥,不然是无法获取其内部的内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法就可以保证数据的安全性。
  7. 传输加密后的信息:服务端将用私钥加密后的数据传递给客户端,在客户端可以被还原出原数据内容。
  8. 客户端解密信息:客户端用之前生成的私钥解密服务端传递过来的数据,由于 数据一直是加密的,因此即使第三方获取到数据也无法知道其详细内容。

用途:SSL/TLS主要用于保护Web通信,而SSH用于安全的远程登录和命令执行。

认证方式:SSL/TLS依赖于数字证书,而SSH依赖于公钥/私钥对。

协议层次:SSL/TLS在传输层和应用层之间,SSH直接在应用层。

实验:

# 1.生成密钥
[root@localhost ~]# cd /etc/pki/tls/certs/
[root@localhost certs]# openssl genrsa -out miyao.key

# 2.生成证书
[root@localhost certs]# openssl req -utf8 -new -key /etc/pki/tls/certs/miyao.key -x509 -days 100 -out /zhengshu.crt
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HUNAN
Locality Name (eg, city) [Default City]:CSC     
Organization Name (eg, company) [Default Company Ltd]:SWXY   
Organizational Unit Name (eg, section) []:obboda
Common Name (eg, your name or your server's hostname) []:localhost
Email Address []:1552469648@qq.com

# 3.配置nginx
[root@localhost certs]# echo "i am port 443" > /web/index.html
[root@localhost certs]# vim /etc/nginx/conf.d/openssl.conf
server {
        listen       192.168.121.131:443 ssl;
        ssl_certificate "/zhengshu.crt";
        ssl_certificate_key "/etc/pki/tls/certs/miyao.key";
        location / {
        root  /web ;
        index index.html;
        }
 }
[root@localhost certs]# systemctl restart nginx.service

# 4.接下来用windows主机进行测试

查看证书:

实验6:nginx发布动态页面(简易实现)

[root@localhost certs]# dnf install phh php-fpm -y
[root@localhost certs]# systemctl restart nginx php-fpm
[root@localhost certs]# echo "<?php phpinfo();?>" > /usr/share/nginx/html/index.php
# 使用浏览器访问

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部