Nginx

Nginx

Nginx是一个轻量级的HTTP服务器,当然除了HTTP也支持SMTP、POP3和IMAP协议,还可以通过模块支持TCP协议,和Apache HTTP Server Project一样,都是用来负责处理和响应用户请求的,它们之间最大的区别就是Nginx能支持更大的并发量。

Ps:HTTP服务器一般是用来访问静态资源,而应用服务器可以动态生成资源,HTTP服务器能泡在应用服务器的前面,所以也叫做代理服务器。

1 源码编译安装及相关启停命令

1.1 安装

#1、安装必要的编译器和依赖并解压
yum install -y gcc
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
mkdir /usr/local/soft/nginx
cd /usr/local/soft/nginx
tar -zxvf nginx-1.22.1.tar.gz

#2、配置编译时的参数
cd usr/local/nginx-1.22.1
./configure --prefix=/usr/local/nginx

#3、编译安装
make
make install

#4、防火墙设置开放80端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload

1.2 启停命令

#进入安装目录
cd /usr/local/nginx
#启动 
./sbin/nginx
#重新加载配置
./sbin/nginx -s reload
#快速停止
./sbin/nginx -s stop
#优雅关闭(在退出前完成已经接受的连接请求)
./sbin/nginx -s quit 
#检测配置文件是否有语法错误,然后退出 
./sbin/nginx -t
#检测配置文件是否有语法错误,转储并退出
./sbin/nginx -T

1.3 配置为系统服务

创建服务vim /usr/lib/systemd/system/nginx.service

#服务脚本内容
[Unit]
Description=Nginx Server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx..pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true

[Install]
WantedBy=multi-user.target
#重新加载系统服务 
systemctl daemon-reload
#启动nginx服务 
systemctl start nginx
#设置开机启动
systemctl enable nginx.service

2 Nginx基本配置

2.1 配置分块

配置块名称作用
全局块配置影响nginx全局的指令。一般有运行nginx服务的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成的子工作进程数等。
events块配置影响nginx服务与用户的网络连接。一般是每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
http块可以嵌套多个server块,配置代理、缓存、日志定义等绝大多数功能和第三方模块的配置,如文件引入,mime-type定义,日志自定义,sendfile配置,连接超时时间,单连接请求数等。
server块配置虚拟主机的相关参数。
location块配置请求的路由和各种页面的处理。

2.2 配置注意事项

  • 注释使用#号
  • 每行配置以分号结尾
  • 如果配置项中包括语法符号,比如空格,需要使用单引号或双引号括住配置项
  • 单位:ms(毫秒),s(秒),m(分钟),h(小时),d(天),w(周),M(月30天),y(年365天),K(1024字节),k(1000字节),M(1024K),m(1000k)

2.3 配置示例

user root root; #配置用户和组,默认为nobody nobody.
worker_processes 1; #允许生成的进程数,默认为1.
pid logs/nginx.pid; #指定Nginx进程运行文件的存放地址.
error_log logs/error.log debug; #指定日志文件路径和级别,该设置可以放到全局块|http|server中,级别可以为debug|info|notice|warn|error|crit|alert|emerg.

events{
    accept_mutex on; #设置网络连接序列化,防止惊群现象,默认为on.
    multi_accept on; #设置一个进程是否可以同时接受多个网络连接,默认为off.
    use epoll; #设置使用的事件驱动模型,可选为select|poll|kqueue|epoll|resig|/dev/poll|eventport.
    worker_connections 1024; #最大连接数,默认512.
}

http{
    include mime.types; #文件扩展名和文件类型映射表.
    default_type application/octet-stream; #默认文件类型,默认为text/plain.
    log_format format   ‘$remote_addr – $remote_user [$time_local] “$request”‘
                                ‘$status $body_bytes_sent “$http_referer”‘
                               ’”$http_user_agent” “$http_x_forwarded_for”‘
                               ’”$upstream_cache_status”‘; #自定义日志格式.
    access_log logs/access.log format; #设置访问日志文件和格式,combined为默认值.
    sendfile on; #设置是否使用sendfile方式传输文件,可以在http|server|location块配置.
    keepalive_timeout 65; #客户端连接超时时间,可以在http|server|location块配置.
    upstream test_server { #反向代理和负载均衡
        server 192.168.24.13:9090 weight 8;
        server 192.168.24.14:9091 backup;
    }
    server{
        listen 80; #监听端口号.
        server_name www.itsh.com; #监听地址.
        keepalive_timeout 30; #设置与上游服务器的超时时间.
        keepalive_requests 100; #设置与上游服务器的单连接请求上限次数.
        location / { #请求的url过滤,正则匹配.
            proxy_pass http://test_server; #请求转向test_server定义的服务器列表.
            add_header addr $remote_addr; #add_header是设置响应头给浏览器
            proxy_set_header Connection ""; #而proxy_set_header是设置请求头给上游服务器
            proxy_set_header Range $http_range; #断点续传
            deny 127.0.0.1; #拒绝的ip.
            allow 172.11.12.23; #允许的ip.
        }
        location ~*\.(css|js|img)$ {
            access_log off;
            add_header Cache-Control max-age=360000; #强制缓存
            valid_referers 192.168.24.11; #防盗链
            if ($invalid_referer){ #如果请求不是来自上面配置的白名单,直接重定向到别的页面或者直接返回403。注意if后面必须有一个空格
               return 403;
            }
        }
    }
}

2.4 日志配置

日志路径是在安装根路径logs目录下,分为access.log访问日志和error.log错误日志。访问日志的内容格式是可以定制的。

如上一小节所示例的,可以使用的变量有:

变量含义
$bytes_sent发送给客户端的总字节数
$connection连接的序列号
$connection_requests当前通过一个连接获得的请求数量
$msec日志写入时间,单位为秒,精度是毫秒级别
$pipe如果请求是通过http流水线发送,该值为p,否则为.
$request_length请求的长度(包括请求行、请求头和请求体)
$request_time请求处理时间,单位为秒,精度毫秒。从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止
$status请求状态
$time_iso8601ISO8601标准格式下的本地时间
$time_local通用日志格式下的本地时间
$remote_addr客户端IP地址
$http_x_forwarded_for客户端IP地址
$remote_user客户端用户名称
$request请求的URL和HTTP协议
$http_referer记录从哪个页面链接访问过来的
$body_bytes_sent发送给客户端的字节数,不包括响应头的大小
$http_user_agent记录客户端浏览器相关信息

日志格式配置完成之后,继续配置日志

