当前位置: 首页 > news >正文

Nginx 学习

通过网盘分享的文件:Nginx
链接: https://pan.baidu.com/s/1dCc7FoND90H_x7rvRUXJqg 提取码: yyds

通过网盘分享的文件:Tomcat
链接: https://pan.baidu.com/s/1nj_5j_66gS_YHUAX1C25jg 提取码: yyds

Nginx安装、启动

  • 安装依赖库
#安装C编译器
yum install -y gcc gcc-c++
  • 安装pcre 、zlib、openssl
mkdir /soft
cd /soft

将安装包上传到Linux

在这里插入图片描述

在这里插入图片描述

cd /soft
tar -zxvf nginx-1.28.0.tar.gz 
tar -zxvf openssl-1.1.1i.tar.gz 
tar -zxvf  pcre-8.37.tar.gz
tar -zxvf  zlib-1.2.11.tar.gz 
tar -zxvf keepalived-2.2.7.tar.gz

解压之后:

在这里插入图片描述

  • 解压Nginx包,并安装

cd  /soft
cd  /soft/pcre-8.37/
./configure
make && make installcd  /soft/zlib-1.2.11/
./configure
make && make installcd /soft/openssl-1.1.1i/
./configure
make && make installln -s /usr/local/lib64/libssl.so.1.1  /usr/lib64/libssl.so.1.1
ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1cd /soft/nginx-1.28.0/
./configure
make && make install
  • 进入nginx所在目录

# 关闭防火墙
systemctl stop firewalldcd /usr/local/nginx/sbin
./nginx  # 启动nginx服务# 查看nginx状态
ps -ef|grep nginx

访问Nginx:

在这里插入图片描述

  • 补充Nginx命令
./nginx -s stop #快速停止
./nginx -s quit #完成已接受的请求后,停止
./nginx -s reload #重新加载配置
./nginx -t #检查nginx配置是否正确
#查看nginx状态
ps -ef|grep nginx

在这里插入图片描述

  • 注册系统服务

在这之前最好停止nginx
通过系统服务的方式启动nginx

cd /usr/local/nginx/sbin
./nginx -s stop #快速停止
vim /usr/lib/systemd/system/nginx.service

注册系统服务:

[Unit] 
Description=nginx
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  status  nginx.service
systemctl  stop   nginx.service
systemctl  start  nginx.service
systemctl restart  nginx.service 

在这里插入图片描述

在这里插入图片描述

Nginx 目录

conf #配置文件|-nginx.conf # 主配置文件|-其他配置文件,都被引入到了nginx.conf
html #静态页面
logs|-access.log #访问日志(每次访问都会记录)|-error.log #错误日志|-nginx.pid #进程号
sbin|-nginx #主进程文件
*_temp #运行时,生成临时文件

在这里插入图片描述

Nginx的location规则详解

=

在这里插入图片描述
通过域名和路径访问后的内容如下
在这里插入图片描述

注意:/usr/share/nginx/test_html文件夹下需要有test.html才可以正常访问

root与alias

请求的条件为test.html
通过root指定的路径为/usr/share/nginx/test_html,因此在匹配的时候,这个路径下就必须要有test.html这个文件才可以,否则就会找不到而报错,

如果用alias,那么通过浏览器进行请求的时候,alias也是指定到/usr/share/nginx/test_htm路径下,但是会匹配默认的index.html,而无须强制匹配test.html,但是此时就不能使用”=”来进行精确匹配,现在将root改为alias,如图:
在这里插入图片描述

location / {alias /app/html/;index  index.html index.htm;}

两者区别:

alias是目录别名,root是最上层目录的定义
alias后必须用"/"结束,不然找不到文件,root可有可无

注意:alias指定的路径结尾要加”/”

^~

在这里插入图片描述
发起同样的请求,观察返回状态码,如图
在这里插入图片描述

注意:如果 ^~匹配成功了,那么表示阻断正则表达式,不再进行正则匹配

Nginx配置

指令

  • ① listen
    在这里插入图片描述
