NGINX中间件学习

  • nginx中间件学习
    • nginx安装与运行
    • Nginx解析过程
    • Nginx进程模型
    • Worker抢占机制
    • Nginx.conf核心配置文件结构
    • 配置文件讲解
    • Nginx常用命令
    • Nginx日志切割(手动)
    • Nginx日志切割(自动)
    • 使用nginx为静态资源提供服务
    • 使用gzip压缩提高请求效率
    • location的匹配规则
    • DNS域名解析
    • Nginx跨域实现
    • Nginx防盗链
    • Nginx的模块化体系
    • nginx集群负载均衡解析
    • 七层与四层负载均的区别
    • Nginx构建Tomcat集群
    • 使用JMeter测试单节点与集群的并发异常率
    • 负载均衡-轮询
    • 负载均衡-加权
    • upstream 指令参数
    • 使用keepalived提高吞吐量
    • 负载均衡之ip\_hash
    • 一致性hash算法
    • 负载均衡之URL\_hash
    • 负载均衡之least\_conn(最小连接数)
    • Nginx控制浏览器缓存
    • Nginx反向代理缓存
    • 配置SSL证书提供https访问
    • 动静分离
    • Nginx高可用-HA
      • 第一步:安装keepalived
      • 第二步:配置keepalived核心配置文件
      • 第三步:把keepalived注册为系统服务
      • 第四步:双主热备
        • 1. 配置DNS解析配置与负载均衡
        • 2. 配置双主热备
    • LVS
      • LVS的三种工作模式
      • 配置DR模式lvs节点与ipvsadm

nginx中间件学习

以下是我在bilibili学习听课的一些随堂笔记,如果有需要的同学可以一起交流学习也

nginx安装与运行

  1. 下载nginx

官网地址:http://nginx.org/

  1. 上传到linux系统(通过ssh工具或者通过scp对考的方式都可以实现文件的上传)
  2. 安装依赖环境
    安装gcc环境
    yum install -y 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

  1. 解压文件,解压之后得到的是源码,源码城编译之后才能安装
    tar -zvxf nginx-*****.tar.gz
  2. 编译之前先创建nginx临时目录。如果不创建,启动nginx过程中会报错。
    mkdir /var/tmp/nginx -p
  3. 在nginx目录,输入如下命令进行配置,目的是为了创建makefile文件
    ./configure \
    --prefix=/usr/local/nginx \ 指定nginx的安装目录
    --pid-path=/var/run/nginx/nginx.pid \ 指定nginx的pid
    --lock-path=/var/lock/nginx.lock \ 锁定安装文件,防止被恶意篡改或误操作
    --error-log-path=/var/log/nginx/error.log \ 错误日志
    --http-log-path=/var/log/nginx/access.log \ http日志
    --with-http_gzip_static_module \ 启用gzip模块,在线实时压缩输出数据流
    --http-client-body-temp-path=/var/temp/nginx/client \ 设定客户端请求的临时目录
    --http-proxy-temp-path=/var/temp/nginx/proxy \ 设定http代理临时目录
    --http-fastcgi-temp-path=/var/temp/nginx/fastcgi \ 设定fastcgi临时目录
    --http-uwsgi-temp-path=/var/temp/nginx/uwsgi \ 设定uwsgi临时目录
    --http-scgi-temp-path=/var/temp/nginx/scgi 设定scgi临时目录
  4. make编译
    make
  5. 安装
    make install
  6. 进入sbin目录启动nginx
    ./nginx 启动nginx

./nginx -s stop 停止nginx

./nginx -s reload 重新加载nginx

whereis nginx 寻找安装目录
注意事项:
1、关闭防火墙或者放通对应的端口

Nginx解析过程

http://192.168.1.172:80/
http 代表的是http协议访问
192.168.1.172:80 代表的是访问此节点的80端口
/ 代表的是/的路由 (在服务器内部可以理解为路径目录)
修改配置文件之后需要重新加载./nginx -s reload

默认的nginx配置文件:

`[root@localhost conf]# cat nginx.conf

`

#user nobody; nginx进程的用户,默认为nobody,如需要用户拥有较大的权限,则可以设置为root

worker_processes 1; work进程 设置,初始情况下是1个,但是实际生产环境可以根据cpu的数量以及性能来进行设置

#error_log logs/error.log; 错误日志的

#error_log logs/error.log notice; 错误日志的级别为notice

`#error_log logs/error.log info;

` 错误日志的级别为info,最详细的是debug

`#pid logs/nginx.pid;

` pid进程目录设置

