Nginx你了解吗?

Nginx你了解吗?
平时潜移默化用到不少 nginx 的能力,但没有吹成对应的概念。

Nginx 你了解吗?

Nginx 核心能力

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

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

1. 正向、反向代理

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

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

Nginx 你了解吗?
  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,做的负载均衡。Nginx 你了解吗?

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

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

✨  延伸技能点:

① [服务发现]:

       在容器/K8S 环境,服务地址是由集群系统动态分配,一般都内置了服务发现能力,docker-comppose/K8s 中定义的服务名就代表了整个服务。
有个文章讲述了: 《② [会话亲和力]:

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

       也有个示例可参考:《巧用会话亲和力做图片预览上传》

3. 动静分离

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

前端可以自行开发、测试,自行使用 nginx 形成静态资源服务器,后端服务仅作为附加资源。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 基地址的妙招》,对动静分离的容器化很有裨益。

实用功能

  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';
        }


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

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

相关阅读

Nginx 从入门到干活

高性能 Nginx HTTPS 调优 – 如何为 HTTPS 提速 30%

nginx+keepalived 实现 nginx 双主高可用的负载均衡

Nginx 正向代理与反向代理

全面了解 Nginx 到底能做什么


来源:全栈码农画像 ,作者小码甲

© 版权声明

☆ END ☆
喜欢就点个赞吧
点赞0 分享
图片正在生成中,请稍后...