一时语噻:二面鹅厂,面试官问出Nginx你了解吗?

本文涉及的产品
应用实时监控服务-应用监控,每月50GB免费额度
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 前天二面鹅厂,面试官问出了“nginx你了解吗?”这样宽泛直白的句式,我一时抓不到重点,一时语噻。下班想了一下,平时潜移默化用到不少nginx的能力,但在面试的时候没有吹成对应的概念。

前天二面鹅厂,面试官问出了“nginx你了解吗?”这样宽泛直白的句式,我一时抓不到重点,一时语噻。

下班想了一下,平时潜移默化用到不少nginx的能力,但在面试的时候没有吹成对应的概念。

面谈nginx核心能力#

nginx是老牌web服务器,以下口水话的nginx基础能力,大家都耳熟能详,看看就行,面试官也不打算考查这个。

高并发连接: 官方称单节点支持5万并发连接数,实际生产环境能够承受2-3万并发。
内存消耗少: 在3万并发连接下,开启10个nginx进程仅消耗150M内存 (15M×10=150M)
配置简单
成本低廉: 开源免费

1. 正向、反向代理#

所谓“代理”,是指在内网边缘 设置一个硬件/软件转发请求;
“正向”还是“反向”的说法,取决于转发的是"出站请求"还是"入站请求".

正向代理:处理来自客户端的出站请求,将其转发到Internet,然后将生成的响应返回给客户端。
反向代理:处理来自Internet的入站请求,将其转发给后端工作程序,然后将响应返回给Internet。

  1. 正向代理和反向代理 在代理的方向上不同,但都会代理处理HTTP请求/响应。
  2. 代理服务器存在的目的:
  • 堡垒机/隔离内网: 内网客户端无法访问外网需要设置堡垒机、隐藏内网工作服务器
  • 代理服务器附加功能: 对流量执行操作、使用缓存或压缩来提高性能、防御攻击并过滤信息

2. 负载均衡#

负载均衡一般伴随着反向代理, 起到了 分配流量、透明代理、 增强容错的效果

http {
    upstream myapp1 {
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }
    server {
        listen 80;
        location / {
            proxy_pass http://myapp1;
        }
    }
}

早期我们的核心产品部署在两台windows Sever IIS上,前面部署了一个nginx,做了负载均衡。

很明显,这里有个[负载均衡策略]的知识点。

  • round-robin 顾名思义:轮询
  • least-connected : 下一个请求将发往最小活动链接的服务器
  • ip-hash: 根据客户端的ip地址和哈希函数 决定将请求发往哪个服务器
    http://nginx.org/en/docs/http/load_balancing.html

✨ 延伸技能点:

  1. [服务发现]:在容器/K8S环境,服务地址是由集群系统动态分配,一般都内置了服务发现能力,docker-comppose/K8s中定义的服务名就代表了整个服务。
    有个文章讲述了: 《巧用nginx 实现Docker-Comppose服务多实例》
  2. [会话亲和力]:又叫“粘性会话”,确保在有状态的应用中,同一客户端的请求打到后端一个服务器上。
    也有个示例可参考:《巧用会话亲和力做图片上传和预览》

3. 动静分离#

动静分离与现在火热的前后端分离概念火热相关,

前端可以自行开发、测试,自行使用nginx形成静态资源服务器,后端服务仅作为附加资源。

下面的例子表明 静态资源在/usr/share/nginx/html, 动态资源路径包含api或swagger。

upstream eap_website {
      server eapwebsite;
    }
  server {
      listen      80;
      location / {            # 静态资源
            root /usr/share/nginx/html;
            index index.html index.htm;
            try_files $uri /index.html;
      }
      location ^~ /api/  {     # 动态资源
         proxy_pass         http://eap_website/api/;
      }
      location ^~ /swagger/  {    # 动态资源
         proxy_pass         http://eap_website/swagger/;
      }
  }

✨ 延伸技能点

  1. 以上流程也是《现代十二要素应用方法论》所推崇的第四点, 从这个体系来说,后端沦落为api开发,实属遗憾
  2. 这里有个《有关在容器生成阶段动态插入api基地址的妙招》,对动静分离的容器化很有裨益。

实用功能#

  1. 通过端口支持 同一域名下多个webapp
  2. 绑定Https证书1、2点一起体现:一个域名绑定到443和8080端口两个https站点