events {

worker_connections 1024; events指令块下的work_connections 用于设置进程的连接数

`}

`

http {

include mime.types; 导入在conf目录下还有一个文件名为mime.types,默认情况下是nginx首页的类型文件,由于篇幅过长,影响配置文件阅读,所以单独作为一个文件保存。在此处导入。

` default_type application/octet-stream;

`

#log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 定义了一个main名称的指令块,

# '$status $body_bytes_sent "$http_referer" '

` # ‘“ h t t p u s e r a g e n t " " http_user_agent" " httpu​sera​gent""http_x_forwarded_for”’;

`

` #access_log logs/access.log main;

`

sendfile on; 文件发送优化。

` #tcp_nopush on;

`

#keepalive_timeout 0;

` keepalive_timeout 65;

`

` #gzip on;

` 压缩功能,打开反可降低带宽使用率,但是增加cpu的使用率

server { //服务

listen 80; //监听端口

` server_name localhost;

` //请求的ip,用于做映射

location / { //会找到ROOT根目录

root 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 html;

` }

`

# proxy the PHP scripts to Apache listening on 127.0.0.1:80

#

#location ~ \.php$ {

# proxy_pass http://127.0.0.1;

` #}

`

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000

#

#location ~ \.php$ {

# root html;

# fastcgi_pass 127.0.0.1:9000;

# fastcgi_index index.php;

# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;

# include fastcgi_params;

` #}

`

# deny access to .htaccess files, if Apache's document root

# concurs with nginx's one

#

#location ~ /\.ht {

# deny all;

#}

` }

`

# another virtual host using mix of IP-, name-, and port-based configuration

#

#server {

# listen 8000;

# listen somename:8080;

` # server_name somename alias another.alias;

`

# location / {

# root html;

# index index.html index.htm;

# }

` #}

`

# HTTPS server

#

#server {

# listen 443 ssl;

` # server_name localhost;

`

# ssl_certificate cert.pem;

` # ssl_certificate_key cert.key;

`

# ssl_session_cache shared:SSL:1m;

` # ssl_session_timeout 5m;

`

# ssl_ciphers HIGH:!aNULL:!MD5;

` # ssl_prefer_server_ciphers on;

`

# location / {

# root html;

# index index.html index.htm;

# }

` #}

`

}

Nginx进程模型

理论:

nginx有2种进程为别为 master进程(主进程)、worker进程(工作进程),为master服务的

模型这样设计的好处:

1、进程之间内存是独立的,不会有影响

2、受黑客攻击时,攻击的的其中的某个进程

查看进程方法:ps -ef | grep nginx

检查nginx配置文件方法:/usr/local/nginx/sbin/nginx -t

进程配置文件:

worker_processes 1; //可以设置nginx的work进程数

#error_log logs/error.log;

#error_log logs/error.log notice;

`#error_log logs/error.log info;

`

`#pid logs/nginx.pid;

`

events {

worker_connections 1024;

}

排错1知识:在nginx启动的过程中提示“nginx: [emerg] open() “/var/run/nginx/nginx.pid” failed (2: No such file or directory)”

原因:没有nginx文件夹,且其下没有nginx.pid文件

解决方法:

(1)进入 cd /usr/local/nginx/conf/ 目录,编辑配置文件nginx.conf ;

(2)在配置文件中有个注释的地方: #pid logs/nginx.pid;

(3)将注释放开,并修改为:pid /usr/local/nginx/logs/nginx.pid;

(4)在 /usr/local/nginx 目录下创建 logs 目录:mkdir /usr/local/nginx/logs

(5)启动nginx服务:/usr/local/nginx/sbin/nginx

排错知识2:在启动nginx的过程中提示nginx: [error] invalid PID number““in “/var/ run/ nginx/ ng inx. pid”

./nginx -c /usr/local/nginx/conf/nginx.conf

Worker抢占机制

nginx是性能非常高的服务器,处理的连接数可以达到几十万甚至几百,底层由c语言来开发

accep_mutex有一个互斥锁,对应的worker会去抢这个锁。抢到了之后才能处理这个请求,worker需要读取、解析、处理、响应等一系列操作,数据返回客户端。

配置文件的指令块:

events {

#默认使用epoll use epoll;

worker_connections 1024; //worker进程的并发连接数,客户端并发连接数。根据配置来,如果用户连接数比较多,但配置连接数据比较少的话可能会卡顿

}

传统服务器事件处理(同步阻塞请求的方式)

就是说工作进程在处理请求,时长较久时或者处理时卡住时客户端这个请求就被阻塞,worker进程会进行等待,如果有新的请求连接进来,后面的进程就会排队。worker1是不可以并发处理的。此时为了解决这样的问题,master会再fork一个worker进程用于处理新的请求,如果新的请求顺利的话,处理完之后就会处理其他的请求,如果请求同样耗时较长,或者卡住时阻塞时,同样worker2也会停止响应,再fork一个新的进程 。

这样处理的效率是非常低的、资源开销也会很大。

Nginx的事件处理(多路复用技术)

在worker进程处理到阻塞时,由于nginx是异步非阻塞的工程机制,worker会接着处理下一个client访问,同时开销也不会很大。worker是可以通过linux做设置的epoll。如果使用windows或者mac的话需要去修改。每一个worker平均可以处理6~8万个请求。worker和cpu内存相关,性能越强,处理的并发也会越强。


Nginx.conf核心配置文件结构

main 全局配置

event 配置工作模式以及连接数

http http模块相关配置

server 虚拟主机配置,可以有多个

location 路由规则,表达式

upstream 集群,内网服务器

配置文件讲解

#user nobody;

#当我们的worker进程在执行的过程中是由操作系统哪个用户来执行的,默认情况下是nobody,当我们发指令给nginx时,实际上是把指令发给了master,由master发给他下面的worker;

worker_processes 1;

#跟cpu相关,cpu有几个,配置为几个。如果有其他配置服务的话可以配置为N-1

nginx日志级别:debug、info、notice、warn、error、crit 日志的详细程度debug最详细

#error_log logs/error.log; 日志的路径

#error_log logs/error.log notice; 日志级别

#error_log logs/error.log info; 日志级别

pid /usr/local/nginx/logs/nginx.pid; pid就是nginx的进程号,直接注释也可以

events {

use epoll; 默认使用epoll,不填也可以

worker_connections 1024; 每个worker允许的连接客户端最大连接数

}

http {

include mime.types; 导入外部的文件,把所有的types放到一个文件里面,再来导入

default_type application/octet-stream; 默认的type类型

#log_format main '$remote_addr(客户端的ip) - $remote_user(客户端的用户) [$time_local] "$request(请求信息)" '

# '$status(状态) $body(主体)_bytes_sent "$http_referer" '

# '"$http_user_agent" "$http_x_forwarded_for"'; 日志的一些变量

#access_log logs/access.log main; 请求的连接日志

sendfile on; 用于文件高效传输

#tcp_nopush on; 和sendfile结合使用,当数据包累计到一定的大小后发送

#keepalive_timeout 0; 客户端连接的超时时间

keepalive_timeout 65; 客户端的默认连接超时时间为65s

#gzip on; 开启压缩之后html\css\jpg会经过压缩,传输效率会加快。减小带宽资源占用、占用节点计算资源

server { //指定块,代表虚拟主机

listen 80;

server_name localhost; 可以是域名,ip+端口

location / { //路由,/代表了根,

root 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 html;

}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80

#location ~ \.php$ {

# proxy_pass http://127.0.0.1;

#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000

#location ~ \.php$ {

# root html;

# fastcgi_pass 127.0.0.1:9000;

# fastcgi_index index.php;

# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;

# include fastcgi_params;

#}

# deny access to .htaccess files, if Apache's document root

# concurs with nginx's one

#

#location ~ /\.ht {

# deny all;

#}

}

# another virtual host using mix of IP-, name-, and port-based configuration

#server {

# listen 8000;

# listen somename:8080;

# server_name somename alias another.alias;

# location / {

# root html;

# index index.html index.htm;

# }

#}

# HTTPS server

#

#server {

# listen 443 ssl;

# server_name localhost;

# ssl_certificate cert.pem;

# ssl_certificate_key cert.key;

# ssl_session_cache shared:SSL:1m;

# ssl_session_timeout 5m;

# ssl_ciphers HIGH:!aNULL:!MD5;

# ssl_prefer_server_ciphers on;

# location / {

# root html;

# index index.html index.htm;

# }

#}

}

Nginx常用命令

./nginx -s stop 强制停止nginx

./nginx -s quit 平滑退出nginx(有用户连接的情况下,不再接受新的请求,会等待用户连接完毕,再退出nginx)

./nginx -t 检查nginx配置文件是否有异常

./nginx -v 查看当前nginx的版本号以及一些环境配置

./nginx -? 将nginx所有命令显示出来

/var/log/nginx 所有nginx日志,在安装的时候可以设置

Nginx日志切割(手动)

现有的日志都会存于access.log文件中,但是随着时间的推移,这个文件的内容会越来越多,体积会越来越大,不便于运维人员查看,所以我们可以把大的日志文件切割为多份不同的小文件作为日志,切割规则是以天为单位,如果每天有几百GB或者几个TB的日志的话,则可以按需第半天或者每小时对日志切割一下。

1、创建一个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}/erro.log ${LOG_PATH}/erro.${RECORD_TIME}.log

#向nginx主进程 发送信息,用于重新打开日志文件

kill -USR1 'cat $PID'

2、为cut_my_log.sh添加可执行的权限

chmod +x cut_my_log.sh

3、测试日志切割后的结果

./cut_my_log.sh

Nginx日志切割(自动)

使用定时任务

1、安装定时任务

yum install crontabs

2、编辑并且添加一行新的任务

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个域,每个域代表一个含义,如下所示:

取值范围 0-59 0-23 1-31 1-12 1-7 ……

使用nginx为静态资源提供服务

其他就是重新定义nginx.conf中的server指令块。同时,同一个server中可以定义多个location,同时location中可以定义多个alias。

server { #指定块,代表虚拟服务主机

listen 80; 监听端口

server_name localhost; 可以是域名,ip+端口

location / { #路由,/代表了根。路由可以写多个,有多个location的情况下不可以使用多个一样路径的路径

root html; 目录,填写网页所在的路径

index index.html index.htm;

}

location / {

alias /home/imooc;

}

}

使用gzip压缩提高请求效率

在nginx.conf配置文件中开启gzip压缩功能,作用:提高 传输效率,节约带宽。

gzip on; 开启此功能

gzip_min_lenth 1; 限制最小压缩,小于1个字节不会压缩

gzip_comp_level 3;定义压缩的级别(压缩比,文件越大,压缩越多,但是cpu也会使用较多)

gzip_types text/plain application/javascrip application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpep image/png application/json; 定义压缩文件的类型

location的匹配规则

location / { 默认的匹配规则,访问html文件夹下的文件

root html;

index imooc.html index.

}

location = / { 默认的匹配规则

root html;

index imooc.html index.

}

location = /imooc/ima/face1.png { 精准的匹配规则

root /home;

index imooc.html index.

}

location ~* \.(GIF|png|bmp|jpg|jpeg) { 正则表达式,*代表不区分大小写

root /home;

}

location ~ \.(GIF|png|bmp|jpg|jpeg) { 精准正则表达式,区分大小写

root /home;

}

location ^~ /imooc/img { ^~以某个字符路径开头为请求

root /home;

}

DNS域名解析

Nginx跨域实现

在server里面添加字段:

add_header ‘Access-Control-Allow-Origin' *;* #允许跨域请求的域,*代表所有

add_header 'Access-Control-Allow-Credentials' 'true'; #允许带上cookie的请求

add_header 'Access-Control-Allow-Methods' *; #允许请求的方法比如,GET/POST/PUT/DELETD

add_header 'Access-Control-Allow-Headers' *; #允许请求的header

Nginx防盗链

在server中,location之前的字段添加:

valid_referers *.imooc.com; #对源站点进行验证

if($invalid_referer){ #非法进入下方判断

return 404;

}

Nginx的模块化体系

event module 操作系统层面的事件处理机制

phase handler 处理客户端的请求以及响应

output filter 过滤器(压缩)

upstream 反向代理模块

load balancer 负载均衡器

extend module 进程模块(如果要使用第三方的模块需要使用到)

nginx安装包介绍:

auto:通过此目录来自动识别编译的操作系统以及脚本

CHANGES:历史版本以及信息

CHANGES.ru:俄罗斯的版本

conf:配置目录,安装完成后会拷贝到安装目录

configure:用于做编译配置

contrib:工作包相关,提供相应的工具

html:默认存放静态的文件,配置目录,安装完成后会拷贝到安装目录

LICENSE:版权说明以及协议

Makefile:用于编译

man:nginx手册

objs:如果安装使用第三方模块,目录内会生成ngx_modules.c文件

src:nginx源码

src目录内部有以下目录:

core:nginx核心代码

event:系统层面上事件处理机制

http:http相关模块在这里

mail:跟邮件相关

misc:辅助的代码

os:和操作系统相关的函数封装以及接口

stream:模块

nginx集群负载均衡解析

七层与四层负载均的区别

作用:提高服务器以及网络设备的网络吞吐量,提升并发性能、增加服务器的处理能力、提高服务器计算能力、启动网络设备更加灵活

四层负载均衡(TCP&UDP),基于ip+端口的负载均衡,通过转发请求到后台的服务器,只负责转发并记录当前连接是由哪台服务器处理,持续连接的请求由同一台服务器响应,类似长连接。

F5硬件负载均衡(商业级的负载均衡)

LVS四层负载均衡

Haproxy四层负载均衡

Nginx四层负载均衡

七层负载均衡(URL&ip)针对于http协议的负载均衡,对响应中的请求进行处理。

Nginx七层负载均衡

Haproxy七层负载均衡

apache七层负载均衡

DNS地域负载均衡

就近访问原则,提高用户访问速度

Nginx构建Tomcat集群

配置上游服务器:

upstream www.tomcats.com{

server 192.168.1.173:8080;

server 192.168.1.174:8080;

server 192.168.1.175:8080;

}

server {

listen 80;

servername www.tomcats.com;

#正则表达式

location / {

proxy_pass http://www.tomcats.com;

}

}

使用JMeter测试单节点与集群的并发异常率

  1. 下载JMeter工具

官方下载链接:https://jmeter.apache.org/

  1. 提前部署好java环境安装好java-jdk组件

  1. 执行程序(在下载的程序包目录下有一个jmeter.bat的文件,以管理员方式运行)

此时程序打开是英文版的,如果需要调整为中文版可以做以下设置:【Options】-【Choose】-【Chinese……】即可调整为中文版界面

  1. 配置测试计划

    1. 界面上有一个默认的测试计划,可以把他改名也可以新建。
    2. 添加线程组 【测试计划】-【添加】-【线程(用户)】-线程组
      线程组有以下几个参数需要设置:
      线程名称:可以支持自定义
      注释:支持自定义
      在取样器错误后要执行的动作:默认即可
      线程数据:也代表用户数,会有多少个用户模拟访问
      Ramp-Up时间:访问间隔时间
      循环次数:可以一直访问也可以设定访问次数
      设定完毕之后就可以保存了。

  1. 添加取样器 【线程组】-【添加】-【取样器】-【http请求】

配置完以上配置之后就可以对网站进行测试啦,点绿色的箭头!

  1. 分析聚合报告

样本:访问总量为多少次,在线程数配置里有线程数以用户循环次数

平均值:所有访问总量平均访问延时单位是ms

中位数:50%的访问延时平均值

90%百分位:10%的访问延时的平均值

95%百分位:5的访问延时的平均值

99%百分位:1%的访问延时的平均值

  1. 配置上游服务器
    配置上游服务器字段如下:
    upstream tomcats {
    server 192.168.1.173:8080
    server 192.168.1.190:8080
    }

负载均衡-轮询

轮询的原理就是后端节点池里的服务器在处理请求的过程中,每一台服务器处理的请求数量都是相差无几的。请求会按照服务器的顺序依次决定由哪一台服务器处理。通过这样的方式实现的请求的负载均衡,在轮询算法下,每一台服务器的权重是相同的。

默认就是轮询策略

集群配置方法如下:

upstream www.tomcats.com{

server 192.168.1.173:8080;

server 192.168.1.174:8080;

server 192.168.1.175:8080;

}

server {

listen 80;

servername www.tomcats.com;

#正则表达式

location / {

proxy_pass http://www.tomcats.com;

}

}

问题1、在使用轮询的场景下,如果有节点宕机,那nginx是怎么处理的?nginx会自动将该节点踢掉,

负载均衡-加权

原理:通过设置服务器权重的方式,来将请求按比例平均分发给节点池后端的服务器,权重高的服务器自然会处理同期内的等比例的请求。

upstream www.tomcats.com{

#weight字段为设置的服务器权重

server 192.168.1.173:8080 weight=1;

server 192.168.1.174:8080 weight=5;

server 192.168.1.175:8080 weight=3;

}

server {

listen 80;

servername www.tomcats.com;

#正则表达式

location / {

proxy_pass http://www.tomcats.com;

}

}

upstream 指令参数

upstream模块,将使nginx跨越单机的限制,完成网络数据的接收、处理和转发。

数据转发功能,为nginx提供了跨越单机的横向处理能力,使nginx摆脱只能为终端节点提供单一功能的限制,而使它具备了网路应用级别的拆分、封装和整合的战略功能。在云模型大行其道的今天,数据转发是nginx有能力构建一个网络应用的关键组件。当然,鉴于开发成本的问题,一个网络应用的关键组件一开始往往会采用高级编程语言开发。但是当系统到达一定规模,并且需要更重视性能的时候,为了达到所要求的性能目标,高级语言开发出的组件必须进行结构化修改。此时,对于修改代价而言,nginx的upstream模块呈现出极大的吸引力,因为它天生就快。作为附带,nginx的配置系统提供的层次化和松耦合使得系统的扩展性也达到比较高的程度。

max_conns : 限制一台服务器的最大连接数 (老版本无法使用,新版本可以使用)。

slow_start :服务器延时加入集群(会将服务器优先级由小加大),不能使用到hash。适用于带权重的,商业版才有的功能。

down :状态,有此字段的服务器不会被用户访问。

backup : 标志的该服务器是备用机,只有其他服务器宕机后才能使用。

max_fails : 最大的失败次数,如果次数达到则认为该台服务器异常了会踢出集群(需要与fail_timeout配合使用)

fail_timeout:失败的时间段,失败之后会等待这个设置的时间,这个时间段内不会请求发过来。等这个时间过了之后再尝试此节点。此会一直请求。(需要配合与max_fails配合使用

使用keepalived提高吞吐量

用法1:

upstream www.tomcats.com{

server 192.168.1.173:8080;

keepalive 32; #要保持的连接数,会把一部分的连接保存为长连接,这样的话就减少了会话的创建跟关闭

}

用法2 为http使用:

upstream www.tomcats.com{

server 192.168.1.173:8080;

keepalive 32; #要保持的连接数,会把一部分的连接保存为长连接,这样的话就减少了会话的创建跟关闭

}

server {

proxy_pass http://www.tomcats.com;

proxy_http_version 1.1; #默认是1.0,1.0非长链接

proxy_set_header Connection""; 用于清空connection信息

}

负载均衡之ip_hash

ip_hash算法是基于

只要用户的IP地不更改,多次连接也会连接到相同的tomcat节点

upstream www.tomcats.com{

ip_hash; #这样就使用到了ip_hash的方式调度了

#weight字段为设置的服务器权重

server 192.168.1.173:8080;

server 192.168.1.174:8080;

server 192.168.1.175:8080;

}

如果要把某一台服务器移除的话不能直接删除字段,在server后面添加一个down了。如果直接删除的话用户会话以及缓存也会重新计算

一致性hash算法

比如当前使用的是ip_hash算法,但是tomcat3宕机了。

所有的请求节点就会发生更改,所有的集群会重新进行计算

一致性算法就是处理以上的问题

节点宕机场景

新增节点场景

负载均衡之URL_hash

配置文件:

upstream www.tomcats.com{

hash $request_uri;

server 192.168.1.173:8080;

server 192.168.1.174:8080;

server 192.168.1.175:8080;

}

负载均衡之least_conn(最小连接数)

upstream www.tomcats.com{

least_conn;

server 192.168.1.173:8080;

server 192.168.1.174:8080;

server 192.168.1.175:8080;

}

Nginx控制浏览器缓存

方法1:

location /static {

alias /home/imooc;

expires 10s; 浏览器缓存时间(相对的过期时间)

}

配置方法:在location指令块中添加expires字段

参数如下:

expires 10s; 设置缓存时间为10S

expires @22h30m; 浏览器缓存时间(绝对的过期时间)

expires -1h; 浏览器缓存时间(1小时之前失效了过期缓存)

expires epoch; 不设置缓存

expires off; 在nginx代表缓存是关着的,在f12中是没有体现的

expires max;缓存时间最长

Nginx反向代理缓存

配置参数:

proxy_cache_path 设置缓存保存的目录

keys_zone 设置共享内存以及占用的空间大小

max_size 设置缓存大小

inactive 超过此时间,则缓存自动清理

use_temp_path 关闭临时目录

proxy_cache_path /usr/local/nginx/upsteam_cache keys_zone=mycache:5m max_size=1g inactive=30s use_tmp_path=off; 直接配置在server以外的字段及可

配置方法,以上的配置写在server字段

upstream www.tomcats.com{

listen 80;

server 192.168.1.173:8080;

#开启并且使用缓存

proxy_cache mycache;

#针对200和304状态码的缓存设置过期时间

proxy_cache_valid 200 304 8h;

}

配置SSL证书提供https访问

第一步:配置目录

./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 \

--with-http_ssl_module

注意,这里复制需要注意后面的空格,建议是拿到txt文本编辑器中进行排版再复制粘贴过去。

第二步:将域名证书以及密钥导入到nginx配置文件下

第三步:配置server节点

server {

listen 443 ssl; 或者ssl on;

server_name localhost;

server_name cloud.tencent.com;

#证书文件名称

ssl_certificate cloud.tencent.com_bundle.crt;

#私钥文件名称

ssl_certificate_key cloud.tencent.com.key;

ssl_session_timeout 5m;

#请按照以下协议配置

ssl_protocols TLSv1.2 TLSv1.3;

#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。

ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;

ssl_prefer_server_ciphers on;

location /{

proxy_pass http://tomcats/;

index index.html index.htm;

}

}

第四步:测试

使用浏览器测试

动静分离

动静分离的特点: 分布式、前后端解耦、静态归nginx、接口服务化

动静分离的好处:用户访问更加快,一但动静分享,静态资源交给客户端去渲染

前端的后端分开开发,降低运维的复杂度

静态数据:/css/js/html/images/audios/videos/……

动态数据:得到的响应可能会和上一次不同

动静分离的方式:CDN(静态资源)

通过把静态资源部署到CDN服务提供端,用户会从最近的CDN机房获取到静态资源

动静分离的方式:nginx

直接将静态的资源放到nginx或者在nginx后面配置一个upstream集群。用于放置静态资源

使用的动静分离的问题

1、跨域 通过 springboot、nginx、jsonp

2、分布式会话 分布式缓存中间件

实践1:

Nginx高可用-HA

使用keepalived组件

  • 解决单点故障
  • 组件免费
  • 可以实现可高用HA机制
  • 基于VRRP协议

虚拟路由冗余协议VRRP,

解决内网单机故障的路由协议

构建有多个路由器MASTER BACKUP

虚拟IP-VIP

双机主备的原理:

条件1:硬件配置完全一致

第一步:安装keepalived

  1. 下载keepalived的tar包

官网:https://www.keepalived.org/

  1. 上传tar包
  2. 解压tar包
  3. 进入软件目录,配置文件configure 环境变量
    ./configure --prefix=/usr/local/keepalived --sysconf=/etc/
    在做以上配置的时候有一些环境可能会报一个warn,需要提前安装libnl/libnl-3依赖
    yum install -y libnl libnl-devel
  4. 编译

make

  1. 安装

make install

  1. 启动

cd /usr/local/keepalived/sbin

./keepalived

第二步:配置keepalived核心配置文件

配置文件:/etc/keepalived.conf

`! Configuration File for keepalived

`

global_defs {

notification_email { #全局的配置邮件

acassen@firewall.loc

failover@firewall.loc

sysadmin@firewall.loc

}

notification_email_from Alexandre.Cassen@firewall.loc #邮件服务器配置

smtp_server 192.168.200.1

smtp_connect_timeout 30

router_id LVS_DEVEL 路由ID:当前安装keepalived节点主机 的标识 符,全局唯一

vrrp_skip_check_adv_addr

vrrp_strict

vrrp_garp_interval 0

vrrp_gna_interval 0

`}

`

vrrp_instance VI_1 { #vrrp的实例对象,计算机节点

state MASTER #静态的状态位,当前配置master的为主节点,MASTER/BACKUP

interface eth0 #当前实例绑定的网卡

virtual_router_id 51 虚拟的路由ID,保证主备节点一致。

priority 100 #优先级/权重,谁的优先级高,在master挂掉之后就能成为master

advert_int 1 #主备之间同步的心跳检查时间间隔,

authentication { #认证授权的密码,防止非法的节点进入

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

192.168.200.16 #虚拟ip地址

}

`}

`

第三步:把keepalived注册为系统服务

将解压包里的文件拷贝到/etc/init.d/下面即可

cd /keepalived-2.2.7/keepalived/etc

cp /etc/init.d/keepalived /etc/init.d/

cp /sysconfig/keepalived /etc/sysconfig/

systemctl daemon-reload

systemctl start keepalived.service

keepalived配置nginx自动重启,

通过脚本来实现

#!/bin/bash

A='ps -C nginx --no-header |wc -l'

#判断nginx是否宕机,如果宕机了,尝试重启

if [ $A -eq 0];then

/usr/local/nginx/sbin/nginx #nginx安装目录

#等待一小会儿再检查nginx,如果没有启动成功,则停止keepalived,使其启动的备用机

sleep 3

if ['ps -C nginx --no-header | wc -l' -eq 0 ];then

killall keepalived

fi

fi

可以在keepalived的配置文件里面引入以上的脚本方法

vrrp_script check_nginx_alive {

script "/etc/keepalived/check_nginx_alive_or_not.sh"

interval 2 #每隔2s运行上一行脚本

weight 10 #如果脚本运行成功,则升级+10

}

在实例里面添加引用方法

tarck_script {

check_nginx_alive

}

第四步:双主热备

1. 配置DNS解析配置与负载均衡

通过公有云的dns服务来配置DNS负载均衡。

2. 配置双主热备

他的本质是2组服务,如下配置为单一节点的服务配置。通过流量的分发实现流量的分发。

vrrp_instance VI_2 {

state MASTER

interface eth0

virtual_router_id 51 (这里是另一组实例的)

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

192.168.200.16

} }

}

LVS

4层的负载均衡,扩容服务器的性能

ipvs (LVS的核心)

为什么要使用LVS+Nginx?

LVS基于4层,工作效率高

单个Nginx承受不了压力,需要集群

LVS充当Nginx集群的调度者

Nginx接受请求来回,LVS可以只接受不响应

LVS的三种工作模式

NAT模式

TUN(ip隧道模式)

DR模式(直接路由模式)

配置DR模式lvs节点与ipvsadm

lvs业务主机需要做以下配置

第一步:关闭网络管理器

systemctl stop NetworkManager

systemctl disable NetworkManager

第二步:创建网卡子接口

cp /etc/sysconfig/netowrk-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens33:1

内容:

BOOTPROTO="static"

DEVICE="ens33:1"

ONBOOT="yes"

IPADDR=192.168.1.150 #这里填写vid的地址

NETMASK=255.255.255.0

systemctl restart network

第三步:安装ipvsadm+

yum install -y ipvsadm

ipvsadm -Ln

RS节点配置(Nginx主机需要做以下配置)

原理:因为DR模式下,后端的nginx是不会直接回包到lvs节点,而是直接返回到用户,所以为要避免源地址不一致的情况,所以通过环回口来模拟lvs的VIP进行发包。这样回包的源地址就是我们手动配置的vip地址了

第一步:关闭网络管理器

systemctl stop NetworkManager

systemctl disable NetworkManager

第二步:创建网卡子接口

cp /etc/sysconfig/netowrk-scripts/ifcfg-lo /etc/sysconfig/network-scripts/ifcfg-lo:1 在第二台节点配置lo,专用于返回数据

DEVICE=lo:1

IPADDR=192.168.1.150

NETMASK=255.255.255.0

NETWORK=127.0.0.0

ROADCAST=127.255.255.255 #掩码记得为全1

ONBOOT=yes

NAME=loopback

第三步:刷新

ifup lo /systemctl resart network

为RS节点配置arp

arp-ignore ——ARP响应级别(处理请求)

0:只要本机配置的ip,就能响应请求

1:请求的目标地址到达对应的网络接口,才会响应请求

arp-announce ——ARP:响应响应级别(返回响应)

0:本机上任何网络接口都向外通告,所有的网卡都能接受到通告

1:尽可能避免本网卡与不匹配的目标进行通告

2:只在本网卡通告

配置文件如下:

vim /etc/sysctl.conf

内容:

net.ipv4.conf.all.arp_ignore = 1

net.ipv4.conf.default.arp_ignore = 1

net.ipv4.conf.lo.arp_ignore = 1

net.ipv4.conf.all.arp_announce = 2

net.ipv4.conf.default.arp_announce =2

net.ipv4.conf.lo.arp_announce = 2

刷新文件生效:

sysctl -p

添加静态路由

route add -host 192.168.1.150 dev lo:1 #去往1.150的数据包交给lo:1处理,实际的应用场景,150更换为lvs地址

route -n #检查系统路由信息表

echo "route add -host 192.168.1.150 dev lo:1" >>/etc/rc.local

配置集群规则

ipvsadm -h #查看帮助

Commands:

Either long or short options are allowed.

--add-service -A add virtual service with options

--edit-service -E edit virtual service with options

--delete-service -D delete virtual service

--clear -C clear the whole table

--restore -R restore rules from stdin

--save -S save rules to stdout

--add-server -a add real server with options

--edit-server -e edit real server with options

--delete-server -d delete real server

--list -L|-l list the table

--zero -Z zero counters in a service or all services

--set tcp tcpfin udp set connection timeout values

--start-daemon start connection sync daemon

--stop-daemon stop connection sync daemon

--help -h display this help message

…………

配置流程:

ipvsadm -A -t 192.168.1.150:80 -s rr #创建一个集群集群地址为192.168.1.150 算法为轮询

ipvsadm -Ln #查看集群状态

ipvsadm -a -t 192.168.1.150:80 -r 192.168.1.171:80 -g #为集群添加一台真实的节点

用浏览器访问测试

在后台检查 ipvsadm -Ln --stats

lvs持久化机制

在lvs中有一个访问持久化机制,有超时时间内,负载算法不会生效

通过参数 -p设置

ipvsadm -E -t 192.168.167.150:80 -s rr -p 30 ##30s的持久化超时时间

连接超时时间

ipvsadm --set 1 1 1

ipvsadm -Lnc #可查看相关的超时时间

undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined

【全】nginx中间件原理实践学习笔记相关推荐

  1. 可能是最全面的 Java G1学习笔记

    转载自 可能是最全面的 Java G1学习笔记 引子 最近遇到很多朋友过来咨询G1调优的问题,我自己去年有专门学过一次G1,但是当时只是看了个皮毛,因此自己也有不少问题.总体来讲,对于G1我有几个疑惑 ...

  2. Golang底层原理学习笔记(一)

    LCY~~Golang底层原理学习笔记 1 源码调试 go源代码地址:GitHub - golang/go: The Go programming language 1.1 源码编译 现在的go语言大 ...

  3. 计算机网路原理复习笔记

    计算机网路原理复习笔记 未看: 前两章 第四章路由聚合 第四章最长前缀匹配 SDN 3. 数据链路层 3.1 基本概念和功能概述 3.1.1 链路:是一条无源的点到点的物理线路段,中间没 有任何其他的 ...

  4. 余淼杰老师 经济学原理复习笔记(宏观1) 2020-12-14

    经济学原理复习笔记(宏观1) 第八章 宏观经济学的数据 chapter 23 一国收入的衡量 23.1 经济的收入与支出--GDP 23.2 国内生产总值(Gross Domestic Product ...

  5. 计算机网络原理(笔记)

    文章目录 计算机网络原理(笔记) 第一章 概述 1.1 网络模型: 1.1.1 ISO/OSI模型 1.1.2 TCP/IP 模型 1.1.3 五层模型 1.2 数据封装与解封装过程 1.3 分层的原 ...

  6. nginx工作原理和实现高并发请求的原因

    一.进程.线程? 进程是具有一定独立功能的,在计算机中已经运行的程序的实体.在早期系统中(如linux 2.4以前),进程是基本运作单位,在支持线程的系统中(如windows,linux2.6)中,线 ...

  7. 学习 redux 源码整体架构,深入理解 redux 及其中间件原理

    如果觉得内容不错,可以设为星标置顶我的公众号 1. 前言 你好,我是若川.这是学习源码整体架构系列第八篇.整体架构这词语好像有点大,姑且就算是源码整体结构吧,主要就是学习是代码整体结构,不深究其他不是 ...

  8. Nginx工作原理及相关介绍

    Nginx工作原理及相关介绍 一.Nginx工作原理与模块介绍 1.Nginx基本工作原理 NGINX以高性能的负载均衡器,缓存,和web服务器闻名.Nginx由内核和模块组成,其中,内核的设计非常微 ...

  9. 余淼杰老师 经济学原理复习笔记(微观)

    经济学原理复习笔记(微观) 余淼杰老师 经济学原理 复习笔记 by: 程琪皓 Lect1: Ten Principles of Economics Lect2: Thinking Like an Ec ...

最新文章

  1. Java-Maven(四):Eclipse集成Maven环境配置
  2. NR 5G 移动性和状态变化
  3. php底层运行机制与原理
  4. 类的构造函数(分类和调用)
  5. android注册界面高级,Android用户注册界面简单设计
  6. 为什么使用lambda表达式
  7. FJ的字符串java问题_蓝桥杯VIP试题 之 基础练习 FJ的字符串- JAVA
  8. mysql begin end 用法_超实用的Mysql动态更新数据库脚本的示例讲解(推荐)
  9. Intel初始化和模式切换示例
  10. Android设置按钮点击后变色(导航栏变色)
  11. mysql order by 语句_Mysql优化order by语句的方法详解
  12. 【数据集】机器学习数据集汇总(附下载地址)
  13. 智能优化算法应用:基于麻雀搜索算法PID参数优化 - 附代码
  14. proteus信号峰值检测仪仿真
  15. 中英文论文写作指导第三部分(实验、材料和方法部分)
  16. 模拟人生java版攻略_模拟人生免费版简易攻略小技巧
  17. 游戏服务器是干什么的(大话、浅析)
  18. Protect the self: defense mechanisms in action
  19. 初学者如何学习一门新的计算机语言!!!
  20. 小 V 视频号下载工具(可下载所有视频号中的视频+公众号中的部分视频、音频)

热门文章

  1. 《语义计算群:AI 理性主义的终结是不可能的吗》
  2. 生成排列(全排列)的两种写法
  3. 曾国藩:统领30万湘军,只靠这4句话
  4. scala中 sorted,sortBy,sortWith语法使用
  5. 荣耀 MagicBook 14 2022评测 荣耀magicbook14优缺点
  6. 论文阅读|《面向多目标柔性作业车间调度的强化学习NSGA-Ⅱ算法》
  7. Mac如何通过远程控制其他Mac
  8. 前端搜索引擎优化SEO优化之Title 和 Meta 标签
  9. css style 命名,CSS_CSS样式命名规范,命名一直是个让我头痛的问题 - phpStudy
  10. 爬虫之京东5g手机爬虫+谷歌浏览器打开窗口使用