listen 127.0.0.1:8000; # 监听localhost:8000  监听指定的IP和端口
listen 127.0.0.1;	#监听指定IP的所有端口
listen 8000;	#监听指定端口上的连接
listen *:8000;	#监听指定端口上的连接

default_server属性是标识符,用来将此虚拟主机设置成默认主机。所谓的默认主机指的是如果没有匹配到对应的address:port,则会默认执行的。如果不指定默认使用的是第一个server

server{listen 8080 default_server;server_name localhost;default_type text/plain;return 444 'This is a error request';
}
  • ② server_name

~ : 用于表示当前uri中包含了正则表达式,并且区分大小写
~*: 用于表示当前uri中包含了正则表达式,并且不区分大小写
^~: 用于不包含正则表达式的uri前缀,功能和不加符号的一致,唯一不同的是,如果模式匹配,那么就停止搜索其他模式了

关于server_name的配置方式有三种,分别是:
精确匹配
通配符匹配
正则表达式匹配

server {listen 80;#server_name www.dhy.cn www.xpy.cn; 		精确匹配#server_name  *.itcast.cn	www.itheima.*; 	通配符匹配#server_name ~^www\.(\w+)\.com$;   			#正则表达式匹配, \是把后面的.转义:让.不做匹配, ^开始$结束,()代表一个正则表达式}

匹配顺序分别为

#	准确的server_name匹配
#	以通配符开始的字符串
#	以通配符结束的字符串
#	匹配正则表达式
  • ③ location

location:用来设置请求的URI

不带符号,要求必须以指定模式开始

server {listen 80;server_name 127.0.0.1; # 等同localhostlocation /abc{default_type text/plain;return 200 "access success";}
}
#以下访问都是正确的
#http://192.168.200.133/abc
#http://192.168.200.133/abc?p1=TOM
#http://192.168.200.133/abc/
#http://192.168.200.133/abcdef

= : 用于不包含正则表达式的uri前,必须与指定的模式精确匹配

server {listen 80;server_name 127.0.0.1;location =/abc{default_type text/plain;return 200 "access success";}
}
#可以匹配到
#http://192.168.200.133/abc #代表/资源下
#http://192.168.200.133/abc?p1=TOM 带参数
#匹配不到
#http://192.168.200.133/abc/ #代表abc这个资源下
#http://192.168.200.133/abcdef
  • ④ error_page

(1)可以指定具体跳转的地址

server {error_page 404 http://www.dhy.cn;
}

(2)可以指定重定向地址

server{error_page 404 /50x.html;error_page 500 502 503 504 /50x.html;location =/50x.html{root html;}
}

简化版的nginx.conf

worker_processes  1; # 启动的worker进程数events{#设置Nginx网络连接序列化accept_mutex on;#设置Nginx的worker进程是否可以同时接收多个请求multi_accept on;#设置Nginx的worker进程最大的连接数worker_connections 1024;#设置Nginx使用的事件驱动模型use epoll;
}http {include       mime.types;#include是引入关键字,这里引入了mime.types这个配置文件(同在conf目录下,mime.types是用来定义,求返回的content-type)default_type  application/octet-stream; #mime.types未定义的,使用默认格式application/octet-streamsendfile on; # 开启 高效文件传输模式。tcp_nopush on; #需要在 sendfile开启模式才有效,防止网路阻塞,积极的减少网络报文段的数量。将响应头和正文的开始部分一起发送,而不一个接一个的发送tcp_nodelay on;keepalive_timeout  65; #长链接超时时间#一个nginx可以启用多个server(虚拟服务器)server {listen       80;#监听端口80server_name  localhost;  #接收的域名location / { root   html; #根目录指向html目录,看下图index  index.html index.htm; #域名/index 指向 index.html index.htm文件,看下图}error_page   500 502 503 504  /50x.html; # 服务器错误码为500 502 503 504,转到"域名/50x.html"location = /50x.html {# 指定到html文件夹下找/50x.htmroot   html;#根目录指向html目录,看下图}}
}

