文章目录
- 1、集群阶段概述
- 5、Nginx安装与运行
- 7、Nginx显示默认首页过程解析
- 8、Nginx进程模型解析
- 9、Nginx处理Web请求机制解析
- 10、nginx.conf配置结构与语法指令
- 10 附:同步与异步,阻塞与非阻塞
- 12、nginx.conf核心配置文件
- 15、核心配置文件
- 16、nginx.pid打开失败以及失败的解决方案
- 17、Nginx常用命令解析
- 18、Nginx日志切割 - 手动
- 20、Nginx日志切割 - 定时
- 22、虚拟主机 - 使用Nginx为静态资源提供服务
- 24 附:root与alias
- 23、使用Gzip压缩提升请求效率
- 25、location的匹配规则解析
- 27、DNS域名解析
- 28、使用SwitchHosts 模拟本地域名解析访问
1、集群阶段概述
项目发展路程
单体部署
- 单节点
- 有条件的单体部署
单体架构的优点
- 小团队成型即可完成开发-测试-上线
- 迭代周期短,速度快
- 打包方便,运维省事
单体架构面临的挑战
- 单节点宕机造成所有服务不可用
- 耦合度太高(迭代,测试,部署)
- 单节点并发能力有限
针对措施:
第一点:集群可解决高可用
第二点:分布式、微服务来改进
第三点:通过负载均衡来降低服务器的负载压力,分发用户的请求到其他计算机节点,对于并发来讲,负载均衡只是解决并发的一种方案。
集群概念
- 计算机"群体"构成整个系统
- 这个"群体"构成一个整体,不能独立存在(内网互通)
- “人多力量大”,群体提升并发与可用性
只要是不同的服务器实现同样的业务,可以称之为集群;如果每个计算机节点的业务不同,称之为分布式。
集群
分布式的集群任务,如方向盘中4个人做就是集群,整体由3个任务组成汽车,形成了分布式的任务。
使用集群的优势
- 提高系统性能
- 提供系统可用性
当一个服务器宕机后,可使用其他计算机节点 - 可扩展性高(可伸缩性)
使用集群的注意点
- 用户会话
会话不能跨tomcat,所以要使用分布式会话,通过redis缓存实现分布式会话 - 定时任务
所有的计算机节点都会触发定时任务,会浪费计算机资源,所以统一使用定时任务或MQ的延时任务 - 内网互通
内网不互通,集群无法实现;
5、Nginx安装与运行
安装与运行
1.去官网http://nginx.org/下载对于的nginx包,推荐使用稳定版本2.上传nginx到linux系统
通过FileZilla工具传输文件
3.安装依赖环境
- 安装gcc环境
yum install gcc-c++
- 安装PCRE库,用于解析正则表达式
yum install -y pcre pcre-devel
- zlib压缩和解压缩依赖
yum install -y zlib zlib-devel
- SSL安全的机密的套接字协议层,用于HTTP安全传输,也就是https
yum install -y openssl openssl-devel
4.解压,需要注意,解压后得到的是源码,源码需要编译后才能安装
tar -zxvf nginx-1.20.2.tar.gz
5.编译之前,先创建nginx临时目录,如果不创建,在启动nginx的过程中会报错
mkdir /var/temp/nginx -p
6.在nginx目录,输入如下命令进行配置,目的是为了创建makefile文件
注:如果报错,则去创建该目录下的文件夹
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi
- 注:
\
代表在命令行中换行,用于提高可读性 - 配置命令:
命令 | 解释 |
---|---|
–prefix | 指定nginx安装目录 |
–pid-path | 指向nginx的pid |
–lock-path | 锁定安装文件,防止被恶意篡改或误操作 |
–error-log | 错误日志 |
–http-log-path | http日志 |
–with-http_gzip_static_module | 启用gzip模块,在线实时压缩输出数据流 |
–http-client-body-temp-path | 设定客户端请求的临时目录 |
–http-proxy-temp-path | 设定http代理临时目录 |
–http-fastcgi-temp-path | 设定fastcgi临时目录 |
–http-uwsgi-temp-path | 设定uwsgi临时目录 |
–http-scgi-temp-path | 设定scgi临时目录 |
7.编译与安装
# 编译
make
# 安装
make install
8.进入sbin目录启动nginx
# 查询nginx安装目录:
whereis nginx
# 进入sbin目录启动nginx
./nginx
9.打开浏览器,访问虚拟机所处内网ip即可打开nginx默认页面,显示如下便表示安装成功:
注意事项
1.如果在云服务器安装,需要开启默认的nginx端口:80
2. 如果在虚拟机安装,需要关闭防火墙
3. 本地win或mac需要关闭防火墙
卸载Nginx
1.首先输入命令 ps -ef | grep nginx
检查一下nginx服务是否在运行。停止Nginx服务
2.查找、删除Nginx相关文件
- 查看Nginx相关文件:
whereis nginx
- find查找相关文件
find / -name nginx
3.依次删除find查找到的所有目录:rm -rf /usr/local/nginx
4.最后使用yum清理依赖包
7、Nginx显示默认首页过程解析
请求Nginx默认页面
注:80端口是默认端口,url链接中可以选择不输入
/
代表是根路由
如果说有不同的多个端口,在后端也会同时有多个server去监听不同的端口,对应的都能找到server
8、Nginx进程模型解析
进程模型
nginx采用单主进程,多子进程(nginx.conf worker_processes 默认为1)的模型
- master进程:主进程
- worker进程:工作进程
master管理worker,master接收外部请求或指令,分配给worker去执行;
master会监控worker,worker发生异常退出时,master会重新启动新的worker来做相应的事情;
以下这些信号,都不是master做的,操作人员执行以下信号,master会传递给相应的worker去执行;
./nginx -s stop
./nginx -s quit
./nginx -s reload // 重新加载
./nginx -t // 检验配置文件是否正确
当操作人发送停止信号让worker去执行,当worker1、worker2没有连接客户端没有任何请求时,worker1、worker2会关闭;当worker3正在处理相应客户端的请求时,worker3不会直接关闭,会等待当前客户端连接释放后,请求处理完成之后才会关闭。
多进程虽然会带来额外的内存开销,采用多进程而不采用多线程的原因:
1.进程之间相互独立,互不影响,某一个worker出问题不会影响其他worker
2.不需要开发人员去额外关注线程安全性
9、Nginx处理Web请求机制解析
Worker抢占机制
master进程fork了3个worker进程,当客户端有请求进入到nginx时,
会有个控制锁accept_mutex,这个锁和client是对应的,这3个worker需要去争抢这个锁,抢到了以后才会处理相应的client;
传统服务器事件处理
假设client1请求阻发手塞,这时有新的请求client2、client3进来,不可以被worker1处理,因为worker1在阻塞中。
为了解决client1阻塞,master可以fork新的进程worker2,client2、client3就不会和worker1发生关系,会把请求落到worker2,如worker2正常进行,会处理完client2后处理client3
假设client2也发生了阻塞,client3会一直卡着,等到worker2处理完client2才会处理client3
为了解决client2阻塞,master会fork个worker3去处理client3
这种处理方式是同步阻塞的
性能会非常低,假设并发达到几十万几百万后,服务器会开很多的进程去处理很多的客户端,如果都是阻塞的,对于资源开销会非常大,导致云服务器成本会非常高
Nginx事件处理
client1连接到worker1,假设client1发生阻塞了,同时又有多个相应的客户端来请求worker1(client2,client3…),由于nginx本身是异步的、非阻塞的,worker1在处理client1时发现阻塞了,它会去护理下一个客户端请求client2,如果clent2又阻塞了,它会继续处理client3。
这是方式主要是因为对worker1进行了设置:
在linux上,基于epoll的一个事件机制(默认的机制),这是在linux上最适合的一种事件机制。
在不同的操作系统,有不同的工作模式;
如果在windons或者mocs系统上,需要进行配置;
使用epoll的工作进程worker一般可以处理 6-8万个请求,并发是很高的;并且worker是和cpu相关的,cpu越大处理并发能力越高,只要愿意砸钱,处理几十万几百万的并发是完全没有问题的;
worker可以设置连接数其实就是请求的并发数
events{
# 默认的可以不写
use:epoll
# 每个worker允许连接的客户端最大连接数,默认是1024
worker_connections 10240
}
对于Nginx来讲,为什么能达到那么高的并发?
抢占机制、异步非阻塞的通信模式(支持高并发类似于selector多路复用器)
10、nginx.conf配置结构与语法指令
nginx.conf配置结构
10 附:同步与异步,阻塞与非阻塞
上一节课程中提到了阻塞与非阻塞、同步与异步,很多人可能会认为同步就是阻塞,异步就是非阻塞,其实不是的。
这4个概念两两组合,会形成4个新的概念,如下:
1.同步阻塞:
客户端发送请求给服务端,此时服务端处理任务时间很久,则客户端则被服务端阻塞了,所以客户端会一直等待服务端的响应,此时客户端不能做其他任何事,服务端也不会接受其他客户端的请求。这种通信机制比较简单粗暴,但是效率不高。
2.同步非阻塞:
客户端发送请求给服务端,此时服务端处理任务时间很久,这个时候虽然客户端会一直等待响应,但是服务端可以处理i其他的请求,过一会回来处理原先的。这种方式很高效,一个服务端可以处理很多请求,不会再因为任务没有处理完而堵着,所以这是非阻塞的。
3.异步阻塞:
客户端发送请求给服务端,此时服务端处理任务时间很久,但是客户端不会等待服务器响应,他可以做其他的任务,等服务器处理完毕后再把结果响应给客户端,客户端得到回调后再处理服务端的响应。这种方式可以避免客户端一直处于等待的状态,优化了用户体验,其实就是类似于网页里发起的ajax异步请求。
4.异步非阻塞:
客户端发送请求给服务端,此时服务端处理任务时间很久,这个时候的任务虽然处理时间会很久,但是客户端可以做其他的任务,因为他是异步的,可以在回调函数里处理响应;同事服务端是非阻塞的,所以服务端可以去处理其他的任务,如此,患者模式就显得非常的高效了。
以上四点,除了第三点,其余的分别为BIO、NIO、AIO。
BIO/NIO/AIO之间的概念与区别:
1.BIO:
我去上厕所,这个时候坑位都满了,我必须等待坑位释放了,我才能上把?此时我啥都不干,站在厕所里盯着,过了一会有人出来了,我就赶紧蹲上去
2.NIO:
我去上厕所,这个时候坑位都满了,没关系,我出去干其他事,过会回来看看有没有空位,如果有我就蹲,如果没有出去接着干其他事。
3.异步阻塞:
我去上厕所,这个时候坑位都满了,没事我等着,等有了新的空位,让他通知我就行,通知了我,我就蹲上去
4.AIO:
我去上厕所,这个时候坑位都满了,没事,我去厕所外面干其他事,等有新的坑位释放了,会有人通知我的,通知我了,我就可以进去蹲了。
从这个生活实例中可以看出来:
- 同步:就是我需要自己每隔一段时间,以轮询的方式去看看有没有空的坑位。
- 异步:则是有人拉完会通知倪,通知你空再回去蹲
- 阻塞:就是在等待的过程中,你不去做其他任何事情,干等着
- 非阻塞:就是你在等待的过程中可以去做其他的事。
小结:异步的优势显而易见,大大优化用户体验,非阻塞是的系统资源开销远远小于阻塞模式,因为系统不需要创建新的进程(或线程),大大地节省了系统的资源,如此多出来的系统资源可以给其他中间件去服务了
12、nginx.conf核心配置文件
1.设置worker进程的用户,指的linux中的用户,会涉及到nginx操作目录或文件的已写权限,默认为nobody
use root
2.worker进程工作数设置,一般来说CPU有几个,就设置寄个,或者设置为N-1也行
worker_processes 1;
3.nginx日志级别debug | info | notice | warn | error | crit | alert | emerg
,错误界别从左到右越来越大
4.设置nginx进程pid
pid logs/nginx.pid
5.设置工作模式
events {
# 默认使用epoll
use epoll;
# 每个worker允许连接的客户端最大连接数
worker_connections 10240;
}
6.http是指令块,针对http网络传输的一些指令配置
http {
}
7.include引入外部配置,提高可读性,避免单个配置文件过大
include mime.types;
8.设定日志格式,main为定义的格式名称,如此access_log就可以直接使用这个变量了
参数名 | 参数意义 |
---|---|
$remote_addr | 客户端ip |
$remote_user | 远程客户端用户名,一般为:‘-’ |
$time_local | 时间和时区 |
$request | 请求的url以及method |
$status | 相应状态码 |
$body_bytes_send | 响应客户端内容字节数 |
$http_referer | 记录用户从哪个链接跳转过来的 |
$http_user_agent | 用户所使用的代理,一般来时都是浏览器 |
$http_x_forwarded_for | 通过代理服务器来记录客户端的ip |
9.sendfile
使用高效文件传输,提升传输性能。启用后才能使用tcp_nopush,是指当数据表累积一定大小后才发送,提高了效率。
sendfile on;
tcp_nopush on;
10.keepalive_timeout设置客户端与服务端i请求的超时时间,保证客户端多次请求的时候不会重复建立新的连接,节约资源损耗
#keepalive_timeout 0;
keepalive_timeout 65;
客户端发送多个请求,每个请求都需要各自独立的去连接传输数据,去创建连接;
http有个keep_alive模式,web服务器在处理完请求后可以保持TCP连接处于打开状态,如果接收到来自客户端的其他请求,服务端会利用这个还没有被关闭的连接继续处理,而不需要再次创建新的连接,这样大大节省了资源的开销;
连接处于打开的状态,也会占用一定的资源,占用的太多,也会影响服务器性能
11.gzip启用压缩,html/js/css压缩后传输会更快
gzip on;
12.server可以在http指令块中设置多个虚拟主机
- listen 监听端口
- server_name localhost、ip、域名
- location 请求路由映射,匹配拦截
- root 请求位置
- index 首页设置
server {
listen 88;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
}
15、核心配置文件
配置多个server:核心conf配置
1.修改配置文件nginx.conf
配置文件添加server块
server {
listen 89;
server_name localhost;
location / {
root html;
index imooc.html index.htm;
}
}
2.创建imooc.html
# 拷贝index.html文件为imooc.html
cp index.html imooc.html
3.重新加载配置文件
4.访问服务80端口、89端口
配置多个server:引入imooc.conf
1.nignx.conf导入imooc.conf;
incloud imooc.conf;
2. 新建imooc.conf
server {
listen 89;
server_name localhost;
location / {
root html;
index imooc.html index.htm;
}
}
16、nginx.pid打开失败以及失败的解决方案
问题
nginx: [error] open() "/var/run/nginx/nginx.pid" failed (2: No such file or directory)
nginx: [error] invalid PID number "" in "/var/run/nginx/nginx.pid"
解决方式一
- 创建默认目录 /var/run/nginx/
# 新建目录
mkdir /var/run/nginx/
# 重启nginx
./nginx -t
./nginx -s reload
./nginx -c /usr/local/nginx/conf/nginx.conf
17、Nginx常用命令解析
./nginx -s stop
快速停止nginx或者说暴力关闭nginx (一般使用在 非法用户黑客攻击的时候立刻停下);
如果正在有用户和后端进行通信,一旦使用,所有用户的连接请求都会被关闭,对于用户来讲是不太友好的,所以不推荐使用这种方式
./nginx -s quit
优雅的停止nginx;
如果没有任何用户请求,会直接关闭;
如果有用户正在通信,会维护当前用户的连接,直到这个用户的连接关闭后,它不再发送请求,nginx才会关闭;
等待所有用户连接(http请求)关闭后在停止nginx;
./nginx -t
配置文件发生修改,检测配置文件是否正确;
检查 nginx.conf 是否ok;
当配置文件有错误,会有提示信息;
./nginx –v
查看当前nginx的版本号
./nginx –V
查看当前nginx的所有信息(nginx版本,gcc环境 ,以及configure)
./nginx –h(./nginx -?)
查看nginx帮助信息
./nginx –c filename
指定nginx的核心配置文件
18、Nginx日志切割 - 手动
查看nginx日志文件目录
执行./nginx –V
查看日志文件目录: /var/log/ngin
日志切割 - 手动
现有的日志都会存在access.log文件中,但是随着时间的推移,这个文件的内容会越来越多,体积会越来越大,不便于运维人员查看,所以我们可以通过把这个大的日志文件切割为多份不同的小文件作为日志,切割规则可以以天为单位,如果每天有几百G或者几个T的日志的话,则可以按需以每半天或者每小时对日志切割一下。
1.创建一个shell可执行文件:cut_my_log.sh
cd /usr/local/nginx/sbin/
vim #!/bin/bash
# 创建一个shell可执行文件:cut_my_log.sh
vim cut_my_log.sh
# 标识为bash文件
#!/bin/bash
# 日志目前所处的位置
LOG_PATH="/var/log/nginx/"
# 切割表达式
RECORD_TIME=$(date -d "yesterday" +%Y-%m-%d+%H:%M)
PID=/var/run/nginx/nginx.pid
mv ${LOG_PATH}/access.log ${LOG_PATH}/access.${RECORD_TIME}.log
mv ${LOG_PATH}/error.log ${LOG_PATH}/error.${RECORD_TIME}.log
#向Nginx主进程发送信号,用于重新打开日志文件
kill -USR1 `cat $PID`
- 为cut_my_log.sh添加可执行的权限:
chmod +x cut_my_log.sh
禁用可执行权限:chmod -R a-x ./cut_my_log.sh
3.测试日志切割后的结果
./cut_my_log.sh
访问nginx后重新查看日志,会生成新的日志文件:
20、Nginx日志切割 - 定时
使用定时任务 - 定时
1.安装定时任务插件:
yum install crontabs
2.
crontab -e
编辑并且添加一行新的任务:
# 查看当前定时任务列表:
crontab -l
# 编辑并且添加一行新的任务:
crontab -e
*/1 * * * * /usr/local/nginx/sbin/cut_my_log.sh
3.重启定时任务
service crond restart
附:常用定时任务命令
service crond start //启动服务
service crond stop //关闭服务
service crond restart //重启服务
service crond reload //重新载入配置
crontab -e // 编辑任务
crontab -l // 查看任务列表
定时任务表达式
Cron表达式时,分为5或6个域,每个域代表一个含义,如下所示:
常用表达式
- 每分钟执行:
*/1 * * * *
- 每日凌晨(每天晚上23:59)执行:
59 23 * * *
- 每日凌晨1点执行:
0 1 * * *
参考文献:
每天定时为数据库备份:https://www.cnblogs.com/leechenxiang/p/7110382.html
22、虚拟主机 - 使用Nginx为静态资源提供服务
1.使用FileZilla工具上传静态资源至Linux
2.映射foodie资源,修改配置文件imooc.conf:
注:nginx.conf已引入imooc.conf
3.访问首页
4.映射静态资源,修改配置文件imooc.conf:
nginx指定文件路径有两种方式root和alias
server {
listen 90;
server_name localhost;
location / {
root /home/foodie-shop;
index index.html;
}
# 注:使用root时, imooc必须在home路径后
location /imooc {
root /home;
}
location /static{
alias /home/imooc;
}
}
5.访问静态资源
24 附:root与alias
root与alias:
假如服务器路径为:/home/imooc/files/img/face.png
- root路径完全匹配访问
location /imooc {
root /home
}
用户访问的时候请求为:url:port/imooc/files/img/face.png
- alias可以为你的路径做一个别名,对用户透明
location /hello{
alias /home/imooc
}
用户访问的时候请求为:url:port/hello/files/img/face.png
,如此相当于为目录imooc
做一个自定义的别名。
23、使用Gzip压缩提升请求效率
配置
修改nginx.conf配置文件:
# 压缩传输
gzip on;
# 限制最小压缩,小于1字节的文件不会压缩
gzip_min_length 1;
# 定义压缩的级别(压缩比取值范围1-9,值越大,压缩比越大,文件越大,压缩越多,但是cpu使用会越多)
gzip_comp_level 3;
# 定义压缩文件的类型
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png application/json;
对比
压缩前
压缩后
25、location的匹配规则解析
- 空格:默认匹配,普通匹配
location / {
root /home;
}
- =:精准匹配
location = /imooc/img/face1.png {
root /home;
}
- ~*:匹配正则表达式,不区分大小写
# 符合图片的显示
# *代表不区分大小写
location ~* .(GIF|jpg|png|jpeg) {
root /home;
}
- ~:匹配正则表达式,区分大小写
# GIF必须大写才能匹配到
location ~ .(GIF|jpg|png|jpeg) {
root /home;
}
- ^~:以某个字符路径开头
location ^~ /imooc/img {
root /home;
}
27、DNS域名解析
ping www.baidu.com
会有个特定的IP,这个IP其实是百度网的目标的IP地址,是通过IP地址去访问的
DNS解析域名
解析过程:浏览器访问慕课网,访问慕课网是浏览器输入的是域名,中间会经过DNS解析,解析后会访问解析的IP地址,这个IP上会有对应的资源,就可以把响应传给浏览器,浏览器进行渲染。
DNS:全称Domain Name System,是一个域名系统。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。
域名的作用:主要是提供便利,企业中计算机节点,可能某些项目会变,项目一旦会变,IP可能也会跟着变,通过域名解析,不管IP如何变,用户访问的域名都是固定的,那么域名是固定的,IP变化对于用户是无所谓的。
DNS解析域名:云服务器
域名和云服务器的公网IP做了绑定,相互映射。
Tomcat是部署在内网的,内网之间是可以相互通信的,其IP对外是关闭的,不可以通过公网IP直接访问的。
Nginx对内网的Tomcat起到一个网关的作用,有一定的保护措施。
28、使用SwitchHosts 模拟本地域名解析访问
Linux修改hosts文件
Linux下在etc/hosts
的hosts文件,本地IP127.0.0.1和localhost做了对应的绑定关系
修改文件
# 修改hosts文件
vim /etc/hosts
# 重启网络: 重启网络后生效
/etc/init.d/network restart