Nginx的面试题

1、什么是 Nginx ?

Nginx ,是一个 Web 服务器和反向代理服务器,用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 协议。

目前使用的最多的 Web 服务器或者代理服务器,像淘宝、新浪、网易、迅雷等都在使用。

Nginx 的主要功能如下:

作为 http server (代替 Apache ,对 PHP 需要 FastCGI 处理器支持)

FastCGI:Nginx 本身不支持 PHP 等语言,但是它可以通过 FastCGI 来将请求扔给某些语言或框架处理。

反向代理服务器

实现负载均衡

虚拟主机

nginx版本号:nginx version: nginx/1.12.2

2、为什么要用Nginx?

优点:

  • 跨平台、配置简单
  • 非阻塞、高并发连接:处理2-3万并发连接数,官方监测能支持5万并发
  • 内存消耗小:开启10个nginx才占150M内存 成本低廉:开源
  • 内置的健康检查功能:如果有一个服务器宕机,会做一个健康检查,再发送的请求就不会发送到宕机的服务器了。重新将请求提交到其他的节点上。
  • 节省宽带:支持GZIP压缩,可以添加浏览器本地缓存
  • 稳定性高:宕机的概率非常小
  • master/worker结构:一个master进程,生成一个或者多个worker进程
  • 接收用户请求是异步的:浏览器将请求发送到nginx服务器,它先将用户请求全部接收下来,再一次性发送给后端web服务器,极大减轻了web服务器的压力
  • 一边接收web服务器的返回数据,一边发送给浏览器客户端
  • 网络依赖性比较低,只要ping通就可以负载均衡
  • 可以有多台nginx服务器
  • 事件驱动:通信机制采用epoll模型

3、Nginx是如何实现高并发的?

Nginx为一群服务器做代理,每次请求经过nginx转发给不同的服务器;具体的由负载均衡的策略决定

在配置文件中,配置upStream 指向多个服务器并指定负载均衡的策略

在server中配置proxy_pass指向upStream

4、Nginx是如何处理http请求的?

Nginx使用反应器模式。主事件循环等待操作系统发出准备事件的信号,这样数据就可以从套接字读取,在该实例中读取到缓冲区并进行处理。单个线程可以提供数万个并发连接。

5、nginx和apache的区别

Apache模块多,基本想到的都可以找到,更成熟,bug少,nginx的bug多。

nginx超稳定,是目前的主流,有丰富的特性,成熟的技术和开发社区。

6、nginx用过哪些模块

  • ngx_http_gzip_module:压缩模块,对Nginx返回的数据压缩,属于性能优化模块
  • ngx_http_fastcgi_module:FastCGI模块,和 动态应用相关的模块,例如PHP
  • ngx_http_proxy_module:Proxy代理模块
  • ngx_http_upstream_module:负载均衡模块,可以实现网站的负载均衡功能及节点的健康检查
  • ngx_http_rewrite_module:URL地址重写模块
  • ngx_http_limit_conn_module:限制用户并发连接数及请求数模块
  • ngx_http_log_module:访问日志模块,以指定的格式记录Nginx客户访问日志等信息
  • ngx_http_stub_status_module:记录Nginx基本访问状态信息等模块
  • ngx_http_referer_module模块: 可以基于这个模块做防盗链。Referer 是 HTTP 请求header 的一部分,当浏览器(或者模拟浏览器行为)向web 服务器发送请求的时候,头信息里有包含 Referer 。比如我在www.google.com 里有一个www.baidu.com 链接,那么点击这个www.baidu.com ,它的header 信息里就有: Referer=http://www.google.com

7、Nginx调优方式:

  • 隐藏 Nginx 版本号
  • 隐藏 Nginx 版本号和软件名
  • 更改 Nginx 服务的默认用户
  • 优化 Nginx worker 进程数
  • 绑定 Nginx 进程到不同的 CPU 上
  • 优化 Nginx 处理事件模型
  • 优化 Nginx 单个进程允许的最大连接数
  • 优化 Nginx worker 进程最大打开文件数
  • 优化服务器域名的散列表大小
  • 开启高效文件传输模式
  • 优化 Nginx 连接超时时间
  • 限制上传文件的大小
  • FastCGI 相关参数调优
  • 配置 Nginx gzip 压缩
  • 配置 Nginx expires 缓存
  • 优化 Nginx日志(日志切割)
  • 优化 Nginx 站点目录
  • 配置 Nginx 防盗链
  • 配置 Nginx 错误页面优雅显示
  • 优化 Nginx 文件权限
  • Nginx 防爬虫优化
  • 控制 Nginx 并发连接数
  • 集群代理优化

