Nginx

1.nginx简介

Nginx (engine x) 是一个高性能的HTTP反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。

其特点是占有内存少,并发能力强。

1.反向代理

代理:其实就是一个中介,A和B本来可以直连,中间插入一个C,C就是中介。

正向代理:正向代理类似一个跳板机,代理访问外部资源

比如我们国内访问谷歌,直接访问访问不到,我们可以通过一个正向代理服务器,请求发到代理服,代理服务器能够访问谷歌,这样由代理去谷歌取到返回数据,再返回给我们,这样我们就能访问谷歌了

正向代理的用途:

  1. 访问原来无法访问的资源,如google。
  2. 可以做缓存,加速访问资源。
  3. 对客户端访问授权,上网进行认证。
  4. 代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息。

反向代理:实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

反向代理的作用:

  1. 保证内网的安全,阻止web攻击,大型网站,通常将反向代理作为公网访问地址,Web服务器是内网
  2. 负载均衡,通过反向代理服务器来优化网站的负载

总结:

  • 正向代理是客户端代理,代理的是客户端,服务端不知道实际发起请求的客户端。
  • 反向代理是服务端代理,代理的是服务端,客户端不知道提供服务的服务端

2.负载均衡

负载均衡实际上就是增加服务器数量,然后将请求分发到各个服务器上,将原先的请求集中到单个服务器的情况改为将请求分发到多个服务器上。

3.动静分离

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

2.nginx安装

依赖直接用yum安装就可以,包括pcre,pcre-devel,zlib,openssl,openssl-devel

将nginx的压缩包放在/usr/local/src下后解压,进入后

  • ./configure —prefix=/usr/local/nginx
  • make
  • make install

进入/usr/local/nginx/conf,编辑nginx.conf配置文件,将端口改为8090(不和apache服务器冲突),添加防火墙放行端口

进入/usr/local/nginx/sbin

执行 : ./nginx 开启

执行 ps -ef | grep nginx确定是否开启

说明nginx已经开启了。

用浏览器访问192.168.125.129:8090【ip也是在上面的配置文件里面配置的】

3.nginx常用命令

下面的命令是相对路径格式,因此要先进入/usr/local/nginx/sbin目录下

  • 查看nginx版本号
  1. ./nginx -v
  • 启动nginx
  1. ./nginx
  • 停止nginx
  1. ./nginx -s stop
  • 重新加载nginx
  1. ./nginx -s reload

4.nginx配置文件

4.1.位置

vim /usr/local/nginx/conf/nginx.conf

4.2.全局块(配置服务器整体运行的配置指令)

从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。

其中work_processes是nginx鬓发处理服务器的关键配置,work_processes的值越大,可以支持的鬓发处理量就越多,但是会受到硬件,软件等限制。

4.3.events块(影响 Nginx 服务器与用户的网络连接)

events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 wordprocess 可以同时支持的最大连接数等(并发数)。

上述例子就表示每个 work process 支持的最大连接数为 1024.这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。

4.4.http块

Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。需要注意的是:http 块也可以包括 http 全局块、server 块。

4.4.1.http全局块

http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。

4.4.2.server块

这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。

每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。

ip与监听端口就是在这里面配置的

4.4.3.location块

一个 server 块可以配置多个 location 块。这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

5.nginx配置实例

5.1.反向代理

实验1

实现效果:访问nginx服务器时跳转到tomcat服务器(只方向代理一个服务器)

1.准备
  1. nginx服务器
  2. 一个Tomcat服务器
  3. java运行环境
  • 其中nginx服务器已经启动【在192.168.125.129:8090端口】
  • Tomcat服务器不同于nginx,不要./configure,make,make file这些步骤,只需要java的运行环境,把Tomcat的源码把放到/usr/local/tomcat这个目录下。
  • 然后再/usr/local下新建java目录,下载jdk的tar源码包,解压到这里面,改名为jdk1.8(方便)然后再在/etc/profile文件中添加环境变量。如下:
  • 执行 resource /etc/profile 使配置生效
  • 执行java -version查看是否成功,如下显示则成功
  • 回到/usr/local/tomcat里面,进入到tomcat8080/bin下,执行./startup.sh开启【8080表示这个tomcat开启的是8080端口】
  • 设置防火墙开放8080端口的访问
  • 配置完成,在浏览器中访问
  • 成功。

