1.  所有 worker 进程的 listenfd 会在新连接到来时变得可读 ,为保证只有一个进程处理该连接,所有 worker 进程在注册 listenfd 读事件前抢占 accept_mutex ,抢到互斥锁的那个进程注册 listenfd 读事件 ,在读事件里调用 accept 接受该连接。


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

3. Nginx 常用命令有哪些 (java 项目 fhadmin.cn)?
启动 nginx 。
停止 nginx -s stop 或 nginx -s quit 。
重启 nginx -s reload 或 service nginx reload 。
重载指定配置文件 .nginx -c /usr/local/nginx/conf/nginx.conf 。
查看 nginx 版本 nginx -v 。
4、nginx 中 500、502、503、504 有什么区别?
500:

Internal Server Error 内部服务错误,比如脚本错误,编程语言语法错误。

502:

Bad Gateway 错误,网关错误。比如服务器当前连接太多,响应太慢,页面素材太多、带宽慢。

503:

Service Temporarily Unavailable,服务不可用,web 服务器不能处理 HTTP 请求,可能是临时超载或者是服务器进行停机维护。

504:

Gateway timeout 网关超时,程序执行时间过长导致响应超时,例如程序需要执行 20 秒,而 nginx 最大响应等待时间为 10 秒,这样就会出现超时。

5、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;

6、Nginx 和 Apache、Tomcat 之间的不同点
1、Nginx/Apache 是 Web Server, 而 Apache Tomact 是一个 servlet container
2、tomcat 可以对 jsp 进行解析,nginx 和 apache 只是 web 服务器,可以简单理解为只能提供 html 静态文件服务。

Nginx 和 Apache 区别 (java 项目 fhadmin.cn):

1)Nginx 轻量级,同样起 web 服务,比 apache 占用更少的内存及资源 。

2)Nginx 抗并发,nginx 处理请求是异步非阻塞的,而 apache 则是阻塞型的,在高并发下 nginx 能保持低资源低消耗高性能 。

3)Nginx 提供负载均衡,可以做做反向代理,前端服务器

4)Nginx 多进程单线程,异步非阻塞;Apache 多进程同步,阻塞。

7、Nginx 有哪些负载均衡策略
Nginx 默认提供的负载均衡策略:

1、轮询(默认)round_robin
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。

2、IP 哈希 ip_hash
每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 共享的问题。

当然,实际场景下,一般不考虑使用 ip_hash 解决 session 共享。

3、最少连接 least_conn
下一个请求将被分派到活动连接数量最少的服务器

4、权重 weight
weight 的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下,达到合理的资源利用率。

还可以通过插件支持其他策略。

8、Nginx 动静态资源分离做过吗,为什么要这样做?
动态资源、静态资源分离,是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来 路。

比如说 js、css、hrml 从 A 服务器返回。图片 从 B 服务器返回,其他请求从 Tomcat 服务器 C 返回。

后台应用分开部署,提高用户访问静态代码的速度。而且现在还有 CDN 服务,不需要限制于服务器的带宽。

9、ngx_http_upstream_module 模块了解吗?
ngx_http_upstream_module 模块用于将多个服务器定义成服务器组,可通过 fastcgi 传递、proxy 传递、uwsgi 传递、memcached 传递和 scgi 传递指令来引用的服务器组。

比如访问 www.a.com 缓存 + 调度:

http{
proxy_cache_path?/var/cache/nginx/proxy_cache?levels=12?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? mysqlsrvs;
}
}

10、限流了解吗,怎么限流的?
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?/? fhadmin.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?/? fhadmin.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) 同时能处理并发连接的总数。

拓展:
如果不想做限流,还可以设置白名单:

利用 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;
}