access_log path [format [buffer=size] [gzip[=level]]] [flush=time] [if=condition];
配置项作用
path指定日志的存放位置
format跟log_format的名字对应,默认使用预定义的combined
buffer指定日志写入时缓冲区大小,默认64K
gzip日志写入是否压缩,可以指定压缩比
flush如果超过该时间,将缓冲区的日志刷到磁盘
if条件判断,如果条件计算为0或者空字符串,不会记录日志

3 基本应用

3.1 虚拟主机

原本一台服务器只能对应一个站点,通过虚拟主机可以虚拟化成多个站点同时对外提供服务。虚拟主机没有独立的IP,磁盘、内存、CPU和网络都是共享的,配置示例如下:

#两个server都监听80端口,通过不同的域名匹配,它们数据的根路径不同,各有各的默认页面,当虚拟主机比较多的时候,配置文件不好维护,可以将每个server中的内容独立成一个文件,然后在主配置文件中通过include引入
server{
    listen 80;
    server_name www.itsh.com;
    root /usr/local/nginx/data/itsh;
    location / {
        index index.html index.htm;
    }
    error_page 500 502 503 504 /50x.html;
    location=/50x.html{
        root html;
    }
}
server{
    listen 80;
    server_name www.itxh.com;
    root /usr/local/nginx/data/itxh;
    location / {
        index index.html index.htm;
    }
    error_page 500 502 503 504 /50x.html;
    location=/50x.html{
        root html;
    }
}
#当然有了虚拟主机之后,子域名还可以映射到子目录,也就是目录绑定。

servername匹配规则是分先后顺序的,前面的匹配上了,就不会往后面匹配了,同一个servername中可以匹配多个域名,也可以使用正则匹配。

3.2 反向代理

一句话,正向代理隐藏了真实的客户端,反向代理隐藏了真实的服务端。

配置示例如下:

#也就是访问Nginx的80端口会反向代理到后端192.168.24.14的服务器
server{
    listen 80;
    server_name localhost;
    location / {
        proxy_pass http://192.168.24.14:8081; #代理的目标服务,也可以是一个服务器组,实现负载均衡
    }
}
3.2.1 location的匹配规则
路径作用
location=/uri=表示精确匹配,只有完全匹配上才会生效
location ^~ /uri^~开头对URL路径进行前缀匹配,并且在正则之前
location ~ pattern~开头表示区分大小写的正则匹配
location ~*~*开头表示不区分大小写的正则匹配
location /uri不带任何修饰符,也表示前缀匹配,但是在正则匹配之后
location /通用匹配,任何未匹配到其它location的请求都会匹配到
3.2.2 反向代理配置项说明

配置Nginx向上游服务器转发时的一些参数

  1. proxy_pass

    设置上游服务器的协议和地址

    注意Nginx在两个模块中都有该指令,在ngx_stream_proxy_module中只能在server段中使用,只需要提供域名或IP和端口,可以理解为端口转发,也就是四层负载。在ngx_http_proxy_module中可以在location段、location中的if段和limit_except段中使用,除了提供域名或IP和端口外,还需要提供协议,还有一个可选的url可以配置,也就是七层负载,

    七层负载时,路径的说明

    • proxy_pass后面的url如果加了/,表示相对路径,是不修改后端url的代理。

      #可以理解为拼接起来,然后直接向后端转发
      #访问代理的/api,转发到后端的地址就是http://itsh.com拼接/api
      location / {
          proxy_pass http://itsh.com;#不加/,和location的/拼接起来
      }
      #访问代理的/api,匹配到该location,然后拼接地址转发给后端
      location /api {
          proxy_pass http://itsh.com;
      }
      #访问代理的/api/,匹配到该location,然后拼接地址转发给后端
      location /api/ {
          proxy_pass http://itsh.com;
      }
      
    • 如果加了,表示绝对根路径,是修改后端url的代理。

      #可以理解为拼接起来,然后再消消乐后向后端转发
      #访问代理的/api,转发到后端的地址就是http://itsh.com/拼接/api
      location / {
          proxy_pass http://itsh.com/;
      }
      #访问代理的/api,相当于匹配上了http://itsh.com//api,然后消除location的值就相当于访问了http://itsh.com/
      location /api {
          proxy_pass http://itsh.com/;
      }
      #访问代理的/api,由http://itsh.com//api/ 消消乐后转发 http://itsh.com//
      location /api/ {
          proxy_pass http://itsh.com/;
      }
      
  2. proxy_redirect

  3. proxy_method

    设置向上游服务器请求的请求方法。

  4. proxy_store

    是否开启将文件保存到磁盘上的功能,如果开启,则将文件保存在root或者alias指令设置的路径中,保存的文件名也可以使用含变量的string参数来指定。保存文件的修改时间根据接受到的Last-Modified来设置,响应都是先写入临时文件,然后重命名生成的。

    #语法
    proxy_store on | off | string;
    #上下文 http,server,location
    
  5. proxy_connect_timeout

    设置与上游服务器连接的超时时间,默认60s,一般不可能大于75s。

    #语法
    proxy_connect_timeout time;
    #上下文 http,server,location
    
  6. proxy_read_timeout

    设置从上游服务器获取响应的超时时间,意思是相邻两次读操作之间的最长时间间隔,而不是整个响应传输完成的时间,超时关闭连接,默认60s。

    #语法
    proxy_read_timeout time;
    #上下文 http,server,location
    
  7. proxy_send_timeout

    设置向上游服务器传输请求的超时时间,意思是相邻两次写操作之间的最长时间间隔,而不是整个请求传输完成的时间。超时关闭连接,默认60s。

    #语法
    proxy_send_timeout time;
    #上下文 http,server,location
    
  8. proxy_http_version

    设置代理使用的HTTP协议版本。

    #语法
    proxy_http_version 1.0 | 1.1;
    #上下文 http,server,location
    
  9. proxy_next_upstream

    设置在哪种情况下一个失败的请求应该被发送到下一台上游服务器。默认值为error timeout。

    #语法
    proxy_next_upstream error | timeout |invalid_header | http_500 | http_502 | http_503 | http_504 | http_404 | off ...;
    #上下文 http,server,location
    
  10. proxy_ignore_client_abort

    决定当客户端在响应传输完成前就关闭连接时,Nginx是否关闭后端连接。默认off。

    #语法
    proxy_ignore_client_abort on | off;
    #上下文 http,server,location
    
  11. proxy_intercept_errors

    当上游服务器的响应码大于等于400时,是否直接将响应发送给客户端,也可以是由Nginx的error_page指令来处理,默认关闭。

    #语法
    proxy_intercept_errors on | off;
    #上下文 http,server,location
    
  12. proxy_cookie_domain

    设置上游服务器”Set-Cookie“响应头中的domain属性的替换文本,可以同时设置多条该指令,默认关闭。off参数可以取消当前配置级别中的所有proxy_cookie_domain指令。

    #语法 domain replacemet中可以包含变量
    proxy_cookie_domain off;
    proxy_cookie_domain domain replacement;
    #上下文 http,server,location
    #示例:将响应头中的domain=itsh.org改为domain=itsh.com
    proxy_cookie_domain itsh.org itsh.com;
    
  13. proxy_cookie_path

    设置上游服务器中Set-Cookie“响应头中path属性的替换文本,可以同时设置多条,默认关闭。

    #语法 path replacement中可以包含变量
    proxy_cookie_path off;
    proxy_cookie_path path replacement;
    #上下文 http,server,location
    #示例:将响应头中的path=/blog/uri/改为path=/bbs/uri
    proxy_cookie_path /blog/ /bbs/;
    
  14. proxy_set_header

    允许重新定义或者添加发往上游服务器的请求头,默认情况下只有两个请求头会被重新定义:

    proxy_set_header Host $proxy_host; #上游服务器接受的主机被修改成了代理服务器的主机
    proxy_set_header Connection close; #代理服务器与上游服务器的keepalive功能被关闭了
    

    如果不想改变请求头Host的值,可以设置为下面的值,如果设置某个请求头的值为空,那么该请求头将不会传递给上游服务

    proxy_set_header Host $http_host;
    
    #语法
    proxy_set_header field value;
    #上下文 http,server,location
    

    获取客户端真实IP

    proxy_set_header  X-Forwarded-For $remote_addr;
    
  15. proxy_ignore_headers

    指定来之上游服务器的响应头中的某些参数不会被解析处理。比如如果后端服务的响应头中包含Expires参数,将会影响到Nginx缓存的机制,因为后端的缓存参数优先级高于Nginx

    #语法
    proxy_ignore_headers field ...;
    #上下文 http,server,location
    #示例配置
    proxy_ignore_headers Expires Set-Cookie;
    
  16. proxy_hide_header

    禁止某些响应头发送给客户端

    #语法
    proxy_hide_header field;
    #上下文 http,server,location
    
  17. proxy_pass_header

    允许传递某些响应头给客户端

    #语法
    proxy_pass_header field;
    #上下文 http,server,location
    
  18. valid_referers

    客户端请求过来会带有一个referer字段,表示该请求是从哪里来的,通过该配置可以判断是否是本站内的请求,以此来防止盗链。

    #语法
    valid_referers none | blocked | server_names | string ...;
    #none表示不存在Referer头,在浏览器地址直接输入URL并回车是没有该字段的
    #blocked检测Referer头的值被防火墙或代理服务器删除或伪装的情况,这种情况该头域的值不以http://或https://开头
    #server_names设置一个或多个URL,检测Referer头的值是否是这些URL中的某一个
    #上下文 location,server
    