2.配置nginx

进入/usr/local/nginx/conf/nginx.conf里面配置,核心是htttp块中的server块中的location块

每个 server 块就相当于一个虚拟主机。而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。location表示的就是对请求路径的处理,默认是没有proxy_pass的,由于是“/”表示访问任何路径都跳转到index.html中,基于此原理,我们要实现访问nginx是跳转到tomcat中就要修改跳转路径,这就是proxy_pass这个字段的作用,后面的值是tomcat的端口。,保存后退出重启nginx服务,访问192.168.125.129:8090【nginx的路径】就直接跳转到tomcat中了。

实验2

上面的实验中只实现了nginx对一个服务器的代理,这个实验要实现对多个服务器的反向代理。

1.准备

显然,一个tomcat无法模拟出多个服务器的效果,于是我们需要同时开启两个tomcat服务器。

  • 先把原来的tomcat复制一个,预计监听8081端口
  • tomcat默认的端口是8080,修改它的默认配置/tomcat8081/conf/server.xml

  • 需要修改3个位置【shutdown的端口,http端口与https端口】


  • 注意在默认值的基础上,http端口变化了多少,最好其他三个就变化多少【这里http端口从8080变到8081,于是shutdown从8005变到8006,https从8443变到8444(不是强制,这是方便)】

  • 为了区分两个服务器,我们在两个服务器的webapps里面分别创建一个测试项目

  • /tomcat8080/webapps/8080test/a.html

  • /tomcat8081/webapps/8081test/a.html

2.nginx配置

下面的两个location是核心,这里使用了正则表达式,表示,如果在路径中出现了8080test(8081test)时就把url【协议名://ip:端口】替换为指定的url。

3.效果

5.2.负载均衡

1.准备

两个tomcat服务器,一个在8080端口,一个在8081端口。分别在webapps中创建一个相同的文件夹loadtest,在里面新建a.html

2.nginx配置

  • 先配置一个负载均衡的总跳转路由【其中servers可以随便取一个名字】
  • 然后就可以配置location了

效果就是当访问路径中有loadtest时,就会根据1:1的权重(即概率)随机分发要指定的两个tomcat服务器上处理。当然weight只是其中一种负载均衡策略,还有其他的几种。

3.负载均衡策略

3.1.轮询(默认)

每个请求按照时间顺序逐一分配到不同的后端服务器,如果后端服务器dowm掉就自动删除。

  1. upstream backserver {
  2. server 192.168.125.14;
  3. server 192.168.125.15;
  4. }

3.2.weight

weight代表权重,weight越大被分配的客户端就越多

  1. upstream backserver {
  2. server 192.168.0.14 weight=8;
  3. server 192.168.0.15 weight=10;
  4. }

3.3.ip_hash

每个按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决sesson的问题。

  1. upstream backserver {
  2. ip_hash;
  3. server 192.168.0.14:88;
  4. server 192.168.0.15:80;
  5. }

5.3.动静分离

1.概念

  • 静态资源: 当用户多次访问这个资源,资源的源代码永远不会改变的资源。
  • 动态资源:当用户多次访问这个资源,资源的源代码可能会发送改变。
  • 动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路。
  • 动静分离简单的概括是:动态文件与静态文件的分离。
  • 动静分离将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用访问。这里我们将静态资源放到nginx中,动态资源转发到tomcat服务器中。
  • 因此,动态资源转发到tomcat服务器我们就使用到了前面讲到的反向代理了。

2.准备

  • 动态的处理实际上就是反向代理和负载均衡处理的
  • 我们准备静态资源,显然静态资源不放在tomcat中,而是要nginx单独处理,所以我们实际上可以把静态资源放在nginx所在主机的任何位置【只要是nginx可以找到的位置】,方便起见,在更目录下直接创建static目录,里面再创建image目录存放图片资源。

