Nginx你了解吗?
平时潜移默化用到不少nginx的能力,但没有吹成对应的概念。
Nginx核心能力
nginx是老牌web服务器,以下口水话的nginx基础能力,大家都耳熟能详,看看就行,面试官也不打算考查这个。
1. 正向、反向代理高并发连接: 官方称单节点支持5万并发连接数,实际生产环境能够承受2-3万并发。 内存消耗少: 在3万并发连接下,开启10个nginx进程仅消耗150M内存 (15M×10=150M) 配置简单 成本低廉: 开源免费
所谓“代理”,是指在内网边缘 设置一个硬件/软件转发请求;“正向”还是“反向”的说法,取决于转发的是"出站请求"还是"入站请求".
正向代理: 处理来自客户端的出站请求,将其转发到Internet,然后将生成的响应返回给客户端。反向代理: 处理来自Internet的入站请求,将其转发给后端工作程序,然后将响应返回给Internet。
- 正向代理和反向代理 在代理的方向上不同,但都会代理处理HTTP请求/响应。
- 代理服务器存在的目的:
- 堡垒机/隔离内网:内网客户端无法访问外网需要设置堡垒机、隐藏内网工作服务器
- 代理服务器附加功能:对流量执行操作、使用缓存或压缩来提高性能、防御攻击并过滤信息
负载均衡一般伴随着反向代理, 起到了分配流量、透明代理、 增强容错的效果
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
✨ 延伸技能点:
① [服务发现]:
在容器/K8S环境,服务地址是由集群系统动态分配,一般都内置了服务发现能力,docker-comppose/K8s中定义的服务名就代表了整个服务。 有个文章讲述了: 《巧用nginx 实现Docker-Comppose服务多实例》
② [会话亲和力]:
又叫“粘性会话”,确保在有状态的应用中,同一客户端的请求打到后端一个服务器上。
也有个示例可参考:《巧用会话亲和力做图片预览上传》
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/; } }
✨ 延伸技能点
① 以上流程也是《现代十二要素应用方法论》所推崇的第四点, 从这个体系来说,后端沦落为api开发,实属遗憾② 这里有个《有关在容器生成阶段动态插入api基地址的妙招》,对动静分离的容器化很有裨益。实用功能通过端口支持同一域名下多个webapp
绑定Https证书
1、2点一起体现:一个域名绑定到443和8080端口两个https站点
upstream receiver_server { server receiver:80; } upstream app_server { server app:80; }
支持rewrite重写规则: 能够根据域名、url的不同,将http请求分发到后端不同的应用服务器节点上。
内置健康检查功能: 如果后端的某台应用节点挂了,请求不会再转发给这个节点,不影响线上功能。 关键指令: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;
节省带宽: 支持gzip压缩
解决跨域问题 ① 反向代理 ② 增加CORS响应头
5、6点一起体现:在前后端分离项目,对跨域请求增加CORS响应头、对静态资源开启 gzip压缩
location / { gzip on; gzip_types application/javascript text/css image/jpeg;
要进大厂, 技术栈要向舒适区以外拓展, 大厂开发大都具备多技能, 随插随用。
基础知识牢固,才会融会贯通,更快解锁高难度姿势。