Nginx必知必会-反向代理、负载均衡

1. Nginx必知必会

1.1 Nginx概要

一款Web服务器,它叫Nginx,碾压了Apache、Microsoft IIS、Tomact、Lighttpd等一众Web服务器。我们国内没有部署Nginx的科技业务公司,相信也没有多少。

为什么呢?胡广认为和Nginx的出身有关!Nginx在2002年立项开发就是为了服务俄罗斯访问量位居首位的Rambler.ru站点。另外最重要一点,免费开源!让Nginx集结了全球的智慧,帮助它升级迭代、不断攀登宝座。

在Java后端的每一个SpringBoot项目都集成了一个Tomcat服务器,那和Nginx有何区别?其实两者实际上都是提供互联网交互能力的一个节点,同样是Web服务器,不过主要的功能不同。

Tomcat服务器设计小巧轻量,没有集成处理复杂业务场景的功能,更适合作为一个API Web服务器。Nginx提供的功能就很多了,像反向代理、负载均衡、Web缓存,我们企业面向用户的第一关卡便是Nginx,后面的链条才轮到微服务节点。下面我一一道来。

1.2 Nginx反向代理、负载均衡

(1)反向代理

认识Nginx就从它的反向代理功能开始,Nginx可以配置这样的映射关系。

server {
    listen       9001;
    server_name  localhost;

    location ~ /server01/ {
            proxy_pass   http://localhost:8001;
	}
    location ~ /server02/ {
            proxy_pass   http://localhost:8002;
	}
}

以上配置代表了所有包含/server01/的路径,实际指向的是后台端口为:http://localhost:8001

举个栗子,用户访问浏览器,这代表了用户肉眼可见的url链接实际映射到企业内部服务器是哪个地址、哪些微服务节点处理这个url链条的请求等。

当然Nginx的反向代理功能不止上面说的基础功能,Nginx转发策略也是它的本事。我们可以设置代理的正则表达式,把一定规则的域名都转发到某一个端口。

server {
    listen 80;

    server_name example.com;

    location ~ ^/api/ {
        proxy_pass http://api.example.com;
    }
}

例如以上Nginx配置,胡广使用了正则表达式 ^/api/ ,严格匹配所有以 /api/ 开头的URL路径,我们把这些请求转发到 http://api.example.com

(2)负载均衡

后台一众的微服务节点,前面我们知道了Nginx负责代理转发的功能,那Nginx就少不了支持负载均衡。

例如6个微服务节点,1秒内1万个用户请求过来,Nginx这台Web服务器要如何负载均衡把哪些请求转发到哪些个微服务节点。

Nginx服务器提供的负载均衡策略包含了内置策略、扩展策略两个类别,这期我们先说说内置策略,而扩展策略顾名思义其实是第三方提供的,类似于插件。

内置策略包含了以下 3 种。

1、轮询策略

将每个用户请求(也是客户端请求)按一定顺序逐个地代理转发到不同的微服务节点上。

2、加权策略

权是权重的意思,我们可以调整某些个后端节点的权重,性能足够的话权重可以加些,给其他节点兄弟分担分担压力。

3、IP Hash策略

这个策略对请求IP进行了Hash操作,也就是相同的Hash结果都会代理转发到同一个微服务节点上。

1.3 正向代理和反向代理

这两个概念很多网上的解释十分绕口,解释不清。我们先说反向代理。

(1)反向代理

通过上文Nginx反向代理的说明,我们可以知道反向代理配置了暴露给用户的链接与实际服务器地址的映射关系。通过反向代理,可以保护企业内部服务器不被直接暴露、负载均衡处理用户请求等。

(2)正向代理

理解反向代理我们是从企业内部服务器的角度,而理解正向代理,我们要从用户的角度来看。

用户通过浏览器访问某个链接,这个链接的请求先到达正向代理服务器,再由正向代理服务器代理用户做这一次请求动作,最后把请求结果返回给用户。

正向代理服务器在其中实际上充当了一部分防火墙的功能,可以保护局域网内用户的安全。

2.Nginx常用命令 

  1. 启动Nginx:
    sudo nginx
    
    启动Nginx服务。
    
    停止Nginx:
    sudo nginx -s stop
    
    或者更优雅地停止:
    sudo nginx -s quit
    
    重新加载配置:
    sudo nginx -s reload
    
    当配置文件更改后,使用该命令重新加载配置,而不需要完全停止Nginx服务。
    
    检查配置文件是否正确:
    sudo nginx -t
    
    该命令会检查Nginx配置文件语法是否正确。
    
    查看Nginx版本:
    nginx -v
    
    或查看详细版本信息:
    nginx -V
    
    平滑重启Nginx:
    sudo nginx -s reopen
    
    显示Nginx的帮助信息:
    nginx -h

