nginx 面试总结

95 阅读6分钟

1. 什么是Nginx?

  • Nginx 是一个轻量级/高性能的反向代理Web服务器,他实现非常高的反向代理、负载均衡,可以处理2-3w并发连接数,官方监测能支持5w并发。

2. 为什么使用Nginx?

  • 跨平台、配置简单、反向代理、高并发连接:处理2-3w并发连接数,官方检测支持5w并发;内存消耗小:开启10个Nginx才占150M内存,nginx处理静态文件好,耗费内存少。
  • Nginx内置的健康检查功能:如果有一个服务器宕机,会做一个健康检查,再发送的请求就不会发送到宕机的服务器了。重新将请求提交到其他的节点上。
  • 使用Nginx的话还能:
      1. 节省宽带:支持GZIP压缩,可以添加浏览器本地缓存
      1. 稳定性高:宕机的概率非常小
      1. 接收用户请求是异步的

3. Nginx性能高的原因

  • 因为他的事件处理机制:异步非阻塞事件处理机制:运用了epoll模型,提供了一个队列,排队解决; 相比与Select/poll(轮询),epoll 主要是使用队列 进行了异步消息的通知。

4. Nginx 怎么处理请求?

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

5. 什么是正向代理和反向代理?

  • 正向代理:就是一个请求直接发送到目标服务器
  • 反向代理:就是请求统一被Nginx接收,再按照一定的规则分发给后端的业务处理服务器进行处理。

6. 使用反向代理服务器的优点是什么?

  • 反向代理服务器可以隐藏源服务器的存在和特征,充当互联网云和web服务器之间的中间层,安全方面足够好。

7. Nginx的优缺点

  • 优点:
    • 占内存小,可实现高并发连接,处理响应快。
    • 可实现http服务器、虚拟主机、反向代理、负载均衡。
    • Nginx配置简单。
    • 可以不暴露正式服务器的Ip地址
  • 缺点:
  • 动态处理差:nginx处理静态文件号,耗费内存少,但是动态页面则不行。

8. Nginx的应用场景

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

9. 如何使用Nginx解决前端跨域问题?

  • 使用Nginx转发请求。把跨域的接口写成调本域的接口,然后将这些接口转发到真正的请求地址。

10. Nginx 虚拟主机如何配置?

  • 基于域名的虚拟主机,通过域名来区分虚拟主机——应用:外部网站
    • 需要建立/data/www /data/bbs目录,windows本地hosts添加虚拟机ip地址对应的域名解析;对应域名网站目录下新增index.html文件
#当客户端访问www.lijie.com,监听端口号为80,直接跳转到data/www目录下文件
    server {
        listen       80;
        server_name  www.lijie.com;
        location / {
            root   data/www;
            index  index.html index.htm;
        }
    }

	#当客户端访问www.lijie.com,监听端口号为80,直接跳转到data/bbs目录下文件
	 server {
        listen       80;
        server_name  bbs.lijie.com;
        location / {
            root   data/bbs;
            index  index.html index.htm;
        }
    }
  • 基于端口的虚拟主机,通过端口来区分虚拟主机——应用:公司内部网站,外部网站的管理后台
 #当客户端访问www.lijie.com,监听端口号为8080,直接跳转到data/www目录下文件
	 server {
        listen       8080;
        server_name  8080.lijie.com;
        location / {
            root   data/www;
            index  index.html index.htm;
        }
    }
	
	#当客户端访问www.lijie.com,监听端口号为80直接跳转到真实ip服务器地址 127.0.0.1:8080
	server {
        listen       80;
        server_name  www.lijie.com;
        location / {
		 	proxy_pass http://127.0.0.1:8080;
            index  index.html index.htm;
        }
	}
  • 基于ip的虚拟主机

11. 什么是动静分离?

  • 让静态的资源只走静态资源服务器,动态的走动态的服务器
  • Nginx的静态处理能力很强,但是动态处理能力不足,因此,在企业中常用动静分离技术
  • 对于静态资源比如图片,js,css等文件,我们则在反向代理服务器nginx中进行缓存。这样浏览器在请求一个静态资源时,代理服务器nginx就可以直接处理,无需将请求转发给后端服务器。

12. nginx的负载均衡策略?

  • 为了避免服务器崩溃,我们会通过负载均衡的方式来分担服务器压力,将服务器组成一个集群,用户访问时,先访问一个转发服务器,再由转发服务器分发到压力更小的服务器。
  • 负载均衡实现有以下五种:
      1. 轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某个服务器宕机,能自动剔除故障系统
      1. 权重weight: weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。其次是为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。权重越高,在被访问的概率越大,如下例,分别是20%,80%
upstream backserver { 
    server 192.168.0.12 weight=2; 
    server 192.168.0.13 weight=8; 
}
      1. ip_hash(ip绑定): 每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问同一个后端服务器,并且可以有效的解决动态网页存在的session共享问题,如下例:
upstream backserver { 
    ip_hash; 
    server 192.168.0.12:88; 
    server 192.168.0.13:80; 
}
    • *4. fair(第三方插件):需要安装upstream_fair模块,对比 weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,响应时间短的优先分配,如下例:
upstream backserver { 
    server server1; 
    server server2; 
    fair; 
}
    • *5. url_hash(第三方插件): 必须安装Nginx的hash软件包,按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。
upstream backserver { 
    server squid1:3128; 
    server squid2:3128; 
    hash $request_uri; 
    hash_method crc32; 
}

13. Nginx 配置高可用?

  • 当上游服务器(真实访问服务器),一旦出现故障或者是没有及时相应的话,应该直接轮训到下一台服务器,保证服务器的高可用。
server {
        listen       80;
        server_name  www.lijie.com;
        location / {
		    ### 指定上游服务器负载均衡服务器
		    proxy_pass http://backServer;
                 ###nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间
                 proxy_connect_timeout 1s;
		    ###nginx发送给上游服务器(真实访问的服务器)超时时间
                 proxy_send_timeout 1s;
		    ### nginx接受上游服务器(真实访问的服务器)超时时间
                 proxy_read_timeout 1s;
                 index  index.html index.htm;
        }
    }

14. Nginx判别Ip不可访问?

# 如果访问的ip地址为192.168.9.115,则返回403
if ($remote_addr = 192.168.9.115) { 
    return 403; 
}

15. 怎么限制浏览器访问?

# 不允许谷歌浏览器访问 如果是谷歌浏览器返回500
if ($http_user_agent ~ Chrome) { 
    return 500; 
}