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

Nginx高级技巧:实现负载均衡和反向代理

文章目录

      • Nginx概述
      • Nginx作用
        • 正向代理
        • 反向代理
        • 负载均衡
        • 动静分离
      • Nginx的安装 -->Docker
        • 3.1 安装Nginx
        • 3.2 Nginx的配置文件
        • 3.3 修改docker-compose文件
      • Nginx源码安装
      • nginx常用命令
      • nginx配置文件
        • 配置文件位置
        • 配置文件结构详情
      • Nginx的反向代理【`重点`】
        • 基于Nginx实现反向代理
        • 4.3 关于Nginx的location路径映射
      • Nginx负载均衡【`重点`】
        • 5.1 轮询
        • 5.2 权重
        • 5.3 ip_hash
        • fair
        • upstream模块中的常用参数
      • Nginx动静分离【`重点`】
        • 6.1 动态资源代理
        • 6.2 静态资源代理
        • root 和alias指令区
      • 权限项目部署
      • Nginx高可用
        • 什么是高可用
        • 双机热备+自动故障转移
        • Nginx如何解决高可用的
        • Keepalived是什么
        • Keepalived实现Nginx高可用
        • Keepalived实现自动故障转移
      • Nginx的进程模型
        • Master进程
        • work进程

Nginx概述

http://nginx.org/en/download.html

Nginx是由俄罗斯人研发的,应对Rambler的网站,并且2004年发布的第一个版本。

Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的。从2004年发布至今,凭借开源的力量,已经接近成熟与完善。
Nginx功能丰富,可作为HTTP服务器,也可作为反向代理服务器,邮件服务器。支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。并且支持很多第三方的模块扩展。
Nginx的稳定性、功能集、示例配置文件和低系统资源的消耗让他后来居上,在全球活跃的网站中有12.18%的使用比率,大约为2220万个网站。

Nginx的特点:

  • 稳定性极强。 7*24小时不间断运行。
  • Nginx提供了非常丰富的配置实例。
  • 占用内存小,并发能力强(官方给的数据是5w)
  • 负载均衡策略
  • 动静态分离
    • 擅长处理静态资源,tomcat擅长处理动态资源

Nginx作用

正向代理

在这里插入图片描述

正向代理是给客户端做代理,客户端清楚要访问的目标服务器。

正向代理服务器作用如下

  1. 访问原来无法访问的资源
  2. 用作缓存,加速访问速度
  3. 对客户端访问授权,上网进行认证
  4. 代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息
反向代理

在这里插入图片描述

反向代理给服务端做代理,客户但不知道要访问那台服务器。

反向代理服务器作用如下:

  1. 保护内网安全
  2. 负载均衡
  3. 缓存,减少服务器的压力
负载均衡

将多个请求均匀的分配到多台服务器上,减轻每台服务器的压力,提高服务的吞吐量。

Nginx提供的负载均衡策略有2种:

内置策略:轮询,权重,Ip hash。

扩展策略:fair(会根据后端服务器的响应时间来分配请求,以实现更加均衡的负载分配。fair策略会优先将请求发送到响应时间较短的服务器上,从而提高整体性能和稳定性。)

Ip hash算法:对客户端请求的ip进行hash操作,然后根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处理,可以解决session不共享的问题

动静分离

在这里插入图片描述

​ 动静分离是指在web服务器架构中,将静态页面与动态页面或者静态内容接口和动态内容接口分开不同系统访问的架构设计方法,进而提升整个服务访问性能和可维护性。

1、代理服务器和静态服务器即为一台服务器上,这里只是为了明显区分动静分离所处服务器的不同;

2、静态服务器中,存放的资源主要是源代码文件、图片、属性、样式以及其它所有非动态的资源文件;

3、调度规则,即为代理服务器,这里是Nginx的服务器调度规则;

4、动态服务器,其种类比较繁多,可以是Apache、Tomcat、IIS以及其它Web服务器,它们一般分别隶属于一台服务器;

Nginx的安装 -->Docker


3.1 安装Nginx

使用Docker-Compose安装

version: '3.1'
services:nginx:restart: alwaysimage: daocloud.io/library/nginx:latestcontainer_name: nginxports:- 80:80
3.2 Nginx的配置文件

关于Nginx的核心配置文件nginx.conf

