从单体架构到集群架构1
单体架构
单体架构的优点
- 小团队成型即可完成开发-测试-上线
- 迭代周期短,速度快
- 打包方便,运维省事
单体架构面临的挑战
- 单节点宕机造成所有服务不可用
- 耦合度太高(迭代,测试,部署)
- 单节点并发能力有限
集群架构
集群概念
- 计算机“群体”构成整个系统
- 集群提高并发和可用性
使用集群的优势
- 提高系统的性能
- 提高系统的可用性
- 可扩展性高
使用集群的注意点
- 用户会话————分布式会话
- 定时任务————统一的单独做一个定时任务的服务,可以所有的定时任务放在一个节点上部署或者使用延时队列
- 保证内网互通
Nginx
- 主要功能是反向代理
- 通过配置文件可以实现集群和负载均衡
- 静态资源的虚拟化
什么是正向代理
- 客户端请求目标服务器之间的一个代理服务器
- 请求会先经过代理服务器,然后再转发请求到目标服务器,获得内容后最后响应给客户端
什么是反向代理
- 用户请求目标服务器,由代理服务器决定访问哪个ip
反向代理之路由
安装nginx
-
上传nginx到linux系统
-
安装依赖环境
(1)安装gcc环境
yum install gcc-c++
(2)安装PCRE库,用于解析正则表达式
yum install -y pcre pcre-devel
(3)zlib压缩和解压缩依赖,
yum install -y zlib zlib-devel
(4)SSL 安全的加密的套接字协议层,用于HTTP安全传输,也就是https
yum install -y openssl openssl-devel
-
解压,需要注意,解压后得到的是源码,源码需要编译后才能安装
tar -zxvf nginx-1.16.1.tar.gz
-
编译之前,先创建nginx临时目录,如果不创建,在启动nginx的过程中会报错
mkdir /var/temp/nginx -p
-
在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_ssl_module --with-http_stub_status_module --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临时目录 -
make编译
make
-
安装
make install
-
进入sbin目录启动nginx
./nginx
- 停止:./nginx -s stop
- 重新加载:./nginx -s reload
Nginx的进程模型
-
master进程:主进程
-
worker进程:工作进程
信号:
./nginx -s stop ./nginx -s quit ./nginx -s reload ./nginx -t
信号是由master交给相应的worker来执行的
Nginx处理Web请求机制解析
Worker抢占机制
- master进程fork出多个worker进程
- 多个worker抢占互斥锁
accept_mutex
- 抢占到的开始处理请求
传统服务器事件处理
- Master主进程监听80端口
- 默认开启一个worker进程
- 一个client请求到达一个worker,若此时worker1未及时响应,此进程处于阻塞状态
- master会fork出其他进程来处理相应的请求
Nginx事件处理
nginx.conf的配置结构
nginx,conf核心配置文件详解
nginx.pid打开失败以及失效问题
Nginx常用命令解析
./nginx -s quit 关闭,直到最后一个连接结束最后关闭nginx ./nignx -t 检测nginx配置文件更改后对不对 ./nginx -v 查看nginx的版本号 ./nginx -?/-h 查看nginx的命令帮助 ./nginx -c filename 设置nginx的核心配置文件
nginx的日志切割(手动)
现有的日志都会存在 access.log 文件中,但是随着时间的推移,这个文件的内容会越来越多,体积会越来越大,不便于运维人员查看,所以我们可以通过把
文件切割为多份不同的小文件作为日志,切割规则可以以 天 为单位,如果每天有几百G或者几个T的日志的话,则可以按需以 每半天 或者 每小时 对日志切割
具体步骤
-
创建一个shell可执行文件: cut_my_log.sh ,内容为:
#!/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
-
测试日志切割后的结果:
./cut_my_log.sh
可以看见日志已经切割完成了,新的日志会在相应时间的日志中继续写。
Nginx的日志切割(自动)
-
安装定时任务插件
yum install crontabs
-
使用
crontab -e
编辑并添加定时任务*/1 * * * * /usr/local/nginx/sbin/cut_my_log.sh
-
重启定时任务
service crond restart
-
常用定时任务命令:
service crond start //启动服务 service crond stop //关闭服务 service crond restart //重启服务 service crond reload //重新载入配置 crontab -e // 编辑任务 crontab -l // 查看任务列表
-
使用Nginx搭建静态资源服务器
server {
listen 90;
server_name localhost;
location / {
root /home/foodie-shop;
index index.html;
}
location /imooc {
#静态图片的路径:/home/imooc
root /home;
}
location /static {
#alias可以使用别名,访问/static此时对用户而言真正的路径是透明的
alias /home/imooc;
}
}
使用Gzip压缩提升请求效率
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;
}
Nginx中解决跨域问题
在配置文件中添加:
#允许跨域请求的域,*代表所有
add_header 'Access-Control-Allow-Origin' *;
#允许带上cookie请求
add_header 'Access-Control-Allow-Credentials' 'true';
#允许请求的方法,比如 GET/POST/PUT/DELETE
add_header 'Access-Control-Allow-Methods' *;
#允许请求的header
add_header 'Access-Control-Allow-Headers' *;
Nginx中配置静态资源防盗链
#对源站点验证
valid_referers *.自己的一级域名.com;
#非法引入会进入下方判断
if ($invalid_referer) {
return 404;
}
评论区