Nginx:常见的面试题和答案
1. 什么是Nginx?
答:Nginx是一款高性能的Web服务器和反向代理服务器,用于HTTP、HTTPS、SMTP、POP3和IMAP协议,同时用于处理高并发的请求,提供快速、可靠的服务。
2. Nginx的优点是什么?
Nginx的优点包括:
- 高性能:Nginx采用异步非阻塞的方式处理请求,可以处理高并发的请求;
- 可扩展性:Nginx支持动态模块化,可以根据需要添加或删除模块;
- 可靠性:Nginx具有良好的稳定性和可靠性,能够保证服务的连续性;
- 灵活性:Nginx支持多种协议和数据格式,可以用于不同的应用场景。
3. Nginx的配置文件是什么?
答:Nginx的配置文件是nginx.conf文件,通常位于/etc/nginx目录下。配置文件包括全局配置、http配置和server配置等部分,可以用来设置Nginx的运行参数、监听端口、代理规则等。
4. Nginx如何处理静态文件?
答:Nginx可以通过配置静态文件目录来处理静态文件,具体步骤如下:
在nginx.conf文件中配置静态文件目录,例如:
location /static/ {
root /var/www/;
}
- 将静态文件放置在指定的目录下,例如/var/www/static/;
- 通过访问http://localhost/static/filename的方式来访问静态文件。
5. Nginx如何处理动态请求?
答:Nginx可以通过反向代理的方式处理动态请求,具体步骤如下:
在nginx.conf文件中配置代理规则,例如:
location /api/ {
proxy_pass http://localhost:8080/;
}
- 将动态请求转发到指定的端口,例如http://localhost:8080/;
- 在指定的端口上启动相应的应用程序,用于处理动态请求。
6. Nginx如何进行负载均衡?
答:Nginx可以通过配置upstream模块来进行负载均衡,具体步骤如下:
在nginx.conf文件中配置upstream模块,例如:
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com;
server backend3.example.com;
}
将请求转发到指定的upstream组,例如:
location /api/ {
proxy_pass http://backend/;
}
Nginx会自动将请求均衡地分配到多个服务器上,从而实现负载均衡。
7. Nginx如何进行HTTPS配置?
答:Nginx可以通过配置SSL模块来进行HTTPS配置,具体步骤如下:
在nginx.conf文件中配置SSL证书和密钥,例如:
ssl_certificate /path/to/ssl.crt;
ssl_certificate_key /path/to/ssl.key;
在server配置中添加SSL配置,例如:
server {
listen 443 ssl;
server_name example.com;
...
}
重新加载Nginx配置文件,使配置生效。
8. Nginx如何进行缓存配置?
答:Nginx可以通过配置缓存模块来进行缓存配置,具体步骤如下:
在nginx.conf文件中配置缓存目录,例如:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m;
在location配置中添加缓存配置,例如:
location /api/ {
proxy_cache my_cache;
proxy_cache_key $uri$is_args$args;
proxy_cache_valid 200 60m;
}
Nginx会自动将请求的结果缓存到指定的目录中,从而提高访问速度。
9. 请列举 Nginx 的一些特性。
- Nginx 服务器的特性包括:
- 反向代理/L7 负载均衡器
- 嵌入式 Perl 解释器
- 动态二进制升级
- 可用于重新编写 URL,具有非常好的 PCRE 支持
10. 请解释 ngx_http_upstream_module 的作用是什么?
答:ngx_http_upstream_module 用于定义可通过 fastcgi 传递、proxy 传递、uwsgi传递、memcached 传递和 scgi 传递指令来引用的服务器组。
11. 请解释什么是C10K问题?
答:C10K问题是指无法同时处理大量客户端(10,000)的网络套接字。
从网络编程技术的角度来说,主要思路为:
- 为每个连接分配一个独立的线程/进程。
- 同一个线程/进程同时处理多个连接(IO 多路复用)
12. 请陈述stub_status和sub_filter指令的作用是什么?
答:Stub_status指令:该指令用于了解Nginx当前状态的当前状态,如当前的活动连接,接受和处理当前读/写/等待连接的总数
Sub_filter指令:它用于搜索和替换响应中的内容,并快速修复陈旧的数据
13. 用Nginx服务器解释-s的目的是什么?
答:用于运行Nginx -s参数的可执行文件。
14. 解释如何在 Nginx 中获得当前的时间?
答:要获得 Nginx 的当前时间,必须使用 SSI 模块、
d
a
t
e
g
m
t
和
date_gmt 和
dategmt和date_local 的变
量。
Proxy_set_header THE-TIME $date_gmt;
15. 解释 Nginx 是否支持将请求压缩到上游?
答:您可以使用 Nginx 模块 gunzip 将请求压缩到上游。gunzip 模块是一个过滤器,
它可以对不支持“gzip”编码方法的客户机或服务器使用“内容编码:gzip”来解压缩响应。
16. 为什么不使用多线程?
答:Nginx:采用单线程来异步非阻塞处理请求(管理员可以配置Nginx主进程的工作进程的数量),不会为每个请求分配cpu和内存资源,节省了大量资源,同时也减少了大量的CPU的上下文切换,所以才使得Nginx支持更高的并发。
17. Nginx的进程模型
答:master-worker模式 在master-worker模式下,有一个master进程和至少一个的worker进程。
单进程模式。 单进程模式只有一个进程
18. 为什么Nginx性能这么高?
答:因为它的事件处理机制:异步非阻塞事件处理机制运用了epoll模型,提供了一个队列,排队解决。
19. 为什么要做动静分离?
- Nginx是当下最热的Web容器,网站优化的重要点在于静态化网站,网站静态化的关键点则是是动静分离,动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们则根据静态资源的特点将其做缓存操作。
- 让静态的资源只走静态资源服务器,动态的走动态的服务器。
- Nginx的静态处理能力很强,但是动态处理能力不足,因此,在企业中常用动静分离技术。
- 对于静态资源比如图片,js,css等文件,我们则在反向代理服务器nginx中进行缓存。这样浏览器在请求一个静态资源时,代理服务器nginx就可以直接处理,无需将请求转发给后端服务器tomcat。 若用户请求的动态文件,比如servlet,jsp则转发给Tomcat服务器处理,从而实现动静分离。这也是反向代理服务器的一个重要的作用。
20. 什么叫CDN服务?
答:CDN ,即内容分发网络。其目的是,通过在现有的 Internet中 增加一层新的网络架构,将网站的内容发布到最接近用户的网络边缘,使用户可就近取得所需的内容,提高用户访问网站的速度。一般来说,因为现在 CDN 服务比较大众,所以基本所有公司都会使用 CDN 服务。
21. Nginx负载均衡的算法怎么实现的?策略有哪些?
为了避免服务器崩溃,大家会通过负载均衡的方式来分担服务器压力。将对台服务器组成一个集群,当用户访问时,先访问到一个转发服务器,再由转发服务器将访问分发到压力更小的服务器。
Nginx负载均衡实现的策略有以下五种:
-
轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某个服务器宕机,能自动剔除故障系统。
upstream backserver {
server 192.168.31.12;
server 192.168.31.13;
}
-
权重 weight
weight的值越大,分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。其次是为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。
权重越高,在被访问的概率越大,如上例,分别是20%,80%。
upstream backserver {
server 192.168.0.12 weight=2;
server 192.168.0.13 weight=8;
}
- ip_hash( IP绑定)
每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题
upstream backserver {
ip_hash;
server 192.168.0.12:88;
server 192.168.0.13:80;
}
- fair(第三方插件)
必须安装upstream_fair模块。
对比 weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,响应时间短的优先分配。
哪个服务器的响应速度快,就将请求分配到那个服务器上。
upstream backserver {
server server1;
server server2;
fair;
}
- url_hash(第三方插件)
必须安装Nginx的hash软件包
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。
upstream backserver {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
22. Nginx限流怎么做的?
答:Nginx限流就是限制用户请求速度,防止服务器受不了,限流有3种:
- 正常限制访问频率(正常流量)
- 突发限制访问频率(突发流量)
- 限制并发连接数
Nginx的限流都是基于漏桶流算法
23. Nginx常见的优化配置有哪些?
- 调整worker_processes
指Nginx要生成的worker数量,最佳实践是每个CPU运行1个工作进程。
了解系统中的CPU核心数,输入:
$ grep processor / proc / cpuinfo | wc -401
- 最大化worker_connections
Nginx Web服务器可以同时提供服务的客户端数。与worker_processes结合使用时,获得每秒可以服务的最大客户端数
最大客户端数/秒=工作进程*工作者连接数
为了最大化Nginx的全部潜力,应将工作者连接设置为核心一次可以运行的允许的最大进程数1024。
- 启用Gzip压缩
压缩文件大小,减少了客户端http的传输带宽,因此提高了页面加载速度
建议的gzip配置示例如下:( 在http部分内)
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 1;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text / plain text / css application / json application / javascript text / xml application / xml + rss text / javascript;
- 为静态文件启用缓存
为静态文件启用缓存,以减少带宽并提高性能,可以添加下面的命令,限定计算机缓存网页的静态文件:
location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
expires 365d;
}
- Timeouts
keepalive连接减少了打开和关闭连接所需的CPU和网络开销,获得最佳性能需要调整的变量可参考:
client_body_timeout 12;
client_header_timeout 12;
keepalive_timeout 15;
send_timeout 10;
- 禁用access_logs
访问日志记录,它记录每个nginx请求,因此消耗了大量CPU资源,从而降低了nginx性能。
完全禁用访问日志记录
access_log off;
如果必须具有访问日志记录,则启用访问日志缓冲
access_log /var/log/nginx/access.log buffer = 4096k
24. Nginx与Apache选择?
Apache
-
apache 的 rewrite 比 nginx 强大,在 rewrite 频繁的情况下,用 apache
-
apache 发展到现在,模块超多,基本想到的都可以找到
-
apache 更为成熟,少 bug ,nginx 的 bug 相对较多
-
apache 超稳定
-
apache 对 PHP 支持比较简单,nginx 需要配合其他后端用
-
apache 在处理动态请求有优势,nginx 在这方面是鸡肋,一般动态请求要 apache 去做,nginx 适合静态和反向。
-
apache 仍然是目前的主流,拥有丰富的特性,成熟的技术和开发社区
Nginx
-
轻量级,采用 C 语言 进行编写,同样的 web 服务,会占用更少的内存及资源
-
抗并发,nginx 以 epoll and kqueue 作为开发模型,处理请求是异步非阻塞的,负载能力比 apache 高很多,而 apache 则是阻塞型的。在高并发下 nginx 能保持低资源低消耗高性能 ,而 apache 在 PHP 处理慢或者前端压力很大的情况下,很容易出现进程数飙升,从而拒绝服务的现象。
-
nginx 处理静态文件好,静态处理性能比 apache 高三倍以上
-
nginx 的设计高度模块化,编写模块相对简单
-
nginx 配置简洁,正则配置让很多事情变得简单,而且改完配置能使用 -t 测试配置有没有问题,apache 配置复杂 ,重启的时候发现配置出错了,会很崩溃
-
nginx 作为负载均衡服务器,支持 7 层负载均衡
-
nginx 本身就是一个反向代理服务器,而且可以作为非常优秀的邮件代理服务器
-
启动特别容易, 并且几乎可以做到 7*24 不间断运行,即使运行数个月也不需要重新启动,还能够不间断服务的情况下进行软件版本的升级
-
社区活跃,各种高性能模块出品迅速
25. Nginx IO模型
答:Nginx 支持多种并发模型,并发模型的具体实现根据系统平台而有所不同。在支持多种并发模型的平台上,Nginx 自动选择最高效的模型。但我们也可以使用 use 指令在配置文件中显式地定义某个并发模型。
Nginx中支持的并发模型:
-
select
IO 多路复用、标准并发模型。在编译 Nginx 时,如果所使用的系统平台没有更高效的并发模型,select 模块将被自动编译。configure 脚本的选项:–with-select_module 和 --without-select_module 可被用来强制性地开启或禁止 select 模块的编译。 -
poll
IO 多路复用、标准并发模型。与 select 类似,在编译 Nginx 时,如果所使用的系统平台没有更高效的并发模型,poll 模块将被自动编译。configure 脚本的选项:–with-poll_module 和 --without-poll_module 可用于强制性地开启或禁止 poll 模块的编译。 -
epoll
IO 多路复用、高效并发模型,可在 Linux 2.6+ 及以上内核可以使用。 -
kqueue
IO 多路复用、高效并发模型,可在 FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0, and Mac OS X 平台中使用。 -
/dev/poll
高效并发模型,可在 Solaris 7 11/99+, HP/UX 11.22+ (eventport), IRIX 6.5.15+, and Tru64 UNIX 5.1A+ 平台使用。 -
eventport
高效并发模型,可用于 Solaris 10 平台,PS:由于一些已知的问题,建议使用/dev/poll替代。