upstream receiver_server {
        server receiver:80;
 }
 upstream app_server {
        server app:80;
 }
 server {
        listen       443 ssl http2;
        server_name  eqid.gridsum.com;
        ssl_certificate         /conf.crt/live/gridsum.com.crt;
        ssl_certificate_key     /conf.crt/live/gridsum.com.key;
        location / {
            proxy_pass         http://receiver_server/;
        }
   }
 server {
        listen 8080 ssl http2;
        server_name             eqid.gridsum.com:8080;
        ssl_certificate         /conf.crt/live/gridsum.com.crt;
        ssl_certificate_key     /conf.crt/live/gridsum.com.key;
        location / {
            proxy_pass         http://app_server/;
        }
    }
  1. 支持rewrite重写规则: 能够根据域名、url的不同,将http请求分发到后端不同的应用服务器节点上。
  2. 内置健康检查功能: 如果后端的某一应用节点挂了,请求不会再转发给这个节点,不影响线上功能。
    关键指令: max_fails, fail_timeout
upstream backend {
    server backend1.example.com weight=5;
    server 127.0.0.1:8080       max_fails=3 fail_timeout=30s;
    server unix:/tmp/backend3;
    server backup1.example.com  backup;
}
  1. 节省带宽: 支持gzip压缩
  2. 解决跨域问题
    ① 反向代理② 增加CORS响应头5、6点一起体现: 在前后端分离项目,对跨域请求增加CORS响应头、对静态资源开启gzip压缩
location / {
            gzip on;
            gzip_types application/javascript text/css image/jpeg;
           root /usr/share/nginx/html;
           index index.html index.htm;
           try_files $uri /index.html;
           add_header 'Access-Control-Allow-Origin' '*';
           add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';
           add_header 'Access-Control-Allow-Headers' 'Content-Type';
           add_header 'Access-Control-Allow-Credentials' 'true';
        }

要进大厂, 技术栈要向舒适区以外拓展, 大厂人员大都具备多技能, 随插随用。

基础知识牢固,才会融会贯通,更快解锁高难度姿势。

鹅厂二面大概率挂了,实践没吹成概念,且行且分享。

本文就是愿天堂没有BUG给大家分享的内容,大家有收获的话可以分享下,想学习更多的话可以到微信公众号里找我,我等你哦。

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
6月前
|
负载均衡 算法 应用服务中间件
面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
字节跳动面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
129 0
|
缓存 运维 监控
面试官:Nginx 是如何实现并发的?为什么 Nginx 不使用多线程?
Nginx 是如何实现并发的?为什么 Nginx 不使用多线程?Nginx常见的优化手段有哪些?502错误可能原因有哪些??
295 0
面试官:Nginx 是如何实现并发的?为什么 Nginx 不使用多线程?
|
1月前
|
负载均衡 算法 Java
腾讯面试:说说6大Nginx负载均衡?手写一下权重轮询策略?
尼恩,一位资深架构师,分享了关于负载均衡及其策略的深入解析,特别是基于权重的负载均衡策略。文章不仅介绍了Nginx的五大负载均衡策略,如轮询、加权轮询、IP哈希、最少连接数等,还提供了手写加权轮询算法的Java实现示例。通过这些内容,尼恩帮助读者系统化理解负载均衡技术,提升面试竞争力,实现技术上的“肌肉展示”。此外,他还提供了丰富的技术资料和面试指导,助力求职者在大厂面试中脱颖而出。
腾讯面试:说说6大Nginx负载均衡?手写一下权重轮询策略?
|
3月前
|
缓存 负载均衡 算法
面试准备-nginx
面试准备-nginx
|
6月前
|
NoSQL 应用服务中间件 MongoDB
2023年底复盘之大厂必问面试题:Redis+MongoDB+ZK+Nginx+数据库
今天分享给大家的都是目前主流企业使用最高频的面试题库,也都是 Java 版本升级之后,重新整理归纳的最新答案,会让面试者少走很多不必要的弯路。同时每个专题都做到了详尽的面试解析文档,以确保每个阶段的读者都能看得懂,同时这部分面试文档也是可以免费的提供给有需要的同学们学习的,有需要的可以查看文末的获取方式!
|
6月前
|
NoSQL Java 应用服务中间件
2024年面试复盘大全500道:Redis+ZK+Nginx+数据库+分布式+微服务
今天分享给大家的都是目前主流企业使用最高频的面试题库,也都是 Java 版本升级之后,重新整理归纳的最新答案,会让面试者少走很多不必要的弯路。同时每个专题都做到了详尽的面试解析文档,以确保每个阶段的读者都能看得懂,同时这部分面试文档也是可以免费的提供给有需要的同学们学习的
|
缓存 运维 负载均衡
运维面试题之nginx
运维面试题之nginx
319 1
|
缓存 负载均衡 监控
Nginx面试常见问题
吐血给大家整理了一些面试官常问到的有关Nginx的问题