worker_processes  1;		
error_log  /var/log/nginx/error.log warn;
# 以上统称为全局块, 
# worker_processes他的数值越大,Nginx的并发能力就越强
# error_log 代表Nginx的错误日志存放的位置events {worker_connections  1024;
}
# events块
# worker_connections他的数值越大,Nignx并发能力越强http {include       /etc/nginx/mime.types;default_type  application/octet-stream;server {listen       80;server_name  localhost;location / {root   /usr/share/nginx/html;index  index.html index.htm;}# location块# root:将接收到的请求根据/usr/share/nginx/html去查找静态资源# index: 默认去上述的路径中找到index.html或者index.htm}# server块# listen: 代表Nginx监听的端口号# localhost:代表Nginx接收请求的ip
}
# http块
# include代表引入一个外部的文件 -> /mime.types中放着大量的媒体类型
# include /etc/nginx/conf.d/*.conf; -> 引入了conf.d目录下的以.conf为结尾的配置文件
3.3 修改docker-compose文件

为了方便修改Nginx配置,修改yml文件

version: '3.1'
services:nginx:restart: alwaysimage: daocloud.io/library/nginx:latestcontainer_name: nginxports:- 80:80volumes:- /opt/docker_nginx/conf.d/:/etc/nginx/conf.d

Nginx源码安装

1、下载nginx源码包

wget http://nginx.org/download/nginx-1.20.1.tar.gz

2、解压

tar -zxf nginx-1.20.1.tar.gz 

3、安装c/c++的编译器

yum install gcc
yum install gcc-c++
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel

因为下载的包是源码包,需要编译,安装后才能使用。而nginx是c写的,因此需要安装c/c++的编译器
在这里插入图片描述
在这里插入图片描述

​ 如上,gcc已经安装完毕,下面来安装nginx

4、安装nginx

1、进入nginx目录
2、 ./configure 
3、make install

在这里插入图片描述

5、安装成功后的位置

nginx默认会按照在/usr/local/nginx中
在这里插入图片描述

nginx常用命令

./nginx 启动
./nginx -s stop 停止
./nginx -s reload 重启(重新加载nginx配置文件)
./nginx -v 查看nginx版本号

nginx配置文件

配置文件位置

在这里插入图片描述

配置文件结构详情
########### 每个指令必须有分号结束。#################
#user administrator administrators;  #配置用户或者组,默认为nobody nobody。
worker_processes 1;  #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid;   #指定nginx进程运行文件存放地址
error_log log/error.log debug;  #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emergevents {accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为onmulti_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off#use epoll;      #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventportworker_connections  1024;    #最大连接数,默认为512
}http {include       mime.types;   #文件扩展名与文件类型映射表default_type  application/octet-stream; #默认文件类型,默认为text/plain#access_log off; #取消服务日志    log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式access_log log/access.log myFormat;  #combined为日志格式的默认值sendfile on;   #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。keepalive_timeout 65;  #连接超时时间,默认为75s,可以在http,server,location块。upstream mysvr {   server 127.0.0.1:7878;server 192.168.10.121:3333 backup;  #热备}error_page 404 https://www.baidu.com; #错误页error_page 500 https://www.jd.com; #错误页server {keepalive_requests 120; #单连接请求上限次数。listen       4545;   #监听端口server_name  127.0.0.1;   #监听地址       location  ~*^.+$ {       #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。#root path;  #根目录#index vv.txt;  #设置默认页proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表deny 127.0.0.1;  #拒绝的ipallow 172.18.5.54; #允许的ip           } }
}
1、全局块
2、events块
3、http块a)server块1)location块
  • 全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
  • events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
  • http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
  • server块:配置虚拟主机的相关参数,一个http中可以有多个server。
  • location块:配置请求的路由,以及各种页面的处理情况。

Nginx的反向代理【重点

基于Nginx实现反向代理

准备一个目标服务器。

启动了之前的tomcat服务器。

编写default.conf配置文件,通过Nginx访问到tomcat服务器。

# 监听80端口
server{listen 80;server_name localhost;# 基于反向代理访问到Tomcat服务器location / {proxy_pass http://192.168.199.109:8081/;}
}
4.3 关于Nginx的location路径映射

优先级关系如下:

(location=) > (location /aa/bb/cc) > (location ~)