3.Nginx常见面试题及答案

  1. Nginx是什么?它的主要作用是什么?

    答案:
    Nginx是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP邮件代理服务器。它最常用于负载均衡、静态文件服务器、反向代理以及API网关。

  2. Nginx和Apache有什么区别?

    答案:

    • Nginx是异步非阻塞的事件驱动架构,适合高并发场景;Apache是进程或线程驱动的,适合复杂的处理任务。
    • Nginx的静态文件处理能力较强,而Apache在模块扩展性方面有优势。
    • Nginx占用的内存较少,性能高,而Apache在处理动态内容(如PHP)时更为灵活。
  3. Nginx如何实现负载均衡?

    答案:
    Nginx通过upstream模块实现负载均衡。常用的负载均衡策略包括:

    • 轮询(Round Robin): 默认策略,按顺序分配请求。
    • 权重(Weight): 按权重分配请求,适用于服务器性能不一致的情况。
    • IP哈希(IP Hash): 根据客户端IP进行分配,确保相同IP的请求始终发往同一台服务器。
    • least_conn: 选择当前连接数最少的服务器。

    示例:

    upstream backend {
        server backend1.example.com weight=3;
        server backend2.example.com;
    }
    
    server {
        location / {
            proxy_pass http://backend;
        }
    }
    
  4. Nginx如何配置反向代理?

    答案:
    反向代理是指Nginx作为中间服务器,将客户端请求转发到后端服务器,然后将响应返回给客户端。配置示例:

    server {
        listen 80;
        server_name example.com;
    
        location / {
            proxy_pass http://backend_server;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    
  5. Nginx的工作原理是什么?

    答案:
    Nginx是基于事件驱动的非阻塞架构。它的主进程负责管理worker进程,而worker进程则处理客户端的请求。Nginx使用的事件驱动模型使其能够同时处理大量连接,而不会为每个连接创建新的线程或进程。

  6. 如何设置Nginx处理静态资源?

    答案:
    Nginx在处理静态文件(如HTML、CSS、JS、图片等)时非常高效。配置示例:

    server {
        listen 80;
        server_name example.com;
    
        location / {
            root /var/www/html;
            index index.html index.htm;
        }
    
        location /images/ {
            root /var/www/html/images;
        }
    }
    
  7. 如何在Nginx中配置SSL?

    答案:
    使用SSL需要配置证书和密钥,配置示例如下:

    server {
        listen 443 ssl;
        server_name example.com;
    
        ssl_certificate /etc/nginx/ssl/nginx.crt;
        ssl_certificate_key /etc/nginx/ssl/nginx.key;
    
        location / {
            root /var/www/html;
            index index.html index.htm;
        }
    }
    
  8. Nginx如何处理502 Bad Gateway错误?

    答案:
    502错误通常是由于后端服务器不可用或响应时间过长导致的。可以通过以下方式排查:

    • 检查后端服务是否正常运行。
    • 增加Nginx与后端服务之间的超时时间,例如:
      proxy_connect_timeout 60;
      proxy_send_timeout 60;
      proxy_read_timeout 60;
      
  9. 如何限制Nginx的连接数或请求速率?

    答案:
    Nginx提供了limit_connlimit_req模块用于限制连接数和请求速率。

    • 限制每个IP地址的连接数:
      http {
          limit_conn_zone $binary_remote_addr zone=addr:10m;
          
          server {
              limit_conn addr 10;
          }
      }
      
    • 限制每秒请求速率:
      http {
          limit_req_zone $binary_remote_addr zone=req:10m rate=5r/s;
      
          server {
              limit_req zone=req burst=10 nodelay;
          }
      }
      
  10. 如何使用Nginx做动静分离?

    答案:
    动静分离是指静态资源和动态请求分别由不同的服务器处理。配置示例:

    server {
        listen 80;
        server_name example.com;
    
        location /static/ {
            root /var/www/static;
        }
    
        location / {
            proxy_pass http://backend_server;
        }
    }
    
  11. Nginx如何处理大文件上传?

    答案:
    可以通过设置client_max_body_size来调整上传文件的最大大小:

    http {
        client_max_body_size 100M;
    }
    
  12. Nginx如何防止DDoS攻击?

    答案:
    Nginx可以通过限制请求速率、连接数以及使用防火墙工具(如fail2ban)等方式来防止DDoS攻击。同时,也可以结合CDN或专门的防护系统增强安全性。

  13. 如何查看Nginx当前的活动连接数?

    答案:
    通过stub_status模块可以查看Nginx的状态信息,配置如下:

    server {
        listen 80;
        server_name example.com;
    
        location /nginx_status {
            stub_status on;
            allow 127.0.0.1;
            deny all;
        }
    }
    
  14. Nginx如何处理缓存?

    答案:
    Nginx可以作为反向代理服务器来缓存后端服务器的响应,配置示例如下:

    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g;
    
    server {
        location / {
            proxy_cache my_cache;
            proxy_pass http://backend;
        }
    }
    
  15. 如何优化Nginx的性能?

    答案:

    • 调整worker_processes的数量,使其与CPU核心数相匹配。
    • 使用gzip压缩传输数据,减少带宽消耗。
    • 启用keepalive,减少建立新连接的开销:

      keepalive_timeout 65;

    • 使用缓存机制(如proxy_cachefastcgi_cache)。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员-杨胡广

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值