综合架构——网站服务
第一节课
1.用户访问网站的流程
输入域名
DNS域名解析
建立连接TCP三次握手
发送HTTP请求报文
发送HTTP响应报文
释放连接TCP四次挥手
2.HTTP报文——请求报文、响应报文
HTTP请求报文
HTTP响应报文
详见:18 HTTP报文.xmind
3.状态码信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pgL3XgKd-1604670753034)(C:\Users\西泽Xiz\AppData\Roaming\Typora\typora-user-images\image-20201021005701038.png)]
4.URL和URI
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ioEPBxET-1604670753041)(C:\Users\西泽Xiz\AppData\Roaming\Typora\typora-user-images\image-20201021005714044.png)]
5.请求访问的资源信息:静态资源、动态资源
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-stAtcngR-1604670753044)(C:\Users\西泽Xiz\AppData\Roaming\Typora\typora-user-images\image-20201021005744349.png)]
伪静态:可以便于搜索引擎收录,也有数据库服务支持,实现交互,本质上仍为动态。
6.网站优劣测评方法和依据
-
根据用户IP地址数量进行统计:仅作参考,由于NAT,网站服务器只能记录一个公网IP
-
PV:页面访问量。
-
UV:记录独立访客数量
Cookie:标识用户身份信息,会保存在用户客户端本地
Session:记录用户用户的一些会话操作,记录在服务器中,eg:记录用户登录信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NrYjwABr-1604670753050)(C:\Users\西泽Xiz\AppData\Roaming\Typora\typora-user-images\image-20201021005800380.png)]
客户端访问过某个网站后会产生一个cookie,如同在网站上办了个会员卡,在这个会员卡中会产生交互信息记录,比如此网站上访问了什么页面,下载了什么图片;同时服务端的Session中会存放所有客户端会员及记录信息。
7.网站的并发
网站服务器在单位时间内能够处理的最大连接数;
8.常用的网站服务
静态:Apache(httpd)、Nginx
动态:PHP、Tomcat、Python
第二节课
〇、简介
-
nginx网站服务的特点
-
nginx服务部署安装
-
nginx目录结构介绍(站点目录)
-
nginx配置文件默认参数说明
-
nginx实现简单网络搭建
-
nginx服务一些常用应用(模块功能)
一、nginx特点
-
高并发(特别是静态资源)、占用系统资源少
-
不仅可以提供web服务,还可以提供负载均衡和缓存服务;
-
可以部署在多种操作系统上,平台可移植性强。
-
nignx实现网络通讯时使用的是异步网络IO模型:epoll模型,Apache使用select模型;(决定了为什么Apache不如nignx)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rSSuZdBI-1604670753053)(C:\Users\西泽Xiz\AppData\Roaming\Typora\typora-user-images\image-20201021010044758.png)]
epoll模型:宿舍管理员
你去找女朋友,查看人员登记信息表——回调select模型:宿舍管理员
你去找女朋友,宿管带你一个一个房间去找——线性轮询
二、nginx安装
1.yum安装:【推荐使用官方yum源安装】
-
更新官方yum源:http://nginx.org/en/linux_packages.html#RHEL-CentOS
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Svc4iFWN-1604670753056)(C:\Users\西泽Xiz\AppData\Roaming\Typora\typora-user-images\image-20201021010141061.png)]
-
安装与启动:
yum install -y nginx systemctl start nginx systemctl enable nginx
-
安装与启动:本地浏览器输入web服务器的IP地址。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B8aLXW4z-1604670753058)(C:\Users\西泽Xiz\AppData\Roaming\Typora\typora-user-images\image-20201021010246616.png)]
2.编译安装
-
在nginx.org官网查找
stable
版本,右键复制其链接; -
下载源码包:
wget http://nginx.org/download/nginx-1.18.0.tar.gz
PS:软件的依赖:
yum install -y penssl-devel yum install -y pcre-devel
-
解压
tar xf nginx-1.18.0.tar.gz
并进入目录中; -
编译安装三部曲:
①进行配置操作——
./configure
--prefix=PATH #设置程序的安装路径
--user=USER #设置一个虚拟用户管理worker进程(出于安全角度)
--group=GROUP #设置一个虚拟用户组…
②进行软件的编译过程——make
将高级语言编写的源文件–>编译–>系统能够识别的机器语言
③编译安装过程——make install
三、查看软件的目录结构:rpm -ql nginx
目录 | 说明 |
---|---|
/etc/logrotate.conf /etc/logrotate.d/xxx | 实现nginx日志文件定时切割处理 切割处理子配置文件 |
/etc/nginx/ | nginx主配置文件 |
/usr/sbin/nginx | 命令文件 |
/usr/share/nginx/html | 站点目录 |
/var/log/nginx | 日志文件 |
/etc/nginx/mime.types | 定义nginx可以识别的语言等内容,如html、css、js |
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G2hbPJRi-1604670753061)(C:\Users\西泽Xiz\AppData\Roaming\Typora\typora-user-images\image-20201021105230419.png)]
1. 利用专用文件切割程序——logrotate
[root@web01 ~]# vim /etc/logrotate.conf
#see "man logrotate" for details
#定义切割周期:daily、weekly、monthly
weekly
#定义保留几个切割后的文件
rotate 4
#create new (empty) log files after rotating old ones
#切割完创建一个源文件,不能说切割后,原始文件没有了,必须要创建出一个源文件来记录后面更新的日志信息
create
#定义脚标:如secure文件切割后生成secure202010
dateext #date extend
#uncomment this if you want your log files compressed
#切割后是否进行压缩处理,默认注释不压缩;
#compress
#加载包含/etc/logrotate.d/目录中文件配置(子配置文件)
include /etc/logrotate.d
#单独对某个文件进行切割配置(局部模块)
/var/log/wtmp {
monthly
create 0664 root utmp
minsize 1M #最小起码达到1M才切割
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NmbzfGPi-1604670753062)(C:\Users\西泽Xiz\AppData\Roaming\Typora\typora-user-images\image-20201021101156813.png)]
2.nginx服务配置文件
/etc/nginx/nginx.conf 主配置文件
[root@web01 nginx]# cat nginx.conf
--------------------- 第一部分:核心主区域 -------------------------------
user nginx; #定义worker进程的管理用户
worker_processes 1; #定义有几个worker进程,越多则并发能力越强,但并不是无限设定的,一般等于服务器CPU的核数
error_log /var/log/nginx/error.log warn; #定义错误日志
pid /var/run/nginx.pid; #定义文件pid路径信息,systemctl判断是否已经启动,就是根据pid文件是否存在
--------------------- 第二部分:事件区域 -------------------------------
events {
worker_connections 1024; #一个worker进程可以并发才处理1024个请求
}
--------------------- 第三部分:HTTP区域 -------------------------------
http {
include /etc/nginx/mime.types; #加载一个配置文件
default_type application/octet-stream;
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;
keepalive_timeout 65; #超时时间,一个连接持续65秒没有数据传输,则释放连接
#gzip on;
include /etc/nginx/conf.d/*.conf; #加载虚拟主机扩展配置文件
}
PS:nginx的进程
master process:主进程,管理服务是否能够正常运行(boss)
worker process:工作进程,处理用户的访问请求(employee)
所以kill进程的时候,只要不kill主进程,nginx会一直运行。
/etc/nginx/mime.types
当web服务器收到静态的资源文件请求时,依据请求文件的后缀名在服务器的MIME配置文件中找到对应的MIME Type,再根据MIME Type设置HTTP Response的Content-Type,然后浏览器根据Content-Type的值处理文件。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4crMgjWN-1604670753063)(C:\Users\西泽Xiz\AppData\Roaming\Typora\typora-user-images\image-20201021195009257.png)]
/etc/nginx/conf.d/default 虚拟主机配置文件
配置一个www站点、bbs站点、blog站点,即一个虚拟主机;
[root@web01 ~]# vim /etc/nginx/conf.d/default.conf
--------------------- 第四部分:Server区域 -------------------------------
server {
listen 80; #指定侦听端口
server_name localhost; #指定网站域名
location / {
root /usr/share/nginx/html; #定义站点目录的位置
index index.html index.htm; #定义首页文件
}
error_page 500 502 503 504 /50x.html; #优雅显示界面
location = /50x.html {
root /usr/share/nginx/html;
}
}
第三节课
一、nginx服务一些常见应用(模块功能)
1.利用nginx服务搭建一个网站
**第一个里程:**编写虚拟主机配置文件
注意分号结尾,不存在冒号!
[root@web01 ~]# cd /etc/nginx/conf.d/
[root@web01 conf.d]# vim www.conf
server{
listen 80;
server_name www.loto.com;
location / {
root /usr/share/nginx/html;
index helloworld.html;
}
}
理解location
location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作。
客户端访问www.loto.com的时候,浏览器会自动转换为http://www.loto.com/;location设为“/”,nginx会自动去找/模块;
如果location配置为/loto,客户端使用www.loto.com,表示想要去找匹配/模块,而配置文件中不存在,所以报错404;
(也就是匹配URI)
www.conf文件中,指明了访问loto.com域名中的www虚拟主机,而location则是用于与用户输入的URI进行匹配;
如:用户输入www.loto.com,则去匹配www主机中的location /,然后获取页面
用户输入www.loto.com/shop,则去匹配www主机中的location /shop ,然后获取页面,但必须在站点目录下有shop目录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3mDkXWK0-1604670753065)(C:\Users\西泽Xiz\AppData\Roaming\Typora\typora-user-images\image-20201021235421781.png)]
**第二个里程:**进入站点目录部署代码
[root@web01 ~]# cd /usr/share/nginx/html
[root@web01 html]# vim helloworld.html
#xxxxxxxxx html代码
**第三个里程:**重启nginx
[root@web01 html]# nginx -t #检查语法
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web01 html]# systemctl reload nginx
**第四个里程:**模拟配置DNS解析
打开Windows,C:\Windows\System32\drivers\etc\hosts
添加10.0.0.7 www.loto.com
**第五个里程:**测试
2.利用nginx服务搭建多个网站
-
首先在html目录下创建多个站点目录:/html/www /html/bbs /html/blog
-
在每个站点目录下添加index文件
-
编辑虚拟主机配置文件:在/etc/nginx/conf.d/目录下,添加www.conf bbs.conf blog.conf
server{ listen 80; server_name bbs.loto.com; location / { root /html/bbs; index index.html; } } server{ listen 80; server_name blog.loto.com; location / { root /html/blog; index index.html; } } server{ listen 80; server_name www.loto.com; location / { root /html/www; index index.html; } }
-
编写DNS配置文件
Linux或Windows中修改hosts文件:10.0.0.7 www.loto.com bbs.loto.com blog.loto.com
-
重启服务
-
访问测试——虚拟主机访问方式
-
使用域名访问
-
使用IP地址访问
问题1:使用10.0.0.7访问,结果跳转的是bbs界面,如何常规的跳转至www界面呢?
使用ll命令查看/etc/nginx/conf.d/目录,会发现列出的配置文件中,bbs排在第一位;nginx服务运行时,会在/etc/nginx/nginx.conf配置文件中执行到include语句,链接加载/etc/nginx/conf.d/目录下的子配置文件,所以第一个被加载的即bbs。因此,只需要在/etc/nginx/nginx.conf的include语句前,加上include /etc/nginx/conf.d/www.conf即可。
一台web服务器可能有多个IP地址,可以通过10.0.0.7访问,也可以通过172.16.1.7访问;可以在conf配置文件中添加listen语句实现只能通过指定的端口访问主机;如
listen 10.0.0.7:80;
-
通过域名访问
-
二.页面访问原理
-
DNS解析 www.loto.com -->> 10.0.0.7
-
建立TCP三次握手:IP地址+端口号
-
客户端发出HTTP请求报文
请求报文有host字段:www.loto.com
和端口字段:80
-
没有找到相同域名的虚拟主机文件后,会去匹配端口号
-
显示主机的网站页面
三.企业中网站的安全访问控制
1.根据用户访问的地址进行控制
对于www.loto.com/AV,实现内网用户可以访问,外网用户不能访问;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jum2Ezct-1604670753066)(C:\Users\西泽Xiz\AppData\Roaming\Typora\typora-user-images\image-20201023180808541.png)]
2.根据用户访问进行认证
- nginx认证模块:ngx_http_auth_basic_module
#Example:
location / {
auth_basic "closed site"; #开启认证功能
auth_basic_user_file conf/password; #密码文件
}
- 编写虚拟主机配置文件:
location /AV {
root /html/www;
index index.html;
auth_basic "loto"; #引号内容起到提示作用,无所谓,重点要写上auth_basic;
auth_basic_user_file password/htpasswd; #建议使用相对路径
}
- 创建密码文件——
htpasswd
命令
- htpasswd参数说明
参数 | 说明 |
---|---|
-c Create a new file. | 创建一个密码文件 |
-b Use the password from the command line rather than prompting for it. | 免交互方式,输入密码信息。 |
- 秒交互创建密码文件
[root@web01 password]# htpasswd -bc ./htpasswd loto 123456
Adding password for user loto
[root@web01 password]# cat htpasswd
loto:$apr1$8NKzToCA$c/uaRfipPlnNZwj8.6sEE0
- 重启服务。
密码文件的权限问题:
当密码文件的权限被设置为600时,访问www.loto.com/AV时,报错如下:
原因分析:
用户访问web服务器时,admin身份会在服务端被转换为虚拟用户nginx;访问/AV目录的时候,还需要去请求认证。但是对于服务端文件而言,属主属组默认情况下均为root;nginx用户对于此文件来说,属于“其他人”,且权限为0;所以会报错;
解决方法:
chown nginx htpasswd
或者不修改属主,将“其他人”的权限设为可读:chmod o+r htpasswd
第四节课
一、利用nginx服务搭建网站文件共享服务(网站页面索引目录)
编写配置文件mirrors.conf
使用的模块:ngx_http_autoindex_module
server {
listen 80;
server_name mirrors.loto.com;
location /{
root /html/mirrors;
index nothing.html; #必须要指定一个不存在的index
autoindex on; #核心
}
}
站点中放置的iso文件,点击后会自动下载;txt文件会自动进入查看其文本内容;
那如何使txt文件也下载呢?
将mime.types媒体资源类型文件中的“txt”删除,使得其不知道txt对应的是何种文件类型,从而默认下载;
mime.types文件的作用:
文件中有的扩展名信息资源,进行访问时会直接看到数据内容;
文件中没有扩展名信息资源,进行访问时会直接下载资源。
二、页面字符修改(乱码问题)
www.loto.com/AV
解决方法:
在配置文件中加入charset utf-8
即可。
三、网站别名功能
四、监控功能
状态模块:ngx_http_stub_status_modules
- 编写配置文件
[root@web01 conf.d]# vim state.conf
server{
listen 80;
server_name state.loto.com;
stub_status; ########重点
}
-
添加hosts解析信息
-
重启并测试
-
Active connections:激活连接数。
-
accepts:接收的TCP连接数汇总。
-
handled:处理的TCP连接数汇总。
通常,accepts和handled的值都是相同的,用户发送一个请求,服务器处理一个请求。但是当服务器端资源受限时(比如进程连接数受限),会出现两值不相等的现象。
nginx服务端总共最大能处理的并发连接数=worker进程数×worker连接数,如果其总值为4096,当第4097个连接请求发送过来时,服务器无法处理,会出现accepts=4097,handled=4096.
-
request:总计的HTTP请求数量。
当使用TCP长连接的时候,request的值一般都大于accepts和handled,因为一个TCP连接可以处理多个HTTP请求。
当使用TCP短链接的时候,三个值一般都是相同的。
如何指定使用长连接或短链接?
修改主配置文件/etc/nginx/nginx.conf,将其值置为0即可。
-
Waiting:等待队列中的请求数。
五、错误日志
错误日志:/var/log/nginx/error.log
在nginx主配置文件中,可以设定不同的错误级别,根据不同的级别定义error.log中所记录的信息;共有如下几个级别,从debug开始,问题严重性逐渐递增,相对应所记录的信息逐渐递减;如:debug级别会记录状态信息和错误信息,而当设定为emerg级别的时候,只有当服务瘫痪的时候,才会将错误记录在日志中。
所以比较建议使用warn或者error级别。
如何设定错误级别?
修改nginx主配置文件:error_log /var/log/nginx/error.log warn;
错误级别
错误级别 | 说明信息 |
---|---|
debug | 调试级别,服务运行的状态信息和错误信息会详细显示 |
info | 信息级别,只显示重要的运行信息和错误信息 |
notice | 通知级别,更加重要的信息进行通知说明 |
warn ★推荐 | 警告级别,可能出现了一些错误信息,但不影响服务运行 |
error ★推荐 | 错误级别,服务运行出现了错误,需要纠正 |
crit | 严重级别,必须修改调整 |
alert | 严重警告级别,即警告且必须修正错误 |
emerg | 灾难级别,服务不能正常运行了。 |
六、访问日志
-
访问日志:/var/log/nginx/access.log
-
nginx主配置文件中关于访问日志的模块信息:
#定义日志模板 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;
-
默认配置下,所有站点的访问信息全部都存放在access.log目录中,为了方便起见,可以将主配置文件中的
access_log /var/log/nginx/access.log main;
写入单独的配置文件中。如:www.conf中加入/var/log/nginx/access_of_www.log main;
bbs.conf中加入/var/log/nginx/access_of_bbs.log main;
-
模板格式:
10.0.0.2 - loto [29/Oct/2020:13:20:20 +0800] "GET /AV/ HTTP/1.1" 200 237 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "-"
模板中的变量 例子 含义 $remote_addr 10.0.0.2 显示用户访问源IP地址信息 $remote_user loto 显示认证的用户信息,设置auth认证了才会有 $time_local 29/Oct/2020:13:20:20 +0800 访问时间 $request “GET /AV/ HTTP/1.1” 请求报文的请求行信息 $status 200 状态码信息 $body_bytes_sent 237 响应的数据包大小,可用此统计消耗流量 $http_referer - 从主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。可以防止盗链。 $http_user_agent Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36 记录用户使用的客户端软件 $http_x_forwarded_for 负载均衡 盗链行为
第三方网站oldman中需要某些资源,而这些资源在oldboy网站中已经有了。oldman在页面代码中直接使用src链接到oldboy的资源。用户最终访问的还是oldboy的资源。且耗费下载的数据信息,耗费的也是oldboy的资源;
即:oldboy为oldman做了件漂亮的嫁衣,且用户以为这些东西都是oldman的。
-
日志格式优化
中文格式化:
log_format style '客户源地址:$remote_addr 认证用户信息:$remote_user 访问时间:$time_local' '请求行信息:$request 状态码信息:$status' '响应数据包大小:$body_bytes_sent' '调用链接信息:$http_referer 负载均衡信息:$http_x_forwarded_for' '客户端软件信息:$http_user_agent';
格式应用:
vim www.conf access_log /var/log/nginx/access_of_www.log style; vim bbs.conf access_log /var/log/nginx/access_of_bbs.log style; vim bbs.conf access_log /var/log/nginx/access_of_bbs.log style; vim bbs.conf access_log /var/log/nginx/access_of_bbs.log style; vim bbs.conf access_log /var/log/nginx/access_of_bbs.log style; .........
七、优雅显示界面
location /{
root /html/www
error_page 404 /404.jpg ###重点
}
八、location详解
Syntax: location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
Default: —
Context: server, location
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}
The “
/
” request will match configuration A, the “/index.html
” request will match configuration B, the “/documents/document.html
” request will match configuration C, the “/images/1.gif
” request will match configuration D, and the “/documents/1.jpg
” request will match configuration E.
九、利用nginx实现页面跳转功能
利用rewrite实现 loto.com ------> www.loto.com
######################### 这样是存在问题的 ##########################
#用户通过loto.com来访问之后,会执行rewrite,告诉客户端loto.com已经跳转至www.loto.com
#客户端浏览器会再通过www.loto.com访问,客户端还会执行rewite,告诉已经跳转至www.loto.com
#入此反复,产生死循环。
#因为server_name中www.loto.com和loto.com写在了一块,不论是www.loto.com来访,还是loto.com,都会要求跳转
server{
listen 80;
server_name www.loto.com loto.com; #需要加入别名
rewrite ^/(.*) http://www.loto.com/$1 permanent; #核心,重写规则配置
location / {
root /html/www;
index index.html;
}
}
#解决方案一:在原链接的server标签之上,再添加一个server标签
server{
server_name loto.com;
rewrite ^/(.*) http://www.loto.com/$1 permanent;
}
#解决方案二:再server模块使用if判断 ★★★★
server{
listen 80;
server_name www.loto.com loto.com; #此处必须写上loto.com,否则会报错!!!!!
access_log /var/log/nginx/access_of_www.log style;
#$host指的是用户输入的网址;~*表示不区分大小写;^loto.com$表示以loto开头,com结尾;
#如果用户访问所输入的网址,是以loto开头com结尾的,则跳转至www.loto.com
if ($host ~* "^loto.com$") {
rewrite ^/(.*) http://www.loto.com/$1 permanent;
}
...
}
^/:匹配URL
(.*):匹配URI
跳转方式:
永久跳转:permanent 301 会将跳转信息缓存至客户端本地
临时跳转:redirect 302 不会缓存跳转信息,每次都由nginx完成跳转
- 永久跳转与临时跳转
- 永久跳转原理301:
-
临时跳转原理302:
临时跳转不会将新的域名缓存至本地,每次都通过老域名访问服务器时,都由nginx服务器来完成新老域名的映射跳转;
- nginx的rewrite重写企业应用场景:
-
可以调整用户浏览的URL,使其看起来更规范,合乎开发及产品人员的需求。
-
为了让搜索引擎收录网站内容,并让用户体验更好,企业会将动态URL伪装成静态地址提供服务。
-
网站换新域名后,让旧域名的访问跳转到新域名上。