3.3 负载均衡

3.3.1 负载均衡配置示例:
http{
    #省略一些配置
    upstream tomcats{
        server 192.168.24.12:8081 weight=2 max_fails=3 fail_timeout=20;
        server 192.168.24.13:8082;
        server 192.168.24.14:8083 backup;
    }
    server{
        listen 80;
        server_name localhost;
        location / {
            proxy_pass http://tomcats;
        }
    }
}
3.3.2 upstream模块中的server属性说明
配置内容作用
weight默认为1,weight越大,负载的权重就越大
max_conns限制分配给某台server处理的最大连接数,超过后,将不会分配新的连接给它,默认为0,表示不限制
max_fails某台server允许请求失败的次数,超过最大次数后,在fail_timeout内,新的请求将不会分配给这台机器,默认为1,如果该组中只有一个服务器,则会忽略该项配置,并且永远不会将该服务器置为不可用
fail_timeout默认为10s
backup其它所有非backup机器down或者忙的时候,请求backup机器
down表示当前server暂时不参与负载
3.3.3 负载策略
策略说明
默认权重轮询
ip_hash根据客户端IP的哈希结果选择一个固定的服务器
least_conn选取活跃连接数与权重的比值最小者为下一个处理请求的server,也就是活跃连接数越小,权重越大,越优先选择,上一次已选的server和已达到最大连接数的server不在选择的范围
通用hash根据用户自定义的键来确定,该键可以是文本字符串、变量或组合,比如hash $request_uri
url_hash根据访问的url定向转发请求
3.3.4 第三方负载模块
  • fair。按照后端服务器的响应时间来分配请求,响应时间短的优先分配
#1、下载解压
cd /usr/local/nginx/modules
wget https://files.cnblogs.com/files/ztlsir/nginx-upstream-fair-master.zip
tar -zxvf nginx-upstream-fair-master.zip
#2、备份原nginx启动文件
cd /usr/local/nginx/sbin
cp nginx nginx.bak
#3、在nginx原解压根目录下添加模块
cd /usr/local/nginx-1.22.1
./configure --prefix=/usr/local/nginx --add-module=/usr/local/nginx/modules/nginx-upstream-fair-master
#4、在nginx原解压目录下make,确保无错误
make
#5、检查是否安装成功
cd /usr/loal/nginx-1.22.1/objs/
./nginx -V
#6、复制添加负载模块后的nginx启动文件到sbin目录,覆盖原文件
cp -rf nginx /usr/local/nginx/sbin/
#7、重启nginx
systemctl restart nginx
upstream tomcats{
    fair;
    server 192.168.24.12:8081;
    server 192.168.24.13:8082; 
}
  • sticky。是使用基于cookie的负载均衡,客户端在收到回复后会在cooikie中添加route字段,类似JsessionId,项目官网https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/src/master/
#1.下载解压
tar -zxvf nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d_.tar.gz
#2.安装openssl-devel依赖
yum install -y openssl-devel

#3.在nginx原解压目录重新编译
cd /usr/local/nginx-1.22.1
./configure --prefix=/usr/local/nginx --add-module=/usr/local/nginx/nginx-goodies-nginx-sticky-module-ng-c78b7dd9d0d
make
#4.报错修改ngx_http_sticky_misc.c文件
#在第12行添加,然后重新编译
#include <openssl/sha.h>
#include <openssl/md5.h>
#5.备份之前的程序
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.backup
#6.将编译好nginx替换到原来的目录
cp -rf /usr/local/nginx-1.22.1/objs/ /usr/local/nginx/sbin/
#7.升级检测并检测程序中是否包含新模块
make upgrade
nginx -V
upstream tomcats{
    sticky name=route expires=1h;
    server 192.168.24.12:8081;
    server 192.168.24.13:8082;
}

3.4 动静分离

动静分离的实践中,既可以把静态文件放在其它的静态资源服务器上,不同类型的静态文件可以转发到不同的服务器,也可以根据客户端类型转发到不同地址上,还可以直接将静态文件存放到Nginx服务器上

