(通俗易懂)搞懂nginx正向代理、反向代理、负载均衡、动静分离,如何配置nginx.conf文件

分享一下我在搭建服务器并部署成功后对nginx的理解及配置。

目录:

1.nginx介绍

2.正向代理

3.反向代理

4.负载均衡

5.动静分离

6.nginx.conf总体代码配置1-5目录

1.nginx介绍

  • nginx是一款轻量级的服务器和反向代理的服务器

  • 占有内存少,并发能力强,能支持高达 50,000 个并发连接数。就是所说的负载均衡。

  • nginx不单单是动态服务器,也可以作为静态页面的 web 服务器。在服务器存放img,pdf,js文件等,可以直接静态获取,就是所说的动静分离。

  • 也可以解决跨域问题,就是所说的反向代理。

  • nginx采用最新的epoll和kqueue网络IO模型,而Apache使用的是select模式。

  • 目前Linux下能承受高并发访问的squid、Memcached 都采用的是epoll网络IO模型。

2.正向代理

  • 如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。

  • 例如:你需要访问google,google不知道访问它的客户端是谁,它只知道这个中间服务器在访问它,所以中间服务器代理了我们客户端,去访问google,这种就叫做正向代理。

3.反向代理

(通俗易懂)搞懂nginx正向代理、反向代理、负载均衡、动静分离,如何配置nginx.conf文件插图

  • 可以先看上面图片,反向代理就是客户端去访问服务器,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后(注:后面会讲到负载均衡轮询,多个服务器才可以负载均衡),再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是nginx代理服务器地址,隐藏了真实服务器IP地址。

  • 通俗的来说就是nginx.conf文件去配置代理,客户端以为访问的是配置好的代理的地址,但是访问的还是真实服务器的地址,只是真实服务器的地址被代理服务器代理了。

  • 有几个好处是:1.解决跨域问题,2.隐藏了服务器真实地址及目录路径,3.实现负载均衡功能

举例:nginx.conf文件

