鹅厂二面,Nginx回忆录

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介: 上周二面鹅厂,面试官问出了“nginx你了解吗?”这样宽泛直白的句式,我一时抓不到重点,一时语噻。下班想了一下,平时潜移默化用到不少nginx的能力,但在面试的时候没有吹成对应的概念。

面谈nginx核心能力


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


高并发连接: 官方称单节点支持5万并发连接数,实际生产环境能够承受2-3万并发。

内存消耗少: 在3万并发连接下,开启10个nginx进程仅消耗150M内存 (15M×10=150M)

配置简单

成本低廉: 开源免费


1. 正向、反向代理


所谓“代理”,是指在内网边缘 设置一个硬件/软件转发请求;


“正向”还是“反向”的说法,取决于转发的是"出站请求"还是"入站请求".


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


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


1c1438e52881f9ecd11660e0deeff5ad.png


  1. 正向代理和反向代理 在代理的方向上不同,但都会代理处理HTTP请求/响应。


  1. 代理服务器存在的目的:


  • 堡垒机/隔离内网:内网客户端无法访问外网需要设置堡垒机、隐藏内网工作服务器


  • 代理服务器附加功能:对流量执行操作、使用缓存或压缩来提高性能、防御攻击并过滤信息


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,做的负载均衡。


3a8a0ec04a58e995742a0a71328ab805.png


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


  • 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形成静态资源服务器,后端服务仅作为附加资源。


74d5669c4ddf2ff630627e7b3911bdde.png


下面的例子表明 静态资源在/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基地址的妙招》,对动静分离的容器化很有裨益。


实用功能


  1. 通过端口支持同一域名下多个webapp


  1. 绑定Https证书

      1、2点一起体现:一个域名绑定到4438080端口两个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请求分发到后端不同的应用服务器节点上。


  1. 内置健康检查功能:   如果后端的某台应用节点挂了,请求不会再转发给这个节点,不影响线上功能。

    关键指令: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压缩


  1. 解决跨域问题    ① 反向代理 ② 增加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';
        }


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


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


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
机器学习/深度学习 人工智能 算法
强化学习从基础到进阶-案例与实践[4.1]:深度Q网络-DQN项目实战CartPole-v0
强化学习从基础到进阶-案例与实践[4.1]:深度Q网络-DQN项目实战CartPole-v0
|
前端开发 程序员
SpringMVC的常用注解(三)下
SpringMVC的常用注解(三)
292 0
SpringMVC的常用注解(三)下
|
机器学习/深度学习 算法
ML之回归预测:利用多个算法模型(LassoR、KernelRidgeR、ElasticNetR、GBR、LGBMR、XGBR)对国内某平台上海2020年6月份房价数据集【12+1】进行回归预测(一)
ML之回归预测:利用多个算法模型(LassoR、KernelRidgeR、ElasticNetR、GBR、LGBMR、XGBR)对国内某平台上海2020年6月份房价数据集【12+1】进行回归预测(一)
ML之回归预测:利用多个算法模型(LassoR、KernelRidgeR、ElasticNetR、GBR、LGBMR、XGBR)对国内某平台上海2020年6月份房价数据集【12+1】进行回归预测(一)
|
关系型数据库 数据库 对象存储
云场景实践研究第19期:小博无线
作为国内领先的商用无线技术方案提供商, 小博无线2013年10月上云以来,已在云端飞行了三年整,从单台主机进化为今天数十台主机, 上百个负载均衡, 数百个容器的略具规模的系统。本文主要介绍小博无线三年来使用云计算平台的实践经验。
2033 0
|
SQL Oracle 关系型数据库
【MOS】Top Ten Performance Mistakes Found in Oracle Systems. (文档 ID 858539.1)
In this Document Purpose Troubleshooting Steps References ...
1125 0
|
Web App开发 测试技术 PHP
phpunit测试学习 2 分类总结断言涉及哪些方面
  购买阿里云相关服务,这里可以领取优惠券, 有的产品5折优惠哟, 注意, 领取的优惠券30天内有效,尽快使用:领取方式:进入链接后 页面下拉 一键领取全部 或者按需每次领取对应的优惠,领取链接:点击此处链接领取https://promotion.
1048 0
[导入]一段不太好的代码:IE主页不是本站地址就不充许访问或下载
IE主页不是本站地址就不充许访问或下载文章来源:http://blog.csdn.net/chsword/archive/2007/01/05/1475071.aspx
593 0