写点什么

鹅厂二面,nginx 回忆录

  • 2022-10-13
    四川
  • 本文字数:2991 字

    阅读完需:约 10 分钟

曾今有一次二面鹅厂,面试官问出了“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


服务端重试除了客户端重试,服务端也可以重试。


upstream RETRY_TEST_SERVER {        server 127.0.0.1:9090;        server 127.0.0.1:9091;}
server { listen 9000; server_name localhost; location / { proxy_pass http://RETRY_TEST_SERVER; proxy_next_upstream timeout; proxy_read_timeout 3; }}
复制代码


转发到上游(默认轮询),如果第一个 RS 出现 timeout,则转发到第二个 RS。


健康检查


如果后端的某台应用节点挂了,请求不会再转发给这个节点,不影响线上功能。


关键指令: 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>. [服务发现]:


在容器/K8S环境,服务地址是由集群系统动态分配,一般都内置了服务发现能力,docker-comppose/K8s中定义的服务名就代表了整个服务。  
复制代码


有个文章讲述了: 《巧用nginx 实现Docker-Comppose服务多实例


<2>. [会话亲和力]:


又叫“粘性会话”,确保在有状态的应用中,同一客户端的请求打到后端一个服务器上。  也有个示例可参考:《[巧用会话亲和力做图片上传和预览](https://www.cnblogs.com/JulianHuang/p/14198095.html)》
复制代码

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/; } }
复制代码


<3>. 支持 rewrite 重写规则: 能够根据域名、url 的不同,将 http 请求分发到后端不同的应用服务器节点上。


<4>. 节省带宽: 支持 gzip 压缩<5>. 解决跨域问题跨域问题: 浏览器禁止以脚本形式跨域访问资源:A 网站下某个 ajax 尝试访问 B 网站。方案:


①. 反向代理:在原尝试跨域的站点上搭建同域 nginx,由该 nginx 转发原跨域请求,这种是在原站点操作


②. 增加 CORS 响应头 ,根据 CORs 方案,在被请求站点操作。




<4>、<5>点一起体现: 在前后端分离项目,对跨域请求增加 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'; }
复制代码




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


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


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


本文回顾了码甲哥使用 nginx 的实践,应该足够在下一次面试中吹水了,如有错误,请留言赐教。

发布于: 刚刚阅读数: 3
用户头像

急性子,入戏慢。 2018-06-17 加入

阿里云社区专家博主,同程旅行基础架构 ; 热衷分享,执着于阅读写作,佛系不水文,有态度公众号:《精益码农》; 持续输出高价值Go、.NET、云原生原创文章。

评论

发布
暂无评论
鹅厂二面,nginx回忆录_有态度的马甲_InfoQ写作社区