# 1. 精确匹配
location = / {# 精准匹配,主机名后面不能带任何的字符串,等号决定匹配的内容,比如:http://baidu.com
}
# 案例
# 用户访问# http:192.168.193.88/abc nginx
#会自动代理到 http://192.168.193.88:8080/
location =/abc {  proxy_pass http://192.168.193.88:8080/;
}# 2. 通用匹配
location /xxx {# 匹配所有以/xxx开头的路径,比如:http://baidu.com/xxx
}# 案例
# 用户访问访问 http://192.168.193.88/qfjava/webdemo/index.jsp 
#会自动代理到 http://192.168.193.88:8080/webdemo/index.jsplocation /qfjava {proxy_pass http://192.168.193.88:8080/;}# 3. 正则匹配
location ~ /xxx {# 匹配所有以/xxx开头的路径
}# 4. 匹配开头路径
location ^~ /images/ {# 匹配所有以/images开头的路径
}# 5. 匹配后缀
location ~* \.(gif|jpg|png)$ {# 匹配以gif或者jpg或者png为结尾的路径
}# 6. 全部通配
location / {# 匹配全部路径  
}

Nginx负载均衡【重点


Nginx为我们默认提供了三种负载均衡的策略:

  • 轮询:将客户端发起的请求,平均的分配给每一台服务器
  • 权重:会将客户端的请求,根据服务器的权重值不同,分配不同的数量。
  • ip_hash:基于发起请求的客户端的ip地址不同,他始终会将请求发送到指定的服务器上。
5.1 轮询

想实现Nginx轮询负载均衡机制只需要在配置文件中添加以下内容

