[TOC]
## 什么是Nginx?
* Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。
* 2011年6月1日,nginx 1.0.4发布。
* 特点是配置简单,占有内存少,并发能力强。
## nginx的四大功能是什么?
(1)正向代理
在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问。
(2)反向代理
我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。
(3)负载均衡
单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。
(4)动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
## nginx和apache的区别?
轻量级:同样起web 服务,nginx 比apache 占用更少的内存及资源;
抗并发:nginx处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能;
模块化:nginx编写模块相对简单;
IO事件模型:apache是同步多进程模型,一个连接对应一个进程,阻塞;nginx是异步的,多进程单线程,异步非阻塞,多个连接(万级别)可以对应一个进程。
功能丰富:Nginx提供负载均衡,可以做做反向代理,前端服务器
## Nginx 常用命令有哪些?
* 启动`nginx`。
* 停止`nginx -s stop`或`nginx -s quit`。
* 重启`nginx -s reload`或`service nginx reload`。
* 重载指定配置文件`.nginx -c /usr/local/nginx/conf/nginx.conf`。
* 查看 nginx 版本`nginx -v`。
## nginx报500、502、503、504 有什么区别?
简单的说,
**500**:
Internal Server Error 内部服务错误,比如脚本错误,编程语言语法错误。
**502**:
Bad Gateway错误,网关错误。比如服务器当前连接太多,响应太慢,页面素材太多、带宽慢。
**503**:
Service Temporarily Unavailable,服务不可用,web服务器不能处理HTTP请求,ip超频访问导致限流,或者临时超载或者是服务器进行停机维护。
**504**:
Gateway timeout 网关超时,程序执行时间过长导致响应超时,例如程序需要执行20秒,而nginx最大响应等待时间为10秒,这样就会出现超时。
## Nginx的负载均衡算法都有哪些?
0)、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
1)、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
2)、ip\_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
3)、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
4)、url\_hash(第三方)
根据url的hash结果分配
## Nginx的 反向代理和正向代理怎么理解?
正向代理:局域网中的电脑用户想要直接访问网络是不可行的,只能通过代理服务器来访问,这种代理服务就被称为正向代理。
![](https://img.kancloud.cn/8b/29/8b2919153e35dc312f8dbc4b73a6d560_624x411.png)
反向代理:客户端无法感知代理,因为客户端访问网络不需要配置,只要把请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据,然后再返回到客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址
![](https://img.kancloud.cn/28/c1/28c1cb649db30c3ba3f01d07c06f62e7_658x471.png)
> 正向代理服务器代理的是客户端,而反向代理服务器代理的是服务端
## 为什么Nginx性能这么高?
得益于它的事件处理机制:
异步非阻塞事件处理机制:运用了epoll模型,提供了一个队列,排队解决
## 为什么不使用多线程?
Nginx:采用单线程来异步非阻塞处理请求(管理员可以配置Nginx主进程的工作进程的数量),不会为每个请求分配cpu和内存资源,节省了大量资源,同时也减少了大量的CPU的上下文切换,所以才使得Nginx支持更高的并发。
## 什么是C10K问题?
C10K问题是指无法同时处理大量客户端(10,000)的网络套接字。
## 使用反向代理的优点是什么?
反向代理服务器可以隐藏源服务器的存在和特征。它充当互联网云和web服务器之间的中间层。
这对于安全方面来说是很好的,特别是当您使用web托管服务时。
## Nginx应用场景有哪些?
1. http服务器。Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。
2. 虚拟主机。可以实现在一台服务器虚拟出多个网站,例如个人网站使用的虚拟机。
3. 反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会应为某台服务器负载高宕机而某台服务器闲置的情况。
4. nginz 中也可以配置安全管理、比如可以使用Nginx搭建API接口网关,对每个接口服务进行拦截。
## Nginx怎么处理请求的?
nginx接收一个请求后,首先由listen和server\_name指令匹配server模块,再匹配server模块里的location,location就是实际地址。
~~~
server { # 第一个Server区块开始,表示一个独立的虚拟主机站点
listen 80; # 提供服务的端口,默认80
server_name localhost; # 提供服务的域名主机名
location / { # 第一个location区块开始
root html; # 站点的根目录,相当于Nginx的安装目录
index index.html index.htm; # 默认的首页文件,多个用空格分开
} # 第一个location区块结果
~~~
## nginx的目录结构了解么?
~~~
[root@localhost ~]# tree /usr/local/nginx
/usr/local/nginx
├── client_body_temp
├── conf # Nginx所有配置文件的目录
│ ├── fastcgi.conf # fastcgi相关参数的配置文件
│ ├── fastcgi.conf.default # fastcgi.conf的原始备份文件
│ ├── fastcgi_params # fastcgi的参数文件
│ ├── fastcgi_params.default
│ ├── koi-utf
│ ├── koi-win
│ ├── mime.types # 媒体类型
│ ├── mime.types.default
│ ├── nginx.conf # Nginx主配置文件
│ ├── nginx.conf.default
│ ├── scgi_params # scgi相关参数文件
│ ├── scgi_params.default
│ ├── uwsgi_params # uwsgi相关参数文件
│ ├── uwsgi_params.default
│ └── win-utf
├── fastcgi_temp # fastcgi临时数据目录
├── html # Nginx默认站点目录
│ ├── 50x.html # 错误页面优雅替代显示文件,例如当出现502错误时会调用此页面
│ └── index.html # 默认的首页文件
├── logs # Nginx日志目录
│ ├── access.log # 访问日志文件
│ ├── error.log # 错误日志文件
│ └── nginx.pid # pid文件,Nginx进程启动后,会把所有进程的ID号写到此文件
├── proxy_temp # 临时目录
├── sbin # Nginx命令目录
│ └── nginx # Nginx的启动命令
├── scgi_temp # 临时目录
└── uwsgi_temp # 临时目录
~~~
## Nginx配置文件nginx.conf有哪些属性模块?
~~~
worker_processes 1; # worker进程的数量
events { # 事件区块开始
worker_connections 1024; # 每个worker进程支持的最大连接数
} # 事件区块结束
http { # HTTP区块开始
include mime.types; # Nginx支持的媒体类型库文件
default_type application/octet-stream; # 默认的媒体类型
sendfile on; # 开启高效传输模式
keepalive_timeout 65; # 连接超时
server { # 第一个Server区块开始,表示一个独立的虚拟主机站点
listen 80; # 提供服务的端口,默认80
server_name localhost; # 提供服务的域名主机名
location / { # 第一个location区块开始
root html; # 站点的根目录,相当于Nginx的安装目录
index index.html index.htm; # 默认的首页文件,多个用空格分开
} # 第一个location区块结果
error_page 500502503504 /50x.html; # 出现对应的http状态码时,使用50x.html回应客户
location = /50x.html { # location区块开始,访问50x.html
root html; # 指定对应的站点目录为html
}
}
......
~~~
## 虚拟主机是什么意思?
Nginx可以实现一台服务器虚拟出多个站点。
## location的作用是什么?
location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作。
## location的语法能说出来吗?
注意:~ 代表自己输入的英文字母
| 匹配符 | 匹配规则 | 优先级 |
| --- | --- | --- |
| \= | 精确匹配 | 1 |
| ^~ | 以某个字符串开头 | 2 |
| ~ | 区分大小写的正则匹配 | 3 |
| ~\* | 不区分大小写的正则匹配 | 4 |
| !~ | 区分大小写不匹配的正则 | 5 |
| !~\* | 不区分大小写不匹配的正则 | 6 |
| / | 通用匹配,任何请求都会匹配到 | 7 |
## Nginx 压缩了解吗,如何开启压缩?
开启nginx gzip压缩后,图片、css、js等静态资源的大小会减小,可节省带宽,提高传输效率,但是会消耗CPU资源。
开启:
~~~
# 开启gzip
gzip off;
# 启用gzip压缩的最小文件,小于设置值的文件将不会压缩
gzip_min_length 1k;
# gzip 压缩级别,1-9,数字越大压缩的越好,也越占用CPU时间,后面会有详细说明
gzip_comp_level 1;
# 进行压缩的文件类型。javascript有多种形式。其中的值可以在 mime.types 文件中找到。
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png application/vnd.ms-fontobject font/ttf font/opentype font/x-woff image/svg+xml;
~~~
## nginx是如何实现高并发的?
简单来讲,就是:
> **异步,非阻塞,使用了epoll和大量的底层代码优化**
稍微详细一点展开的话,就是nginx的特殊进程模型和事件模型的设计。
**进程模型**
nginx采用一个master进程,多个woker进程的模式。
1. master进程主要负责收集、分发请求。当一个请求过来时,master拉起一个worker进程负责处理这个请求。
2. master进程也要负责监控woker的状态,保证高可靠性
3. woker进程一般设置为跟cpu核心数一致。nginx的woker进程跟apache不一样。apche的进程在同一时间只能处理一个请求,所以它会开很多个进程,几百甚至几千个。而nginx的woker进程在同一时间可以处理额请求数只受内存限制,因此可以处理多个请求。
**事件模型**
nginx是异步非阻塞的。
每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方,比如向上游(后端)服务器转发request,并等待请求返回。那么,这个处理的worker不会这么傻等着,他会在发送完请求后,注册一个事件:“如果upstream返回了,告诉我一声,我再接着干”。于是他就休息去了。此时,如果再有request 进来,他就可以很快再按这种方式处理。而一旦上游服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。
web server的工作性质决定了每个request的大部份生命都是在网络传输中,实际上花费在server机器上的时间片不多。这是几个进程就解决高并发的秘密所在。
## Nginx的master和worker是如何工作的?
可以参考上题,nginx的事件模型和进程模型。
## nginx怎么结合php处理动态请求?
Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。
FastCGI接口在Linux下是socket,(这个socket可以是文件socket,也可以是ip socket)。为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket。
当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接纳到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序(php-fpm)处理脚本并读取返回数据。
接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;
最后,Nginx将返回的数据发送给客户端,这就是Nginx+FastCGI的整个运作过程。
![](https://img.kancloud.cn/4f/28/4f28367364d203823d48221a41e90dfe_573x235.png)
![](https://img.kancloud.cn/48/b5/48b58d76c1b37f01b9d2903e070acea2_723x370.png)
## nginx中fastcgi有什么优化点?
fastcgi\_cache\_path /usr/local/nginx/fastcgi\_cache levels=1:2 keys\_zone=TEST:10minactive=5m;
这个指令为FastCGI 缓存指定一个路径,目录结构等级,关键字区域存储时间和非活动删除时间。
fastcgi\_connect\_timeout 300;
指定连接到后端FastCGI 的超时时间。
fastcgi\_send\_timeout 300;
向FastCGI 传送请求的超时时间,这个值是指已经完成两次握手后向FastCGI 传送请求的超时时间。
fastcgi\_read\_timeout 300;
接收FastCGI 应答的超时时间,这个值是指已经完成两次握手后接收FastCGI 应答的超时时间。
fastcgi\_buffer\_size 4k;
指定读取FastCGI 应答第一部分需要用多大的缓冲区,一般第一部分应答不会超过1k,由于页面大小为4k,所以这里设置为4k。
fastcgi\_buffers 8 4k;
指定本地需要用多少和多大的缓冲区来缓冲FastCGI 的应答。
fastcgi\_busy\_buffers\_size 8k;
这个指令我也不知道是做什么用,只知道默认值是fastcgi\_buffers 的两倍。
fastcgi\_temp\_file\_write\_size 8k;
在写入fastcgi\_temp\_path 时将用多大的数据块,默认值是fastcgi\_buffers 的两倍。
fastcgi\_cache TEST
开启FastCGI 缓存并且为其制定一个名称。个人感觉开启缓存非常有用,可以有效降低CPU 负载,并且防止502 错误。
fastcgi\_cache\_valid 200 302 1h;
fastcgi\_cache\_valid 301 1d;
fastcgi\_cache\_valid any 1m;
为指定的应答代码指定缓存时间,如上例中将200,302 应答缓存一小时,301 应答缓存1 天,其他为1 分钟。
fastcgi\_cache\_min\_uses 1;
缓存在fastcgi\_cache\_path 指令inactive 参数值时间内的最少使用次数,如上例,如果在5 分钟内某文件1 次也没有被使用,那么这个文件将被移除。
fastcgi\_cache\_use\_stale error timeout invalid\_header http\_500;
## nginx的常用优化方案有哪些?
可以分为**nginx指令中的优化**和**内核参数的优化**。
>worker_processes 改为cpu核心数
worker_processes 4; #定位为cpu的内核数量,最大8
>worker_cpu_affinity 开启多核CPU使用
worker_cpu_affinity 0001 0010 0100 1000
第一位0001(关闭第四个、关闭第三个、关闭第二个、开启第一个)
第二位0010(关闭第四个、关闭第三个、开启第二个、关闭第一个)
第三位0100(关闭第四个、开启第三个、关闭第二个、关闭第一个)
> errorlog 配置crit尽量精简写log,减少磁盘IO
**error_log /data/logs/nginx/error.log crit;**
常见的错误日志级别有\[debug | info | notice | warn | error | crit | alert | emerg\],级别越高记录的信息越少。
生产场景一般是 warn | error | crit 这三个级别之一
注意:不要配置info等级较低的级别,会带来大量的磁盘I/O消耗。
>worker_rlimit_nofile 自行配置nginx的worker进程打开的最大文件数,
worker_rlimit_nofile 65535;
如果不配置,会读取服务器内核参数(通过ulimit -a查看)
>网络IO事件模型使用 epoll
use epoll;
>worker_connections 设置一个worker可以打开的最大连接数
worker\_connections 65535;
> 开启gzip,会大量减少我们的发数据的量
gzip on;
## 作为负载均衡,lvs和nginx有什么区别?
lvs 与 nginx 对比:
负载度: lvs 优于 nginx
稳定度: lvs 优于 nginx
服务器性能要求: lvs 优于 nginx
网络层数的效率: lvs 优于 nginx(网络七层:应用层、会话层、表示层、传输层、网络层、链路层、 物理层)
功能多少 : nginx 优于 lvs
nginx工作在网络的第7层,lvs工作在第四层。所以nginx可以针对http应用本身来做分流策略,比如针对域名、目录结构等,相比之下lvs并不具备这样的功能。
## nginx如何实现限流?
Nginx 提供两种限流方式,一是控制速率,二是控制并发连接数。
(1)控制速率
`ngx_http_limit_req_module`模块提供了漏桶算法(leaky bucket),可以限制单个IP的请求处理频率。
如:
**1.1 正常限流:**
~~~
http {
limit_req_zone 192.168.1.1 zone=myLimit:10m rate=5r/s;
}
server {
location / {
limit_req zone=myLimit;
rewrite / http://www.hac.cn permanent;
}
}
~~~
参数解释:
~~~
key: 定义需要限流的对象。
zone: 定义共享内存区来存储访问信息。
rate: 用于设置最大访问速率。
~~~
表示基于客户端192.168.1.1进行限流,定义了一个大小为10M,名称为myLimit的内存区,用于存储IP地址访问信息。rate设置IP访问频率,rate=5r/s表示每秒只能处理每个IP地址的5个请求。Nginx限流是按照毫秒级为单位的,也就是说1秒处理5个请求会变成每200ms只处理一个请求。如果200ms内已经处理完1个请求,但是还是有有新的请求到达,这时候Nginx就会拒绝处理该请求。
**1.2 突发流量限制访问频率**
上面rate设置了 5r/s,如果有时候流量突然变大,超出的请求就被拒绝返回503了,突发的流量影响业务就不好了。
这时候可以加上**burst**参数,一般再结合**nodelay**一起使用。
~~~
server {
location / {
limit_req zone=myLimit burst=20 nodelay;
rewrite / http://www.hac.cn permanent;
}
}
~~~
`burst=20 nodelay`表示这20个请求立马处理,不能延迟,相当于特事特办。不过,即使这20个突发请求立马处理结束,后续来了请求也不会立马处理。burst=20 相当于缓存队列中占了20个坑,即使请求被处理了,这20个位置这只能按 100ms一个来释放。
(2)控制并发连接数
`ngx_http_limit_conn_module`提供了限制连接数功能。
~~~
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server {
...
limit_conn perip 10;
limit_conn perserver 100;
}
~~~
`limit_conn perip 10`作用的key 是`$binary_remote_addr`,表示限制单个IP同时最多能持有10个连接。
`limit_conn perserver 100`作用的key是`$server_name`,表示虚拟主机(server) 同时能处理并发连接的总数。
\> 注:**limit\_conn perserver 100**作用的key是\*\*$server\_name\*\*,表示虚拟主机(server) 同时能处理并发连接的总数。
**1.3 白名单区分限速**
如果不想做限流,还可以设置白名单:
利用 Nginx`ngx_http_geo_module`和`ngx_http_map_module`两个工具模块提供的功能。
~~~
##定义白名单ip列表变量
geo $limit {
default 1;
10.0.0.0/8 0;
192.168.0.0/10 0;
81.56.0.35 0;
}
map $limit $limit_key {
0 "";
1 $binary_remote_addr;
}
# 正常限流设置
limit_req_zone $limit_key zone=myRateLimit:10m rate=10r/s;
~~~
**geo**对于白名单 将返回0,不限流;其他IP将返回1,进行限流。
## nginx可以实现限速么?
除此之外:
`ngx_http_core_module`还提供了限制数据传输速度的能力(即常说的下载速度)
~~~
location /flv/ {
flv;
limit_rate_after 500m;
limit_rate 50k;
}
~~~
针对每个请求,表示客户端下载前500m的大小时不限速,下载超过了500m后就限速50k/s。
## 如何修改worker 进程数?
在 conf/nginx.conf 文件中修改 worker\_processes 数字即可。
![在这里插入图片描述](https://www.pianshen.com/images/820/1aab3dd1ff59916253de79c11cbe58ec.png)
## Nginx 基本命令有哪些?
./nginx -s stop
./nginx -s quit
./nginx -s reload
./nginx
./nginx -t
## Nginx进程模型
![](https://img.kancloud.cn/23/bb/23bb40683f360232932cdf107e913c52_755x361.png)
## Nginx 抢占机制
![](https://img.kancloud.cn/01/76/01766937ae8923d90d47eafeef38057b_820x217.png)
## 怎么修改nginx打印的日志格式?
Nginx 服务器提供了一个 HttpLogModule 模块,可以通过它来设置日志的输出格式。
![](https://img.kancloud.cn/92/6b/926b20a7541312216361c0d43ec246b6_744x106.png)
Nginx 日志格式中,有很多参数,总结如下:
~~~
参数 说明 示例
$remote_addr 客户端地址 14.116.133.170
$remote_user 客户端用户名称 --
$time_local 访问时间和时区 03/Mar/2019:16:43:53 +0800
$request 请求的URI和HTTP协议 "GET /city/static/js/illegals/vehicle-search.js HTTP/1.1"
$http_host 请求地址,即浏览器中你输入的地址(IP或域名) www.super.com 192.168.118.15
$status HTTP请求状态 200
$upstream_status upstream状态 200
$body_bytes_sent 发送给客户端文件内容大小 1547
$http_referer url跳转来源 https://www.baidu.com/
$http_user_agent 用户终端浏览器等信息 Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0
$ssl_protocol SSL协议版本 TLSv1
$ssl_cipher 交换数据中的算法 RC4-SHA
$upstream_addr 后台upstream的地址,即真正提供服务的主机地址 192.168.118.16:8080
$request_time 整个请求的总时间 0.205
$upstream_response_time 请求过程中,upstream响应时间 0.002
~~~
通过更改这里,可以达到想要的结果,如果想打印post请求传参,可以通过安装第三方组件来完成。
## 简单的说下nginx优化的点
1.使用epoll模型
2.提高进程数、打开连接数
3.启用gzip压缩传输
4.为静态文件启用缓存
5.Timeouts设置
6.防盗链设置
7.非法脚本
8.防止ddoc攻击
9.禁止恶意域名解析
10.隐藏版本信息
## keepalived是什么?
keepalived最初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了实现高可用的VRRP功能。keepalived除了能够管理LVS软件外,还能支持其他服务的高可用解决方案。
keepalived通过VRRP协议实现高可用功能的。VRRP(Virtual Router Redundancy Protocol)虚拟路由冗余协议。VRRP出现的目的就是为了解决静态路由单点故障问题,它能保证当个别节点宕机时,整个网络可以不间断地运行。
## keepalived高可用故障转移原理是什么?
keepalived高可用服务之间的故障转移,是通过VRRP来实现的。在keepalived服务工作时,主Master节点会不断地向备节点发送(多播的方式)心跳消息,用来告诉备Backup节点自己还活着。
当主节点发生故障时,无法给备节点发送心跳消息,如果备节点无法继续检测到来自主节点的心跳。就会调用自身的接管程序,接管主节点的IP资源和服务。当主节点恢复时,备节点又会释放主节点故障时自身接管的IP资源和服务,恢复到原来的备用角色。
## nginx反向代理负载均衡,如何和php通信的
可以按照轮询、ip哈希、URL哈希、权重等多种方式对后端服务器做负载均衡
nginx 的 upstream目前支持 4 种方式的分配
1)、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
![](https://img.kancloud.cn/ac/4a/ac4a619507d47e53a19bba0c37e4c06c_1139x102.png)
2)、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
![](https://img.kancloud.cn/a9/52/a952d2f5a87275f0043658c0b1125300_1140x100.png)
2)、ip\_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
![](https://img.kancloud.cn/9c/55/9c5587292d75e37acfb88c76eeec72c8_1138x136.png)
3)、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
![](https://img.kancloud.cn/33/74/337491cd2e15eb26622802dd204def75_1148x136.png)
4)、url_hash(第三方)
![](https://img.kancloud.cn/65/e1/65e1877f5c2f0b888ed8a26a50a47186_1145x165.png)
- 消息队列
- 为什么要用消息队列
- 各种消息队列产品的对比
- 消息队列的优缺点
- 如何保证消息队列的高可用
- 如何保证消息不丢失
- 如何保证消息不会重复消费?如何保证消息的幂等性?
- 如何保证消息消费的顺序性?
- 基于MQ的分布式事务实现
- Beanstalk
- PHP
- 函数
- 基础
- 基础函数题
- OOP思想及原则
- MVC生命周期
- PHP7.X新特性
- PHP8新特性
- PHP垃圾回收机制
- php-fpm相关
- 高级
- 设计模式
- 排序算法
- 正则
- OOP代码基础
- PHP运行原理
- zavl
- 网络协议new
- 一面
- TCP和UDP
- 常见状态码和代表的意义以及解决方式
- 网络分层和各层有啥协议
- TCP
- http
- 二面
- TCP2
- DNS
- Mysql
- 锁
- 索引
- 事务
- 高可用?高并发?集群?
- 其他
- 主从复制
- 主从复制数据延迟
- SQL的语⾔分类
- mysqlQuestions
- Redis
- redis-question
- redis为什么那么快
- redis的优缺点
- redis的数据类型和使用场景
- redis的数据持久化
- 过期策略和淘汰机制
- 缓存穿透、缓存击穿、缓存雪崩
- redis的事务
- redis的主从复制
- redis集群架构的理解
- redis的事件模型
- redis的数据类型、编码、数据结构
- Redis连接时的connect与pconnect的区别是什么?
- redis的分布式锁
- 缓存一致性问题
- redis变慢的原因
- 集群情况下,节点较少时数据分布不均匀怎么办?
- redis 和 memcached 的区别?
- 基本算法
- MysqlNew
- 索引new
- 事务new
- 锁new
- 日志new
- 主从复制new
- 树结构
- mysql其他问题
- 删除
- 主从配置
- 五种IO模型
- Kafka
- Nginx
- trait
- genergtor 生成器
- 如何实现手机扫码登录功能
- laravel框架的生命周期