在这里插入图片描述
在这里插入图片描述

sendfile

打开sendfile,用户请求的数据不用再加载到nginx的内存中,而是直接发送
在这里插入图片描述

Nginx配置使用场景

修改nginx配置文件后,记得重新加载nginx ==> ./nginx -s reload

不同二级域名,映射到不同静态网页

可以写多个server字段,从前向后匹配,先匹配到哪个就用哪个

用户访问pro.hedaodao.ltd,就会走到第一个server配置;test.hedaodao.ltd走到第二个配置

http {#....其他属性server {listen       80;server_name  pro.hedaodao.ltd;location / { root   html/pro; index  index.html index.htm;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}server {listen       80;server_name  test.hedaodao.ltd;location / { root   html/test; index  index.html index.htm;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}
}

不同域名,映射到同一静态页面

server_name

  • 可以写多个,用空格分开
  • 使用通配符(*)
  • 使用正则表达式(https://blog.csdn.net/yangyelin/article/details/112976539)
http{ 		server {listen       80;server_name  *.hedaodao.ltd  ~^[0-9]+\.hedaodao\.ltd$; # "\."是转译"."location / { root   html/test; index  index.html index.htm;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}
}

Nginx命令配置到系统环境

(1)修改/etc/profile文件

vim /etc/profile
#在最后一行添加
export PATH=$PATH:/usr/local/nginx/sbin
source /etc/profile #使之立即生效
nginx -v #检测是否配置成功

正则表达式

在这里插入图片描述

反向代理与负载均衡

反向代理:这种代理方式叫做,隧道代理。有性能瓶颈,因为所有的数据都经过Nginx,所以Nginx服务器的性能至关重要
在这里插入图片描述

负载均衡:把请求,按照一定算法规则,分配给多台业务服务器(即使其中一个坏了/维护升级,还有其他服务器可以继续提供服务)

在这里插入图片描述

反向代理

启用proxy_pass,root和index字段就会失效

proxy_pass后的地址必须写完整 http://xxx,不支持https

当访问localhost时(Nginx服务器),网页打开的是http://xxx(应用服务器),网页地址栏写的还是localhost


http{ 		server {listen       80;server_name  localhost;location / { proxy_pass http://xxx; #配置后root和index失效#root   html/test; #index  index.html index.htm;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}
}

编写proxy_pass的时候,后面的值要不要加"/"?

server {listen 80;server_name localhost;location /{#proxy_pass http://192.168.200.146;proxy_pass http://192.168.200.146/;}
}
# 当客户端访问 http://localhost/index.html,效果是一样的
server{listen 80;server_name localhost;location /server{#proxy_pass http://192.168.200.146;proxy_pass http://192.168.200.146/;}
}
当客户端访问 http://localhost/server/index.html
这个时候,第一个proxy_pass就变成了http://localhost/server/index.html
第二个proxy_pass就变成了http://localhost/index.html效果就不一样了。

结论:
不加了/,拼接location的uri,
加了/,不拼接

负载均衡

使用upstream定义一组地址【在server字段下】
服务端设置

这里不准备三台虚拟机,充当真实服务器,而使用端口进行区分

server {listen   9001;server_name localhost;default_type text/html;location /{return 200 '<h1>192.168.111.101:9001</h1>';}
}server {listen   9002;server_name localhost;default_type text/html;location /{return 200 '<h1>192.168.111.101:9002</h1>';}
}
server {listen   9003;server_name localhost;default_type text/html;location /{return 200 '<h1>192.168.111.101:9003</h1>';}
}

负载均衡器设置

upstream backend{server 192.168.111.101:9091;server 192.168.111.101:9092;server 192.168.111.101:9093;
}
server {listen 80;server_name localhost;location /{proxy_pass http://backend;}
}

① 负载均衡状态

代理服务器在负责均衡调度中的状态有以下几个:
在这里插入图片描述

down

down:将该服务器标记为永久不可用,那么该代理服务器将不参与负载均衡

upstream backend{server 192.168.111.101:9001 down;server 192.168.111.101:9002;server 192.168.111.101:9003;
}
server {listen 80;server_name localhost;location /{proxy_pass http://backend;}
}

该状态一般会对需要停机维护的服务器进行设置。

backup
backup:将该服务器标记为备份服务器,当主服务器不可用时,将用来传递请求。

当主服务器恢复时,会使用主服务器来处理请求

upstream backend{server 192.168.111.101:9001 ;server 192.168.111.101:9002 backup;server 192.168.111.101:9003;
}
server {listen 80;server_name localhost;location /{proxy_pass http://backend;}
}

介绍一个工具firewall-cmd,该工具是Linux提供的专门用来操作firewall的。

  • 查询防火墙中指定的端口是否开放
firewall-cmd --query-port=9001/tcp
  • 如何开放一个指定的端口
firewall-cmd --permanent --add-port=9002/tcp
  • 批量添加开发端口
firewall-cmd --permanent --add-port=9001-9003/tcp
  • 如何移除一个指定的端口
firewall-cmd --permanent --remove-port=9003/tcp
  • 重新加载
firewall-cmd --reload

其中:

  • ​ --permanent表示设置为持久

  • ​ --add-port表示添加指定端口

  • ​ --remove-port表示移除指定端口
    max_conns
    max_conns=number:用来设置代理服务器同时活动链接的最大数量,默认为0,表示不限制,使用该配置可以根据后端服务器处理请求的并发量来进行设置,防止后端服务器被压垮

upstream backend{server 192.168.111.101:9001 ;server 192.168.111.101:9002 ;server 192.168.111.101:9003 max_conns=100 ;
}
server {listen 80;server_name localhost;location /{proxy_pass http://backend;}
}

max_fails和fail_timeout
max_fails=number:设置允许请求代理服务器失败的次数,默认为1。

fail_timeout=time:设置经过max_fails失败后,服务暂停的时间,默认是10秒

upstream backend{server 192.168.111.101:9001 ;server 192.168.111.101:9002 ;server 192.168.111.101:9003  max_fails=3 fail_timeout=15;
}
server {listen 80;server_name localhost;location /{proxy_pass http://backend;}
}

② 负载均衡策略

weight加权[加权轮询]
访问使用哪个地址的权重

upstream backend{server 192.168.111.101:9001 weight=10;server 192.168.111.101:9002 weight=5;server 192.168.111.101:9003 weight=3;
}
server {listen 80;server_name localhost;location /{proxy_pass http://backend;}
}

ip hash

可以解决session共享问题

upstream backend{ip_hash;server 192.168.111.101:9001 ;server 192.168.111.101:9002 ;server 192.168.111.101:9003 ;
}
server {listen 80;server_name localhost;location /{proxy_pass http://backend;}
}

url_hash

upstream backend{hash &request_uri;server 192.168.111.101:9001 ;server 192.168.111.101:9002 ;server 192.168.111.101:9003 ;
}
server {listen 80;server_name localhost;location /{proxy_pass http://backend;}
}

least_conn

最少连接,把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果

upstream backend{least_conn;server 192.168.111.101:9001 ;server 192.168.111.101:9002 ;server 192.168.111.101:9003 ;
}
server {listen 80;server_name localhost;location /{proxy_pass http://backend;}
}

动静分离

当用户请求时,动态请求分配到Tomcat业务服务器,静态资源请求放在Nginx服务器中

例子:

图片目录

在这里插入图片描述

Nginx配置

在这里插入图片描述

index.html引入两个图片

在这里插入图片描述

  访问

在这里插入图片描述

URL重写

rewrite是URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement,结尼是flag标记。rewrite    <regex>   <replacement>  [flag];
关键字				正则				替代内容     flagt标记正则:per1森容正则表达式语句进行规则匹配
替代内容:将正则匹配的内容替换成replacementflag标记说明:
last  #本条规则匹配完成后,继续向下匹配新的1ocation URI规则
break #本条规则匹配完成即终止,不再匹配后面的任何规则redirect #返回302临重定向,游览器地址会显示跳转后的URL地址
permanent #返回301永久重定向,测览器地址栏会显示跳转后的URL地址

浏览器地址栏访问 http://localhost/123.html实际上是访问http://localhost//index.jsp?pageNum=123

server {listen       80;server_name  localhost;location / { rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1  break; #$1 代表第一个正则表达式的结果proxy_pass http://xxx;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}
}

网关服务器

在这里插入图片描述

上图中,应用服务器,不能直接被外网访问到,只能通过Nginx服务器进行访问(使用proxy_pass),这时候这台Nginx服务器就成为了网关服务器(承担入口的功能)

所以,我们启动应用服务器的防火墙,设置其只能接受这台Nginx服务器的请求
启动防火墙

systemctl start  firewalld.service

不让外网直接访问的加上rich规则
在这里插入图片描述

例:在192.168.111.102上加

  • ① 添加rich规则
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.111.101" port protocol="tcp" port="8080" accept" #配置意思:外网不能访问,但是让192.168.111.101这个地址可以访问8080端口
  • ② 移除rich规则
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.111.101" port port="8080" protocol="tcp" accept"
  • ③ 重启

移除和添加规则都要重启才能生效

firewall-cmd --reload

查看所有规则

firewall-cmd --list-all #所有开启的规则

在这里插入图片描述

  • ④ 配置Nginx

192.168.111.101

查看指定端口的进程号

netstat -tanlp |grep 端口号 #即可查到占用该端口号的进程

nginx配置,访问该主机的80端口,可以跳到192.168.111.102:8080
在这里插入图片描述

  • ⑤ 访问

在这里插入图片描述

防盗链

当我们请求到一个页面后,这个页面一般会再去请求其中的静态资源,这时候请求头中,会有一个referer字段,表示当前这个请求的来源,我们可以限制指定来源的请求才返回,否则就不返回,这样可以节省资源

valid_referers none|server_name

设置有效的referer值

  • none:检测地址没有referer,则有效
  • server_name:检测主机地址,referer显示是从这个地址来的,则有效(server_name必须是完整的http://xxxx
    注意:if ($invalid_referer)if后有个空格,不写就会报错
nginx: [emerg] unknown directive "if($invalid_referer)" in /usr/local/nginx/conf/nginx.conf:27
  • ① Nginx配置

例子:这里设置nginx服务器中的img目录下的图片必须referer为http:192.168.174/133才能访问

server {listen       80;server_name  localhost;location / { proxy_pass http://xxx;}location /img{valid_referers http:192.168.174/133;if ($invalid_referer){#无效的return 403;#返回状态码403}root html;index  index.html index.htm;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}
}

如果引用这张图片的页面且referer并没有被设置,图片无法加载出来
如果直接访问图片地址,因为没有refer字段指向来源,会直接显示Nginx的页面
在这里插入图片描述

  • ② 设置盗链图片

将提示图片放在html/img/x.png,访问设置防盗链图片时,就返回这x.png张图

location /img{valid_referers http:192.168.174/133;if ($invalid_referer){#无效的rewrite ^/  /img/x.png break;}root html;index  index.html index.htm;
}

跨域问题解决

在这里插入图片描述

  • ① 同源策略

浏览器的同源策略:是一种约定,是浏览器最核心也是最基本的安全功能,如果浏览器少了同源策略,则浏览器的正常功能可能都会受到影响
同源: 协议、域名(IP)、端口相同即为同源

http://192.168.200.131/user/1
https://192.168.200.131/user/1
不http://192.168.200.131/user/1
http://192.168.200.132/user/1
不http://192.168.200.131/user/1
http://192.168.200.131:8080/user/1
不http://www.nginx.com/user/1
http://www.nginx.org/user/1
不http://192.168.200.131/user/1
http://192.168.200.131:8080/user/1
不http://www.nginx.org:80/user/1
http://www.nginx.org/user/1
满足
  • ② 跨域问题

简单描述下:

有两台服务器分别为A,B,如果从服务器A的页面发送异步请求到服务器B获取数据,
如果服务器A和服务器B不满足同源策略,则就会出现跨域问题。

案例演示

在这里插入图片描述
1)nginx的html目录下新建一个a.html

<html><head><meta charset="utf-8"><title>跨域问题演示</title><script src="jquery.js"></script><script>$(function(){$("#btn").click(function(){$.get('http://192.168.200.133:8080/getUser',function(data){alert(JSON.stringify(data));}); });});</script></head><body><input type="button" value="获取数据" id="btn"/></body>
</html>

2)在nginx.conf配置如下内容

server{listen  8080;server_name localhost;location /getUser{default_type application/json;return 200 '{"id":1,"name":"TOM","age":18}';}
}
server{listen 	80;server_name localhost;location /{root html;index index.html;}
}

3)通过浏览器访问测试
在这里插入图片描述

  • ③ 解决方案

使用add_header指令,该指令可以用来添加一些头信息
Access-Control-Allow-Origin: 直译过来是允许跨域访问的源地址信息,可以配置多个(多个用逗号分隔),也可以使用*代表所有源
Access-Control-Allow-Methods:直译过来是允许跨域访问的请求方式,值可以为 GET POST PUT DELETE…,可以全部设置,也可以根据需要设置,多个用逗号分隔

具体配置方式

location /getUser{
#可以跨域请求,并设置跨域请求的请求方式add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE;default_type application/json;return 200 '{"id":1,"name":"TOM","age":18}';
}

高可用场景

在这里插入图片描述

用户访问时,访问的是一个虚拟IP,keepalived会选定一个主服务器使用这个虚拟IP
每台机器上的keepalived会相互通信,根据其他机器上的keepalived进程是否存在,判断服务器状态,如果默认的Master停止了,就会在剩下的Backup机器中,竞选出一台Nginx服务器作为Master

安装keepalived

yum install -y keepalived

修改keepalived配置

  • 配置文件在/etc/keepalived/keepalived.conf
  • vrrp_instanceauthenticationvirtual_router_idvirtual_ipaddress这几个一样的机器,才算是同一个组里。这个组才会选出一个作为Master机器
    这里我们设置两台机器,分别下载好keepalived,然后进行配置
vim /etc/keepalived/keepalived.conf #进行配置

机器一:

! Configuration File for keepalivedglobal_defs {router_id lb # 名字与其他配置了keepalive的机器不重复就行
}
vrrp_script chk_http_port { script "/usr/local/src/nginx_check.sh" interval 2      #(检测脚本执行的间隔) weight 2 } 
vrrp_instance dingchao {#vrrp实例名可以随意取state MASTER #只能有一个默认的Master,其他写BACKUPinterface ens33 # ifconfig 或ipaddr查看下网卡名,默认时ens33virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同  priority 100 # 多台安装了keepalived的机器竞争成为Master的优先级,BACKUP 优先级低于MASTER advert_int 1 #通信时间authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.111.110 #虚拟IP}
}

机器二:

! Configuration File for keepalivedglobal_defs {router_id lb2 # 名字与其他配置了keepalive的机器不重复就行
}
vrrp_script chk_http_port { script "/usr/local/src/nginx_check.sh" interval 2      #(检测脚本执行的间隔) weight 2 } 
vrrp_instance dingchao {#vrrp实例名可以随意取state BACKUP #只能有一个默认的Master,其他写BACKUPinterface ens33 # ip addr查看下网卡名,默认时ens33virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同  priority 50# 多台安装了keepalived的机器竞争成为Master的优先级advert_int 1 #通信时间authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.111.110 #虚拟IP}
}

添加检测脚本

vim /usr/local/src/nginx_check.sh #将脚本添加进去
chmod +x /usr/local/src/nginx_check.sh #添加执行权限
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then/usr/local/nginx/sbin/nginxsleep 2if [ `ps -C nginx --no-header |wc -l` -eq 0 ];thenkillall keepalivedfi
fi

启动

cd /usr/local/sbin
./keepalived # 启动

Nginx 限流

控制速率

在这里插入图片描述

  • nodelay 针对的是 burst 参数,burst=20 nodelay

配置 server,使用 limit_req 指令应用限流

server {location / {limit_req zone=service1RateLimit;proxy_pass http://my_upstream;}
}
  • key :定义限流对象,binary_remote_addr 是一种key,表示基于 remote_addr(客户端IP) 来做限流,binary_ 的目的是压缩内存占用量
  • zone:定义共享内存区来存储访问信息, myRateLimit:10m 表示一个大小为10M,名字为myRateLimit的内存区域。1M能存储16000 IP地址的访问信息,10M可以存储16W IP地址访问信息。
  • rate 用于设置最大访问速率,rate=10r/s 表示每秒最多处理10个请求。Nginx 实际上以毫秒为粒度来跟踪请求信息,因此 10r/s 实际上是限制:每100毫秒处理一个请求。这意味着,自上一个请求处理完后,若后续100毫秒内又有请求到达,将拒绝处理该请求。

控制并发

在这里插入图片描述

需要注意的是:只有当 request header 被后端server处理后,这个连接才进行计数

Nginx 优化

Nginx UI

https://nginxui.com/zh_CN/guide/getting-started.html#%E4%BD%BF%E7%94%A8-docker

Nginx应用场景

  • 负载均衡、反向代理
  • 跨域问题解决
  • 网关 服务器
  • 封禁IP
  • 防盗链
  • 动静分离
  • 限流等

基本配置优化

查看CPU核数

cat /proc/cpuinfo| grep "cpu cores"| uniq

在这里插入图片描述

worker_processes 4 ; # 设为cpu核数 启动的worker进程数events{#设置Nginx网络连接序列化accept_mutex on;#设置Nginx的worker进程是否可以同时接收多个请求multi_accept on;#设置Nginx的worker进程最大的连接数worker_connections 1024;#设置Nginx使用的事件驱动模型use epoll;
}http {include       mime.types;#include是引入关键字,这里引入了mime.types这个配置文件(同在conf目录下,mime.types是用来定义,求返回的content-type)default_type  application/octet-stream; #mime.types未定义的,使用默认格式application/octet-streamsendfile on; # 开启 高效文件传输模式。tcp_nopush on; #需要在 sendfile开启模式才有效,防止网路阻塞,积极的减少网络报文段的数量。将响应头和正文的开始部分一起发送,而不一个接一个的发送tcp_nodelay on; #有数据随时发送keepalive_timeout  65; #长链接超时时间#一个nginx可以启用多个server(虚拟服务器)server {listen       80;#监听端口80server_name  localhost;  #接收的域名location / { root   html; #根目录指向html目录,看下图index  index.html index.htm; #域名/index 指向 index.html index.htm文件,看下图}error_page   500 502 503 504  /50x.html; # 服务器错误码为500 502 503 504,转到"域名/50x.html"location = /50x.html {# 指定到html文件夹下找/50x.htmroot   html;#根目录指向html目录,看下图}}
}

keepalive、worker_connections

转发请求 提高效率

upstream backend{server 192.168.111.101:9001;server 192.168.111.101:9002;server 192.168.111.101:9003;keepalive 300; # 300个长连接,转发请求效率大大提高!
}
server {listen 80;server_name localhost;location /{proxy_pass http://backend;}
}

在这里插入图片描述

缓存优化

   # 代理缓存配置# meitecache:256m,大小256m,失效时间1天 inactive=1dproxy_cache_path "./meite_cachedata"  levels=1:2 keys_zone=meitecache:256m inactive=1d max_size=1000g; server {listen       80;server_name  localhost;location /details {#使用缓存名称proxy_cache meitecache;#对以下状态码实现缓存~~~~proxy_cache_valid 200 206 304 301 302 1d;# 缓存的key--》请求路径proxy_cache_key $request_uri;add_header X-Cache-Status $upstream_cache_status;proxy_pass   http://127.0.0.1:8080;index  index.html index.htm;}	}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

开启gzip压缩

server {listen       80;server_name  localhost;gzip on;gzip_buffers 32 4K;gzip_comp_level 6;gzip_min_length 100;gzip_types application/javascript text/css text/xml application/json;gzip_disable "MSIE [1-6]\."; #配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)gzip_vary on; #accept-encodinggzip_static on; #如果有压缩好的,直接使用location / {proxy_pass   http://127.0.0.1:8080;   }}

配置文件内容详细介绍:

gzip配置的常用参数

  • gzip on|off; #是否开启gzip
  • gzip_buffers 32 4K| 16 8K #缓冲(压缩在内存中缓冲几块? 每块多大?)
  • gzip_comp_level [1-9] #推荐6 压缩级别(级别越高,压的越小,越浪费CPU计算资源)
  • gzip_disable #正则匹配UA 什么样的Uri不进行gzip
  • gzip_min_length 200 # 开始压缩的最小长度(再小就不要压缩了,意义不在)
  • gzip_http_version 1.0|1.1 # 开始压缩的http协议版本(可以不设置,目前几乎全是1.1协议)
  • gzip_proxied # 设置请求者代理服务器,该如何缓存内容
  • gzip_types text/plain application/xml # 对哪些类型的文件用压缩 如txt,xml,html ,css
  • gzip_vary on|off # 是否传输gzip压缩标志

应用层面优化

在这里插入图片描述

TCP优化

在这里插入图片描述

vi /etc/sysctl.conf 

配置内容

# 防止一个套接字过多连接到达时引起负载
net.ipv4.tcp_syncookies=1
#默认128,socket的监听队列,微调大
net.core.somaxconn=1024 
# timeout的超时时间,调小,tcp握手时间
net.ipv4.tcp_fin_timeout=10 
#os直接使用timewait的连接
net.ipv4.tcp_tw_reuse=1 
#回收禁用,若开启---》快速回收处于 TIME_WAIT状态的socket
net.ipv4.tcp_tw_recycle=0 

加载配置!

sysctl -p

监控

在这里插入图片描述

调优

在这里插入图片描述

http://www.dtcms.com/a/316460.html

相关文章:

  • UnityUI系统--GUI
  • PHP‑ORT扩展构建纯PHP机器学习的推荐系统
  • Redis协议数据迁移方式
  • 聚焦智能穿戴“下一代消费终端”之争,Meta/微美全息借AI+AR积淀定义行业未来
  • Tasks and Deadlines(Sorting and Searching)
  • 【人工智能-18】机器学习:决策树、随机森林
  • 什么情况下浮动IP(Floating IP)会“漂移”(Drift)
  • 浮动IP(Floating IP)的删除通常需要满足什么条件
  • 小程序点击菜单栏实现样式动态切换
  • 对于包含大量文件的程序的便捷makefile操作
  • RK3568 Linux驱动学习——字符设备驱动开发
  • windows内核研究(软件调试-内存断点)
  • 永磁同步电机无速度算法--具有电流测量误差鲁棒性的永磁同步电机无传感器控制的自适应广义复矢量观测器
  • 二叉树算法
  • 02-算法
  • Java后端高频面试题
  • EP02:【DL 第二弹】张量的索引、分片、合并以及维度调整
  • 如何选择正确的体育/电竞数据接口服务商?
  • 力扣148:排序链表
  • Android 开发中,HandlerThread、IntentService 和 AsyncTask区别对比
  • Pytorch基础入门2
  • C++面向对象编程基础:从类定义到封装机制详解
  • 【Linux网络编程】socket基础
  • 风丘助力混合动力汽车工况测试:精准采集整车信号解决方案
  • Datawhale AI夏令营 第三期 task2 稍微改进
  • P1026 [NOIP 2001 提高组] 统计单词个数
  • 计算机网络:详解路由器如何转发子网数据包
  • Java JDBC连接池深度解析与实战指南
  • SAP PP CK466
  • 解决docker load加载tar镜像报json no such file or directory的错误