3.nginx配置

实际上这么一句,含义是:当路径中出现 /image/时将根路径【协议://ip:端口】替换为/static,于是当我们请求192.168.125.129:8090/image/logo.png是访问的是/static/image/logo.png。

5.4.高可用集群

1.概念

我们之前的不论反向代理还是负载均衡还是动静分离都是由一个nginx服务器完成的,但是实际上是可能出现nginx也宕机的情况的,于是我们可能需要多台nginx服务器,它们拥有相同的配置【当然ip和端口不同】,一台作为主服务器[master],其他的作为从服务器[backup],如果主服务器宕机,就让从服务器替代。从而实现高可用。

2.准备

由于有多台nginx服务器,我们需要更高一层去管理这些nginx服务器,监控它们的状态,可以用keepalived这个软件【yum -y install keepalived】。

还需要多台主机同时运行nginx【当然也可以是多个虚拟机,但是太麻烦了,实验就不搭了】,我们假设现在已经有了两几台nginx服务器了。

3.keepalived配置

位置:/etc/keepalived/keeplived.conf【yum安装后自动生成在这里】。

  1. ! Configuration File for keepalived
  2. global_defs { #全局定义部分
  3. notification_email { #设置报警邮件地址,可设置多个
  4. acassen@firewall.loc #接收通知的邮件地址
  5. }
  6. notification_email_from test0@163.com #设置 发送邮件通知的地址
  7. smtp_server smtp.163.com #设置 smtp server 地址,可是ip或域名.可选端口号 (默认25)
  8. smtp_connect_timeout 30 #设置 连接 smtp server的超时时间
  9. router_id LVS_DEVEL #主机标识,用于邮件通知
  10. vrrp_skip_check_adv_addr
  11. vrrp_strict #严格执行VRRP协议规范,此模式不支持节点单播
  12. vrrp_garp_interval 0
  13. vrrp_gna_interval 0
  14. script_user keepalived_script #指定运行脚本的用户名和组。默认使用用户的默认组。如未指定,默认为keepalived_script 用户,如无此用户,则使用root
  15. enable_script_security #如过路径为非root可写,不要配置脚本为root用户执行。
  16. }
  17. vrrp_script chk_nginx_service { #VRRP 脚本声明
  18. script "/etc/keepalived/chk_nginx.sh" #周期性执行的脚本
  19. interval 3 #运行脚本的间隔时间,秒
  20. weight -20 #权重,priority值减去此值要小于备服务的priority值
  21. fall 3 #检测几次失败才为失败,整数
  22. rise 2 #检测几次状态为正常的,才确认正常,整数
  23. user keepalived_script #执行脚本的用户或组
  24. }
  25. vrrp_instance VI_1 { #vrrp 实例部分定义,VI_1自定义名称
  26. state MASTER #指定 keepalived 的角色,必须大写 可选值:MASTER|BACKUP
  27. interface ens33 #网卡设置,lvs需要绑定在网卡上,realserver绑定在回环口。区别:lvs对访问为外,realserver为内不易暴露本机信息
  28. virtual_router_id 51 #虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致
  29. priority 100 #定义优先级,数字越大,优先级越高。
  30. advert_int 1 #设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒,两个节点设置必须一样
  31. authentication { #设置验证类型和密码,两个节点必须一致
  32. auth_type PASS
  33. auth_pass 1111
  34. }
  35. virtual_ipaddress { #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
  36. 192.168.119.130
  37. }
  38. track_script { #脚本监控状态
  39. chk_nginx_service #可加权重,但会覆盖声明的脚本权重值。chk_nginx_service weight -20
  40. }
  41. notify_master "/etc/keepalived/start_haproxy.sh start" #当前节点成为master时,通知脚本执行任务
  42. notify_backup "/etc/keepalived/start_haproxy.sh stop" #当前节点成为backup时,通知脚本执行任务
  43. notify_fault "/etc/keepalived/start_haproxy.sh stop" #当当前节点出现故障,执行的任务;
  44. }
  45. virtual_server 192.168.119.130 80 { #定义RealServer对应的VIP及服务端口,IP和端口之间用空格隔开
  46. delay_loop 6 #每隔6秒查询realserver状态
  47. lb_algo rr #后端调试算法(load balancing algorithm)
  48. lb_kind DR #LVS调度类型NAT/DR/TUN
  49. #persistence_timeout 60 同一IP的连接60秒内被分配到同一台realserver
  50. protocol TCP #用TCP协议检查realserver状态
  51. real_server 192.168.119.120 80 {
  52. weight 1 #权重,最大越高,lvs就越优先访问
  53. TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
  54. connect_timeout 10 #10秒无响应超时
  55. retry 3 #重连次数3次
  56. delay_before_retry 3 #重连间隔时间
  57. connect_port 80 #健康检查realserver的端口
  58. }
  59. }
  60. real_server 192.168.119.121 80 {
  61. weight 1 #权重,最大越高,lvs就越优先访问
  62. TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
  63. connect_timeout 10 #10秒无响应超时
  64. retry 3 #重连次数3次
  65. delay_before_retry 3 #重连间隔时间
  66. connect_port 80 #健康检查realserver的端口
  67. }
  68. }
  69. }
  70. vrrp_instance VI_2 { #vrrp 实例部分定义,VI_2自定义名称
  71. state BACKUP #指定 keepalived 的角色,必须大写 可选值:MASTER|BACKUP 分别表示(主|备)
  72. interface ens33 #网卡设置,绑定vip的子接口,lvs需要绑定在网卡上,realserver绑定在回环口。区别:lvs对访问为外,realserver为内不易暴露本机信息
  73. virtual_router_id 52 #虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致
  74. priority 90 #定义优先级,数字越大,优先级越高。
  75. advert_int 1 #设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒,两个节点设置必须一样
  76. authentication { #设置验证类型和密码,两个节点必须一致
  77. auth_type PASS
  78. auth_pass 1111
  79. }
  80. virtual_ipaddress { #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
  81. 192.168.119.131
  82. }
  83. }
  84. virtual_server 192.168.119.131 80 { #定义RealServer对应的VIP及服务端口,IP和端口之间用空格隔开
  85. delay_loop 6 #每隔6秒查询realserver状态
  86. lb_algo rr #后端调试算法(load balancing algorithm)
  87. lb_kind DR #LVS调度类型NAT/DR/TUN
  88. #persistence_timeout 60 #同一IP的连接60秒内被分配到同一台realserver
  89. protocol TCP #用TCP协议检查realserver状态
  90. real_server 192.168.119.120 80 {
  91. weight 1 #权重,最大越高,lvs就越优先访问
  92. TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
  93. connect_timeout 10 #10秒无响应超时
  94. retry 3 #重连次数3次
  95. delay_before_retry 3 #重连间隔时间
  96. connect_port 80 #健康检查realserver的端口
  97. }
  98. }
  99. real_server 192.168.119.121 80 {
  100. weight 1 #权重,最大越高,lvs就越优先访问
  101. TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
  102. connect_timeout 10 #10秒无响应超时
  103. retry 3 #重连次数3次
  104. delay_before_retry 3 #重连间隔时间
  105. connect_port 80 #健康检查realserver的端口
  106. }
  107. }
  108. }

这个配置文件包含以下几部分:

  • global_defs【全局定义部分】
  • vrrp_script chk_nginx_service 【检测脚本的位置:这个shell脚本实现的就是对nginx服务器状态的监控。注意,是要自己写的】
  • vrrp_instance VI_1 【这就是一个服务器实例(这里我们是nginx)】,里面有一个重要的字段 virtual_ipaddress即VIP(虚拟IP)与vrrp_instance一对一,每个虚拟IP可以对接多台nginx主机,一个keepalived可以有多个虚拟IP,我们访问时访问的就是虚拟IP
  • virtual_server【对虚拟IP对接的主机的具体配置】
  • real_server【是virtual_server里面的字段,可以有多个(相当于负载均衡),即是对真实机的ip与端口的配置,让虚拟ip可以知道去那里监控服务器】。