8、 Nginx 常用命令?

启动 /usr/local/nginx/sbin/nginx 。

停止 nginx -s stop 或 nginx -s quit 。

重载配置 /usr/local/nginx/sbin/nginx -s reload(平滑重启) 或 service nginx reload 。

重载指定配置文件 .nginx -c /usr/local/nginx/conf/nginx.conf 。

查看 nginx 版本 /usr/local/nginx/sbin/nginx -V。

检查配置文件是否正确 nginx -t 。

显示帮助信息 nginx -h 。

9、nginx日志分析怎么做的

我们公司使用ELK做nginx的日志分析 主要分析nginx的access.log日志

10、nginx如何设置防ddos攻击

限制每秒请求数

限制IP连接数

白名单设置

ngx_http_limit_req_module模块通过漏桶原理来限制单位时间内的请求数,一旦单位时间内请求数超过限制,就会返回503错误。

11、Nginx 常用配置?

worker_processes  8; # 工作进程个数
worker_connections  65535; # 每个工作进程能并发处理(发起)的最大连接数(包含所有连接数)
error_log         /data/logs/nginx/error.log; # 错误日志打印地址
access_log      /data/logs/nginx/access.log; # 进入日志打印地址
log_format  main  '$remote_addr"$request" ''$status $upstream_addr "$request_time"'; # 进入日志格式

## 如果未使用 fastcgi 功能的,可以无视
fastcgi_connect_timeout=300; # 连接到后端 fastcgi 超时时间
fastcgi_send_timeout=300; # 向 fastcgi 请求超时时间(这个指定值已经完成两次握手后向fastcgi传送请求的超时时间)
fastcgi_rend_timeout=300; # 接收 fastcgi 应答超时时间,同理也是2次握手后
fastcgi_buffer_size=64k; # 读取 fastcgi 应答第一部分需要多大缓冲区,该值表示使用1个64kb的缓冲区读取应答第一部分(应答头),可以设置为fastcgi_buffers选项缓冲区大小
fastcgi_buffers 4 64k; # 指定本地需要多少和多大的缓冲区来缓冲fastcgi应答请求,假设一个php或java脚本所产生页面大小为256kb,那么会为其分配4个64kb的缓冲来缓存
fastcgi_cache TEST; # 开启fastcgi缓存并为其指定为TEST名称,降低cpu负载,防止502错误发生

listen       80; # 监听端口
server_name  rrc.test.jiedaibao.com; # 允许域名
root  /data/release/rrc/web; # 项目根目录
index  index.php index.html index.htm; # 访问根文件

12、使用“反向代理服务器”的优点是什么?

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

13、请解释Nginx如何处理HTTP请求。

Nginx使用反应器模式。主事件循环等待操作系统发出准备事件的信号,这样数据就可以从套接字读取,在该实例中读取到缓冲区并进行处理。单个线程可以提供数万个并发连接。

14、请解释Nginx服务器上的Master 和 Worker进程分别是什么?

Master进程:读取及评估配置和维持

Worker进程:处理请求

15、nginx 有哪几种虚拟主机

基于IP 基于端口 基于域名

基于IP的虚拟主机:每个网站都需要一个IP。缺点是:需要多个IP,如果是公网IP每个IP都需要收费

基于端口的虚拟主机:只需要一个IP。缺点:端口号没有办法告诉公网用户,无法适用于公网用户,适合内部用户使用。

基于域名的虚拟主机:最常用的就是基于域名的虚拟主机

16、请解释是否有可能将Nginx的错误替换为502错误、503?

502 =错误网关

503 =服务器超载

有可能,但是您可以确保fastcgi_intercept_errors被设置为ON,并使用错误页面指令。

17、502错误问题解决办法?

Nginx 502错误情况1:

网站的访问量大,而php-cgi的进程数偏少。

针对这种情况的502错误,只需增加php-cgi的进程数。具体就是修改/usr/local/php/etc/php-fpm.conf 文件,将其中的max_children值适当增加。这个数据要依据你的VPS或独立服务器的配置进行设置。一般一个php-cgi进程占20M内存,你可以自己计算下,适量增多。

/usr/local/php/sbin/php-fpm restart 然后重启一下.

Nginx 502错误情况2:

CPU占用率、内存占用率非常高,遭到CC攻击.

解决方法请参考:LinuxVPS简单解决CC攻击

Nginx 502错误情况3:

CPU占用率不高,内存溢出。

检查一下网站程序有没有问题?一般小偷站点常常会出现内存溢出。

