Day92.Nginx: 反向代理、负载均衡、动静分离、安装与配置

2023-11-08 22:50

本文主要是介绍Day92.Nginx: 反向代理、负载均衡、动静分离、安装与配置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、Nginx简介 

二、安装

nginx常用的命令

三、反向代理

反向代理案例二

location指令说明

四、Nginx配置实例-负载均衡

2. weight 权重

3. ip_hash

4. fair(需要第三方插件)

5. 其他:down、Bacup

五、动静分离

动静分离实验二 (重要)

六、Nginx 工作原理

技术类型

七、Nginx 配置相关


一、Nginx简介 

Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,特点是占有内存少并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等

正向代理

Nginx不仅可以做反向代理,实现负载均衡。还能用作正向代理来进行上网等功能。

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

反向代理

反向代理:其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址

负载均衡

客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕后,再将结果返回给客户端。

当请求过多,访问量过大时,增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。

动静分离

为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。

二、安装

需要安装:pcre、openssl、zlib、nginx,步骤略 (压缩、编译、安装)

需要开放防火墙端口,否则无法远程访问:

查看开放的端口号

firewall-cmd --list-all

设置开放的服务或端口号

firewall-cmd --add-service=http --permanent

firewall-cmd --add-port=80/tcp --permanent

重启防火墙

firewall-cmd --reload

systemctl status firewalld :查看防火墙状态
systemctl stop firewalld:关闭防火墙
systemctl start firewalld:开启防火墙

nginx常用的命令

(1)启动命令:在/usr/local/nginx/sbin目录下执行 ./nginx

(2)关闭命令:在/usr/local/nginx/sbin目录下执行 ./nginx  -s  stop

(3)重新加载命令:在/usr/local/nginx/sbin目录下执行 ./nginx  -s  reload

(4)查看版本:在/usr/local/nginx/sbin目录下执行 ./nginx  -v

(5)查看进程:ps -ef|grep nginx

三、反向代理

修改配置文件:

 

修改成功后, 输入 ../sbin/nginx -s reload 加载配置文件

映射域名,通过修改本地 C:/Windows/System32/drivers/etc/hosts 文件,将 www.123.com 映射到 192.168.86.86

(80是web默认端口,所以可以省略) 

linux启动tomcat服务后,访问Nginx地址,或www.123.com就可以反向代理到Tomcat了!

反向代理案例二

第一步,准备两个tomcat,一个8080端口,一个8081端口,并准备好测试的页面

webapps/edu/index.html

webapps/vod/index.html 