配置示例

server{
    listen 80;
    server_name localhost;
    location / {
        proxy_pass http://192.168.24.14:9091;
        root html;
        index index.html
    }
    location ~*/(css|js|img) {
        root /usr/local/nginx/data/static;
    }
}

3.5 keepalive

keepalive是HTTP1.1中为了重复利用TCP连接使用的技术,达到复用连接,有效减少握手次数。

http1.0中是短连接,一次请求响应对应一个tcp连接,http1.1中是长连接,连接可以复用

3.5.1 面向客户端使用keepalive
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
	#配置客户端向Nginx服务发送请求的参数
    keepalive_timeout  65; #超过改时间没有活动,会让Keepalive失效,断开tcp连接,有活动则重置
    keepalive_time 1h; #一个tcp连接总时长,超过之后强制失效
    send_timeout 60 60; #向客户端传输响应的超时时间,超时只设置在两个连续的写操作之间,而不是整个响应的传输,如果客户端在该时间内没有收到任何东西,连接就会关闭,意思就是服务器准备数据的时间而不是传输时间。后面第二个60表示下发一个header告诉浏览器
    keepalive_requests 1000; #一个tcp长连接中可以处理的请求数,超过后断开连接
    keepalive_disable msie6; #默认在IE6中禁用keepalive功能
}
3.5.2 面向上游服务器使用keepalive
upstream webserver {
	  keepalive 100;#Nginx与上游服务器的tcp连接数
	  keepalive_requests 1000; #与上游服务器的一个tcp连接可以并发处理的请求数
	  keepalive_timeout 65; #与上游服务器的keepalive时间
	  server 192.168.24.13:9090;
	  server 192.168.24.14:9091;
	}
    server {
        listen       80;
        server_name  localhost;
        location / {
		 proxy_http_version 1.1; #与上游服务器连接的http版本号
		 proxy_set_header Connection ""; #由于Nginx接受客户端的请求后向上游服务器中转时,会清除请求头中的一些信息,默认只会重定义这两个字段proxy_set_header Host $proxy_host; proxy_set_header Connection close;设置该参数为空,会与上游服务器开启keepalive功能,并且缓存的标识字段也会被传递
		 proxy_pass http://webserver; #反向代理、负载均衡,upstream块中配置的上游服务器
        }      
    }

3.6数据压缩

Html默认会压缩,其他类型需要添加配置,比如Json、JS和CSS,但是对于图片和音视频这类二进制格式的本身已经经过压缩,再进行压缩的话,压缩比不会很高,不建议开启压缩。gzip作用域在http|server|location块。

http{
    listen 80;
    server_name localhost;
    gzip on; #是否开启gzip压缩
    gzip_comp_level 3; #压缩等级,取值范围1~9,默认为1,等级越高越消耗CPU
    gzip_min_length 1k; #压缩的最小文件,小于该值的文件不会压缩
    gzip_http_version 1.1; #启用压缩功能时,协议的最小版本,默认HTTP/1.1
    gzip_buffers 16 8k; #压缩时缓冲空间,默认32 4k|16 8k
    gzip_types  
        text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml
    	text/javascript application/javascript application/x-javascript
    	text/x-json application/json application/x-web-app-manifest+json
    	text/css text/plain text/x-component
    	font/opentype application/x-font-ttf 					application/vnd.ms-fontobject
    	image/x-icon;; #哪些mime类型的文件进行压缩
    gzip_vary on; #如果启用压缩,是否在响应头中插入“Vary:Accept-Encoding”,建议开启,让用户知道服务端是支持压缩功能的。主要是适配老的浏览器
    gzip_proxied any; #可以多选。off为不做限制,any为无条件启用压缩。仅当作为反向代理时,针对上游服务器返回的头信息进行压缩,expired当返回的header中包含"Expires"信息时启用压缩,no-cache当header中包含"Cache-Control:no-cache"信息时启用压缩,no-store当header中包含"Cache-control:no-store"信息时启用压缩,private当header中包含"Cache-Control:private"信息时启用压缩,no_last_modified当header不包含"Last-Modified"信息时启用压缩,no_etag当header中不包含"ETag"时启用压缩,auth当header中包含"Authorization“信息时启用压缩
    gzip_disable "MSIE [1-6]\."; #针对一些客户端禁用gzip功能
}

对于一些不支持gzip的客户端可以使用模块ngx_http_gunzip_module在服务端解压缩一些gzip压缩过的文件再发送给客户端。该模块是Nginx自带的但是默认没有开启,需要重新编译Nginx

./configure --prefix=/usr/local/nginx --with-http_gzi_static_module

3.7跨域访问

同域的意思就是请求的协议、请求的域名(IP)和请求的端口都相同。比如:

域1域2是否同源
http://www.itsh.comhttps://www.itsh.com否,协议不同
www.itsh.comwww.itsh.org否,域名不同
blog.itsh.comiv.itsh.com否,子域名不同
www.itsh.com:2334www.itsh.com:5667否,端口不同
www.itsh.com/indexwww.itsh.com/bbs

注意,同源策略是浏览器保护用户的措施,防止第三方网站请求拿到返回的数据,服务器端是不存在跨域的。但是在一些情况下,比如需要允许浏览器执行JS访问其他网站资源(嵌入播放器、嵌入天气预报等),只需要在被跨域请求的服务器响应头中添加Acces-Control-Allow-Origin字段即可。解决办法如下

3.7.1 修改浏览器设置

虽然浏览器可以解决,但是不可能要求所有用户都修改该配置

3.7.2 前端用JSONP请求

原理就是script标签的src、img标签的src和link标签的href是不会受到同源限制的,本质上它们链接的资源是一个get请求,这也决定了JSONP只能解决get的跨域问题

3.7.3 修改后端代码

spring中在被请求的方法或者类上使用@CrossOrigin注解,其本质上是在响应头中加入了一下三个字段:

"Access-Control-Allow-Origin":"*"
"Access-Controll-Allow-Methods":"GET,POST,PUT,OPTIONS"
"Access-Controll-Allow-Credentials":"true"

当然如果方法比较多可以添加拦截器或配置类,为所有的响应头都加上这些header,比如:

@Configuration
public class CORSConfiguration{
    @Bean
    public WebMvcConfigurer corsConfigurer(){
        return new WebMvcConfigurerAdapter(){
            @Override
            public void addCorsMappings(CorsRegistry registry){
                registry.addMapping("*")
                    .allowedOrigins("*")
                    .allowedMethods("GET","POST","DELETE","PUT","OPTIONS")
                    .allowCredentials(false).maxAage(3600);
            }
        }
    }
}
3.7.4 Nginx代理设置跨域

