WEB服务器的部署及优化
1. 用户常用的关于web的信息
1.1 什么是www
- www是world wide web的缩写,及万维网,也就是全球信息广播的意思;
- 通常说的上网就是使用www来查询用户所需要的信息。
- www可以结合文字、图形、影像以及声音等多媒体,超链接的方式将信息以Internet传递到世界各处去。
- 当你连接www网站,该网站会提供一些数据,客户端要使用可以解析这些数据的软件来处理,那就是浏览器
1.2 网址
- URI:Uniform Resource Identifier统一资源标识,分为URL和URN
- URN:Uniform Resource Naming,统一资源命名,P2P下载使用的磁力链接是URN的一种实现
- URL:Uniform Resorce Locator,统一资源定位符用于描述某服务器某特定资源位置
- 两者区别:而URL提供查找该事物的方法。URN仅用于命名,而不指定地址
1.3 URL的组成
-
URL组成机构如下:
<scheme>://<user>:<password>@<host>:<port>/<path>:<params>?<query>#<frag>
-
每部分的定义为:
scheme 方案 访问服务器以获取资源时要使用哪种协议 user 用户 某些方案访问资源时需要的用户名 password 密码 用户对应的密码,中间用:分隔 scheme 方案 访问服务器以获取资源时要使用哪种协议 host 主机 资源宿主服务器的主机名或IP地址 port 端口 资源宿主服务器正在监听的端口号,很多方案有默认端口号 path 路径 服务器资源的本地名,由一个/将其与前面的URL组件分隔 params 参数 指定输入的参数,参数为名/值对,多个参数,用;分隔 query 查询 传递参数给程序,如数据库,用?分隔,多个查询用&分隔 frag 片段 一小片或一部分资源的名字,此组件在客户端使用,用#分隔
2. HTTP简介
2.1 什么是http
- HTTP协议:全称为Hyper Text Transfer Protocol(超文本传输协议)
- 简单来说http就是从服务器传输超文本(html)到本地浏览器的传输协议
- HTTP协议工作于B/S架构上,浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务端发送请求(Request)Web服务端根据接收到的请求数据后,向客户端发送响应信息(Response)
- https://developer.mozilla.org/zh-CN/docs/Web
2.2 http的工作机制
-
一次http事务包括:
-
http请求:http request
-
http响应: http response
-
-
Web资源: web resource
一个网页由多个资源(文件)构成,打开一个页面,通常会有多个资源展示出来,但是每个资源都要单独请求。因此,一个"Web页面"通常并不是单个资源,而是一组资源的集合。
-
资源类型:
- 静态文件:无需服务端做出额外处理,服务器端和客户端的文件内容相同
- 常见文件后缀:.html,.txt,.jpg,.js,.css,mp3,avi
-
动态文件:服务端执行程序,返回执行的结果,服务器端和客户端的文件内容不相同
- 常见文件后缀:.php,jsp,asp
-
web中常用的语言介绍
-
html语言 超文本标记语言
html<html> <head> <meta http-equiv=Content-Type content="text/html;charset=utf-8"> <title>HTML语言</title> </head> <body> <img src="http://www.xianoupeng.com/uploadfile/2019/0424/20190424115929686.jpg"> <h1 style="color:red">欢迎</h1> <p><a href=http://www.baidu.com>百度</a>欢迎你</p> </body> </html>
-
css 层叠样式表 表述网站的风格
csshtml网页主体 --- <html> <head> <meta http-equiv=Content-Type content="text/htm1;charset=utf-8"> <link rel="stylesheet" type="text/css" href="mystyle.css" /> </head> <body> <h1>这是 heading 1</h1> <p>这是一段普通的段落。请注意,该段落的文本是红色的。在body选择器中定义了本页面中的默认文本颜 色。</p> <p class="ex">该段落定义了class="ex"。该段落中的文本是蓝色的。</p> </body> </html> css文件 -- body {color:red } h1 {color:yellow } p.ex {color:blue }
-
js实现html和css实现不了的功能比如动画效果
js<!DOCTYPE html> <html> <head> <meta http-equiv=Content-Type content="text/html;charset=utf-8"> </head> <body> <h2>我的第一个JavaScript</h2> <button type="button" onclick="document.getElementById('demo').innerHTML = Date()"> 点击这里来显示日期和时间 </button> <p id="demo"></p> </body> </html>
-
-
mine(Multipurpose Internet Mail Extensions)多用途因特网邮件扩展
- 它设计的最初目的是为了在发送电子邮件时附加多媒体数据,让邮件客户程序能根据其类型进行处理;
- 为了支持多媒体数据类型,HTTP协议中就使用了附加在文档之前的MIME数据类型信息来标识数据类型。
- 其主要功能是让服务器将它们发送的多媒体数据的类型告诉浏览器。
- 服务器将MIME标志符放入传送的数据中来告诉浏览器使用哪种插件读取相关文件;
- MIME类型存在于HTTP响应报文的响应头部信息里,它是一种文本标记;
- MIME格式: type/subtype 文件类型后缀(html txt jpg png... ...)
MIME类型 文件类型 text/html html、htm、shtml文本类型 text/css css文本类型 text/xml xml文本类型 image/gif gif图像类型 image/jpeg jpeg、jpg图像类型 application/javascript js文本类型 text/plain txt文本类型 application/json json文本类型 video/mp4 mp4视频类型 video/quicktime mov视频类型 video/x-flv flv视频类型 video/x-ms-wmv wmv视频类型 video/x-msvideo avi视频类
2.3 http访问请求的完整过程
- 建立连接:
TCP的3次握手建立链接,向服务器发送http请求,服务器拒绝或允许
- 接受请求
接受客户端请求报文对某个资源的一次请求过程web响应访问模型
a.单进程I/O模型:启动一个进程处理用户请求,而且一次只处理一个,多个请求被串行响应
b.多进程I/O模型:并行启动多个进程,每个进程响应一个连接请求
c.复用I/O结构:启动一个进程,同时响应N个连接请求
d.复用的多进程I/O模型:启动M个进程,每个进程响应N个连接请求,同时接收M*N个请求
- 处理请求:
服务器对请求报文进行解析,并获取请求的资源及请求方法等相关信息,根据方法,资源,首部和可选
的主体部分对请求进行处理常用请求Method: GET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS
- 访问资源:
服务器获取请求报文中请求的资源web服务器,即存放了web资源的服务器,负责向请求者提供对方请求
的静态资源,或动态运行后生成的资源
- 5.构建响应报文:
一旦Web服务器识别除了资源,就执行请求方法中描述的动作,并返回响应报文。响应报文中包含有响
应状态码、响应首部,如果生成了响应主体的话,还包括响应主体
响应实体:如果事务处理产生了响应主体,就将内容放在响应报文中回送过去。响应报文中通常包括:描述了响应主体MIME类型的Content-Type首部;描述了响应主体长度的Content-Length
实际报文的主体内容:
- URL重定向:web服务构建的响应并非客户端请求的资源,而是资源另外一个访问路径
- MIME类型:Web服务器要负责确定响应主体的MIME类型。多种配置服务器的方法可将MIME类型与资源管理起来
- 发送响应报文
Web服务器通过连接发送数据时也会面临与接收数据一样的问题。服务器可能有很多条到各个客户端的连接,有些是空闲的,有些在向服务器发送数据,还有一些在向客户端回送响应数据。服务器要记录连接的状态,还要特别注意对持久连接的处理。对非持久连接而言,服务器应该在发送了整条报文之后,关闭自己这一端的连接。对持久连接来说,连接可能仍保持打开状态,在这种情况下,服务器要正确地计算Content-Length首部,不然客户端就无法知道响应什么时候结束。
2.4 http协议报文的头部结构
-
请求报文
-
图示:
-
请求情报文由三部分组成即:开始行、首部行、实体主体;
-
开始行:请求方法 url 版本 CRLF;
-
首部行:通常用键值表示;
-
空格;
-
实体主体数据,一般在post动作中可以提看到
-
开始行中的请求方法:
方法 描述 GET 请求指定页面信息,并返回实体主体 HEAD 类似get要求,只不过返回相应中没有主题内容,用户获取报头 POST 向指定资源提交数据请求,数据包含在请求中,此请求可能会生成新的资源或修改已有资源 PUT 从客户端向服务端传送数据取代指定的文档内容 DELETE 请求服务器删除指定页面 CONNECT HTTP/1.1协议中预留给弄够将改为管道方式的代理服务器 OPTIONS 允许客户端查看服务器的性能 TRACE 回显服务器收到的请求,用于测试和诊断
-
-
响应报文
-
图示:
-
求情报文由三部分组成即:开始行、首部行、实体主体;
-
开始行:http版本 状态码 短语 CRLF;
-
首部行通常用键值表示;
-
空格;
-
实体主体数据,即获取内容。
-
2.5 状态代码
- 状态码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值
状态码 | 含义 | 详解 |
---|---|---|
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 服务器当前不能处理客户端的请求,一段时间后可能恢复正常
3. web服务器的配置详解
3.1 web服务的常用类型
- Apache
- Nginx
- openresty
- 大厂自研
3.2 Nginx的安装
- 开源版本的Nginx官网:http://nginx.org
- Nginx在安装的过程中可以选择源码安装也可以选择使用软件包安装
- 源码安装下载相应的源码压缩包解压后编译完成安装
- 软件安装包可以使用rpm或者apt命令进行安装,也可以使用dnf通过软件仓库安装
以软件仓库安装为例:
-
配置软件仓库
[root@localhost ~]# vim /etc/yum.repos.d/nginx.repo [nginx] name=nginx baseurl=http://nginx.org/packages/rhel/9/x86_64 gpgcheck=0
-
执行安装命令
[root@localhost ~]# dnf install nginx --y
-
启动服务并启用服务
[root@localhost ~]# systemctl enable --now nginx.service #启动并立即执行nginx服务 [root@localhost ~]# netstat -antlupe | grep nginx #查看nginx端口,默认为80 [root@localhost ~]# firewall-cmd --permanent --add-service=http [root@localhost ~]# firewall-cmd --reload
-
注意:在安装nginx之前还要配置好系统的软件仓库,nginx的安装需要通过系统软件仓库来解决依赖性
3.3 Nginx涉及到的文件
-
相关配置文件的作用
-
主配置文件:/etc/nginx/nginx.conf
-
相关配置文件:/etc/nginx/conf.d
相关配置文件的作用 主配置目录:/etc/nginx 相关配置文件:/etc/nginx
-
日志文件:/var/log/nginx
-
默认发布目录:/usr/share/niginx/html/
-
默认发布文件内容:/usr/share/niginx/html/index.html
-
3.4 Nginx配置文件内容详解
# 编辑 Nginx 的主配置文件
[root@localhost ~]# vim /etc/nginx/nginx.conf
# 检查 Nginx 配置文件语法错误的命令
[root@localhost ~]# nginx -t
# 在不停止 Nginx 服务的情况下,重新加载配置文件
[root@localhost ~]# nginx -s reload
-
nginx全局配置
user nginx; #nginx程序运行用户 worker_processes auto; #指定nginx开启的work进程个数 error_log /var/log/nginx/error.log notice; #错误日志 pid /var/run/nginx.pid; #pid文件 events { worker_connections 1024; #指定每个 Nginx 工作进程可以同时处理的最大连接数 }
-
http模块配置:用于配置与 HTTP 协议相关的全局设置以及服务器和位置相关的指令。
http { # 定义了一个名为main的日志格式。这个格式指定了如何记录访问日志中的信息 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; # Nginx服务器是否使用sendfile()传输文件 # 与sendfile配合使用,当sendfile开启且tcp_nopush设置为on时,Nginx 会尝试将多个小的数据包合并成一个大的数据包发送,减少网络传输中的小数据包数量,提高网络传输效率。 tcp_nopush on; tcp_nodelay on; # 当包累计到一定大小后就发送,默认0.2s一次 # 定义了一个 HTTP 连接在空闲状态下保持打开的时间,这里设置为 65 秒。在这个时间内,如果客户端再次发起请求,可以复用之前的连接,减少连接建立和关闭的开销,提高性能。 keepalive_timeout 65; # 长连接超时时间 types_hash_max_size 4096; #设置了 MIME 类型哈希表的最大大小 include /etc/nginx/mime.types; #包含的配置文件 default_type application/octet-stream; #设置了默认的 MIME 类型。如果 Nginx 无法根据文件扩展名确定 MIME 类型,就会使用这个默认值。 #gzip on; #可以使网站的css、js 、xml、html 等静态资源在传输时进行压缩 include /etc/nginx/conf.d/*.conf; #指定子配置文件 server { listen 80; #指定了这个虚拟主机监听的端口为 80 listen [::]:80; #用于监听 IPv6 地址的 80 端口 server_name _; root /usr/share/nginx/html; #默认发布目录,当客户端请求一个URL时,Nginx会在这个目录下查找相应的文件来响应请求。 index /usr/share/nginx/html/index.html #默认发布文件,配置文件中没有,需要手动创建修改 # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; error_page 404 /404.html; location = /404.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } }
-
子配置文件
/etc/nginx/conf.d/default.conf server { listen 80; #监听端口 server_name localhost; #服务器的名字 location / { root /usr/share/nginx/html; #默认发布目录 index index.html index.htm; #默认发布文件 } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; #访问出错呈现错误页面 location = /50x.html { root /usr/share/nginx/html; } }
3.5 Nginx配置
-
nginx虚拟主机
- 默认情况下nginx只能发布一个站点;
- 如果要发布多个站点需要搭建多台nginx来满足,如果这样会浪费太多资源;
- 为解决上述问题,启用nginx的虚拟主机即可;
- 虚拟主机有两种模式,基于IP或者基于域名
-
基于IP的虚拟主机
[root@localhost ~]# ip addr add 172.25.254.111/24 dev ens160 [root@localhost ~]# ip addr add 172.25.254.222/24 dev ens160 [root@localhost ~]# mkdir -p /usr/share/nginx/vhostroot/{111,222}/html [root@localhost ~]# echo 172.25.254.111 > /usr/share/nginx/vhostroot/111/html/index.html [root@localhost ~]# echo 172.25.254.222 > /usr/share/nginx/vhostroot/222/html/index.html [root@localhost ~]# vim /etc/nginx/conf.d/vhost_ip.conf server{ listen 172.25.254.111:80; location / { root /usr/share/nginx/vhostroot/111/html; index index.html } } server{ listen 172.25.254.222:80; location / { root /usr/share/nginx/vhostroot/222/html; index index.html } } [root@localhost ~]# curl 172.25.254.222:8080 172.25.254.222 [root@localhost ~]# curl 172.25.254.111 172.25.254.111
-
基于域名的虚拟主机
[root@localhost ~]# mkdir -p /usr/share/nginx/vhostroot/{bbs,news}/html [root@localhost ~]# echo news.easylee.org > /usr/share/nginx/vhostroot/news/html/index.html [root@localhost ~]# echo bbs.easylee.org > /usr/share/nginx/vhostroot/bbs/html/index.html [root@localhost ~]# vim /etc/nginx/conf.d/vhost_name.conf server { listen 80; server_name bbs.easylee.org; location / { root /usr/share/nginx/vhostroot/bbs/html; index index.html; } } server { listen 80; server_name news.easylee.org; location / { root /usr/share/nginx/vhostroot/news/html; index index.html; } }
-
测试
[root@localhost conf.d]# curl news.easylee.org
news.easylee.org
[root@localhost conf.d]# curl bbs.easylee.org
news.easylee.org -
注意:在测试时因为虚拟主机是基于域名的,执行测试命令的主机需要做本地解析
在linux中
[root@localhost ~]# vim /etc/hosts
172.25.254.100 bbs.easylee.org news.easylee.org在windows中,编辑文件 C:\Windows\System32\drivers\etc\hosts
172.25.254.100 bbs.easylee.org news.easylee.org
-
-
web服务器的访问控制
-
基于IP的访问控制
-
设置访问控制
[root@localhost ~]# mkdir -p /usr/share/nginx/vhostroot/bbs/html/admin [root@localhost ~]# echo admin page > /usr/share/nginx/vhostroot/bbs/html/admin/index.html [root@localhost ~]# vim vhost_name.conf server { listen 80; root /usr/share/nginx/vhostroot/bbs/html; index index.html index.htm; server_name bbs.easylee.org; location / { } location /admin/ { allow 172.25.254.100; deny all; } }
-
测试
在100中访问 [root@localhost ~]# curl bbs.easylee.org/admin/ admin page 在其他主机中访问 ] ➤ curl bbs.easylee.org/admin/ <html> <head><title>403 Forbidden</title></head> <body> <center><h1>403 Forbidden</h1></center> <hr><center>nginx/1.24.0</center> </body> </html>
-
-
基于认证的访问控制
-
建立认证文件按
[root@localhost ~]# dnf install httpd-tools -y [root@localhost ~]# htpasswd -cm /etc/nginx/.htpasswd admin New password: Re-type new password: Adding password for user admin 注意:htpasswd -c 表示新建认证文件,无论认证文件存不存在 当认证文件存在时加-c参数会把认证文件之前的内容全部清空
-
设置认证访问控制
[root@localhost ~]# vim vhost_name.conf server { listen 80; root /usr/share/nginx/vhostroot/bbs/html; index index.html index.htm; server_name bbs.easylee.org; location / { } location /admin/ { auth_basic on; auth_basic_user_file /etc/nginx/.htpasswd; } }
-
测试
未输入用户密码 [root@localhost ~]# curl bbs.easylee.org/admin/ <html> <head><title>401 Authorization Required</title></head> <body> <center><h1>401 Authorization Required</h1></center> <hr><center>nginx/1.24.0</center> </body> </html> 输入用户没密码 [root@localhost ~]# curl bbs.easylee.org/admin/ -uadmin:lee admin page
-
-
3.6 web服务器的数据加密(https)
- https简介
- HTTP协议以明文方式发送内容,不提供任何方式的数据加密,HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等;
- 为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。
- HTTPS全称:Hyper Text Transfer Protocol over Secure Socket Layer ),是以安全为目标的HTTP通道;
- HTTPS并不是一个新协议,而是HTTP+SSL(TLS);
- 原本HTTP先和TCP直接通信,而加了SSL后,就变成HTTP先和SSL通信,再由SSL和TCP通信相当于SSL被嵌在了HTTP和TCP之间。
- 注意:SSL 是"Secure Sockets Layer"的缩写,中文叫做"安全套接层"。它是在上世纪90年代中期,由网景公司设计的。到了1999年,SSL 应用广泛,已经成为互联网上的事实标准。IETF 就把SSL 标准化。标准化之后SSL被改为 TLS(Transport Layer Security传输层安全协议)
- https握手流程
-
部署https
-
生成密钥
[root@localhost ~]# mkdir -p /etc/nginx/certs [root@localhost ~]# openssl req -newkey rsa:2048 -nodes -sha256 -keyout /etc/nginx/certs/easylee.org.key -x509 -days 365 -out /etc/nginx/certs/easylee.org.crt -------------------------------------- 按照提示填入相应信息 Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:Shannxi Locality Name (eg, city) [Default City]:Xi'An Organization Name (eg, company) [Default Company Ltd]:easylee Organizational Unit Name (eg, section) []:web Common Name (eg, your name or your server's hostname) []:www.easylee.org Email Address []:lee@easylee.org # 查看证书内容 [root@localhost ~]# openssl x509 -in easylee.org.crt -text -noout 我们生成的证书需要通过CA机构认证才能投入生产环境中 CA就是一个公认的公证单位,你可以自行产生一把密钥且制作出必要的证书数据并向CA单位注册,那么当客户端的浏览器在浏览时,该浏览器会主动向CA单位确认该证书是否为合法注册过,如果是,那么该次连接才会建立,如果不是,浏览器会发出警告信息,告知用户应避免建立连接
-
配置nginx开启https功能
[root@localhost ~]# mkdir /usr/share/nginx/vhostroot/login/html -p [root@localhost ~]# echo login.easylee.org > /usr/share/nginx/vhostroot/login/html/index.html [root@localhost ~]# vim /etc/nginx/conf.d/https.conf server { listen 443 ssl; server_name login.easylee.org; ssl_certificate /etc/nginx/certs/easylee.org.crt; #证书 ssl_certificate_key /etc/nginx/certs/easylee.org.key; #密钥 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #支持版本 ssl_ciphers HIGH:!aNULL:!MD5; #加密方式 location / { root /usr/share/nginx/vhostroot/login/html; index index.html; } } # 检查 Nginx 配置文件语法错误的命令 [root@localhost ~]# nginx -t # 在不停止 Nginx 服务的情况下,重新加载配置文件 [root@localhost ~]# nginx -s reload 当开启https后客户一般情况下不会在浏览器中特别添加https去访问,我们需要强制客户在访问某些站点时使用加密
-
强制访问加密
[root@localhost ~]# /etc/nginx/conf.d/https.conf server { listen 80; server_name login.easylee.org; rewrite ^/(.*)$ https://login.easylee.org/$1 permanent; } ^/(.*)$ 这时正则表达式语法表示匹配浏览器地址栏中的所有内容 $1 login.easylee.org/xxx 这个地址转换时保留xxx permanent 表示永久转换301
-
3.7 搭建动态网站
动态网站指网站内容可根据不同情况动态变更的网站,一般情况下动态网站通过数据库进行架构。
动态网站除了要设计网页外,还要通过数据库和编程序来使网站具有更多自动的和高级的功能。
动态网页:使用网页脚本语言,比如php、JSP等,通过脚本将网站内容动态存储到数据库,用户访问网站是通过读取数据库来动态生成网页的方法。
-
配置web服务器对php站点的支持
-
下载php并启动服务
[root@localhost ~]# dnf install php -y [root@localhost ~]# systemctl enable --now php-fpm.service
-
生成php测试页
[root@localhost ~]# mkdir -p /usr/share/nginx/html/php [root@localhost ~]# vim /usr/share/nginx/html/php/index.php <?php phpinfo(); ?> [root@localhost ~]# nginx -s reload
-
直接访问172.25.254.100/index.php
-
地址栏中的所有内容
$1 login.easylee.org/xxx 这个地址转换时保留xxx
permanent 表示永久转换301
```
3.7 搭建动态网站
动态网站指网站内容可根据不同情况动态变更的网站,一般情况下动态网站通过数据库进行架构。
动态网站除了要设计网页外,还要通过数据库和编程序来使网站具有更多自动的和高级的功能。
动态网页:使用网页脚本语言,比如php、JSP等,通过脚本将网站内容动态存储到数据库,用户访问网站是通过读取数据库来动态生成网页的方法。
-
配置web服务器对php站点的支持
-
下载php并启动服务
[root@localhost ~]# dnf install php -y [root@localhost ~]# systemctl enable --now php-fpm.service
-
生成php测试页
[root@localhost ~]# mkdir -p /usr/share/nginx/html/php [root@localhost ~]# vim /usr/share/nginx/html/php/index.php <?php phpinfo(); ?> [root@localhost ~]# nginx -s reload
-
直接访问172.25.254.100/index.php
-