修改nginx的配置文件,在server{}中添加

        location /edu/{proxy_pass http://192.168.86.86:8080;}location /vod/{proxy_pass http://192.168.86.86:8081;}

 代理了两个服务器!两个都可以通过nginx 访问

location指令说明

该指令用于匹配 URL。

1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。 (优先级1)

2、~:用于表示 uri 包含正则表达式,并且区分大小写。 (优先级4)

3、~*:用于表示 uri 包含正则表达式,并且不区分大小写。 (优先级3)

4、^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。(优先级2)

Location区段匹配示例location = / {  //精确匹配,优先级最高# 只匹配 / 的查询.[ configuration A ]
}location / {  //普通匹配,优先级低# 匹配任何以 / 开始的查询,但是正则表达式与一些较长的字符串将被首先匹配。[ configuration B ]
}location ^~ /images/ {  //反正则,优先于正则匹配# 匹配任何以 /images/ 开始的查询并且停止搜索,不检查正则表达式。[ configuration C ]
}
location ~* \.(gif|jpg|jpeg)$ {   //  ~*正则匹配,不区分大小写,优先级高于普通匹配# 匹配任何以gif, jpg, or jpeg结尾的文件,但是所有 /images/ 目录的请求将在Configuration C中处理。[ configuration D ]
} 
各请求的处理如下例:
http://192.168.140.110:9000/
http://192.168.140.110:9000/documents/document.html
http://192.168.140.110:9000/images/1.gif
http://192.168.140.110:9000/documents/1.jpg■/ → configuration A
■/documents/document.html → configuration B
■/images/1.gif → configuration C
■/documents/1.jpg → configuration D

四、Nginx配置实例-负载均衡

Nginx默认匹配策略是轮询!Dubbo框架默认匹配策略是随机访问!

负载均衡配置:

upstream称为上游服务器,即真实处理请求的业务服务器。

  upstream tomcatgroup{server 192.168.86.86:8080 weight=1;server 192.168.86.86:8081 weight=2;}location /edu/{proxy_pass http://tomcatgroup;}

  

2. weight 权重

weight代表权,重默认为1,权重越高被分配的客户端越多

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

3. ip_hash

第一请求是谁处理的,以后都由同一个服务器处理。

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题(不建议使用)

 问题:1.如果该服务器宕机,客户则需要重新登录系统,重新进行哈希计算。2.ip分步不均

4. fair(需要第三方插件)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream server_pool{   

server 192.168.10.1:80;    

server 192.168.10.2:80;

server 192.168.10.3:80;

fair;    

}

5. 其他:down、Bacup

五、动静分离

Nginx 动静分离简单来说就是把动态请求跟静态请求分开,Nginx 处理静态请求,Tomcat处理动态请求。

动静分离实验二 (重要)

如果开启反向代理,访问tomcat动态资源jspjsp中引用的静态资源可以从nginx服务器中进行加载。

配置文件:

实现了静态资源、动态资源分开访问。 

六、Nginx 工作原理

Nginx 同redis类似都采用了 IO多路复用机制 ,每个worker都是一个独立的进程,但每个进程里只有一个主线程,通过 异步非阻塞 的方式来处理请求, 即使是千上万个请求也不在话下。每个worker的线程可以把一个cpu的性能发挥到极致。所以worker数量和服务器的cpu数相等是最为适宜。设少了会浪费cpu,设多了会造成cpu频繁切换上下文带来的损耗。

异步非阻塞。io多路复用

master-workers的机制的好处

首先,对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。

其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快启动新的worker进程。

当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险。

面试题:

第一个:发送请求,占用了woker的几个连接数?

动态资源请求:占用四个连接数。静态资源请求:占用两个连接数

因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接.

第二个:nginx有一个master,有四个woker,每个woker支持最大的连接数1024,支持的最大并发数是多少?

总连接数:4*1024 = 4096

静态请求需要两个连接数 = 4096/2 = 2048 

动态请求需要四个连接数 = 4096/4 = 1024

技术类型

select

  • select 会修改传入的参数数组,这个对于一个需要调用很多次的函数,是非常不友好的。
  • select 如果任何一个sock(I/O stream)出现了数据,select 仅仅会返回,但是并不会告诉你是那个sock上有数据,于是你只能自己一个一个的找,10几个sock可能还好,要是几万的sock每次都找一遍...
  • select 只能监视1024个链接。
  • select 不是线程安全的,如果你把一个sock加入到select, 然后突然另外一个线程发现,这个sock不用,要收回,这个select 不支持的,如果你丧心病狂的竟然关掉这个sock, select的标准行为是不可预测的

poll

  • poll 去掉了1024个链接的限制
  • poll仍然不是线程安全的, 这就意味着,不管服务器有多强悍也只能在一个线程里面处理一组I/O流。

epoll

  • epoll 可以说是I/O 多路复用最新的一个实现,epoll 修复了poll 和select绝大部分问题
  • epoll 现在是线程安全的。  
  • epoll 现在不仅告诉你sock组里面数据,还会告诉你具体哪个sock有数据,你不用自己去找了。

epoll是Linux内核​为处理大批量文件描述符​而作了改进的poll,是Linux下多路复用IO​接口select/poll的增强版本,它能显著提高程序在大量并发连接​中只有少量活跃的情况下的系统CPU利用率。另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。epoll除了提供select/poll那种IO事件的水平触发(Level Triggered)外,还提供了边缘触发(Edge Triggered),这就使得用户空间程序有可能缓存IO状态,减少epoll_wait/epoll_pwait的调用,提高应用程序效率。
 

七、Nginx 配置相关

#安全问题,建议用nobody,不要用root.

#user  nobody;

#worker数和服务器的cpu数相等是最为适宜

worker_processes  2;

#work绑定cpu(4 work绑定4cpu)

worker_cpu_affinity 0001 0010 0100 1000

  

#error_log path(存放路径) level(日志等级) path表示日志路径,level表示日志等级,

#具体如下:[ debug | info | notice | warn | error | crit ]

#从左至右,日志详细程度逐级递减,即debug最详细,crit最少,默认为crit

#error_log  logs/error.log;

#error_log  logs/error.log  notice;

#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {

    worker_connections  1024;  

    #这个值是表示nginx要支持哪种多路io复用

    #一般的Linux选择epoll, 如果是(*BSD)系列的Linux使用kquene。

    #windows版本的nginx不支持多路IO复用,这个值不用配。

    use epoll;

    # 当一个worker抢占到一个链接时,是否尽可能的让其获得更多的连接,默认是off 。

    multi_accept on; //并发量大时缓解客户端等待时间。

    # 默认是on ,开启nginx的抢占锁机制。

    accept_mutex  on; //master指派worker抢占锁

}

http {

    #当web服务器收到静态的资源文件请求时,依据请求文件的后缀名在服务器的MIME配置文件中找到对应的MIME Type,再根据MIME Type设置HTTP Response的Content-Type,然后浏览器根据Content-Type的值处理文件。

    include       mime.types;  #/usr/local/nginx/conf/mime.types

    #如果 不能从mime.types找到映射的话,用以下作为默认值-二进制

    default_type  application/octet-stream;

     #日志位置

     access_log  logs/host.access.log  main;

     #一条典型的accesslog:

     #101.226.166.254 - - [21/Oct/2013:20:34:28 +0800] "GET /movie_cat.php?year=2013 HTTP/1.1" 200 5209 "http://www.baidu.com" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; MDDR; .NET4.0C; .NET4.0E; .NET CLR 1.1.4322; Tablet PC 2.0); 360Spider"

     #1)101.226.166.254:(用户IP)

     #2)[21/Oct/2013:20:34:28 +0800]:(访问时间)

     #3)GET:http请求方式,有GET和POST两种

     #4)/movie_cat.php?year=2013:当前访问的网页是动态网页,movie_cat.php即请求的后台接口,year=2013为具体接口的参数

     #5)200:服务状态,200表示正常,常见的还有,301永久重定向、4XX表示请求出错、5XX服务器内部错误

     #6)5209:传送字节数为5209,单位为byte

     #7)"http://www.baidu.com":refer:即当前页面的上一个网页

     #8)"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; #.NET CLR 3.0.30729; Media Center PC 6.0; MDDR; .NET4.0C; .NET4.0E; .NET CLR 1.1.4322; Tablet PC 2.0); 360Spider": agent字段:通常用来记录操作系统、浏览器版本、浏览器内核等信息

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                       '$status $body_bytes_sent "$http_referer" '

                      '"$http_user_agent" "$http_x_forwarded_for"';

    #开启从磁盘直接到网络的文件传输,适用于有大文件上传下载的情况,提高IO效率。

    sendfile        on; //大文件传递优化,提高效率

   

    #一个请求完成之后还要保持连接多久,0表示完成请求后直接关闭连接。默认:75s

    keepalive_timeout  60s;

    #开启或者关闭gzip模块, 文件压缩,再传输,提高效率

    #gzip  on ;

    #设置允许压缩的页面最小字节数,页面字节数从header头中的Content-Length中进行获取。

    #gzip_min_lenth 1k;

    # gzip压缩比,1 压缩比最小处理速度最快,9 压缩比最大但处理最慢(传输快但比较消耗cpu)

    #gzip_comp_level 4;

    #匹配MIME类型进行压缩,(无论是否指定)"text/html"类型总是会被压缩的。

    #gzip_types types text/plain text/css application/json  application/x-javascript text/xml   

    #动静分离

    #服务器端静态资源缓存,最大缓存到内存中的文件,不活跃期限

    open_file_cache max=655350 inactive=20s;   

   

    #活跃期限内最少使用的次数,否则视为不活跃。

    open_file_cache_min_uses 2;

    #验证缓存是否活跃的时间间隔

    open_file_cache_valid 30s;

    

    upstream  myserver{

        # ip_hash;

        server 192.168.161.132:8080 weight=1;

        server 192.168.161.132:8081 weight=1 backup;

        #hash $request_uri

        #hash_method crc32

    }

    server {

        #监听端口号

        listen       80;

        #服务名

        server_name  192.168.137.129;

        #字符集

        #charset utf-8;

        location / {   #匹配任何查询。

            root   html;#资源查找位置。         /user/local/nginx/html

            #默认访问首页索引文件的名称

            index  index.html index.htm;

            #反向代理路径

            proxy_pass http://myserver;

            #反向代理的超时时间

            proxy_connect_timeout 10;

            proxy_redirect default;

         }

          #普通匹配

        location  /images/ {    

                    root images ;

        }

         #反正则匹配

         location ^~ /images/jpg/ {  # 匹配任何以 /images/jpg/ 开头的任何查询并且停止搜索。任何正则表达式将不会被测试。

                      root images/jpg/ ;

         }

         #正则匹配

         location ~*.(gif|jpg|jpeg)$ {       

                      #所有静态文件直接读取硬盘

                      root pic ;

                      #expires定义用户浏览器缓存的时间为3天,如果静态页面不常更新,可以设置更长,这样可以节省带宽和缓解服务器的压力

                      expires 3d;

         }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html

        error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            root   html;

        }

    }

}