方式一:通过反向代理,让两个域变成同域的请求。

方式二:在Nginx返回给浏览器时,添加Access-Control-Allow-Origin头信息,告诉浏览器,它请求的源站是支持来自其他地址的数据的。

location / {
    proxy_pass http://192.168.24.12:8089;
    add_header 'Access-Control-Access-Origin' '*';
    add_header 'Access-Control-Access-Methods' 'GET,PUT,POST,DELETE,OPTIONS';
}

3.8 Nginx的客户端缓存-浏览器缓存

浏览器第一次向服务器发送请求后拿到请求结果,会根据响应头中的缓存标识,决定是否缓存结果,如果是则将请求结果和缓存标识存入浏览器缓存中。服务器会在响应头中加入控制缓存的字段。

3.8.1 强制缓存

强制缓存就是浏览器向浏览器缓存查找请求结果,并根据该结果的缓存规则来决定是否使用该缓存。

  • 如果不存在缓存结果和标识,强制缓存失效,则直接向服务器发起请求
  • 如果存在缓存结果和标识,但结果已经失效,强制缓存失效,使用协商缓存
  • 如果存在缓存结果和标识,并且结果未失效,强制缓存生效,直接返回该结果

强制缓存字段

  • Expires是http/1.0用来控制缓存的结果,其含义是该缓存结果的到期时间,是一个绝对值,由于客户端和服务端可能会在时间上因为一些原因发生误差,导致强制缓存毫无意义。
  • Cache-Control是http/1.1中控制缓存的字段,优先级高于Expires,是一个相对值,但是由于缓存过期后,浏览器不管资源是否发生变化,都会再次读取资源文件。
取值类 型功能
public响应头意味着包括CND、代理服务器之类的任何缓存都可以存储响应的副本,该指令通常来说是冗余的,因为其它指令(如max-age)已经隐式的表示响应可以缓存
private响应头相比较public,private是显式指令,表示只有响应的最终接收方可以缓存文件
max-age请求和响应文件可以在浏览器缓存的时间以秒为单位,设置私有缓存(客户端)的时间
s-maxage请求和响应该指令在公共缓存中会覆盖max-age指令,设置公共缓存(代理、CDN)中的缓存时间
no-store请求和响应表示不会将任何信息持久化到任何缓存中,无论缓存的私有与否,该指令的优先级很高,如果缓存的文件包含敏感信息或者时效性很高,就可以使用该指令
no-cache请求头该指令并不意味着不缓存,而是在浏览器和服务器验证过并且服务器告知浏览器可以使用缓存之前,不能使用缓存。该指令既可以确保内容最新,也可以尽可能使用更快的副本,当服务器响应允许使用缓存时,网络只会传输文件报头,文件内容从缓存中获取,该指令和max-age指令一起使用时,max-age是没用的,因为重新验证的时间限制是零秒
must-revalidate请求和响应该指令需要关联一个max-age指令,比如max-age=600,该指令更像是一个具有宽限期的no-cache,在最初的600秒浏览器不会向服务器重新验证,当600秒过去的一刻,才会重新验证
proxy-revalidate请求和响应是公共缓存版的must-revalidate
immutable响应告知浏览器该文件是不可变的,因此不需要重新验证,减少造成延迟的往返开销,高延迟场景下,这种节约是可感知的,同时配置max-age是无效的,即使时间到了也不会验证
stale-while-revalidate响应关联一个max-age指令,也就是该指令提供一个宽限期,也就是在max-age指定的时间过后,可以在该指令指定的时间内继续使用旧资源,直到重新验证了它
stale-if-error响应如果max-age指定的有效期过后,重新验证资源返回了5xx之类的错误,浏览器可以使用旧缓存的宽限期就是该指令指定的时间
no-transform响应告知中间代理不得对该资源进行任何更改或转换,该指令可以与其他任何指令搭配使用,且不依赖其它指令独立运行,当然在https下,该指令也就没有意义了
min-fresh请求和响应缓存最小使用时间
max-stale请求和响应缓存最大使用时间,如果过期,但还在该时间范围内可以继续使用
only-if-cached响应只使用缓存,如果没有缓存,504
3.8.2 协商缓存

协商缓存是强制缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器根据缓存标识决定是否使用缓存。

  • 协商缓存生效,返回304
  • 协商缓存失效,重新请求后端资源,返回200

协商缓存字段

  • Last-ModifiedIf-Modified-Since,前者是服务器响应请求时,返回的资源文件在服务器最后被修改的时间。后者则是浏览器再次发送该请求时,携带上次请求返回的Last-Modified的值,以此来通知服务端该资源上次请求返回的最后修改时间,服务器会根据该值与该资源的最新修改时间比较,如果大于If-Modified-Since字段的值,则重新返回资源,否则返回304,代表资源无更新,可以继续使用缓存文件。如果资源最后修改时间变了但内容没有变,会重新请求资源。
  • E-tagIf-None-Match,前者是服务器返回的当前资源的唯一标识(对文件名和文件大小进行哈希运算截取部分拼接而成),后者则是浏览器再次发起该请求时,携带上次请求返回的E-tag的值,以此告诉服务器该资源上次请求返回的唯一标识,服务器根据该值与资源在服务器上的E-tag值进行比较,相同则返回304,代表资源无更新,继续使用缓存文件,不一致则重新返回资源文件。优先级高于Last-Modified和If-Modified-Since。E-tag的值是通过哈希算法计算得来的,会占用服务端计算的资源。

**PS:**浏览器中写入URL,回车,会从缓存中获取,如果有则不用继续请求了【强制缓存】,使用F5告诉浏览器向服务器看一下该资源是否有过期了,浏览器就会带上If-Modify-Since发起请求【协商缓存】,使用Ctrl+F5告诉浏览器删除缓存文件,并向服务器重新请求该资源。

3.8.3 Nginx配置强制缓存和协商缓存

对于静态文件,比如css|js|img等类型的文件采用强制缓存,设置浏览器缓存保存的时间,当设置的时间到期后,强制缓存失效,浏览器会采用协商缓存与服务器进行确认,如果没有变更,304,如果有变更,200。

对于动态文件,设置使用协商缓存,保证每次都想服务器确认一下文件是否变更。

location ~*\.(html)$ {
	root html; #一些容易变更的资源文件
	access_log off;
	add_header Cache-Control max-age=no-cache; #协商缓存,解决了资源修改后不更新的问题		
}
		
location  ~*\.(css|js|png|jpg|gif)$ {
	access_log off;
	root static;
	add_header Cache-Control max-age=10; #强制缓存
    #expires 20; #经过测试,同时配置该选项,以该选项的过期时间为准
} 