检查一下/var/log/目录下的日志,看看是不是有人爆破SSH和FTP端口?

SSH、FTP遭到穷举也会占用大量内存。是的话改掉SSH端口和FTP端口即可

18、 nginx 500、304、499 是什么问题导致的

500:

1.web脚本错误,如php语法错误,lua语法错误等。

2.访问量大的时候,由于系统资源限制,而不能打开过多的文件

硬盘空间满了:

使用 df -k 查看硬盘空间是否满了。清理硬盘空间就可以解决500错误。Nginx	如果开启了access log,在不需要的情况下,最好关闭access log。access log	会占用大量硬盘空间。

分析思路:

查看nginx error log ,查看php error log

如果是脚本的问题,则需要修复脚本错误,并优化代码

各种优化都做好,还是出现too many open files,那就要考虑做负载均衡, 把 流量分散到不同服务器上去了。

304:未修改(表示客户机缓存的版本是最新的,客户机应该继续使用它。)

499:服务端处理时间过长,客户端主动关闭了连接。

19、tomcat端口有哪些,都是什么用途

答:80port:服务器连接器的端口号,该连接器将在指定端口侦听来自客户端的请求。

8005 port:指定一个端口,这个端口负责监听关闭Tomcat的请求

20、请解释ngx_http_upstream_module的作用是什么?

ngx_http_upstream_module用于定义可通过fastcgi传递、proxy传递、uwsgi传递、memcached传递和scgi传递指令来引用的服务器组。

21、请解释什么是C10K问题?

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

22、解释如何在Nginx中获得当前的时间?

要获得Nginx的当前时间,必须使用SSI模块、dategmtdate_gmt和date_local的变量。

Proxy_set_header THE-TIME $date_gmt;

23、Nginx的负载均衡算法都有哪些

nginx 的 upstream目前支持 4 种方式的分配

0)、轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

1)、weight

指定轮询机率,weight和访问比率成正比,用于后端服务器性能不均的情况。

2)、ip_hash

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

3)、fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

4)、url_hash(第三方)

根据url的hash结果分配

24、nginx 有什么使用场景

我们公司使用nginx做负载均衡,反向代理,也做web服务器来使用;比如负载均衡,主要是用upstream模块,nginx的代理功能是使用http proxy模块做的。

25、 使用反向代理服务器的好处是什么?

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

26、举例nginx服务器的最佳用途?

Nginx服务器的最佳用法是在网络上部署动态HTTP内容,使用SCGI、WSGI应用程序服务器、用于脚本的FastCGI处理程序。它还可以作为负载均衡器。

27、 如何设置在81端口上运行nginx?

为了通过一个不同的端口开启Nginx,你必须进入/etc/Nginx/sites-enabled/,如果这是默认文件,那么你必须打开名为“default”的文件。编辑文件,并放置在你想要的端口:

28、反向代理配置

客户端本来可以直接通过HTTP协议访问某网站应用服务器,网站管理员可以在中间加上一个Nginx,客户端请求Nginx,Nginx请求应用服务器,然后将结果返回给客户端,此时Nginx就是反向代理服务器。

server {
  listen80;
  location / {
    proxy_pass http://192.168.20.1:8080; # 应用服务器HTTP地址
}

负载均衡配置

upstream myapp {
server192.168.20.1:8080; # 应用服务器1
server192.168.20.2:8080; # 应用服务器2
}
  server {
listen80;
location / {
    proxy_pass http://myapp;
}
}

虚拟主机配置

多个域名指向同一台主机

server {
listen80default_server;
server_name _;
return444; # 过滤其他域名的请求,返回444状态码
}
    server {
listen80;
server_name www.aaa.com; # www.aaa.com域名
location / {
    proxy_pass http://localhost:8080; # 对应端口号8080
}
}
server {
listen80;
server_name www.bbb.com; # www.bbb.com域名
location / {
    proxy_pass http://localhost:8081; # 对应端口号8081
}
}

29、正向代理

一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器)

然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理

正向代理总结就一句话:代理端代理的是客户端

30、反向代理

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求,发给内部网络上的服务器

并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器

反向代理总结就一句话:代理端代理的是服务端

31、动态资源、静态资源分离

动态资源、静态资源分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后

我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路

动态资源、静态资源分离简单的概括是:动态文件与静态文件的分离

32、为什么要做动、静分离?

在我们的软件开发中,有些请求是需要后台处理的(如:.jsp,.do等等),有些请求是不需要经过后台处理的(如:css、html、jpg、js等等文件)

