找回密码
 立即注册
首页 业界区 安全 Nginx扫盲,一文从0搞定Nginx

Nginx扫盲,一文从0搞定Nginx

羊舌正清 2025-6-1 20:24:23
一. 什么是Nginx?
我们需要捋一下服务端的访问流程,服务端通过输入网站,网站又经过运营商的dns,转为ip然后请求到服务器上,服务器接收请求发送html文件通过端口发送到电脑上.
看起来没什么问题,那么接下来,根据这个html,我们需要服务端进行一定的服务,服务压力过大,一台服务器遭不住,怎么办?用Nginx!
Nginx就是一个中间件,常见的有四大功能:反向代理,负载均衡,请求限流,动静分离!(还有请求的缓存proxy cache ,滚动升级 master控worker,单线程多进程架构(单线程避免并发,线程切换问题提升开销,多个进程保证实时相应))
二.如何实现反向代理?
在http区块定义upstream服务器池
  1. http {
  2.     upstream 任意名字 {
  3.         server 后端服务器地址1;
  4.         server 后端服务器地址2;
  5.         server 后端服务器地址3;
  6.     }
  7.     server {
  8.         listen 80;
  9. //客户端访问proxy_pass配置的网址默认是80端口直接连接到Nginx
  10.         location / {
  11.             proxy_pass http://刚刚的任意名字;
  12.         }
  13.     }
  14. }
复制代码
三.如何实现负载均衡?
负载均衡算法:
轮询(Round Robin):默认情况下,请求会按照顺序轮流发送到各个服务器。
权重(Weight):允许为每个服务器分配不同的权重,权重越高,接收请求的概率越大。
IP 哈希(IP Hash):根据客户端 IP 地址进行哈希运算,使得来自同一客户端的请求始终指向相同的后端服务器。
最少连接(Least Connections):选择当前连接数最少的服务器来处理新的请求。
除了权重是
  1. upstream backend_servers {
  2.     server backend1.example.com weight=3;
  3.     server backend2.example.com;
  4.     server backend3.example.com;
  5. }
复制代码
其他的都在upstream里标注即可
  1. upstream backend_servers {
  2. //这里
  3.     ip_hash;
  4.     server backend1.example.com;
  5.     server backend2.example.com;
  6.     server backend3.example.com;
  7. }
复制代码
四.如何实现请求限流?
  1. 在 http 区块内声明一个限流区域,并指定其共享内存大小及最大请求速率:
  2. http {
  3.     limit_req_zone $binary_remote_addr zone=traffic_control:10m rate=10r/s;
  4.     server {
  5.         listen 80;
  6.         location / {
  7.             limit_req zone=traffic_control burst=20 nodelay;
  8.             proxy_pass http://backend_servers;
  9.         }
  10.     }
  11. }
复制代码
详解: limit_req_zone : Nginx特定的用于请求限流区域的指令,通过这个指令来统计和限制请求速率以及相应的参数
$binary_remote_addr : 为一个Nginx变量,代表客户端的ip地址,Nginx会根据每个不同的ip地址来记录请求数量
zone=traffic_control:10m  :  zone也是Nginx特定的关键字,告诉Nginx这里要定义存储限流信息的内存区域
traffic_control是该内存区域的名称,可以随便起名,符合规范即可,在使用限流规则的时候需要引用这个名称
10m表示Nginx创建记录客户端请求信息(时间,数量,ip)的内存大小为10MB,1MB大概可以记录16000个ip地址的限流信息
rate=10r/s : rate也是Nginx的一个关键字,用来指定限流的速率,10r/s表示每秒最多允许10个请求,r/s是每秒请求数,r/m的话是每分钟请求数
以上是定义,下面是引用赋值
limit_req zone=traffic_control  : 指定请求限流的内存区域,以及定义的限流信息
burst=20 : 表示当突发超出限流数量后,会把超出数量的最多20个请求放入缓存区中之后处理(再超出会报503错误)
nodelay  : 表示进入缓存区后立即处理掉,在本场景的例子是由 10r/s配合burst实现30r/s的情况
五. 如何实现动静分离?
之前我们是这样处理动态资源(请求)的,
  1. location / {
  2.             proxy_pass http://刚刚的任意名字;
  3.         }
复制代码
但是资源不止是动态的,也有我们内置的图片,css这些静态的
那么动态+静态为:
location / {
  1.     proxy_pass http://backend_servers;
  2. }
  3. location ~* \.(jpg|jpeg|png|gif|css|js|ico|html)$ {
  4.     root /var/www/static;
  5.     expires 30d;
  6. }
复制代码
详解:
.(jpg|jpeg|png|gif|css|js|ico|html)$  : 这是具体的正则表达式,用于匹配以 .jpg、.jpeg、.png、.gif、.css、.js、.ico 或 .html 结尾的请求 URI
root /var/www/static;  :  用于指定请求文件的根目录,当客户端请求匹配到这个 location 块时,Nginx 会在 /var/www/static 目录下查找对应的文件。例如,如果客户端请求的是 /images/example.jpg,Nginx 会尝试在 /var/www/static/images/example.jpg 路径下查找该文件。
expires 30d;  :  表示客户端的缓存,即当客户端请求到这些静态资源后,会在本地缓存30天,当客户端再次请求的同样的资源的时候呢,就会优先使用本地缓存的资源而不会向服务器发生请求

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册