server { listen 8555; # 假的IP,只做演示 server_name 192.168.0.1; #反向代理,proxy_pass为代理服务器的地址 #这里举例地址为接口地址 #192.168.0.0.1:8555的前台网页请求192.168.0.0.1:8555/api/getList的接口 location /api/ { proxy_pass http://192.168.0.1:7666/; ... } }

正向代理与反向代理区别

正向代理是中间服务器代理客户端,为客户端收发请求,使真实客户端对服务器不可见。

反向代理是nginx去代理服务器,为服务器收发请求,使真实服务器对客户端不可见,让客户端直接对接的是nginx代理服务器。

4.负载均衡

(通俗易懂)搞懂nginx正向代理、反向代理、负载均衡、动静分离,如何配置nginx.conf文件插图1

  • 按照一定的算法【权重、轮询】,将客户端请求转发到不同服务器上,减轻单个服务器压力,提高系统并发量。

  • 通过心跳检测的方式,判断应用服务器当前是否可以正常工作,如果服务器宕机,请求将自动发送到其他正常的服务器。

  • 如检测到发生故障的应用服务器恢复工作,自动将其添加到处理用户请求队伍中。

  • 负载均衡算法

    • 源地址哈希法:根据获取客户端的IP地址,通过哈希函数计算得到一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要访问服务器的序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问。

    • 轮询法:将客户端请求按顺序轮流地分配到服务器上,均衡地请求每一台服务器,而不关心服务器实际的连接数和当前的系统负载问题。

    • 随机法:通过系统的随机算法,根据服务器的列表大小值来随机选取其中的一台服务器进行访问。

    • 加权轮询法:不同的服务器可能机器的配置也不一样,有的好有点差,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的weight权重,让其处理更多的请求;而配置低、负载高的机器,给其分配较低的weight权重,降低其系统负载,加权轮询能很好地处理这一问题,可以配置请求顺序而且按照权重分配到服务器。

    • 加权随机法:与加权轮询法一样,加权随机法也根据服务器的配置,系统的负载分配不同的权重。不同的是,它是按照weight权重随机请求服务器,而不是顺序请求服务器。

    • 最小连接数法:由于服务器的配置不相同,对于请求的处理有快有慢,最小连接数法根据后端服务器当前的连接情况,动态地选取其中当前积压的请求数最少的一台服务器来处理当前的请求,尽可能地提高服务器的利用效率,合理地分流到每一台服务器。

  • 案例:

  1. 如果你只有一台服务器,多个客户端去请求一个服务器的话,请求页面很慢很卡,或者导致你服务器撑不住而宕机,或者直接请求超时,因此需要多个服务器并配置负载均衡。

  2. 配置负载均衡后,如果有5台服务器,4台服务器全挂了,1台正常运行,那么也不会影响请求,会把客户端的请求到正常的服务器。

  3. 也可以配置权重去让请求先请求哪个服务器,就是所谓上面对应的轮询法、随机法、加权轮询法、加权随机法、最小连接数法。

举例:nginx.conf文件
tips:192.168.0.1:7020、192.168.0.2:7020、192.168.0.3:7020为你每个服务器后端地址,这里ip作为演示,也可以使用域名,由于配置了proxy_pass地址,首先所有请求会经过nginx反向代理服务器,然后再去执行你配置的负载均衡算法。

## 配置负载均衡–哈希法

tips当客户端的ip不变的情况下,访问到了第一个server服务器,然后又访问192.168.0.0.1:8555其他页面时获取到接口,保持访问相同的server服务器。1.无法与加权法、轮询法同用。2.可以解决session服务器存储问题。

http { upstream upstreamDemo{ ip_hash; server 192.168.0.1:7020; server 192.168.0.2:7020; server 192.168.0.3:7020; ... } server { listen 8555; server_name 192.168.0.0.1; location /api/ { proxy_pass http://upstreamDemo; } } }

## 配置负载均衡–轮询法

tips:默认情况就是采用轮询法

http { upstream upstreamDemo{ server 192.168.0.1:7020; server 192.168.0.2:7020; server 192.168.0.3:7020; ... } server { listen 8555; server_name 192.168.0.0.1; location /api/ { proxy_pass http://upstreamDemo; } } }

## 配置负载均衡–加权轮询法weight

tips:weight不写,默认是1,weight越高表示那个服务器接收请求比较高

http { upstream upstreamDemo{ server 192.168.0.1:7020 weight=1; server 192.168.0.2:7020 weight=2; # 接受请求最高 server 192.168.0.3:7020 weight=3; } server { listen 8555; server_name 192.168.0.0.1; location /api/ { proxy_pass http://upstreamDemo; } } }

## 配置负载均衡–最小连接数法least_conn

tips:把请求自动分配到现在连接数最少的服务器上

http { upstream upstreamDemo{ least_conn; server 192.168.0.1:7020; server 192.168.0.2:7020; server 192.168.0.3:7020; } server { listen 8555; server_name 192.168.0.0.1; location /api/ { proxy_pass http://upstreamDemo; } } }

## 配置负载均衡–其他配置

tips

1.down标识表示这台服务器不参与负载均衡(不会接收请求),一般使用在服务器维护或者发布代码的时候。

2.backup标识表示这台服务器为备份状态,意思是指当其他服务器都不能使用的时候,才会轮到此台服务器开始接收请求。

3.max_conns标识表示设置当前服务器最大接收的请求数,不设置则不限制接收最大请求数。防止服务器本来只能接收2048个请求数,你不设置max_conns而导致服务器超出接收请求,导致服务器宕机。

4.max_fails(值为次数)和max_timeout(值为多少秒)一起配合使用,max_fails是指设置请求服务器失败的次数,max_timeout是指经过max_fails次数失败之后,服务器暂停的时间。

http { upstream upstreamDemo{ server 192.168.0.1:7020 down; server 192.168.0.2:7020 backup; server 192.168.0.3:7020 max_conns=2048; server 192.168.0.4:7020 max_conns=1024 max_fails=5 fail_timeout=8; } server { listen 8555; server_name 192.168.0.0.1; location /api/ { proxy_pass http://upstreamDemo; } } }

5.动静分离

(通俗易懂)搞懂nginx正向代理、反向代理、负载均衡、动静分离,如何配置nginx.conf文件插图2

  • 动静分离顾名思义就是动态(数据/页面)和静态(数据/页面)分开请求。进而提升整个服务访问性能和可维护性。

  • 例如接口是必须动态去请求的,那么我们图片img或者一些pdf文件,就没必要叫后端再给你接口返回,可以在nginx配置,直接静态获取你存放在服务器上的图片。

举例:nginx.conf文件

server { listen 8555; server_name 192.168.0.1; # 假的IP,只做演示 # 配置静态资源处理,root为你img等存放在服务器路径 # 因为我这是docker映射,所以路径是docker的路径 # /usr/share,具体按照你们情况去配置路径 # 如果没有使用docker,那么直接拿服务器绝对路径 location /img/ { root /usr/share/static; index index.html index.htm; } # 配置动态资源处理,proxy_pass为代理服务器的地址 # 这里举例地址为接口地址,因此得动态请求 location /api/ { proxy_pass http://192.168.0.1:7666/; ... } }
  • 通过192.168.0.0.1:8555/img/xxx.jpg即可访问静态资源

  • 通过192.168.0.0.1:8555/api/getList即可访问后端接口动态资源

6.nginx.conf总体配置讲解

可以直接复制使用然后修改server块对应的就可以了

[root@VM-12-15-centos nginx]# cat nginx.conf # nginx用户及组:用户、组。window下不指定 # 语法:user username [groupname] # 默认:user nobody nobody # 按照你服务器名字赋值[root@VM-12-15-centos nginx] user root; # 工作进程:数目。根据硬件调整,一般不改变,设置为1 # 通常等于服务器CPU数量。 worker_processes 1; # 一个进程能打开的文件描述符最大值,理论上该值因该是最多能打开的文件数除以进程数。 # 但是由于nginx负载并不是完全均衡的,所以这个值最好等于最多能打开的文件数。 # LINUX系统可以执行 sysctl -a | grep fs.file 可以看到linux文件描述符。 # 根据fs.file-max的值设置 worker_rlimit_nofile 199007; ​ events { # nginx采用最新的epoll和kqueue网络IO模型,而Apache使用的是select模式。 # 目前Linux下能承受高并发访问的squid、Memcached 都采用的是epoll网络IO模型。 # 使用epoll的I/O 模型。linux建议epoll,FreeBSD建议采用kqueue,window下不指定。 use epoll; ​ # 单个进程最大连接数(默认1024) # 根据你服务器cpu、worker_processes对应去配置 # linux下输入ulimit -n查看你的最大连接数 # worker_processes是1,worker_connections最大为10,000 worker_connections 1024; # 可以不设置 # 客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置, # 一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。 # client_header_buffer_size 4k; } ​ http { # 设定mime类型,类型由mime.type文件定义 include mime.types; default_type application/octet-stream; ​ # 服务器名字的hash表大小 server_names_hash_bucket_size 128; ​ # 客户端请求头缓冲大小。 # nginx默认会用client_header_buffer_size这个buffer来读取header值, # 如果header过大,它会使用large_client_header_buffers来读取。 # 如果设置过小HTTP头/Cookie过大 会报400 错误 nginx 400 bad request # 如果超过buffer,就会报HTTP 414错误(URI Too Long) # nginx接受最长的HTTP头部大小必须比其中一个buffer大 # 否则就会报400的HTTP错误(Bad Request) # client_header_buffer_size 32k; # large_client_header_buffers 4 32k; ​ # 隐藏ngnix版本号 # server_tokens off; ​ # 忽略不合法的请求头 # ignore_invalid_headers on; ​ # 让nginx在处理自己内部重定向时不默认使用server_name设置中的第一个域名 # server_name_in_redirect off; ​ # 客户端请求体的大小 # client_body_buffer_size 8m; ​ # 开启文件传输,一般应用都应设置为on; # 若是有下载的应用,则可以设置成off来平衡网络I/O和磁盘的I/O来降低系统负载 sendfile on; ​ # 告诉nginx在一个数据包里发送所有头文件,而不一个接一个的发送。 # tcp_nopush on; ​ # tcp_nodelay off 会增加通信的延时,但是会提高带宽利用率。在高延时、数据量大的通信场景中应该会有不错的效果 # tcp_nodelay on,会增加小包的数量,但是可以提高响应速度。在及时性高的通信场景中应该会有不错的效果 tcp_nodelay on; ​ # 长连接超时时间,单位是秒 keepalive_timeout 65; # server块记得listen的端口去开放防火墙 # http转发到https # 如果用户输入www.xxx.com会自动转到https://www.xxx.com server { listen 80; server_name www.xxx.com; return 301 https://$server_name$request_uri; } # nuxt ssr渲染项目,需要使用Dockerfile # 配置docker并在服务器yarn start此项目 # 这里只是让nginx代理转发 server { # 监听端口并切有证书的带ssl,没有的就不填 listen 443 ssl; # 填写绑定证书的域名 server_name www.xxx.com; # 配置ssl证书 # 证书文件名称 此为docker映射目录 ssl_certificate /etc/nginx/cert/xxx_bundle.crt; # 私钥文件名称 此为docker映射目录 ssl_certificate_key /etc/nginx/cert/xxx.key; ssl_session_timeout 5m; #请按照以下套件配置,配置加密套件,写法遵循openssl标准 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; # 表示使用的TLS协议的类型 ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; # 网站主页路径 # 因为这里是ssr渲染,blog为docker容器名 location / { proxy_pass http://blog:3000; proxy_set_header Host $host; proxy_set_header X-Forward-For $remote_addr; } # 配置反向代理,解决请求后端接口跨域问题 # 访问:https://xxx/api/xxxxxx location /api/ { # 待转发后端接口地址 proxy_pass http://xxx:7020/; # 重定义发往后端服务器的请求头,常见配置使用 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 配置status为405时,转200状态码并重定向 error_page 405 =200 $request_uri; } # 配置动静分离 # 访问静态数据:https://xxx/img/xxxxxx.jpg location /img/ { # docker映射的目录路径 root /usr/share/static; index index.html index.htm; } } ​ # vue项目,直接yarn build打包后放入服务器并docker映射 server{ listen 8886 ssl; # 填写绑定证书的域名 server_name www.xxx.com; # 配置ssl证书 # 证书文件名称 此为docker映射目录 ssl_certificate /etc/nginx/cert/xxx_bundle.crt; # 私钥文件名称 此为docker映射目录 ssl_certificate_key /etc/nginx/cert/xxx.key; ssl_session_timeout 5m; #请按照以下套件配置,配置加密套件,写法遵循openssl标准 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; # 表示使用的TLS协议的类型 ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; # 网站主页路径 location / { try_files $uri $uri/index.html /index.html; # docker容器下的地址 root /usr/share/nginx/html/ange-blog-administration/dist; index index.html index.htm; error_page 405 =200 $request_uri; } ​ # 配置反向代理,解决请求后端接口跨域问题 # 访问:https://xxx/api/xxxxxx location /api/ { # 待转发后端接口地址 proxy_pass http://xxx:7020/; # 重定义发往后端服务器的请求头,常见配置使用 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 配置status为405时,转200状态码并重定向 error_page 405 =200 $request_uri; } # 配置动静分离 # 访问静态数据:https://xxx/img/xxxxxx.jpg location /img-log/ { # docker映射的目录路径 root /usr/share/nginx/html/spring-boot; index index.html index.htm; } } }

(通俗易懂)搞懂nginx正向代理、反向代理、负载均衡、动静分离,如何配置nginx.conf文件插图3

原文链接:https://blog.csdn.net/weixin_41863539/article/details/126090601

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享