1. Nginx基本概念
1.1 Nginx简介
- Nginx是一个高性能的HTTP和反向代理web服务器
- 特点是占有内存少,并发能力强
- Nginx专为性能优化而开发,能经受高负载的考验,有报告表明能支持高达50000个并发连接数
1.2 相关概念
1.2.1 反向代理
正向代理
在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问。
反向代理
- 反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将服务发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器地址。
- 简单理解:对于客户端来说,反向代理服务器把自己当成了目标服务器,至于我要做什么,你客户端不要问,问就是不知道。
1.2.2 负载均衡
单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。
1.2.3 动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
2. Nginx安装
-
官网下载1.12.2版本Nginx
-
安装Nginx相关素材:
-
安装pcre:wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz 可以直接从windows拖到Xshell!
解压
进入解压之后的目录。执行./configure(检查)
执行命令:make && make install
查看版本:pcre-config–version
-
安装zlib、oepnssl:yum -y install make zlib zlib-devel gcc-c++libtool openssl openssl-devel
-
-
安装Nginx:同上安装pcre!
-
安装成功之后,在/usr中会多出一个文件夹local/nginx,在nginx/sbin中有启动脚本
-
启动之后,防火墙要开放80端口号才行,然后访问192.168.200.128:80
3. Nginx常用命令
使用Nginx命令的前提:进入Nginx目录:/usr/local/nginx/sbin
常用命令
- 查看nginx版本号:./nginx -v
- 启动nginx:./nginx
- 关闭nginx:./nginx -s sop
- 重新加载nginx:./nginx -s reload
4. Nginx配置文件
位置
/usr/local/nginx/conf/nginx.conf
组成
-
Nginx配置文件由三部分组成:
-
全局块:从配置文件开始到events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令。主要包括配置运行Nginx服务器的用户(组)、允许生成的worker process数、进程PID存放路径、日志存放路径和类型以及配置文件的引入等。
worker_processes = 1 // 这是Nginx服务器并发处理服务的关键配置,worker_processes值越大,可以支持的并发处理量也就越多,但是会受到硬件、软件设备的制约
-
events块:涉及的指令主要影响Nginx服务器与用户的网络连接。
events { worker_connections 1024 // nginx服务器支持的最大连接数 }
-
http块:Nginx服务器中配置最频繁的部分。Http全局块指令包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上限等。server块和虚拟主机有关系,又包括全局server块和location块
-
5. Nginx配置实例
5.1 反向代理准备工作
-
安装启动Tomcat!8080端口!
-
启动端口80、8080、8081、8082、9001方便后续测试
-
访问过程
5.2 反向代理实例1
效果
在浏览器地址栏输入www.123.com ,然后跳转到Tomcat页面。
过程
-
在window系统的hosts文件中进行域名和ip对应关系的配置
-
在nginx进行请求转发的配置(反向代理配置)
-
启动nginx测试!
5.3 反向代理实例2
效果
访问http://192.168.200.128:9001/edu/ ,直接跳转到127.0.0.1:8080
访问http://192.168.200.128:9001/vod/ ,直接跳转到127.0.0.1:8081
过程
-
两个tomcat服务器,一个8080端口,一个80801端口
-
创建文件夹和测试文件:8080tomcat里有一个项目edu,页面a.html,有一句话8080,8081tomcat里有一个项目vod,页面a.html,有一句话8081
-
开始配置:
开放对外访问的端口号:
-
测试
5.4 负载均衡实例
效果
浏览器地址栏输入http://192.168.200.128:9001/edu/a.html 负载均衡效果,平均到8080端口和8081端口。
准备
-
两台Tomcat服务器,5.3已准备
-
两台Tomcat里面webapps目录中,创建名称是edu文件夹,在edu文件夹中创建页面a.html,用于测试
-
在nginx配置文件中进行负载均衡的配置(第一个红快是在http块设置!)
可以在配置的myserver里面的每个server后加weight=1、2 表示负载权重
-
Nginx提供了几种分配方式:
- 轮询(默认):每个请求按时间顺序分配到后端服务器,如果down掉,自动剔除
- weight:weight代表权重,默认为1,权重越高分配的越多
- ip_hash:每个请求按照ip的hash分配,这样每个访客固定访问后端一个服务器,解决了session的问题,加在第一红块server上一行
- fair(第三方):按后端服务器响应的时间来分配,响应时间短的优先分配。加在第一红块server最后一行
5.5 动静分离实例
动静分离理解
-
Nginx动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat处理动态页面。动静分离从目前实现角度来讲大致分为两种,一种是纯粹把静态文件独立成单独的域名﹐放在独立的服务器上,也是目前主流推崇的方案处理静态页面。另外一种方法就是动态跟静态文件混合在一起发布,通过nginx来分开
-
通过location指定不同的后缀名实现不同的请求转发。通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体Expires定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用Expires来缓存),我这里设置3d,表示在这3天之内访问这个URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码200。
准备工作
在Linux系统中准备一些静态资源:www中放一个html页面,image中放个图片
具体配置
-
在Nginx配置文件中进行配置
-
测试:
输入http://192.168.200.128/image/01.jpg,配置了autoindex on,只访问到image,会列出来目录
输入http://192.168.200.128/www/a.html:
5.6 高可用实例
理解高可用
我们需要有这么两台Nginx服务器,keepAlive,虚拟ip地址
准备工作
- 两台服务器192.168.200.128、192.168.200.129
- 两台服务器上都安装nginx
- 两台服务器上的usr文件夹下都安装keepalived:yum install keepalived -y ,安装完成后,在etc里面生成目录keepalived,有文件keepalived.conf
高可用配置(主从配置)
-
修改etc/keepalived/keepalived.conf: 主机master,那个是100,从机backup,90,都有虚拟主机
! Configuration File for keepalived global_defs { notification_email { [email protected] [email protected] [email protected] } notification_email_from [email protected] smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_script chk_http_port { script "/usr/local/src/nginx_check.sh" interval 2 weight 2 } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.200.16 192.168.200.17 192.168.200.18 } } virtual_server 192.168.200.100 443 { delay_loop 6 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP real_server 192.168.201.100 443 { weight 1 SSL_GET { url { path / digest ff20ad2481f97b1754ef3e12ecd3a9cc } url { path /mrtg/ digest 9b3a0c85a887a256d6939da88aabd8cd } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } virtual_server 10.10.10.2 1358 { delay_loop 6 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP sorry_server 192.168.200.200 1358 real_server 192.168.200.2 1358 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl3/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.200.3 1358 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334c } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334c } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } virtual_server 10.10.10.3 1358 { delay_loop 3 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP real_server 192.168.200.4 1358 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl3/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.200.5 1358 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl3/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
-
在/usr/local/src添加检测脚本
#!/bin/bash a=`ps -C nginx -no-header |wc -l` if [ $A -eq 0];then /usr/local/nginx/sbin/nginx sleep 2 if[ `ps -C nginx --no-header |wc -l` -eq 0 ];then killall keepalived fi fi
-
把两台服务器上的nginx和keepalived启动:systemctl start keepalived.service
-
测试:在浏览器中输入配置文件中虚拟的ip地址:http://192.168.200.16/
-
测试:把主服务器(192.168.200.128)nginx和keepalived都停掉,再看效果:还是可以正常访问!(ip a可以查看虚拟ip的绑定情况)
配置文件解析
检测脚本文件:
6. Nginx原理
两个进程(一个master多个worker)
worker工作流程
优点
- 可以使用nginx -s reload热部署!
- 每个worker是一个独立的进程,如果其中的一个worker出现问题,其他的worker是独立的,会继续进行争抢,实现请求过程,不会发生服务中断
- 设置多少个woker才是最合适的?worker数和cpu数相等是最适宜的
连接数worker_connections
-
发送一个请求,占用worker几个连接数?
如果请求的是静态资源服务器,会占用2个,如果请求的是Tomcat等后台服务器,会占用4个。
-
nginx中有一个master、四个worker,每个woker支持的最大的连接数是1024,那么支持的最大并发数是多少?如果请求的是静态资源服务器,支持1024*4/2=2048个并发,如果请求的是Tomcat服务器,那么支持1024 x 4 / 4=1024个并发