当前位置: 首页 > news >正文

Nginx之反向代理、负载均衡、动静分离。

Nginx之反向代理、负载均衡、动静分离。

1、Nginx是啥?

轻量级Web服务器、反向代理服务器、电子邮件(IMAP/POP3)代理服务器

在 BSD-like 协议下发行、占内存少、并发高(同时处理请求能力)。

2、安装

官网:nginx:下载

下载最新稳定版:

Linux: nginx-1.22.1

Windows: nginx/Windows-1.22.1

下载、解压、进入后目录为:(image 目录是我自己加的、其他目录才是原文件)

3、启动

点击nginx.exe 小黑框一闪而过、然后到浏览器输入 http://localhost:80 回车(默认端口号是:80)出现如下画面
请添加图片描述
请添加图片描述

成功!

但到这一步没有什么用、我们需要修改配置文件来完成目标

4、反向代理 or 正向代理

简而言之:

正向代理是 VPN、即代理对象是客户端

反向代理:代理对象是服务器、客户端发生请求给服务器、 Nginx 会先接收这些请求、然后通过事先定义的规则(即配置)进行一系列处理、最终再发给真正服务器。

ok、那反向代理有啥用呢?

就是接下来的主题了:负载均衡与动静分离

5、Nginx 负载均衡

场景:用户数增多、一台服务器不够用、我们需要再扩展一台服务器去处理同样的请求、即两服务器做同样工作、那就涉及到如下问题:

1、如何分配请求给两台服务器?

2、若用户在一台服务区登陆且获得 token 、当再次请求且携带 token 时刚好由另一台服务器处理、但此服务器上用户是显示未登陆的、该如何解决?

Nginx 采用了 三种方法来实现负载均衡:轮询、权重轮询、hash_ip

5.1、轮询 与 权重轮询、hash_ip

轮询:

当有两台服务器时、使用轮询法,则是两台服务器交替处理请求、第一个交给A服务器、第二个交给B服务器、第三个又交给A服务器

如此循环往复

权重轮询

即在轮询基础上加一个比例、如 1:3、若有4个请求进来,A只处理 1 个、B处理 3 个(此场景适用于服务器性能不一致时)

hash_ip

目的:将同一 IP 的请求发给 同一 服务器、用以解决 token 问题(rides也可解决)

原理: hash算法,对客户端请求的ip进行hash操作,然后根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处理,可以解决 token 不共享的问题。

5.2、实现

nginx.conf文件结构

...              #全局块events {         #events块...
}http      #http块
{...   #http全局块server        #server块{ ...       #server全局块location [PATTERN]   #location块{...}location [PATTERN] {...}}server{...}...     #http全局块
}
  • 1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
  • 2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
  • 3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
  • 4、server块:配置虚拟主机的相关参数,一个http中可以有多个server
  • 5、location块:配置请求的路由,以及各种页面的处理情况。

上面是我CV的、没办法,别人写的好、不用对不住、下面是真实配置内容

在解压好的目录下打开 conf 文件夹、然后打开 nginx.conf 配置文件、得如下配置信息。

后面细讲都有啥用

