一. 什么是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天,当客户端再次请求的同样的资源的时候呢,就会优先使用本地缓存的资源而不会向服务器发生请求
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |