羊舌正清 发表于 2025-6-1 20:24:23

Nginx扫盲,一文从0搞定Nginx

一. 什么是Nginx?
我们需要捋一下服务端的访问流程,服务端通过输入网站,网站又经过运营商的dns,转为ip然后请求到服务器上,服务器接收请求发送html文件通过端口发送到电脑上.
看起来没什么问题,那么接下来,根据这个html,我们需要服务端进行一定的服务,服务压力过大,一台服务器遭不住,怎么办?用Nginx!
Nginx就是一个中间件,常见的有四大功能:反向代理,负载均衡,请求限流,动静分离!(还有请求的缓存proxy cache ,滚动升级 master控worker,单线程多进程架构(单线程避免并发,线程切换问题提升开销,多个进程保证实时相应))
二.如何实现反向代理?
在http区块定义upstream服务器池
http {
    upstream 任意名字 {
      server 后端服务器地址1;
      server 后端服务器地址2;
      server 后端服务器地址3;
    }
    server {
      listen 80;
//客户端访问proxy_pass配置的网址默认是80端口直接连接到Nginx
      location / {
            proxy_pass http://刚刚的任意名字;
      }
    }
}三.如何实现负载均衡?
负载均衡算法:
轮询(Round Robin):默认情况下,请求会按照顺序轮流发送到各个服务器。
权重(Weight):允许为每个服务器分配不同的权重,权重越高,接收请求的概率越大。
IP 哈希(IP Hash):根据客户端 IP 地址进行哈希运算,使得来自同一客户端的请求始终指向相同的后端服务器。
最少连接(Least Connections):选择当前连接数最少的服务器来处理新的请求。
除了权重是
upstream backend_servers {

    server backend1.example.com weight=3;

    server backend2.example.com;
    server backend3.example.com;

}其他的都在upstream里标注即可
upstream backend_servers {
//这里
    ip_hash;

    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}四.如何实现请求限流?
在 http 区块内声明一个限流区域,并指定其共享内存大小及最大请求速率:

http {
    limit_req_zone $binary_remote_addr zone=traffic_control:10m rate=10r/s;
    server {
      listen 80;
      location / {
            limit_req zone=traffic_control burst=20 nodelay;
            proxy_pass http://backend_servers;
      }
    }
}详解: 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的情况
五. 如何实现动静分离?
之前我们是这样处理动态资源(请求)的,
location / {
            proxy_pass http://刚刚的任意名字;
      }但是资源不止是动态的,也有我们内置的图片,css这些静态的
那么动态+静态为:
location / {
    proxy_pass http://backend_servers;

}

location ~* \.(jpg|jpeg|png|gif|css|js|ico|html)$ {

    root /var/www/static;

    expires 30d;

}详解:
.(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天,当客户端再次请求的同样的资源的时候呢,就会优先使用本地缓存的资源而不会向服务器发生请求

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: Nginx扫盲,一文从0搞定Nginx