Linux学习——4_WEB服务器的部署及优化
WEB服务器的部署及优化
用户常用关于web信息
什么是www
www是world wide web的缩写,即万维网,也就是全球信息广播
通常说的上网就是使用www来查询用户所需要的信息。
www可以结合文字、图形、影像以及声音等多媒体,超链接的方式将信息以Internet传递到世界各
处。
当连接www网站,该网站会提供一些数据,客户端要使用可以解析这些数据的软件来处理,那就是浏览器
网址
URI:Uniform Resource Identifier统一资源标识,分为URL和URN
URN:Uniform Resource Naming,统一资源命名,P2P下载使用的磁力链接是URN的一种实现
URL:Uniform Resorce Locator,统一资源定位符用于描述某服务器某特定资源位置
两者区别:而URL提供查找该事物的方法。URN仅用于命名,而不指定地址
URL组成
<scheme>://<user>:<password>@<host>:<port>/<path>:<params>?<query>#<frag>
scheme | 方案 | 访问服务器以获取资源时要使用哪种协议 |
user | 用户 | 某些方案访问资源时需要的用户名 |
password | 密码 | 用户对应的密码,中键用 : 分隔 |
host | 主机 | 资源主服务器的主机名或IP地址 |
port | 端口 | 资源主服务器正在监听的端口号,很多方案有默认端口号 |
path | 路径 | 服务器资源的本地名,由一个 / 将其与前面的URL组件分隔 |
params | 参数 | 指定输入的参数,参名为 / 值对,多个参数用 ; 分隔 |
query | 查询 | 传递参数给程序,如数据库,用 ? 分隔,多个查询用 & 分隔 |
frag | 片段 | 一小片或一部分资源的名字,此组件在客户端使用,用 # 分隔 |
HTTP简介
什么是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
http工作机制
一次http事务包括:
http请求:http request
http响应: http response
Web资源: web resource
一个网页由多个资源(文件)构成,打开一个页面,通常会有多个资源展示出来,但是每个资源都要单独请求。因此,一个"Web页面”通常并不是单个资源,而是一组资源的集合
资源类型:
静态文件:无需服务端做出额外处理,服务器端和客户端的文件内容相同
常见文件后缀:.html,.txt,.jpg,.js,.css,mp3,avi
动态文件:服务端执行程序,返回执行的结果,服务器端和客户端的文件内容不相同
常见文件后缀:.php,jsp,asp
web中常用语言介绍
html语言 超文本标记语言
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>HTML语言</title>
</head>
<body><h1 style="color: red;">hello</h1><p><a href="www.baidu.com">百度</a></p>
</body>
</html>
css 层叠样式表 表述网站的风格
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>HTML语言</title><link rel="stylesheet" href="./1.css">
</head>
<body><h1>css演示</h1><p>CSS不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。</p><p class="ex">class</p>
</body>
</html>
body{color: red;
}
h1{color: yellow;
}
p.ex{color: blue;
}
js实现html和css实现不了的功能比如动画效果
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><h2>js</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视频类型 |
http访问请求完整过程
1.建立连接:
TCP的3次握手建立链接,向服务器发送http请求,服务器拒绝或允许
2.接受请求
接受客户端请求报文对某个资源的一次请求过程web响应访问模型
a.单进程I/O模型:启动一个进程处理用户请求,而且一次只处理一个,多个请求被串行响应
b.多进程I/O模型:并行启动多个进程,每个进程响应一个连接请求
c.复用I/O结构:启动一个进程,同时响应N个连接请求
d.复用的多进程I/O模型:启动M个进程,每个进程响应N个连接请求,同时接收M*N个请求
3.处理请求:
服务器对请求报文进行解析,并获取请求的资源及请求方法等相关信息,根据方法,资源,首部和可选的主体部分对请求进行处理常用请求Method: GET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS
4.访问资源:
服务器获取请求报文中请求的资源web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态运行后生成的资源
5.构建响应报文:
一旦Web服务器识别除了资源,就执行请求方法中描述的动作,并返回响应报文。响应报文中包含有响应状态码、响应首部,如果生成了响应主体的话,还包括响应主体
响应实体:如果事务处理产生了响应主体,就将内容放在响应报文中回送过去。响应报文中通常包括:
描述了响应主体MIME类型的Content-Type首部
描述了响应主体长度的Content-Length
实际报文的主体内容
1)URL重定向:web服务构建的响应并非客户端请求的资源,而是资源另外一个访问路径
2)MIME类型:Web服务器要负责确定响应主体的MIME类型。多种配置服务器的方法可将MIME类型与资源管理起来
6.发送响应报文
Web服务器通过连接发送数据时也会面临与接收数据一样的问题。服务器可能有很多条到各个客户端的连接,有些是空闲的,有些在向服务器发送数据,还有一些在向客户端回送响应数据。服务器要记录连接的状态,还要特别注意对持久连接的处理。对非持久连接而言,服务器应该在发送了整条报文之后,关闭自己这一端的连接。对持久连接来说,连接可能仍保持打开状态,
http协议报文头部结构
请求报文
请求报文由三部分组成即:开始行(请求行)、首部行(请求头部)、实体主体(请求体)
开始行:请求方法 url 版本 CRLF
首部行通常用键值表示
空格
实体主体数据,一般在post动作中可以提看到
开始行中的请求方法:
方法 | 描述 |
GET | 请求指定页面信息,返回实体主体 |
HEAD | 类似get请求,但返回响应中没有主体内容,用户获取包头 |
POST | 向指定资源提交数据请求,数据包含在请求中,此请求可能会生成新的资源或修改已有资源 |
PUT | 从客户端向服务端传送数据取代指定的文档内容 |
DELETE | 请求服务器删除指定页面 |
CONNECT | 通常被用于通过 HTTP 代理服务器来建立与其他服务器的安全连接。 |
OPTIONS | 允许客户端查看服务器的性能 |
TRACE | 回显服务器收到的请求 |
响应报文
响应报文由三部分组成即:开始行(响应行)、首部行(响应体)、实体主体(报文主体)
开始行:http版本 状态码 短语 CRLF
首部行通常用键值表示
空格
实体主体数据,即获取内容
状态代码
状态码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值
状态码 | 含义 | 详解 |
1xx | 指示信息 | 表示求情已接收,继续处理 |
2xx | 成功 | 表示请求已被成功接收、理解、接收 |
3xx | 重定向 | 要完成请求必须进行更进一步的操作 |
4xx | 客户端错误 | 请求有语法错误或请求无法实现 |
5xx | 服务器错误 | 服务器未能实现合法的请求 |
常见状态代码、状态描述的说明如下:
状态码 | 含义 |
200 OK | 客户端请求成功 |
400 Bad Request | 客户端请求有语法错误,不能被服务器所理解 |
401 Unauthorized | 请求未经授权,这个状态码必须和WWW-Authenticate报头一起使用 |
403 Forbidden | 服务器收到请求,但是拒绝提供服务 |
404 Not Fount | 请求资源不存在,例如输入错误的URL |
500 Internal Server Error | 服务器发生不可预期的错误 |
503 Server Unavailable | 服务器当前不能处理客户端的请求,一段时间后可能恢复正常 |
web服务器的配置
web服务的常用种类
Apache
Nginx
openresty
大厂自研
Nginx的安装
开源版本的Nginx官网:http://nginx.org
Nginx在安装的过程中可以选择源码安装也可以选择使用软件包安装
源码安装下载相应的源码压缩包解压后编译完成安装
软件安装包可以使用rpm或者apt命令进行安装,也可以使用dnf通过软件仓库安装
关闭防火墙
启动服务
[root@localhost ~]# systemctl start nginx.service
Nginx涉及到的文件
相关配置文件的作用
主配置目录:/etc/nginx
相关配置文件:/etc/nginx/
[root@localhost ~]# tree /etc/nginx
/etc/nginx
├── conf.d #子配置目录
│ └── vhosts.conf
├── default.d
├── fastcgi.conf
├── fastcgi.conf.default
├── fastcgi_params #fastci变量文件,用于识别php
├── fastcgi_params.default
├── koi-utf
├── koi-win
├── mime.types #媒体文件
├── mime.types.default
├── nginx.conf #主配置文件
├── nginx.conf.default
├── scgi_params #scgi变量文件,用于识别perl
├── scgi_params.default
├── uwsgi_params #uwsgi变量文件,用于识别python
├── uwsgi_params.default
└── win-utf[root@localhost ~]# ls /var/log/nginx/ #日志文件
Nginx配置文件内容详解
nginx全局配置
[root@localhost nginx]# cat nginx.confuser nginx; #nginx程序运行用户
worker_processes auto; #开启work进程数量
error_log /var/log/nginx/error.log; #错误日志
pid /run/nginx.pid; #pid文件include /usr/share/nginx/modules/*.conf;events {worker_connections 1024; #可接受最大连接数
}
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; #nginx服务器是否使用sendfile()传输文件tcp_nopush on; #当包累计到一定大小后就发送,默认0.2s一次tcp_nodelay on;keepalive_timeout 65; #长连接超时时间types_hash_max_size 4096;include /etc/nginx/mime.types; #可解析的静态资源类型default_type application/octet-stream; #用来配置nginx响应前端请求默认的MIME类型server {listen 80; #监听端口listen [::]:80;server_name _; #服务器的名字root /nginx/html; #默认发布目录index 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 {}}include /etc/nginx/conf.d/*.conf;}
Nginx配置
Nginx虚拟主机
默认情况下nginx只能发布一个站点
如果要发布多个站点需要搭建多台nginx来满足,如果这样会浪费太多资源
为解决上述问题,启用nginx的虚拟主机即可
虚拟主机有两种模式,基于IP或者基于域名
基于IP的虚拟主机
[root@localhost ~]# ip a a 172.25.254.101/24 dev ens160
[root@localhost ~]# ip a a 172.25.254.102/24 dev ens160
[root@localhost ~]# mkdir /nginx/virtual/timinglee.org/{news,bbs}/html
[root@localhost timinglee.org]# ls -ld /nginx/virtual/timinglee.org/{news,bbs}/html
drwxr-xr-x 2 root root 24 Nov 29 20:56 /nginx/virtual/timinglee.org/bbs/html
drwxr-xr-x 2 root root 24 Nov 29 20:57 /nginx/virtual/timinglee.org/news/html
[root@localhost ~]# echo bbs.timinglee.org > /nginx/virtual/timinglee.org/bbs/html/index.html
[root@localhost ~]# echo news.timinglee.org > /nginx/virtual/timinglee.org/news/html/index.html
[root@localhost ~]# vim /etc/nginx/nginx.confuser nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;include /usr/share/nginx/modules/*.conf;events {worker_connections 1024;
}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;server {listen 80;listen [::]:80;server_name _;root /nginx/html;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 {}}include /etc/nginx/conf.d/*.conf;}[root@localhost ~]# cd /etc/nginx/conf.d/
[root@localhost conf.d]# ls
vhosts.conf
[root@localhost conf.d]# vim vhosts.conf
server {listen 172.25.254.101:80;server_name bbs.timinglee.org;root /nginx/virtual/timinglee.org/bbs/html;index index.html;
}server {listen 172.25.254.102:80;server_name news.timinglee.org;root /nginx/virtual/timinglee.org/news/html;index index.html;
}[root@localhost conf.d]# systemctl restart nginx.service
[root@localhost conf.d]# curl 172.25.254.101
bbs.timinglee.org
[root@localhost conf.d]# curl 172.25.254.102
news.timinglee.org
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传输层安全协议)