1, 请解释一下什么是 Nginx?
答: Nginx 是一个 web 服务器和反向代理服务器, 用于 HTTP,HTTPS,SMTP,POP3 和 IMAP 协议.
2, 请列举 Nginx 的一些特性?
答: Nginx 服务器的特性包括:
1) 反向代理 / L7 负载均衡器
2) 嵌入式 Perl 解释器
3) 动态二进制升级
4) 可用于重新编写 URL, 具有非常好的 PCRE 支持
3,nginx 和 apache 的区别?
1) 轻量级, 同样起 Web 服务, 比 apache 占用更少的内存及资源
2) 抗并发, nginx 处理请求是异步非阻塞的, 而 apache 则是阻塞型的, 在高并发下 nginx 能保持低资源低消耗高性能
3) 高度模块化的设计, 编写模块相对简单
4) 最核心的区别在于 apache 是同步多进程模型, 一个连接对应一个进程; nginx 是异步的, 多个连接 (万级别) 可以对应一个进程
4.nginx 是如何实现高并发的
答: 一个主进程, 多个工作进程, 每个工作进程可以处理多个请求, 每进来一个 request, 会有一个 worker 进程去处理. 但不是全程的处理, 处理到可能发生阻塞的地方, 比如向上游 (后端) 服务器转发 request, 并等待请求返回. 那么, 这个处理的 worker 继续处理其他请求, 而一旦上游服务器返回了, 就会触发这个事件, worker 才会来接手, 这个 request 才会接着往下走. 由于 Web server 的工作性质决定了每个 request 的大部份生命都是在网络传输中, 实际上花费在 server 机器上的时间片不多. 这是几个进程就解决高并发的秘密所在. 即 @skoo 所说的 webserver 刚好属于网络 io 密集型应用, 不算是计算密集型.
5, 请解释 Nginx 如何处理 HTTP 请求.
答: Nginx 使用反应器模式. 主事件循环等待操作系统发出准备事件的信号, 这样数据就可以从套接字读取, 在该实例中读取到缓冲区并进行处理. 单个线程可以提供数万个并发连接.
6, 在 Nginx 中, 如何使用未定义的服务器名称来阻止处理请求?
答: 只需将请求删除的服务器就可以定义为:
- Server {
- listen 80; server_name " " ;
- return 444;
- }
这里, 服务器名被保留为一个空字符串, 它将在没有 "主机" 头字段的情况下匹配请求, 而一个特殊的 Nginx 的非标准代码 444 被返回, 从而终止连接.
7, 使用 "反向代理服务器" 的优点是什么?
答: 反向代理服务器可以隐藏源服务器的存在和特征. 它充当互联网云和 Web 服务器之间的中间层. 这对于安全方面来说是很好的, 特别是当您使用 Web 托管服务时.
8, 请列举 Nginx 服务器的最佳用途.
答: Nginx 服务器的最佳用法是在网络上部署动态 HTTP 内容, 使用 SCGI,WSGI 应用程序服务器, 用于脚本的 FastCGI 处理程序. 它还可以作为负载均衡器.
9, 请解释 Nginx 服务器上的 Master 和 Worker 进程分别是什么?
答:
Master 进程: 读取及评估配置和维持
Worker 进程: 处理请求
10, 请解释你如何通过不同于 80 的端口开启 Nginx?
答: 为了通过一个不同的端口开启 Nginx, 你必须进入 / etc/Nginx/sites-enabled/, 如果这是默认文件, 那么你必须打开名为 "default" 的文件. 编辑文件, 并放置在你想要的端口:
- Like server {
- listen 81;
- }
11, 请解释是否有可能将 Nginx 的错误替换为 502 错误, 503?
答: 502 = 错误网关 503 = 服务器超载 有可能, 但是您可以确保 fastcgi_intercept_errors 被设置为 ON, 并使用错误页面指令.
Location / { fastcgi_pass 127.0.01:9001; fastcgi_intercept_errors on; error_page 502 =503/error_page.html; #... }
12, 在 Nginx 中, 解释如何在 URL 中保留双斜线?
答: 要在 URL 中保留双斜线, 就必须使用 merge_slashes_off;
语法: merge_slashes [on/off]
默认值: merge_slashes on
环境: http,server
13, 请解释 ngx_http_upstream_module 的作用是什么?
答: ngx_http_upstream_module 用于定义可通过 fastcgi 传递, proxy 传递, uwsgi 传递, Memcached 传递和 scgi 传递指令来引用的服务器组.
14, 请解释什么是 C10K 问题?
答: C10K 问题是指无法同时处理大量客户端 (10,000) 的网络套接字.
15, 请陈述 stub_status 和 sub_filter 指令的作用是什么?
答: 1)Stub_status 指令: 该指令用于了解 Nginx 当前状态的当前状态, 如当前的活动连接, 接受和处理当前读 / 写 / 等待连接的总数 2)Sub_filter 指令: 它用于搜索和替换响应中的内容, 并快速修复陈旧的数据
16, 解释 Nginx 是否支持将请求压缩到上游?
答: 您可以使用 Nginx 模块 gunzip 将请求压缩到上游. gunzip 模块是一个过滤器, 它可以对不支持 "gzip" 编码方法的客户机或服务器使用 "内容编码: gzip" 来解压缩响应.
17, 解释如何在 Nginx 中获得当前的时间?
答: 要获得 Nginx 的当前时间, 必须使用 SSI 模块,$date_gmt 和 $date_local 的变量. Proxy_set_header THE-TIME $date_gmt;
18, 用 Nginx 服务器解释 - s 的目的是什么?
答: 用于运行 Nginx -s 参数的可执行文件.
19, 解释如何在 Nginx 服务器上添加模块?
答: 在编译过程中, 必须选择 Nginx 模块, 因为 Nginx 不支持模块的运行时间选择.
20, nginx 负载均衡的算法怎么实现的
(1)nginx 的 upstream 目前支持 4 种方式的分配
1), 轮询 (默认)
每个请求按时间顺序逐一分配到不同的后端服务器, 如果后端服务器 down 掉, 能自动剔除.
2),weight
指定轮询几率, weight 和访问比率成正比, 用于后端服务器性能不均的情况.
3),ip_hash
每个请求按访问 ip 的 hash 结果分配, 这样每个访客固定访问一个后端服务器, 可以解决 session 的问题.
4),fair(第三方)
按后端服务器的响应时间来分配请求, 响应时间短的优先分配.
5),url_hash(第三方)
(2)nginx 内置策略包含加权轮询和 ip hash
加权轮询算法分为先深搜索和先广搜索, 那么 nginx 采用的是先深搜索算法, 即将首先将请求都分给高权重的机器, 直到该机器的权值降到了比其他机器低, 才开始将请求分给下一个高权重的机器;
21,Nginx 是如何处理一个请求的呢?
首先, nginx 在启动时, 会解析配置文件, 得到需要监听的端口与 ip 地址, 然后在 nginx 的 master 进程里面
先初始化好这个监控的 socket, 再进行 listen
然后再 fork 出多个子进程出来, 子进程会竞争 accept 新的连接.
此时, 客户端就可以向 nginx 发起连接了. 当客户端与 nginx 进行三次握手, 与 nginx 建立好一个连接后
此时, 某一个子进程会 accept 成功, 然后创建 nginx 对连接的封装, 即 ngx_connection_t 结构体
接着, 根据事件调用相应的事件处理模块, 如 http 模块与客户端进行数据的交换.
最后, nginx 或客户端来主动关掉连接, 到此, 一个连接就寿终正寝了
22,nginx 为什么不使用多线程?
Apache: 创建多个进程或线程, 而每个进程或线程都会为其分配 CPU 和内存 (线程要比进程小的多, 所以 worker 支持比 perfork 高的并发), 并发过大会榨干服务器资源.
Nginx: 采用单线程来异步非阻塞处理请求 (管理员可以配置 Nginx 主进程的工作进程的数量)(epoll), 不会为每个请求分配 CPU 和内存资源, 节省了大量资源, 同时也减少了大量的 CPU 的上下文切换. 所以才使得 Nginx 支持更高的并发
23, 如何解决惊群现象?
惊群是多个子进程在同一时刻监听同一个端口引起的;
Nginx 解决方法: 同一个时刻只能有唯一一个 worker 子进程监听 Web 端口, 此时新连接事件只能唤醒唯一正在监听端口的 worker 子进程.
采用锁, 互斥量实现!!
来源: http://www.bubuko.com/infodetail-3086779.html