鹅厂二面,Nginx回忆录

服务器
上周二面鹅厂,面试官问出了“nginx你了解吗?”这样宽泛直白的句式,我一时抓不到重点,一时语噻。下班想了一下,平时潜移默化用到不少nginx的能力,但在面试的时候没有吹成对应的概念。

[[386489]]

本文转载自微信公众号「全栈码农画像」,作者小码甲。转载本文请联系全栈码农画像公众号。

上周二面鹅厂,面试官问出了“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; 
        } 
    } 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

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

 

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

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

延伸技能点:

① [服务发现]:

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

② [会话亲和力]:

又叫“粘性会话”,确保在有状态的应用中,同一客户端的请求打到后端一个服务器上。

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.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.

✨ 延伸技能点

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

实用功能

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

绑定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.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.

支持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; 
 
    server backup1.example.com  backup; 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

节省带宽: 支持gzip压缩

解决跨域问题 ① 反向代理 ② 增加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'
       } 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

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

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

 

责任编辑:武晓燕 来源: 全栈码农画像
相关推荐

2023-04-07 19:25:04

后端开发

2012-06-07 09:00:06

2013-04-06 18:52:20

2020-04-09 08:47:38

Java对象线程

2012-09-07 14:30:31

工作回忆录

2020-12-21 11:40:48

鸿蒙HarmonyOS2.回忆录

2012-09-19 14:36:38

创业创业公司创业教训

2013-12-24 12:49:25

2012-09-25 09:47:00

云计算云环境互联网

2013-08-28 11:21:05

2012-09-25 10:48:38

互联网数据云计算

2020-11-17 06:57:15

存储互联网用户

2020-12-11 08:42:06

Kona 开源JDK

2025-02-28 09:00:00

DeepSeek人工智能AI

2020-02-26 14:28:43

前端大厂二面

2018-09-06 08:46:15

腾讯秋招跳槽

2020-12-09 15:24:15

安全计算竞赛

2011-07-19 15:33:57

iPhone

2022-07-11 22:53:59

JavaScrip编译信小程序

2022-01-17 10:18:33

腾讯末位淘汰制员工
点赞
收藏

51CTO技术栈公众号