upstream 名字 { # 给空格server ip:port; # 给分号  server 192.168.193.66:8080server ip:port;...
}
server {listen 80;server_name localhost;location / {proxy_pass http://upstream的名字/; # 给分号}
}
5.2 权重

实现权重的方式

# 名字中不要出现下换线
upstream 名字 { server ip:port weight=权重比例; # server 192.168.193.66:8080 weight=8;server ip:port weight=权重比例; # server 192.168.193.66:8080 weight=2;...
}
server {listen 80;server_name localhost;location / {proxy_pass http://upstream的名字/;}
}
5.3 ip_hash

ip_hash实现

upstream 名字 {ip_hash;server ip:port;server ip:port;...
}
server {listen 80;server_name localhost;location / {proxy_pass http://upstream的名字/;}
}
fair

fair 模块(第三方)来实现负载均衡,fair 采用的不是内建的算法,而是可以根据页面大小、响应时间智能的进行负载均衡。因为是第三方所以需要单独安装,安装方式参考下面文档

https://blog.csdn.net/cxy35/article/details/104855031

upstream 名字 {server ip:port;server ip:port;fair;
}
server {listen 80;server_name localhost;location / {proxy_pass http://upstream的名字/;}
}
upstream模块中的常用参数
upstream linuxe_backend {server 192.168.1.110 down;  #该节点不可用server 192.168.1.120 backup;  #其他节点挂了后该节点自动上线server 192.168.1.130 max_failes=1 fail_timeout=10s weight=5;server backend1.linuxe.cn 8080 weight=3 max_conns=10;
}
server:负载均衡后端服务器的IP或域名,不写端口的话默认是80。高并发场景用域名,再通过DNS进行负载均衡 
weight:后端服务器权重,默认为1,权重越大接收的请求越多。例:weight=5
max_fails:检查节点的健康状态并允许请求失败的次数,达到该次数就将节点下线。默认为1,0表示禁止失败尝试。例:max_fails=2
fail_timeout:max_fails失败次数达到限制后暂停该节点服务的时间,默认是10秒。例:fail_timeout=10s
backup:热备配置,当服务池中所有服务器均出现问题后会自动上线backup服务器
down:标志服务器不可用,不参与负载均衡。这个参数通常配合IP_HASH使用
max_conns:限制最大连接数,通常对后端服务器硬件不一致的情况进行配置

Nginx动静分离【重点

​ 动静分离是指在web服务器架构中,将静态页面与动态页面或者静态内容接口和动态内容接口分开不同系统访问的架构设计方法,进而提升整个服务访问性能和可维护性。

动:必须依赖服务器返回,比如Controller,数据库相关操作。
静:不需要依赖容器的比如css/js/html或者图片等文件


Nginx的并发能力公式:

​ worker_processes * worker_connections / 4 | 2 = Nginx最终的并发能力

动态资源需要/4,静态资源需要/2.

Nginx通过动静分离,来提升Nginx的并发能力,更快的给用户响应。

6.1 动态资源代理

使用proxy_pass动态代理

# 配置如下
location / {proxy_pass 服务器的路径;
}
6.2 静态资源代理

使用root或者alias静态代理

server{listen 80;server_name localhost;location /html {root data; // 在data/html下面找文件index a.html; # 配置默认页面}location /images {root data; // 在data/images下面找文件autoindex on; # 地址栏访问 http://192.168.193.88/images/}
}
root 和alias指令区
location /img/ {alias /var/www/image/;
}

​ 若按照上述配置的话,则访问/img/目录里面的文件时,ningx会自动去/var/www/image/目录找文件

location /img/ {root /var/www/image;
}

​ 若按照这种配置的话,则访问/img/目录下的文件时,nginx会去/var/www/image/img/目录下找文件

alias是一个目录别名的定义,root则是最上层目录的定义。

还有一个重要的区别是alias后面必须要用“/”结束,否则会找不到文件的。。。而root则可有可无

权限项目部署

 # 权限服务器集群
upstream rbac {server 172.30.77.207:8082;server 172.30.77.207:8083;
}server {listen       80;server_name  localhost;location / {   # 反向代理到后端服务器proxy_pass http://rbac;}location /rbac {  # 权限项目前端相关静态页面root data;index index.html;}
}

前端页面访问:http://www.2105.com/rbac/login.html

后台接口访问:http://www.2105.com/user/page

后台接口取消上下文路径,多个应用可以根据端口号或者location来区分。

Nginx高可用

什么是高可用

​ 高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。

假设系统一直能够提供服务,我们说系统的可用性是100%。

如果系统每运行100个时间单位,会有1个时间单位无法提供服务,我们说系统的可用性是99%。很多公司的高可用目标是4个9,也就是99.99%,这就意味着,系统的年停机时间为8.76个小时。

在这里插入图片描述

在生产环境上很多时候是以Nginx做反向代理对外提供服务,但是一天Nginx难免遇见故障,如:服务器宕机。当Nginx宕机那么所有对外提供的接口都将导致无法访问。

双机热备+自动故障转移

​ 这种方案是国内企业中最为普遍的一种高可用方案,双机热备其实就是指一台服务器在提供服务,另一台为某服务的备用状态,当一台服务器不可用另外一台就会顶替上去。

有了双机热备方案之后,还不够,每次出现故障需要人工介入恢复势必会增加系统的不可服务实践。所以,又往往是通过自动故障转移来实现系统的高可用。

Nginx如何解决高可用的

在这里插入图片描述

Nginx解决高可用需要准备两台nginx,一个是主(Master)服务器,一个是备(backup)服务器,使用keepalived基于主和备可以创建出一台虚拟服务器供客户端调用。虚拟服务器接收到请求会先把请求交给主服务器处理,如果主服务器宕机就把请求交给备服务器处理。

Keepalived是什么

Keepalived软件起初是专为LVS(Linux Virtual Server,Linux虚拟服务器)负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP (Virtual Router Redundancy Protocol ,虚拟路由器冗余协议)功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件

Keepalived实现Nginx高可用

安装前需要准备好两台虚拟器,两台都需要安装nginx和keepalived。

192.168.147.10(主)

192.168.147.11(备)

1、安装keepalived

yum -y install keepalived  # 配置文件在/etc/keepalived/keepalived.conf

2、修改主服务器keepalived.conf

# 检测脚本
vrrp_script chk_http_port {script "/usr/local/src/check_nginx_pid.sh" #心跳执行的脚本,检测nginx是否启动interval 2                          #(检测脚本执行的间隔,单位是秒)weight 2                            #权重
}
#vrrp 实例定义部分
vrrp_instance VI_1 {state MASTER            # 指定keepalived的角色,MASTER为主,BACKUP为备interface ens33         # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡virtual_router_id 66    # 虚拟路由编号,主从要一直priority 100            # 优先级,数值越大,获取处理请求的优先级越高advert_int 1            # 检查间隔,默认为1s(vrrp组播周期秒数)track_script {chk_http_port            #(调用检测脚本)}virtual_ipaddress {192.168.147.88                 # 定义虚拟ip(VIP),可多设,每行一个}
}

virtual_ipaddress 里面可以配置vip,在线上通过vip来访问服务。

interface需要根据服务器网卡进行设置通常查看方式ip addr

3、修改备服务器配置文件

检测脚本
vrrp_script chk_http_port {script "/usr/local/src/check_nginx_pid.sh" #心跳执行的脚本,检测nginx是否启动interval 2                          #(检测脚本执行的间隔)weight 2                            #权重
}
#vrrp 实例定义部分
vrrp_instance VI_1 {state BACKUP                        # 指定keepalived的角色,MASTER为主,BACKUP为备interface ens33                      # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡virtual_router_id 66                # 虚拟路由编号,主从要一直priority 99                         # 优先级,数值越大,获取处理请求的优先级越高advert_int 1                        # 检查间隔,默认为1s(vrrp组播周期秒数)track_script {chk_http_port                   #(调用检测脚本)}virtual_ipaddress {192.168.147.88                   # 定义虚拟ip(VIP),可多设,每行一个}
}

4、检测脚本

/usr/local/src/check_nginx_pid.sh
#检测nginx是否启动了
A=`ps -C nginx --no-header |wc -l`        
if [ $A -eq 0 ];then    #如果nginx没有启动就启动nginx                        systemctl start nginx                #重启nginxif [ `ps -C nginx --no-header |wc -l` -eq 0 ];then    #nginx重启失败,则停掉keepalived服务,进行VIP转移killall keepalived                    fi
fi

5、脚本授权

chmod 700 check_nginx_pid.sh # 脚本必须通过授权,不然没权限访问

6、启动keepalived

systemctl start keepalived

在这里插入图片描述

搭建高可用需要注意一下几点

1、keepalived启动先ngixn必须是启动成功的,否则keepalived启动不了

2、nginx停止后keepalived也会停止

3、主宕机后启动顺序是先启动nginx,在启动keepalived

7、测试顺序

1、主备都启动时访问速虚拟主机请求会交给主处理
2、把主中的nginx关闭后,请求会交给备服务器处理
Keepalived实现自动故障转移

Keepalived高可用服务之间的故障切换转移,是通过VRRP 来实现的。
Keepalived服务正常工作时,主 Master节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备Backup节点自己还活着,当主 Master节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主 Master节点的心跳了,于是调用自身的接管程序,接管主Master节点的 IP资源及服务。而当主 Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。

Nginx的进程模型

Nginx启动成功默认会有两个进程,master和work。
在这里插入图片描述
在这里插入图片描述

Master进程

master进程主要用来管理worker进程,具体包括如下4个主要功能:
1、接收来自外界的信号。
2、向各worker进程发送信号。
3、监控woker进程的运行状态。
4、当woker进程退出后(异常情况下),会自动重新启动新的woker进程
5、热加载ngixn配置文件

​ master进程充当整个进程组与用户的交互接口,同时对进程进行监护。它不需要处理网络事件,不负责业务的执行,只会通过管理worker进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。

​ 我们要控制nginx,只需要通过kill向master进程发送信号就行了。比如kill -HUP pid,则是告诉nginx,从容地重启nginx,我们一般用这个信号来重启nginx,或重新加载配置,因为是从容地重启,因此服务是不中断的。

​ kill -HUP 是用来向指定进程发送一个HUP信号,许多程序在收到HUP信号时,会重新读取配置文件

master进程在接收到HUP信号后是怎么做的呢?

1)首先master进程在接到信号后,会先重新加载配置文件,然后再启动新的worker进程,并向所有老的worker进程发送信号,告诉他们可以光荣退休了。

2)新的worker在启动后,就开始接收新的请求,而老的worker在收到来自master的信号后,就不再接收新的请求,并且在当前进程中的所有未处理完的请求处理完成后,再退出。

work进程

work进程主要用来处理网络请求,像网络事件,则是放在worker进程中来处理了。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的(默认是1),一般我们会设置与机器cpu核数一致,这里面的原因与nginx的进程模型以及事件处理模型是分不开的。

​ worker进程之间是平等的,每个进程,处理请求的机会也是一样的

​ 当我们提供80端口的http服务时,一个连接请求过来,每个work进程都有可能处理这个连接,怎么做到的呢?

Nginx采用异步非阻塞的方式来处理网络事件,类似于Libevent,具体过程如下:

1)接收请求:首先,每个worker进程都是从master进程fork过来,在master进程建立好需要listen的socket(listenfd)之后,然后再fork出多个worker进程。所有worker进程的listenfd会在新连接到来时变得可读,每个work进程都可以去accept这个socket(listenfd)。当一个client连接到来时,所有accept的work进程都会受到通知,但只有一个进程可以accept成功,其它的则会accept失败。为保证只有一个进程处理该连接,Nginx提供了一把共享锁accept_mutex来保证同一时刻只有一个work进程在accept连接。所有worker进程在注册listenfd读事件前抢accept_mutex,抢到互斥锁的那个进程注册listenfd读事件,在读事件里调用accept接受该连接。

2)处理请求:当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。

​ 我们可以看到,一个请求,完全由worker进程来处理,而且只在一个worker进程中处理。worker进程之间是平等的,每个进程,处理请求的机会也是一样的。

后记
👉👉💕💕美好的一天,到此结束,下次继续努力!欲知后续,请看下回分解,写作不易,感谢大家的支持!! 🌹🌹🌹

相关文章:

Nginx高级技巧:实现负载均衡和反向代理

文章目录 Nginx概述Nginx作用正向代理反向代理负载均衡动静分离 Nginx的安装 -->Docker3.1 安装Nginx3.2 Nginx的配置文件3.3 修改docker-compose文件 Nginx源码安装nginx常用命令nginx配置文件配置文件位置配置文件结构详情 Nginx的反向代理【重点】基于Nginx实现反向代理4…...

2024年2月最新微信域名检测拦截接口源码

这段PHP代码用于检测指定域名列表中的域名是否被封。代码首先定义了一个包含待检测域名的数组 $domainList,然后遍历该数组,对每个域名发送HTTP请求并检查响应内容以判断域名是否被封。 具体步骤如下: 1. 定义待检测的域名列表。 2. 遍历域名…...

1、Linux-安装

一、Linux和Windows的一些区别 1、Linux严格区分大小写——【Windows创建文件夹时不区分大小写】 2、Linux中所有内容都以文件形式存储,包括硬件 3、Linux不靠拓展名区分文件类型,而是可以通过读取文件开头的一些字节来区分。 但是在实际使用中一般要…...

flutter 父组件调用子组件方法

当子组件是有状态组件 声明GlobalKey 如 声明 GlobalKey formKey GlobalKey<FormState>(); Form( key: formKey, autovalidateMode: AutovalidateMode.always, child: Column( children: <Widget>[ TextFormField( autofocus: true, initialValue: "a&quo…...

京东云硬钢阿里云:承诺再低10%

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 阿里云刚刚宣布史上最大规模的全线产品降价20%&#xff0c;这热度还没过&#xff0c;京东云当晚就喊话&#xff1a;“随便降、比到底!&#xff0c;全网比价&#xff0c;击穿低价&#xff0c;再低10%”&#xff0c;并…...

Phoncent博客:探索AI写作与编程的无限可能

Phoncent博客&#xff0c;一个名为Phoncent的创新AIGC博客网站&#xff0c;于2023年诞生。它的创始人是庄泽峰&#xff0c;一个自媒体人和个人站长&#xff0c;他在网络营销推广领域有着丰富的经验。庄泽峰深知人工智能技术在内容创作和编程领域的潜力和创造力&#xff0c;因此…...

【Go-Zero】测试API查询信息无法返回数据库信息与api、rpc文件编写规范

【Go-Zero】测试API查询信息无法返回数据库信息与api、rpc文件编写规范 大家好 我是寸铁&#x1f44a; 总结了一篇测试API查询信息无法返回数据库信息与api、rpc文件编写规范的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 问题背景 大家好&#xff0c;我是寸铁&#xff01…...

SpringBootWeb快速入门

1.创建springboot工程&#xff0c;新建module 2.勾选web开发相关依赖 3.删除多余文件 4.新建类 5.启动类中运行main方法 6.启动 默认端口号8080 7.打开浏览器&#xff0c;地址栏输入 8.报错 9.原因&#xff0c;控制层位置放错&#xff0c;剪切controller层放进com.example …...

【书生·浦语大模型实战营】第 2 节 -课后作业

第二节 -轻松玩转书生浦语大模型趣味 Demo-课后作业 0.课程体验0.1 鸡兔同笼0.2 逻辑推理0.3 AI会毁灭人类吗&#xff1f; 1.课后作业1.1 基础作业1.1.1 作业11.1.2 作业2 0.课程体验 课程链接&#xff1a;https://github.com/internLM/tutorial 首先&#xff0c;这个课程是免费…...

Java如何使用OpenCV

背景&#xff1a;利用OpenCV功能批量处理视频 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个广泛应用于计算机视觉和图像处理领域的开源库。它提供了丰富的功能和工具&#xff0c;可用于处理图像和视频数据&#xff0c;并在各种应用中发挥着重要作…...

C++指针(三)

个人主页:PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 文章目录 前言 1.字符指针 1.1字符指针的概念 1.2字符指针的用处 1.3字符指针的操作 1.3.1定义 1.3.2初始化 1.4字符指针使用注意事项 2.数组参数&#xff0c;指针参数 2.1数组参数 2.1.1数组参数的概念 2.1…...

消息中间件之RocketMQ源码分析(二十七)

Broker提交或回滚事务消息 当生产者本地事务处理完成并且Broker回查事务消息后&#xff0c;不管执行Commit还是Rollback,都会根据用户本地事务的执行结果发送一个End_transaction的RPC请求给Broker&#xff0c;Broker端处理该请求的类是EndTransactionProcessor 第一步&…...

C习题002:澡堂洗澡

问题 输入样例 在这里给出一组输入。例如&#xff1a; 2 5 1 3 3 2 3 3 输出样例 在这里给出相应的输出。例如&#xff1a; No代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB 栈限制 8192 KB 代码 #include<stdio.h> int main() {int N,W,s,t,p;int arr_s[…...

智能双星:遥测终端机与柳林“巡检机器人“,助力智能运维新升级!

随着科技的不断发展&#xff0c;智能化、自动化的运维管理已经成为企业追求高效、稳定运营的重要方向。柳林遥测终端机、柳林e拍云平台以及巡检机器人的组合&#xff0c;为企业带来了一种全新的、前置的、无感的智能运维体验。 柳林遥测终端机&#xff0c;以其强大的数据采集和…...

算法复习之前缀和【备战蓝桥杯】

一维前缀和 S[i] a[1] a[2] ... a[i] a[l] ... a[r] S[r] - S[l - 1]二维前缀和 S[i, j] 第i行j列格子左上部分所有元素的和 以(x1, y1)为左上角&#xff0c;(x2, y2)为右下角的子矩阵的和为&#xff1a; S[x2, y2] - S[x1 - 1, y2] - S[x2, y1 - 1] S[x1 - 1, y1 - …...

IDEA基础——Maven配置tomcat

配置方案 一、配置maven-tomcat plugin插件&#xff08;只最高支持到tomcat 8&#xff09;~~1.添加镜像源&#xff0c;获取tomcat 8插件配置~~~~1.1 在pom.xml里先添加镜像源~~~~1.2 添加tomcat插件配置~~ 2. 添加tomact官方发布的插件配置&#xff08;无需添加镜像源&#xff…...

数据结构测试题

目录 1.闰年判断 2.志愿者选拔 3.单词接龙 4.对称二叉树 5.英雄南昌欢迎您 6.时间转换 7.矩阵乘法 8. Huffuman树 1.闰年判断 题目描述&#xff1a; 给定一个年份&#xff0c;判断这一年是不是闰年。 当以下情况之一满足时&#xff0c;这一年是闰年&#xff1a; 1. 年…...

【MATLAB】兔子机器人总系统_动力学模型解读(及simulink中的simscape的各模块介绍)

1、动力学模型 Rectangular Joint 控制平面上&#xff08;x&#xff0c;y轴&#xff09;的移动&#xff0c;去掉以后&#xff0c;机器人在原地翻滚不移动 Rigid Transform 坐标转换&#xff0c;B站视频已收藏 去掉&#xff0c;机体与地面贴合 此处的作用是设定机体的初…...

Launch学习

参考博客&#xff1a; (1) 史上最全的launch的解析来啦&#xff0c;木有之一欧 1 ROS工作空间简介 2 元功能包 src目录下可以包含多个功能包&#xff0c;假设需要使用机器人导航模块&#xff0c;但是这个模块中包含着地图、定位、路径规划等不同的功能包&#xff0c;它们的逻…...

蓝桥OJ 2942数字王国之军训排队 DFS剪枝

蓝桥OJ 2942数字王国之军训排队 #include<bits/stdc.h> using namespace std;const int N 15;//最多10队 int a[N], n; vector<int>v[N];//二维数组 v[i]记录队伍i中所有人的编号bool dfs(int cnt, int dep) {if (dep n1){//判断合法性for (int i 1; i < n; …...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...