PHPer面试取经路-Nginx篇

点击蓝字 关注我们  //  记得设为星标哦~

1什么是 Nginx?

Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。2011年6月1日,nginx 1.0.4发布。特点是配置简单,占有内存少,并发能力强。

2Nginx 的四大功能是什么?

正向代理在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问。反向代理我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。负载均衡单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。动静分离为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。

3Nginx 和 Apache 的区别?

轻量级:同样起 web 服务,nginx 比 apache 占用更少的内存及资源;抗并发:nginx 处理请求是异步非阻塞的,而 apache 则是阻塞型的,在高并发下 nginx 能保持低资源低消耗高性能;模块化:nginx 编写模块相对简单;IO事件模型:apache 是同步多进程模型,一个连接对应一个进程,阻塞;nginx 是异步的,多进程单线程,异步非阻塞,多个连接(万级别)可以对应一个进程。功能丰富:nginx 提供负载均衡,可以做做反向代理,前端服务器。

4Nginx 常用命令有哪些?

启动 nginx 。停止 nginx -s stop 或 nginx -s quit 。重启 nginx -s reload 或 service nginx reload 。重载指定配置文件 .nginx -c /usr/local/nginx/conf/nginx.conf 。查看 nginx 版本 nginx -v 。

5Nginx 报500、502、503、504 有什么区别?

500:Internal Server Error 内部服务错误,比如脚本错误,编程语言语法错误。502:Bad Gateway 错误,网关错误。比如服务器当前连接太多,响应太慢,页面素材太多、带宽慢。503:Service Temporarily Unavailable,服务不可用,web服务器不能处理HTTP请求,ip超频访问导致限流,或者临时超载或者是服务器进行停机维护。504:Gateway timeout 网关超时,程序执行时间过长导致响应超时,例如程序需要执行20秒,而nginx最大响应等待时间为10秒,这样就会出现超时。

6Nginx 的负载均衡算法都有哪些?

轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。weight指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。ip_hash每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。fair(第三方)按后端服务器的响应时间来分配请求,响应时间短的优先分配。url_hash(第三方)根据url的hash结果分配。

7Nginx 的反向代理和正向代理怎么理解?

正向代理:局域网中的电脑用户想要直接访问网络是不可行的,只能通过代理服务器来访问,这种代理服务就被称为正向代理。

反向代理:客户端无法感知代理,因为客户端访问网络不需要配置,只要把请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据,然后再返回到客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。

正向代理服务器代理的是客户端,而反向代理服务器代理的是服务端

8为什么 Nginx 性能这么高?

得益于它的事件处理机制:异步非阻塞事件处理机制:运用了epoll模型,提供了一个队列,排队解决。

9为什么不使用多线程?

Nginx 采用单线程来异步非阻塞处理请求(管理员可以配置Nginx主进程的工作进程的数量),不会为每个请求分配cpu和内存资源,节省了大量资源,同时也减少了大量的CPU的上下文切换,所以才使得Nginx支持更高的并发。

10什么是C10K问题?

C10K 问题是指无法同时处理大量客户端(10,000)的网络套接字。

11使用反向代理的优点是什么?

反向代理服务器可以隐藏源服务器的存在和特征。它充当互联网云和web服务器之间的中间层。这对于安全方面来说是很好的,特别是当您使用web托管服务时。

12Nginx 应用场景有哪些?

http 服务器。Nginx 是一个 http 服务可以独立提供 http 服务。可以做网页静态服务器。虚拟主机。可以实现在一台服务器虚拟出多个网站,例如个人网站使用的虚拟机。反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用 nginx 做反向代理。并且多台服务器可以平均分担负载,不会应为某台服务器负载高宕机而某台服务器闲置的情况。nginx 中也可以配置安全管理、比如可以使用 nginx 搭建 API 接口网关,对每个接口服务进行拦截。

13Nginx 怎么处理请求的?

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区块结果

14Nginx 的目录结构了解么?