user  nobody; #配置用户或者组,默认为nobody nobody。worker_processes  1; #允许生成的进程数,默认为1#pid /nginx/pid/nginx.pid;   #指定nginx进程运行文件存放地址#制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
#error_log  logs/error.log;  
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;events {#accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为on#multi_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off#use epoll;      #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventportworker_connections  1024;  #最大连接数,默认为512
}http {include       mime.types; #文件扩展名与文件类型映射表default_type  application/octet-stream; #默认文件类型,默认为text/plain#access_log off; #取消服务日志  #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '#                  '$status $body_bytes_sent "$http_referer" '#                  '"$http_user_agent" "$http_x_forwarded_for"'; #自定义格式#access_log  logs/access.log  main; #combined为日志格式的默认值sendfile        on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。#tcp_nopush     on;#keepalive_timeout  0; 连接超时时间,默认为75s,可以在http,server,location块。keepalive_timeout  65;#gzip  on;# 存放需要负载均衡的服务器upstream mysvr {   server 127.0.0.1:7878;server 192.168.10.121:3333 backup;  #热备、就是其他服务器崩了后会使用这个}# error_page 404 https://www.baidu.com; #错误页server {# keepalive_requests 120; #单连接请求上限次数。listen       80; #监听端口server_name  8.134.81.146;#监听地址 ,默认127.0.0.1或localhost#charset koi8-r;#access_log  logs/host.access.log  main;#请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。# location  ~*^.+$ {...}location /sony_images/ {root	C:/nginx-1.22.1/image/;autoindex      on; # 列出访问目录}location / {root   html/dist; # 打包的文件存放路径index  index.html index.htm;try_files $uri $uri/ /index.html;# ---解决vue项目访问时不是index.html下出现的页面刷新404问题proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表deny 127.0.0.1;  #拒绝的ipallow 172.18.5.54; #允许的ip           }#location ^~/api { #     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_buffering off;#     rewrite ^/api/(.*)$ /$1 break; #     proxy_pass http://xxxxx:8080; 后端接口地址#}#location /api/ {#proxy_set_header X-Real-IP $remote_addr;#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#proxy_set_header Host  $http_host;#proxy_set_header X-Nginx-Proxy true;#proxy_set_header Connection "";#proxy_pass http://xxxxx:8080;  #****后端接口地址#proxy_redirect default ;#}location /api { proxy_pass http://8.134.81.146:8081/;  #****后端接口地址可使用公网pi但推荐使用本地ip即:127.0.0.1:8081}# redirect server error pages to the static page /50x.html# 请求返回后出现如下错误时会返回到页面error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {#    proxy_pass   http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {#    root           html;#    fastcgi_pass   127.0.0.1:9000;#    fastcgi_index  index.php;#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;#    include        fastcgi_params;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {#    deny  all;#}}# another virtual host using mix of IP-, name-, and port-based configuration##server {#    listen       8000;#    listen       somename:8080;#    server_name  somename  alias  another.alias;#    location / {#        root   html;#        index  index.html index.htm;#    }#}# HTTPS server##server {#    listen       443 ssl;#    server_name  localhost;#    ssl_certificate      cert.pem;#    ssl_certificate_key  cert.key;#    ssl_session_cache    shared:SSL:1m;#    ssl_session_timeout  5m;#    ssl_ciphers  HIGH:!aNULL:!MD5;#    ssl_prefer_server_ciphers  on;#    location / {#        root   html;#        index  index.html index.htm;#    }#}}

常用点详解

1、这个表示当我们访问 locahost 时 (因为下面的 location 后面接的是 / 表示访问地址只有 locahost时)会进入到你 proxy_pass b变量设置的地址如果是location /a那么对于的访问地址应该是 locahost/a

  location / {    proxy_pass http://server_pools; # 也可以是一个具体地址如 http://127.0.0.1}

1、如何实现负载均衡

其余不变、只是 proxy_pass后面的地址要设置成 http//: + 自定义变量、然后我们在外面使用 upstream 关键字定义一个变量用来存储全部服务器ip、weight 表示权重,如下权重和为 12、那么表示当有 12 个请求进来时、会有 5 个请求给第一个服务器、1 个请求给第二个服务器 、 6 个请求给第三个服务器

ip_hash 表示同一ip只会访问同一服务器

http{...
upstream server_pools { server 192.168.1.11:8880   weight=5;server 192.168.1.12:9990   weight=1;server 192.168.1.13:8989   weight=6;server 192.168.10.121:3333 backup;  #热备、就是其他服务器崩了后会使用这个ip_hash;#weigth参数表示权值,权值越高被分配到的几率越大
}
server {  listen 80; server_name mingongge.com;location / {    proxy_pass http://server_pools; }
}...
}

6、Nginx 动静分离

定义:就是将静态资源(即图片等)放到服务器的一个地方、然后通过配置 Nginx 使得外面在访问静态资源时,不用走服务器请求去获取、而是直接使用 url 访问

这样减少服务器压力

实现

在配置文件中加一个 location 即可

http{server { location /sony_images/ {root	C:/nginx-1.22.1/image/; # 为存放图片的文件夹的绝对路径autoindex      on; # 列出访问目录}}
}

步骤:

1、在任何地方创建一个文件夹 image、文件夹下再创建一个文件夹 sony_images 、此文件加下存放若干图片。

2、进行如上配置

3、访问 locahost/sony_images/ 会出现:

请添加图片描述

因为我们加了:autoindex on; # 列出访问目录、所以直接访问文件夹就能显示文件夹下全部文件

访问指定图片的ip为: locahost/sony_images/1inch_40x40.png

请添加图片描述

这样、我们就可以将访问图片变成访问一个ip地址、方便前端去调用图片了

问题:root 与 alias

root:
location /sony_images/ {root	C:/nginx-1.22.1/image/;autoindex      on; # 列出访问目录}}
浏览器访问ip:http://locahost/sony_images/ 
实际服务器查找资源地址:C:/nginx-1.22.1/image/sony_images/ 
格式:root后面设置的地址 + location 后面设置的地址alias:
location /sony_images/ {alias	C:/nginx-1.22.1/image/sony_images/;autoindex      on; # 列出访问目录}}
浏览器访问ip:http://locahost/sony_images/ 
实际访问地址:C:/nginx-1.22.1/image/sony_images/ 
格式:alias后面设置的地址

可以看到:

alias:访问的真实路径是直接以 alias后面的路径为准

root:将 root 后面的路径加上 location 后面的路径

7、Nginx 常用命令

cd /usr/local/nginx/sbin/
./nginx  启动
./nginx -s stop  停止
./nginx -s quit  安全退出
./nginx -s reload  重新加载配置文件  如果我们修改了配置文件,就需要重新加载。
ps aux|grep nginx  查看nginx进程
http://www.lryc.cn/news/16255.html

相关文章:

  • 0401不定积分的概念和性质-不定积分
  • 数组中的各种迭代API方法手写
  • 详解量子计算:相位反冲与相位反转
  • C++——C++11第三篇
  • 180 2 22222
  • 成人高考初中毕业能报名吗 需要什么条件
  • ChatGPT初体验
  • ChatGPT概念狂飙!究竟魅力何在?
  • 如何下载阅读Spring源码-全过程详解
  • 学了两个月的Java,最后自己什么也不会,该怎么办?
  • 前端vue实现获取七天时间和星期几功能
  • zookeeper单机部署
  • 单片机输入输出模式
  • 数据结构_ 堆结构与堆排序(c++ 实现 + 完整代码 )
  • 【MySQL】sql中explain解释和应用
  • 从零实现深度学习框架:Seq2Seq从理论到实战【实战篇】
  • 【数据结构入门】-链表之单链表(1)
  • Docker竟如此简单!
  • 在外包干了几年,感觉自己都快费了
  • Java实现多线程有几种方式(满分回答)
  • 实例4:树莓派GPIO控制舵机转动
  • 【音视频处理】为什么MP3不是无损音乐?音频参数详解,码率、采样率、音频帧、位深度、声道、编码格式的关系
  • Linux 环境变量
  • 从功能测试(点点点)到进阶自动化测试,实现薪资翻倍我只用了3个月时间
  • aspnetcore 原生 DI 实现基于 key 的服务获取
  • 华为OD机试 -最大子矩阵和(Python) | 机试题+算法思路+考点+代码解析 【2023】
  • C2驾照科一学习资料(1)
  • 4576: 移动数组元素
  • 字符串中<br>处理
  • 大数据技术原理与应用介绍