3.9 Nginx的服务器缓存-HTTP代理缓存

代理缓存是将上游服务器返回的内容缓存到Nginx中

3.9.1 缓存配置示例
http{
    proxy_cache_path /usr/local/soft/nginx/http_cache levels=1:2 keys_zone=sh_cache:5m inactive=10m max_size=1g;
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;

    server {
        listen       80;
        server_name  localhost;
        
        location / {
            proxy_pass http://192.168.24.13:9091;
            proxy_cache sh_cache; #使用proxy_cache_path定义的内存区域
            proxy_cache_key $host$uri$is_args$args; #缓存键
            proxy_ignore_headers Expires Set-Cookie;
            proxy_cache_valid 200 304 2m;#对应200和304响应码进行缓存,过期时间2分钟,这会覆盖掉proxy_cache中inactive的值
            add_header X-Proxy-Cache $upstream_cache_status; #在返回的响应头中添加X-Proxy-Cache,表示是否命中缓存
            root html;
            access_log off;	
		}
    }
}
3.9.2 缓存配置项说明
  1. proxy_cache_path

    #语法
    proxy_cache_path path [levels=levels] keys_zone=name:size [inactive=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time];
    #上下文 http
    
    参数含义
    path指定缓存文件目录,最好和proxy_temp_path设置在同一文件分区下
    level定义缓存的层次结构,它是根据哈希后的请求的URL地址创建的,目录名称从哈希后的字符串结尾处开始截取,假设哈希后的请求链接地址为4j4kgi2o34lb4s9ce2,则levels=1:2,表示第一层子目录的名称长度是1,也就是字符2,第二层子目录的名称是长度为2的字符也就是ce
    keys_zone指定缓存区名称和共享内存大小,在共享内存中设置一块存储区域来存放缓存的key和metadata,这样就可以判断一个请求是否命中缓存,1m可以缓存8000个key
    inactive表示主动删除在指定时间内未被访问的缓存,默认10m
    max_size缓存占用的最大存储空间,如果不指定,会用掉所有磁盘空间,当磁盘满了之后采用LRU算法移除数据
    loader_filescache loader进程(将文件系统上保存的缓存重新加载到共享内存的进程,加载过程分多次迭代完成,每次迭代加载的文件数量,迭代的消耗时间,迭代的暂停时间,)遍历文件时,每次加载的文件个数,默认100
    loader_threshold每次迭代消耗的时间上限,默认200ms
    loader_sleep一次迭代之后,停顿的时间间隔,默认50ms
  2. proxy_temp_path

    设置从上游服务器接受的临时文件的存放路径,可以为该路径定义最多三层子目录的目录树,level的含义和proxy_cache_path中的level相同

    #语法
    proxy_temp_path path [level1 [level2 [level3]]];
    #上下文 http,server,location
    #示例配置
    proxy_temp_path /nginx/temp_cache 1 2;
    
  3. proxy_cache

    指定用于页面缓存的共享内存,同一共享内存可以在多个地方使用,off参数可以屏蔽从上层配置继承的缓存功能,zone的取值是proxy_cache_path配置项中的keys_zone的值

    #语法
    proxy_cache zone | off;
    #上下文 http,server,location
    
  4. proxy_cache_key

    设置缓存键,可以使用一些内置变量

    注意该键的设计非常关键,代理或URL跳转常常会添加无用的请求,可能会导致不同的key保存多份相同的内容,通常可以根据一些lua脚本对URL参数进行过滤,保证key的唯一性

    #语法
    proxy_cache_key string;
    #上下文 http,server,location
    #示例
    proxy_cache_key $host$uri$is_args$args;
    
  5. proxy_cache_valid

    为不同的响应状态码设置不同的缓存时间,可以配置多个,如果仅仅配置了time参数,则只有200、300和302的响应会缓存,如果使用了any参数,那么会缓存所有的响应

    #语法
    proxy_cache_valid [code ...] time;LL
    #上下文 http,server,location
    #示例配置
    proxy_cache_valid 200 304 5m;
    proxy_cache_valid 404 1m;
    proxy_cache any;
    

    **注意:**这些缓存的参数也可以是上游服务器直接在响应头中设置,上游服务设置的优先级要高于该指令设置的缓存时间。

    “X-Accel-Expires”响应头可以以秒为单位设置响应的缓存时间,如果值为0,表示禁止缓存响应,如果值以@开始,表示自1970年1月1日以来的秒数,响应一直会被缓存到这个绝对时间点。
    如果不含“X-Accel-Expires”响应头,缓存参数仍可能被“Expires”或者“Cache-Control”响应头设置。
    如果响应头含有“Set-Cookie”,响应将不能被缓存。 这些头的处理过程可以使用指令[proxy_ignore_headers](#3.2.2 配置项说明)忽略。

  6. proxy_cache_min_uses

    指定请求至少被发送了多少次以上才缓存,默认1,

    #语法
    proxy_cache_min_uses numbers;
    #上下文 http,server,location
    
  7. proxy_cache_use_stale

    如果上游服务器出现状况,Nginx是可以使用过期的缓存的,默认off。updating参数允许在更新缓存时使用过期缓存作为响应,以减少更新时访问上游服务器的次数,当在添加缓存时想要减少访问上游服务器的次数,则可以使用proxy_cache_lock指令

    #语法
    proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_504 | http_404 | off ...;
    #上下文 http,server,location
    
  8. proxy_cache_lock

    对于相同的请求,同时只允许一个请求发送到上游服务器,其它请求将会等待缓存,直到出现该请求的缓存,或者在proxy_cache_lock_timeout超时后。

    默认off,所有在缓存中没有的请求都会请求上游服务器。

    #语法
    proxy_cache_lock on | off;
    #上下文 http,server,location
    
  9. proxy_cache_lock_timeout

    设置锁的超时时间

    #语法
    proxy_cache_lock_timeout  time;
    #上下文 http,server,location
    
  10. proxy_cache_bypass

    如果至少一个条件为真(非空且非‘0’),则不从缓存中取响应。可以和proxy_no_cache一起使用

    #语法
    proxy_cache_bypass string ...;
    #上下文 http,server,location
    
  11. proxy_no_cache

    如果至少一个条件为真(非空且非‘0’),则不将响应存入缓存。

    #语法
    proxy_no_cache string ...;
    #上下文 http,server,location
    #示例
    proxy_no_cache $cookie_nocache $arg_nocache$arg_comment;
    proxy_no_cache $http_pragma    $http_authorization;
    
  12. proxy_cache_revalidate

    如果缓存过期了,向上游服务器发送If_Modified-Since和If-None-Match来验证资源是否改变

3.9.3 缓存不生效

需要说明一点,Nginx是否缓存是Nginx和上游服务器共同决定的,默认情况下,当从上游服务器中得到的Cache-Control中配置了private,no-cache,no-store或者Set-Cookie中配置了Expires信息时,Nginx不进行缓存,另外,Nginx仅仅缓存客户端的GET和HEAD请求。可以通过修改后端代码改变响应头信息或者使用[proxy_inore_headers](#3.2.2 反向代理配置项说明)来忽略某些引起不缓存的头信息。

3.9.4 缓存过期

造成缓存过期的原因可能有以下几种:

  1. 上游服务器响应头中设置了Expires
  2. 上游服务器响应头中设置了Cache-Control:max-age
  3. Nginx的proxy_cache_valid指令设置的缓存时间
  4. Nginx的proxy_cache_path中配置的inactive时间

上游服务器Expires、上游服务器max-age和Nginx的proxy_cache_valid都配置的情况下,以Expires的值为标准进行过期处理

上游服务器max-age和Nginx的proxy_cache_valid都配置的情况下,以max-age的值为标准进行过期处理。(这里可能后端配置了Expires但是被Nginx给屏蔽了)

只有Nginx的proxy_cache_valid配置了的情况下,以该值为标准进行处理

特别注意的是inactive不受上面所说的三个条件的影响,它的意思是从第一次缓存后经过inactive指定的时间后,强制进行缓存的清理。

3.9.5 缓存清理

默认情况下,缓存会在proxy_cache_path中的max_size用完的情况下删除,或者超过inactive属性配置的时间过后删除。

而如果想根据URL主动删除缓存,就需要使用第三方模块ngx_cache_purge。

#1、解压
tar -zxvf ngx_cahceh_purge-2.3.tar.gz
#2、备份之前的nginx启动文件
cd /usr/local/soft/nginx/sbin
cp nginx nginx.old
#3、在nginx原解压根目录下添加模块
cd /usr/local/soft/nginx.1.22.1
./configure --prefix=/usr/local/soft/ngix --add-module=/usr/local/soft/nginx/ngx_cache_purge-2.3
#4、在原解压根目录下编译,确保没有错误,不需要install,如果install之后会覆盖原有的配置
make
#5、检查是否安装成功
cd /usr/local/soft/nginx-1.22.1/objs
./nginx -V
#6、复制objs目录下的nginx文件到sbin目录
cp -rf nginx /usr/local/soft/nginx/sbin
#7、配置文件中添加配置
location ~/purge(/.*){
	allow all;
	proxy_cache_purge sh_cache $host$uri$is_args$args;#缓存区域和缓存键
}
#8、重启并测试
systemctl restart nginx
#在原来的请求的端口后面加上/purge,比如原链接是http://192.168.24.11/time/query,那么删除缓存的URL就是http://192.168.24.11/purge/time/query。就会删除掉该请求键对应的缓存,下一次访问将请求上游服务器响应
3.9.6 缓存命中率

可以在返回给客户端的响应头中添加X-Proxy-Cache字段,值为内置变量**$upstream_cache_status**来判断是否命中缓存

状态含义
MISS未命中缓存,请求上游服务器
HIT命中缓存
EXPIRED正在更新缓存,将使用旧的应答,也就是响应入口没变([proxy_cache_use_stale updating](#3.9.2 缓存配置项说明))
BYPASS缓存被绕过了([proxy_cache_bypass](#3.9.2 缓存配置项说明))
STALE无法从上游服务更新缓存时,返回了旧的缓存([proxy_cache_use_stale ](#3.9.2 缓存配置项说明))
UPDATING内容过期了,相较于之前的请求,响应的入口已经更新,并且proxy_cache_use_stale的updating已被设置
REVALIDATED启用[proxy_cache_revalidate](#3.9.2 缓存配置项目说明)后,当内容过期后,会去上游服务器验证,此时返回的状态

3.10 Nginx的文件元信息缓存

应用于静态文件元数据信息缓存,缓存这部分经常打开使用的文件元数据,在sendfile时加速文件的打开和响应。

配置如下

open_file_cache max=500 inactive=120s; #缓存的最大数量,超过后使用LRU算法淘汰,指定inactive时间内未被访问的缓存将被删除(不是删除缓存的资源,而是删除缓存的元数据信息)
open_file_cache_min_uses 1; #访问多少次之后就开始缓存
open_file_cache_valid 60s; #间隔多长时间去检查文件是否有变化
open_file_cache_errors on; #对错误信息是否缓存

3.11 Nginx+Redis

3.12 Nginx健康检查

3.12.1 失败重试(默认)
  1. 节点是否存活-upstream块

    [upstream块](#3.3.2 upstream模块中的server属性说明)中的server配置属性中有max_failsfail_timeout,意味着在fail_timeout时间内失败了max_fails次后会将当前server标记为不可用状态。max_fails默认为1,如果max_fails为0,意味着服务一直可用,不检查健康状态。当fail_timeout时间后会再次激活该服务

    upstream backend {
        server 192.168.24.13:9090 max_fails=3 fail_timeout=10 weight=5;
        server 192.168.24.14:9091;
        server 192.168.24.15:9092;
    }
    
  2. 请求切换节点-location块

    [proxy_next_upstream](#3.2.2 反向代理配置项说明)用于指定在什么情况下Nginx会将请求转移到其它服务器上,默认的选项是error和timeout,当然也可以使用其它参数来指定哪些状态码的情况下重试。在proxy_next_upstream_timeout超时时间内允许重试proxy_next_upstream_tries参数指定的次数(包括第一次,也就是如果该值为3,第一次失败了,最多会重试两次)。需要注意的是默认情况下只会对GET等幂等性的请求进行重试,对于非幂等方法(POST|PATCH|LOCK)不会进行重试,这是因为非幂等性方法重试多次之后可能造成在上游服务器中多次插入的情况,如果让POST请求失败也会重试,需要在proxy_next_upstream中配置non_idempotent

    server{
        location / {
            proxy_pass http://backend;
            proxy_next_upstream error timeout;
            proxy_next_upstream_timeout 30s;
            proxy_next_upstream_tries 2;      
        }
    }
    
3.12.2 主动检查(添加模块)

主动检查需要添加该模块是Tengine版中的nginx_upstream_check_module(Github地址),需要重新编译源码,目前最新支持的nginx版本是1.20.1

模块添加步骤

#1、重新下载并解压1.20.2版本的nginx
#2、下载并解压nginx_upstream_check_module
cd /usr/local/nginx20
tar -zxvf nginx_upstream_check_module-0.3.0.tar.gz
#3、上传check_1.20.1+.patch文件,注意要与nginx的版本对应
#3.进入nginx原解压根目录,执行patch(tengine修改了nginx的很多源码)
cd /usr/local/nginx/nginx-1.20.2
patch -p1 < /root/check_1.20.1+.patch
#4、配置并编译安装
./configure --prefix=/usr/local/nginx --add-module=/usr/local/nginx/nginx_upstream_check_module-0.3.0
make
make install
#5、修改配置文件
#6、启动nginx并访问http://192.168.24.13/status
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

配置示例

http {
    upstream backend {
        server 192.168.24.11:8080;
        server 192.168.24.14:9092;
        check interval=1000 rise=1 fall=3 timeout=2000 type=http; #调用间隔时间,成功rise次为up,失败fall次为down
        check_http_send "GET /time/query HTTP/1.0\r\n\r\n"; #后端检查状态的接口,注意这里请求的方法和接口必须在后端存在!!!!!
       	check_http_expect_alive http_2xx http_3xx; #调用接口的响应码为这些值时为正常状态
	}
    server{
        listen 80;
		location /status { #状态显示页面
			access_log off;
        	check_status;
    	}
        location / {
            proxy_pass http://backend;
            root html;
        }
    }
}

3.13 Https配置

http和https协议

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
    	listen 80;
    	server_name itsh.com;
    	rewrite ^(.*)$ https://$host$1 permanent; #将请求转成https
    }
    server {
    	listen 443;#监听443端口
    	server_name itsh.com; #域名
    	ssl on; 
    	ssl_certificate  /root/card/huiblog.top.pem; #ssl证书的pem文件路径
    	ssl_certificate_key /root/card/huiblog.top.key;#ssl证书的key文件路径
    	location / {
    	 	proxy_pass  http://后端项目公网或私网:端口;
    	}
  	}
}

3.14 高可用配置

Keepalived软件最早是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP (Virtual Router Redundancy Protocol ,虚拟路由器冗余协议)功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用(防止单点故障)解决方案。
在 Keepalived服务正常工作时,主 Master节点会不断地向备节点发送(组播)心跳消息,用以告诉备Backup节点自己还存活,当主 Master节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主 Master节点的心跳了,于是接管主Master节点的 IP资源及服务。而当主 Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。

搭建一个主从热备的Nginx高可用集群

  • 主节点Keepalived配置

    ! Configuration File for keepalived
    
    #定义全局配置
    global_defs {
    #	notifacation_email{ #设置keepalived在有事件发生时,需要发送到的邮件地址,可以有多个
    #		xxx
    #		xxx
    #	}
    #	notificatin_email_from   xxx  #设置发送邮件的来源
    #	smtp_server IP #指定发送邮件的smtp服务器
    #	smtp_connect_timeout 30 #smtp连接超时时间
        router_id SH1 #表示运行keepalived的一个唯一标识
    }
    
    #定义服务检测脚本
    vrrp_script check_nginx{
    	script "/usr/local/src/check_nginx_isalive.sh" #检测脚本文件
    	interval 2 #脚本执行的间隔
    	weight 10 #权重
    }
    
    #定义虚拟路由,VI_1是该路由的标识符,可自定义
    vrrp_instance VI_1 {
        state MASTER #定义master
        interface ens33 #绑定虚拟IP的网络接口
        virtual_router_id 51  #虚拟ID的路由号,两个节点必须一致
        mcast_src_ip 192.168.24.11 #本机IP
        priority 100 #节点优先级
        advert_int 1 #广播信息发送间隔,主从节点必须相同
        authentication { #验证类型和密码,主备密码必须相同
            auth_type PASS
            auth_pass 1111
        }
        track_script {
        	check_nginx #调用定义的检测脚本
        }
        virtual_ipaddress {
            192.168.24.100  # 虚拟IP也就是VIP,可以设置多个
        }
    }
    
  • 从节点Keepalived配置

    ! Configuration File for keepalived
    global_defs {
    	router_id SH2
    }
    vrrp_script check_nginx{
    	script "/usr/local/src/check_nginx_isalive.sh"
    	interval 2
    	weight 10 
    }
    vrrp_instance VI_1 {
    	state BACKUP
    	interface ens33
    	virtual_router_id 51
    	mcast_src_ip 192.168.24.12
    	priority 50
    	advert_int 1
    	authentication {
    		auth_type PASS
    		auth_pass 1111
    	}
    	track_script {
        	check_nginx 
        }
    	virtual_ipaddress {
    		192.168.44.200
    	}
    }
    
  • 检测脚本

    #!/bin/bash
    A='ps -C nginx --no-header | wc -l'
    if [$A -eq 0];then  #如果没有启动就启动Nginx
    	systemctl start nginx
    	if ['ps -C nginx --no-header | wc -l' -eq 0]; then #如果启动失败了,杀掉keepalived进程,以此来自动的进行IP漂移
    	killall keepalived
    	fi
    fi
    

    脚本必须授权

    chmod 775 check_nginx_isalive.sh
    
    virtual_router_id 51  #虚拟ID的路由号,两个节点必须一致
    mcast_src_ip 192.168.24.11 #本机IP
    priority 100 #节点优先级
    advert_int 1 #广播信息发送间隔,主从节点必须相同
    authentication { #验证类型和密码,主备密码必须相同
        auth_type PASS
        auth_pass 1111
    }
    track_script {
    	check_nginx #调用定义的检测脚本
    }
    virtual_ipaddress {
        192.168.24.100  # 虚拟IP也就是VIP,可以设置多个
    }
    

    }

    
    
  • 从节点Keepalived配置

    ! Configuration File for keepalived
    global_defs {
    	router_id SH2
    }
    vrrp_script check_nginx{
    	script "/usr/local/src/check_nginx_isalive.sh"
    	interval 2
    	weight 10 
    }
    vrrp_instance VI_1 {
    	state BACKUP
    	interface ens33
    	virtual_router_id 51
    	mcast_src_ip 192.168.24.12
    	priority 50
    	advert_int 1
    	authentication {
    		auth_type PASS
    		auth_pass 1111
    	}
    	track_script {
        	check_nginx 
        }
    	virtual_ipaddress {
    		192.168.44.200
    	}
    }
    
  • 检测脚本

    #!/bin/bash
    A='ps -C nginx --no-header | wc -l'
    if [$A -eq 0];then  #如果没有启动就启动Nginx
    	systemctl start nginx
    	if ['ps -C nginx --no-header | wc -l' -eq 0]; then #如果启动失败了,杀掉keepalived进程,以此来自动的进行IP漂移
    	killall keepalived
    	fi
    fi
    

    脚本必须授权

    chmod 775 check_nginx_isalive.sh
    

3.15 限流

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值