[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 # 临时目录

15Nginx 配置文件 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 4 /50x.html; # 出现对应的http状态码时,使用50x.html回应客户    location = /50x.html { # location区块开始,访问50x.html    root html; # 指定对应的站点目录为html  }}......

16虚拟主机是什么意思?

Nginx 可以实现一台服务器虚拟出多个站点。

17location 的作用是什么?

location 指令的作用是根据用户请求的 URI 来执行不同的应用,也就是根据用户请求的网站 URL 进行匹配,匹配成功即进行相关的操作。

18location 的语法能说出来吗?

注意:~ 代表自己输入的英文字母

19Nginx 压缩了解吗,如何开启压缩?

开启 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;

20Nginx 是如何实现高并发的?

简单来讲,就是:异步,非阻塞,使用了epoll和大量的底层代码优化。

稍微详细一点展开的话,就是nginx的特殊进程模型和事件模型的设计。

进程模型:

nginx 采用一个 master 进程,多个 woker 进程的模式。

master 进程主要负责收集、分发请求。当一个请求过来时,master 拉起一个 worker 进程负责处理这个请求。master 进程也要负责监控 woker 的状态,保证高可靠性。woker 进程一般设置为跟cpu核心数一致。nginx 的 woker 进程跟 apache 不一样。apche 的进程在同一时间只能处理一个请求,所以它会开很多个进程,几百甚至几千个。而 nginx 的 woker 进程在同一时间可以处理额请求数只受内存限制,因此可以处理多个请求。

事件模型:

nginx是异步非阻塞的。

每进来一个 request,会有一个 worker 进程去处理。但不是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方,比如向上游(后端)服务器转发 request,并等待请求返回。那么,这个处理的 worker 不会这么傻等着,他会在发送完请求后,注册一个事件:“如果upstream返回了,告诉我一声,我再接着干”。于是他就休息去了。此时,如果再有 request 进来,他就可以很快再按这种方式处理。而一旦上游服务器返回了,就会触发这个事件,worker 才会来接手,这个 request 才会接着往下走。web server 的工作性质决定了每个 request 的大部份生命都是在网络传输中,实际上花费在 server 机器上的时间片不多。这是几个进程就解决高并发的秘密所在。

21Nginx 的 master 和 worker 是如何工作的?

可以参考上题,nginx的事件模型和进程模型。

22Nginx 怎么结合 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 的整个运作过程。

23Nginx 中 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;

24Nginx 的常用优化方案有哪些?

可以分为nginx指令中的优化和内核参数的优化。举几个例子:

worker_processes 8;

nginx进程数,建议按照cpu数目来指定,一般为它的倍数。

worker_cpu_affinity       01000000 ;

为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个,或者将一个进程分配到多个cpu。

worker_rlimit_nofile ;

这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。

worker_connections ;

每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为worker_processes*worker_connections。

keepalive_timeout 60;

keepalive超时时间。

gzip on;

开启gzip

25作为负载均衡,lvs 和 nginx 有什么区别?

lvs 与 nginx 对比:

负载度:lvs 优于 nginx稳定度:lvs 优于 nginx服务器性能要求:lvs 优于 nginx网络层数的效率:lvs 优于 nginx(网络七层:应用层、会话层、表示层、传输层、网络层、链路层、 物理层)功能多少 :nginx 优于 lvsnginx 工作在网络的第7层,lvs工作在第四层。所以nginx可以针对http应用本身来做分流策略,比如针对域名、目录结构等,相比之下lvs并不具备这样的功能。

26nginx如何实现限流?

Nginx 提供两种限流方式,一是控制速率,二是控制并发连接数。

控制速率

ngx_http_limit_req_module 模块提供了漏桶算法(leaky bucket),可以限制单个IP的请求处理频率。如:

正常限流:http {  limit_req_zone 192.168.1.1 zone=myLimit:10m rate=5r/s;}server {  location / {    limit_req zone=myLimit;    rewrite / ;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就会拒绝处理该请求。

突发流量限制访问频率 上面rate设置了 5r/s,如果有时候流量突然变大,超出的请求就被拒绝返回503了,突发的流量影响业务就不好了。

这时候可以加上burst参数,一般再结合nodelay一起使用。

server {  location / {    limit_req zone=myLimit burst=20 nodelay;    rewrite / ;permanent;  }}

burst=20 nodelay 表示这20个请求立马处理,不能延迟,相当于特事特办。不过,即使这20个突发请求立马处理结束,后续来了请求也不会立马处理。burst=20 相当于缓存队列中占了20个坑,即使请求被处理了,这20个位置这只能按 100ms一个来释放。

控制并发连接数

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;}map $limit $limit_key {  0 "";  1 $binary_remote_addr;}# 正常限流设置limit_req_zone $limit_key zone=myRateLimit:10m rate=10r/s;

geo对于白名单 将返回0,不限流;其他IP将返回1,进行限流。

27Nginx 可以实现限速么?

除此之外:ngx_http_core_module 还提供了限制数据传输速度的能力(即常说的下载速度)

location /flv/ {  flv;  limit_rate_after 500m;  limit_rate 50k;}

针对每个请求,表示客户端下载前500m的大小时不限速,下载超过了500m后就限速50k/s。

小编整理了一份计算机类的资料,包含打造PHP程序员、java、Linux、Go语言等。获取方式:关注:爱码仕,回复:1024,就可以获得这份超级大礼!

爱码仕

号 : guster666

:icoder996

分享

收藏

点赞

在看