这篇关于Day92.Nginx: 反向代理、负载均衡、动静分离、安装与配置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/372953

相关文章

Zookeeper安装和配置说明

一、Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。 ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境; ■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例; ■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble) Zookeeper通过复制来实现

CentOS7安装配置mysql5.7 tar免安装版

一、CentOS7.4系统自带mariadb # 查看系统自带的Mariadb[root@localhost~]# rpm -qa|grep mariadbmariadb-libs-5.5.44-2.el7.centos.x86_64# 卸载系统自带的Mariadb[root@localhost ~]# rpm -e --nodeps mariadb-libs-5.5.44-2.el7

Centos7安装Mongodb4

1、下载源码包 curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.1.tgz 2、解压 放到 /usr/local/ 目录下 tar -zxvf mongodb-linux-x86_64-rhel70-4.2.1.tgzmv mongodb-linux-x86_64-rhel70-4.2.1/

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

hadoop开启回收站配置

开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。 开启回收站功能参数说明 (1)默认值fs.trash.interval = 0,0表示禁用回收站;其他值表示设置文件的存活时间。 (2)默认值fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval的参数值相等。

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

wolfSSL参数设置或配置项解释

1. wolfCrypt Only 解释:wolfCrypt是一个开源的、轻量级的、可移植的加密库,支持多种加密算法和协议。选择“wolfCrypt Only”意味着系统或应用将仅使用wolfCrypt库进行加密操作,而不依赖其他加密库。 2. DTLS Support 解释:DTLS(Datagram Transport Layer Security)是一种基于UDP的安全协议,提供类似于

Centos7安装JDK1.8保姆版

工欲善其事,必先利其器。这句话同样适用于学习Java编程。在开始Java的学习旅程之前,我们必须首先配置好适合的开发环境。 通过事先准备好这些工具和配置,我们可以避免在学习过程中遇到因环境问题导致的代码异常或错误。一个稳定、高效的开发环境能够让我们更加专注于代码的学习和编写,提升学习效率,减少不必要的困扰和挫折感。因此,在学习Java之初,投入一些时间和精力来配置好开发环境是非常值得的。这将为我