这里紧张通过三个方面大略先容nginx
反向代理负载均衡nginx特点1. 反向代理
关于代理
说到代理,首先我们要明确一个观点,所谓代理便是一个代表、一个渠道;
此时就设计到两个角色,一个是被代理角色,一个是目标角色,被代理角色通过这个代理访问目标角色完成一些任务的过程称为代理操作过程;犹如生活中的专卖店~客人到adidas专卖店买了一双鞋,这个专卖店便是代理,被代理角色便是adidas厂家,目标角色便是用户
image
正向代理
说反向代理之前,我们先看看正向代理,正向代理也是大家最常打仗的到的代理模式,我们会从两个方面来说关于正向代理的处理模式,分别从软件方面和生活方面来阐明一下什么叫正向代理
在如今的网络环境下,我们如果由于技能须要要去访问国外的某些网站,此时你会创造位于国外的某网站我们通过浏览器是没有办法访问的,此时大家可能都会用一个操作FQ进行访问,FQ的办法紧张是找到一个可以访问国外网站的代理做事器,我们将要求发送给代理做事器,代理做事器去访问国外的网站,然后将访问到的数据通报给我们!
上述这样的代理模式称为正向代理,正向代理最大的特点是客户端非常明确要访问的做事器地址;做事器只清楚要求来自哪个代理做事器,而不清楚来自哪个详细的客户端;正向代理模式屏蔽或者隐蔽了真实客户端信息。
image
反向代理
明白了什么是正向代理,我们连续看关于反向代理的处理办法,举例如我大天朝的某宝网站,每天同时连接到网站的访问人数已经爆表,单个做事器远远不能知足公民日益增长的购买希望了,此时就涌现了一个大家耳熟能详的名词:分布式支配;也便是通过支配多台做事器来办理访问人数限定的问题;某宝网站中大部分功能也是直策应用nginx进行反向代理实现的,并且通过封装nginx和其他的组件之后起了个高大上的名字:Tengine,有兴趣的童鞋可以访问Tengine的官网查看详细的信息:http://tengine.taobao.org/
那么反向代理详细是通过什么样的办法实现的分布式的集群操作呢,我们先看一个示意图:
image
通过上述的图解大家就可以看清楚了,多个客户端给做事器发送的要求,nginx做事器吸收到之后,按照一定的规则分发给了后真个业务处理做事器进行处理了。此时~要求的来源也便是客户端是明确的,但是要求详细由哪台做事器处理的并不明确了,nginx扮演的便是一个反向代理角色
反向代理,紧张用于做事器集群分布式支配的情形下,反向代理隐蔽了做事器的信息!
项目场景
常日情形下,我们在实际项目操作时,正向代理和反向代理很有可能会存在在一个运用处景中,正向代理代理客户真个要求去访问目标做事器,目标做事器是一个反向单利做事器,反向代理了多台真实的业务处理做事器。详细的拓扑图如下:
image
2. 负载均衡
我们已经明确了所谓代理做事器的观点,那么接下来,nginx扮演了反向代理做事器的角色,它因此依据什么样的规则进行要求分发的呢?不用的项目运用处景,分发的规则是否可以掌握呢?
这里提到的客户端发送的、nginx反向代理做事器吸收到的要求数量,便是我们说的负载量
要求数量按照一定的规则进行分发到不同的做事器处理的规则,便是一种均衡规则
以是~将做事器吸收到的要求按照规则分发的过程,称为负载均衡。
负载均衡在实际项目操作过程中,有硬件负载均衡和软件负载均衡两种,硬件负载均衡也称为硬负载,如F5负载均衡,相对造价昂贵本钱较高,但是数据的稳定性安全性等等有非常好的保障,如中国移动中国联通这样的公司才会选择硬负载进行操作;更多的公司考虑到成本原因,会选择利用软件负载均衡,软件负载均衡是利用现有的技能结合主机硬件实现的一种行列步队分发机制
image
nginx支持的负载均衡调度算法办法如下:
weight轮询(默认):吸收到的要求按照顺序逐一分配到不同的后端做事器,纵然在利用过程中,某一台后端做事器宕机,nginx会自动将该做事器剔除出行列步队,要求受理情形不会受到任何影响。 这种办法下,可以给不同的后端做事器设置一个权重值(weight),用于调度不同的做事器上要求的分配率;权重数据越大,被分配到要求的几率越大;该权重值,紧张是针对实际事情环境中不同的后端做事器硬件配置进行调度的。ip_hash:每个要求按照发起客户真个ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端做事器,这也在一定程度上办理了集群支配环境下session共享的问题。fair:智能调度调度算法,动态的根据后端做事器的要求处理到相应的韶光进行均衡分配,相应韶光短处理效率高的做事器分配到要求的概率高,相应韶光长处理效率低的做事器分配到的要求少;结合了前两者的优点的一种调度算法。但是须要把稳的是nginx默认不支持fair算法,如果要利用这种调度算法,请安装upstream_fair模块url_hash:按照访问的url的hash结果分配要求,每个要求的url会指向后端固定的某个做事器,可以在nginx作为静态做事器的情形下提高缓存效率。同样要把稳nginx默认不支持这种调度算法,要利用的话须要安装nginx的hash软件包Nginx安装1. windows安装
官方网站下载地址:
https://nginx.org/en/download.html
如下图所示,下载对应的版本的nginx压缩包,解压到自己电脑上存放软件的文件夹中即可
image
解压完成后,文件目录构造如下:
image
启动nginx
1) 直接双击该目录下的nginx.exe,即可启动nginx做事器
2) 命令行计入该文件夹,实行nginx命令,也会直接启动nginx做事器
D:/resp_application/nginx-1.13.5> nginx
image
访问nginx
打开浏览器,输入地址:http://localhost,访问页面,涌现如下页面表示访问成功
image
停滞nginx
命令行进入nginx根目录,实行如下命令,停滞做事器:
逼迫停滞nginx做事器,如果有未处理的数据,丢弃
D:/resp_application/nginx-1.13.5> nginx -s stop
优雅的停滞nginx做事器,如果有未处理的数据,等待处理完成之后停滞
D:/resp_application/nginx-1.13.5> nginx -s quit
image
2. ubuntu安装
按照正常软件的安装办法,直接通过如下命令进行安装:
$ sudo apt-get install nginx
image
安装完成即可,在/usr/sbin/目录下是nginx命令所在目录,在/etc/nginx/目录下是nginx所有的配置文件,用于配置nginx做事器以及负载均衡等信息
查看nginx进程是否启动
$ ps -ef|grep nginx
nginx会自动根据当前主机的CPU的内核数目创建对应的进程数量(当前ubuntu主机是2核4线程配置)
image
备注:这里启动的做事进程实在是4个进程,由于nginx进程在启动的时候,会附带一个守护进程,用于保护正式进程不被非常终止;如果守护进程一旦返现nginx继续被终止了,会自动重启该进程。
守护进程一样平常会称为master进程,业务进程被称为worker进程
启动nginx做事器命令
直接实行nginx会按照默认的配置文件进行做事器的启动
$ nginx
image
停滞nginx做事命令
和windows系统实行过程一样,两种停滞办法
$ nginx -s stopor $ nginx -s quit
image
重新启动加载
同样也可以利用命令reopen和reload来重新启动nginx或者重新加载合营着文件。
3. mac os安装
直接通过brew进行nginx的安装,或者下载tar.gz压缩包都是可以的。
直接通过brew进行安装
brew install nginx
安装完成后,后续的命令操作,做事器的启动、进程查看、做事器的停滞、做事器的重启已经文件加载命令都是同等的。
nginx配置nginx是一个功能非常强大的web做事器加反向代理做事器,同时又是邮件做事器等等
在项目利用中,利用最多的三个核心功能是反向代理、负载均衡和静态做事器
这三个不同的功能的利用,都跟nginx的配置密切干系,nginx做事器的配置信息紧张集中在nginx.conf这个配置文件中,并且所有的可配置选项大致分为以下几个部分
main # 全局配置events { # nginx事情模式配置}http { # http设置 .... server { # 做事器主机配置 .... location { # 路由配置 .... } location path { .... } location otherpath { .... } } server { .... location { .... } } upstream name { # 负载均衡配置 .... }}
如上述配置文件所示,紧张由6个部分组成:
main: 用于进行nginx全局信息的配置events: 用于nginx事情模式的配置http: 用于进行http协议信息的一些配置server: 用于进行做事器访问信息的配置location:用于进行访问路由的配置upstream:用于进行负载均衡的配置main模块
不雅观察下面的配置代码
# user nobody nobody;worker_processes 2;# error_log logs/error.log# error_log logs/error.log notice# error_log logs/error.log info# pid logs/nginx.pidworker_rlimit_nofile 1024;
上述配置都是存放在main全局配置模块中的配置项
user用来指定nginx worker进程运行用户以及用户组,默认nobody账号运行worker_processes指定nginx要开启的子进程数量,运行过程中监控每个进程花费内存(一样平常几M~几十M不等)根据实际情形进行调度,常日数量是CPU内核数量的整数倍error_log定义缺点日志文件的位置及输出级别【debug / info / notice / warn / error / crit】pid用来指定进程id的存储文件的位置worker_rlimit_nofile用于指定一个进程可以打开最多文件数量的描述event 模块
上干货
event { worker_connections 1024; multi_accept on; use epoll;}
上述配置是针对nginx做事器的事情模式的一些操作配置
worker_connections 指定最大可以同时吸收的连接数量,这里一定要把稳,最大连接数量是和worker processes共同决定的。multi_accept 配置指定nginx在收到一个新连接关照后尽可能多的接管更多的连接use epoll 配置指定了线程轮询的方法,如果是linux2.6+,利用epoll,如果是BSD如Mac请利用Kqueuehttp模块
作为web做事器,http模块是nginx最核心的一个模块,配置项也是比较多的,项目中会设置到很多的实际业务场景,须要根据硬件信息进行适当的配置,常规情形下,利用默认配置即可!
http { ## # 根本配置 ## sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; # server_tokens off; # server_names_hash_bucket_size 64; # server_name_in_redirect off; include /etc/nginx/mime.types; default_type application/octet-stream; ## # SSL证书配置 ## ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE ssl_prefer_server_ciphers on; ## # 日志配置 ## access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; ## # Gzip 压缩配置 ## gzip on; gzip_disable \"大众msie6\公众; # gzip_vary on; # gzip_proxied any; # gzip_comp_level 6; # gzip_buffers 16 8k; # gzip_http_version 1.1; # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; ## # 虚拟主机配置 ## include /etc/nginx/conf.d/.conf; include /etc/nginx/sites-enabled/;根本配置
sendfile on:配置on让sendfile发挥浸染,将文件的回写过程交给数据缓冲去去完成,而不是放在运用中完成,这样的话在性能提升有有好处tc_nopush on:让nginx在一个数据包中发送所有的头文件,而不是一个一个单独发tcp_nodelay on:让nginx不要缓存数据,而是一段一段发送,如果数据的传输有实时性的哀求的话可以配置它,发送完一小段数据就急速能得到返回值,但是不要滥用哦keepalive_timeout 10:给客户端分配连接超时时间,做事器会在这个韶光过后关闭连接。一样平常设置韶光较短,可以让nginx事情持续性更好client_header_timeout 10:设置要求头的超时时间client_body_timeout 10:设置要求体的超时时间send_timeout 10:指定客户端相应超时时间,如果客户端两次操作间隔超过这个韶光,做事器就会关闭这个链接limit_conn_zone $binary_remote_addr zone=addr:5m :设置用于保存各种key的共享内存的参数,limit_conn addr 100: 给定的key设置最大连接数server_tokens:虽然不会让nginx实行速率更快,但是可以在缺点页面关闭nginx版本提示,对付网站安全性的提升有好处哦include /etc/nginx/mime.types:指定在当前文件中包含另一个文件的指令default_type application/octet-stream:指定默认处理的文件类型可以是二进制type_hash_max_size 2048:稠浊数据,影响三列冲突率,值越大花费内存越多,散列key冲突率会降落,检索速率更快;值越小key,占用内存较少,冲突率越高,检索速率变慢日志配置
access_log logs/access.log:设置存储访问记录的日志error_log logs/error.log:设置存储记录缺点发生的日志SSL证书加密
ssl_protocols:指令用于启动特定的加密协议,nginx在1.1.13和1.0.12版本后默认是ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2,TLSv1.1与TLSv1.2要确保OpenSSL >= 1.0.1 ,SSLv3 现在还有很多地方在用但有不少被攻击的漏洞。ssl prefer server ciphers:设置协商加密算法时,优先利用我们做事真个加密套件,而不是客户端浏览器的加密套件压缩配置
gzip 是见告nginx采取gzip压缩的形式发送数据。这将会减少我们发送的数据量。gzip_disable 为指定的客户端禁用gzip功能。我们设置成IE6或者更低版本以使我们的方案能够广泛兼容。gzip_static 见告nginx在压缩资源之前,先查找是否有预先gzip处理过的资源。这哀求你预先压缩你的文件(在这个例子中被注释掉了),从而许可你利用最高压缩比,这样nginx就不用再压缩这些文件了(想要更详尽的gzip_static的信息,请点击这里)。gzip_proxied 许可或者禁止压缩基于要乞降相应的相应流。我们设置为any,意味着将会压缩所有的要求。gzip_min_length 设置对数据启用压缩的最少字节数。如果一个要求小于1000字节,我们最好没关系缩它,由于压缩这些小的数据会降落处理此要求的所有进程的速率。gzip_comp_level 设置数据的压缩等级。这个等级可以是1-9之间的任意数值,9是最慢但是压缩比最大的。我们设置为4,这是一个比较折中的设置。gzip_type 设置须要压缩的数据格式。上面例子中已经有一些了,你也可以再添加更多的格式。文件缓存配置
open_file_cache 打开缓存的同时也指定了缓存最大数目,以及缓存的韶光。我们可以设置一个相对高的最大韶光,这样我们可以在它们不活动超过20秒后打消掉。open_file_cache_valid 在open_file_cache中指定检测精确信息的间隔韶光。open_file_cache_min_uses 定义了open_file_cache中指令参数不活动韶光期间里最小的文件数。open_file_cache_errors 指定了当搜索一个文件时是否缓存缺点信息,也包括再次给配置中添加文件。我们也包括了做事器模块,这些是在不同文件中定义的。如果你的做事器模块不在这些位置,你就得修正这一行来指定精确的位置。
server模块
srever模块配置是http模块中的一个子模块,用来定义一个虚拟访问主机,也便是一个虚拟做事器的配置信息
server { listen 80; server_name localhost 192.168.1.100; root /nginx/www; index index.php index.html index.html; charset utf-8; access_log logs/access.log; error_log logs/error.log; ......}
核心配置信息如下:
server:一个虚拟主机的配置,一个http中可以配置多个serverserver_name:用于指定ip地址或者域名,多个配置之间用空格分隔root:表示全体server虚拟主机内的根目录,所有当前主机中web项目的根目录index:用户访问web网站时的全局首页charset:用于设置www/路径中配置的网页的默认编码格式access_log:用于指定该虚拟主机做事器中的访问记录日志存放路径error_log:用于指定该虚拟主机做事器中访问缺点日志的存放路径location模块
location模块是nginx配置中涌现最多的一个配置,紧张用于配置路由访问信息
在路由访问信息配置中关联到反向代理、负载均衡等等各项功能,以是location模块也是一个非常主要的配置模块
基本配置
location / { root /nginx/www; index index.php index.html index.htm;}
location /:表示匹配访问根目录
root:用于指定访问根目录时,访问虚拟主机的web目录
index:在不指定访问详细资源时,默认展示的资源文件列表
反向代理配置办法
通过反向代理代理做事器访问模式,通过proxy_set配置让客户端访问透明化
location / { proxy_pass http://localhost:8888; proxy_set_header X-real-ip $remote_addr; proxy_set_header Host $http_host;}
uwsgi配置
wsgi模式下的做事器配置访问办法
location / { include uwsgi_params; uwsgi_pass localhost:8888}
upstream模块
upstream模块紧张卖力负载均衡的配置,通过默认的轮询调度办法来分发要求到后端做事器
大略的配置办法如下
upstream name { ip_hash; server 192.168.1.100:8000; server 192.168.1.100:8001 down; server 192.168.1.100:8002 max_fails=3; server 192.168.1.100:8003 fail_timeout=20s; server 192.168.1.100:8004 max_fails=3 fail_timeout=20s;}
核心配置信息如下
ip_hash:指定要求调度算法,默认是weight权重轮询调度,可以指定server host:port:分发做事器的列表配置-- down:表示该主机停息做事-- max_fails:表示失落败最大次数,超过失落败最大次数停息做事-- fail_timeout:表示如果要求受理失落败,停息指定的韶光之后重新发起要求负载均衡负载均衡也是Nginx常用的一个功能,负载均衡其意思便是分摊到多个操作单元上进行实行,例如Web做事器、FTP做事器、企业关键运用做事器和其它关键任务做事器等,从而共同完成事情任务。大略而言便是当有2台或以上做事器时,根据规则随机的将要求分发到指定的做事器上处理,负载均衡配置一样平常都须要同时配置反向代理,通过反向代理跳转到负载均衡。而Nginx目前支持自带3种负载均衡策略,还有2种常用的第三方策略。
1、RR(默认)
每个要求按韶光顺序逐一分配到不同的后端做事器,如果后端做事器down掉,能自动剔除。
大略配置:
image
负载均衡的核心代码为:
image
这里我配置了2台做事器,当然实际上是一台,只是端口不一样而已,而8081的做事器是不存在的,也便是说访问不到,但是我们访问http://localhost 的时候,也不会有问题,会默认跳转到http://localhost:8080 详细是由于Nginx会自动判断做事器的状态,如果做事器处于不能访问(做事器挂了),就不会跳转到这台做事器,以是也避免了一台做事器挂了影相应用的情形,由于Nginx默认是RR策略,以是我们不须要其他更多的设置。
2、权重
指定轮询几率,weight和访问比率成正比,用于后端做事器性能不均的情形。
例如:
image
那么10次一样平常只会有1次会访问到8081,而有9次会访问到8080。
3、ip_hash
上面的2种办法都有一个问题,那便是下一个要求来的时候要求可能分发到其余一个做事器,当我们的程序不是无状态的时候(采取了session保存数据),这时候就有一个很大的很问题了,比如把登录信息保存到了session中,那么跳转到其余一台做事器的时候就须要重新登录了,以是很多时候我们须要一个客户只访问一个做事器,那么就须要用iphash了,iphash的每个要求按访问ip的hash结果分配,这样每个访客固定访问一个后端做事器,可以办理session的问题。
image
4、fair(第三方)
按后端做事器的相应韶光来分配要求,相应韶光短的优先分配。
image
5、url_hash(第三方)
按访问url的hash结果来分配要求,使每个url定向到同一个后端做事器,后端做事器为缓存时比较有效。 在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是利用的hash算法。
image
以上5种负载均衡各自适用不同情形下利用,以是可以根据实际情形选择利用哪种策略模式,不过fair和url_hash须要安装第三方模块才能利用,由于本文紧张先容Nginx能做的事情,以是Nginx安装第三方模块不会再本文先容。
HTTP做事器Nginx本身也是一个静态资源的做事器,当只有静态资源的时候,就可以利用Nginx来做做事器,同时现在也很盛行动静分离,就可以通过Nginx来实现,首先看看Nginx做静态资源做事器。
image
这样如果访问http://localhost 就会默认访问到E盘wwwroot目录下面的index.html,如果一个网站只是静态页面的话,那么就可以通过这种办法来实现支配。
动静分离动静分离是让动态网站里的动态网页根据一定规则把不变的资源和常常变的资源区分开来,动静资源做好了拆分往后,我们就可以根据静态资源的特点将其做缓存操作,这便是网站静态化处理的核心思路。
image
这样我们就可以把HTML以及图片和css以及js放到wwwroot目录下,而tomcat只卖力处理jsp和要求,例如当我们后缀为gif的时候,Nginx默认会从wwwroot获取到当前要求的动态图文件返回,当然这里的静态文件跟Nginx是同一台做事器,我们也可以在其余一台做事器,然后通过反向代理和负载均衡配置过去就好了,只要搞清楚了最基本的流程,很多配置就很大略了。其余localtion后面实在是一个正则表达式,以是非常灵巧。
正向代理正向代理,意思是一个位于客户端和原始做事器(origin server)之间的做事器,为了从原始做事器取得内容,客户端向代理发送一个要求并指定目标(原始做事器),然后代理向原始做事器转交要求并将得到的内容返回给客户端。当你须要把你的做事器作为代理做事器的时候,可以用Nginx来实现正向代理,但是目前Nginx有一个问题,那便是不支持HTTPS,虽然我百度到过配置HTTPS的正向代理,但是到末了创造还是代理不了,当然可能是我配置的不对,以是也希望有知道精确方法的同道们留言解释一下。
image
resolver是配置正向代理的DNS做事器,listen 是正向代理的端口,配置好了就可以在ie上面或者其他代理插件上面利用做事器ip+端口号进行代理了。
作者:逝者如此灬
链接:https://www.jianshu.com/p/3ca785008a20