这些不需要经过后台处理的文件称为静态文件,否则动态文件。因此我们后台处理忽略静态文件。这会有人又说那我后台忽略静态文件不就完了吗

当然这是可以的,但是这样后台的请求次数就明显增多了。在我们对资源的响应速度有要求的时候,我们应该使用这种动静分离的策略去解决

动、静分离将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用访问

这里我们将静态资源放到nginx中,动态资源转发到tomcat服务器中

33、nginx配合php工作Fastcgi原理

Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是socket(这个socket可以是文件socket,也可以是ip socket)。为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接收到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据发送给客户端。这就是Nginx+FastCGI的整个运作过程

34、负载均衡

负载均衡即是代理服务器将接收的请求均衡的分发到各服务器中

负载均衡主要解决网络拥塞问题,提高服务器响应速度,服务就近提供,达到更好的访问质量,减少后台服务器大并发压力

2、fastcgi 与 cgi 的区别?

1)cgi

web 服务器会根据请求的内容,然后会 fork 一个新进程来运行外部 c 程序(或 perl 脚本…), 这个进程会把处理完的数据返回给 web 服务器,最后 web 服务器把内容发送给用户,刚才 fork 的进程也随之退出。

如果下次用户还请求改动态脚本,那么 web 服务器又再次 fork 一个新进程,周而复始的进行。

2)fastcgi

web 服务器收到一个请求时,他不会重新 fork 一个进程(因为这个进程在 web 服务器启动时就开启了,而且不会退出),web 服务器直接把内容传递给这个进程(进程间通信,但 fastcgi 使用了别的方式,tcp 方式通信),这个进程收到请求后进行处理,把结果返回给 web 服务器,最后自己接着等待下一个请求的到来,而不是退出。

35、LVS 与 Nginx 区别

LVS:Linux 虚拟机、流量调度,负载均衡

单向的 End user -----> LVS -----> tomcat -----> end user

nginx:高性能代理服务器,系统内部流量分发,反向代理

有来回 End user -----> Ngnix -----> tomcat -----> Ngnix -----> end user

nginx 和 LVS 作对比的结果:

  1. nginx 工作在网络的第 7 层,可以作为网页静态服务器,支持 Rewrite 重写规则;支持 GZIP 压缩,节省带宽;可以做缓存;可以针对 http 应用本身来做分流策略,静态分离,针对域名、目录结构等
    相比之下 LVS 并不具备这样的功能,所以 nginx 单凭这点可以利用的场合就远多于 LVS 了;但 nginx 有用的这些功能使其可调整度要高于 LVS,所以经常要去触碰,人为出现问题的机率也就大
  2. nginx 对网络的依赖较小,理论上只要 ping 得通,网页访问正常,nginx 就能连得通,nginx 同时还能区分内外网,如果是同时拥有内外网的节点,就相当於单机拥有了备份线路;LVS 就比较依赖于网络环境,目前来看服务器在同一网段内并且 LVS 使用 direct 方式分流,效果较能得到保证。另外注意,LVS 需要向托管商至少申请多于一个 ip 来做 visual ip
  3. nginx 安装和配置比较简单,测试起来也很方便,因为它基本能把错误用日志打印出来。LVS 的安装和配置、测试就要花比较长的时间,因为同上所述,LVS 对网络依赖性比较大,很多时候不能配置成功都是因为网络问题而不是配置问题,出了问题要解决也相应的会麻烦的多
  4. nginx 也同样能承受很高负载且稳定,但负载度和稳定度差 LVS 还有几个等级:nginx 处理所有流量所以受限于机器 IO 和配置;本身的 bug 也还是难以避免的;nginx 没有现成的双机热备方案,所以跑在单机上还是风险比较大,单机上的事情全都很难说
  5. nginx 可以检测到服务器内部的故障(健康检查),比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点。目前 LVS 中 ldirectd 也能支持针对服务器内部的情况来监控,但 LVS 的原理使其不能重发请求。比如用户正在上传一个文件,而处理该上传的节点刚好在上传过程中出现故障,nginx 会把上传切到另一台服务器重新处理,而 LVS 就直接断掉了

36、haproxy和nginx有什么区别?

Haproxy特点

  • 支持TCP与Http协议,工作在网络4层和7层
  • 支持Session共享、Cookies引导
  • 支持通过URL健康检测
  • 支持8种负载均衡策略
  • 支持心跳检测

Nginx特点

  • 支持Http协议,工作在网络7层
  • 支持通过端口健康检测
  • 支持强大的正则匹配规则
  • 支持WebSocket协议
  • 支持Http Cache
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章