Nginx 面试三连问:如何工作?负载均衡策略有哪些,如何成为一个更好的 Java 开发者
4、Nginx 的 master 和 worker 是如何工作的?
这跟 Nginx 的多进程、单线程有关。(一个进程只有一个主线程)。
为什么要用单线程?
采用单线程来异步非阻塞处理请求(管理员可以配置 Nginx 主进程的工作进程的数量),不会为每个请求分配 cpu 和内存资源,节省了大量资源,同时也减少了大量的 CPU 的上下文切换,所以才使得 Nginx 支持更高的并发。
简单过程:
主程序 Master process 启动后,通过一个 for 循环来 接收 和 处理外部信号 ;
主进程通过 fork() 函数产生 worker 子进程 ,每个子进程执行一个 for 循环来实现 Nginx 服务器对事件的接收和处理 。
详细过程:
1、Nginx 在启动后,会有一个 master 进程和多个相互独立的 worker 进程。2、master 接收来自外界的信号,先建立好需要 listen 的 socket(listenfd) 之后,然后再 fork 出多个 worker 进程,然后向各 worker 进程发送信号,每个进程都有可能来处理这个连接。3、所有 worker 进程的 listenfd 会在新连接到来时变得可读 ,为保证只有一个进程处理该连接,所有 worker 进程在注册 listenfd 读事件前抢占 accept_mutex ,抢到互斥锁的那个进程注册 listenfd 读事件 ,在读事件里调用 accept 接受该连接。4、当一个 worker 进程在 accept 这个连接之后,就开始读取请求、解析请求、处理请求,产生数据后,再返回给客户端 ,最后才断开连接。
5、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 。
6、nginx 中 500、502、503、504 有什么区别?
500:
Internal Server Error 内部服务错误,比如脚本错误,编程语言语法错误。
502:
Bad Gateway 错误,网关错误。比如服务器当前连接太多,响应太慢,页面素材太多、带宽慢。
503:
Service Temporarily Unavailable,服务不可用,web 服务器不能处理 HTTP 请求,可能是临时超载或者是服务器进行停机维护。
504:
Gateway timeout 网关超时,程序执行时间过长导致响应超时,例如程序需要执行 20 秒,而 nginx 最大响应等待时间为 10 秒,这样就会出现超时。
7、Nginx 压缩了解吗,如何开启压缩?
开启 nginx gzip 压缩后,图片、css、js 等静态资源的大小会减小,可节省带宽,提高传输效率,但是会消耗 CPU 资源。
开启:
#?开启 gzipgzip?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;
8、Nginx 和 Apache、Tomcat 之间的不同点
1、Nginx/Apache 是 Web Server,而 Apache Tomact 是一个 servlet container2、tomcat 可以对 jsp 进行解析,nginx 和 apache 只是 web 服务器,可以简单理解为只能提供 html 静态文件服务。
Nginx 和 Apache 区别:
1)Nginx 轻量级,同样起 web 服务,比 apache 占用更少的内存及资源 。
2)Nginx 抗并发,nginx 处理请求是异步非阻塞的,而 apache 则是阻塞型的,在高并发下 nginx 能保持低资源低消耗高性能 。
3)Nginx 提供负载均衡,可以做做反向代理,前端服务器
4)Nginx 多进程单线程,异步非阻塞;Apache 多进程同步,阻塞。
9、Nginx 有哪些负载均衡策略
Nginx 默认提供的负载均衡策略:
1、轮询(默认)round_robin
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
2、IP 哈希 ip_hash
每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 共享的问题。
当然,实际场景下,一般不考虑使用 ip_hash 解决 session 共享。
3、最少连接 least_conn
下一个请求将被分派到活动连接数量最少的服务器
4、权重 weight
weight 的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下,达到合理的资源利用率。
还可以通过插件支持其他策略。
10、Nginx 动静态资源分离做过吗,为什么要这样做?
动态资源、静态资源分离,是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来 路。
比如说 js、css、hrml 从 A 服务器返回。图片 从 B 服务器返回,其他请求从 Tomcat 服务器 C 返回。
后台应用分开部署,提高用户访问静态代码的速度。而且现在还有 CDN 服务,不需要限制于服务器的带宽。
11、ngx_http_upstream_module 模块了解吗?
ngx_http_upstream_module 模块用于将多个服务器定义成服务器组,可通过 fastcgi 传递、proxy 传递、uwsgi 传递、memcached 传递和 scgi 传递指令来引用的服务器组。
比如访问 www.a.com 缓存+调度:
http{proxy_cache_path?/var/cache/nginx/prox
y_cache?levels=1:2:2?keys_zone=proxycache:20m?inactive=120s?max_si?#缓存 ze=1g;upstream?mysqlsrvs{ip_hash;?#源地址 hash 调度方法?写了 backup 就不可用 server?172.18.99.1:80?weight=2;?#weight 权重 server?172.18.99.2:80;??????????#标记 down,配合 ip_hash 使用,实现灰度发布 server?172.18.99.3:80?backup;???#backup 将服务器标记为“备用”,即所有服务器均不可用时才启用?}}server{server_name?www.a.com;proxy_cache?proxycache;proxy_cache_key?$request_uri;proxy_cache_valid?200?302?301?1h;proxy_cache_valid?any?1m;location?/?{proxy_pass?http://mysqlsrvs;}}
12、限流了解吗,怎么限流的?
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 了,突发的流量影响业务就不好了。
评论