1、Nginx简介
1.1 Nginx概述
Nginx 是高性能的 HTTP 和反向代理的服务器,处理高并发能力是十分强大的,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数。
1.2 反向代理
正向代理:客户端要访问Internet,需要在客户端配置代理服务器,通过代理服务器进行互联网访问。在如今的网络环境下,我们如果由于技术需要要去访问国外的某些网站,此时你会发现位于国外的某网站我们通过浏览器是没有办法访问的,此时大家可能都会用一个代理进行访问,代理的方式主要是找到一个可以访问国外网站的代理服务器,我们将请求发送给代理服务器,代理服务器去访问国外的网站,然后将访问到的数据传递给我们!
上述这样的代理模式称为正向代理,正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。
反向代理:反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器(就是指后端处理业务的服务器) IP 地址。多个客户端给反向代理服务器发送请求,Nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理。注意这是将客户端的请求分发给后端服务器,所以此时客户端是明确的。但是请求具体由哪台服务器处理的并不明确,此时Nginx扮演的就是一个反向代理角色。客户端是不能感知到代理的存在的,反向代理对外都是透明的,访问者并不知道其实自己访问的就是一个代理。
总结:正向代理隐藏客户端,反向代理隐藏客户端
1.3 负载均衡
概念:增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器
1.4 动静分离
概念:为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
2、Nginx常用的命令和配置文件
2.1 Nginx的安装
在Linux系统(centos)上安装Nginx
(1)安装openssl、zlib、 gcc 依赖
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
(2)安装pcre(本次选用的是8.37版本的)
-
联网下载 浏览器搜pcre即可
-
使用命令 cd /usr/src 进入到src目录下
-
将第一步下载好的文件放到src目录下
-
使用命令 tar –xvf pcre-8.37.tar.gz 解压pcre压缩文件,解压完后 cd pcre-8.37
-
使用命令 ./configure ,完成后执行命令 make && make install 完成安装
-
可以使用 pcre-config --version 可以查看版本号
(3)安装 Nginx
1、切换到 src目录下 将Nginx的压缩包放入src目录下,并解压缩 nginx-xx.tar.gz 包。
2、 进入解压缩完后的目录,执行 ./configure
3、 最后执行 make && make install
(4)检查
在安装完成后,执行 cd /usr/local 发现里面会多出一个文件夹 nginx
cd nginx/sbin 后 ./nginx 启动nginx
再输入命令:ps -ef | grep nginx 可以查看相关信息
在浏览器上输入你 linux 的ip地址(nginx默认端口号是80),出现如下界面
2.2 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
2.3 Nginx的配置文件
-
nginx 配置文件位置
cd /usr/local/nginx/conf 下的 nginx.conf
-
配置文件中的内容
包含三部分内容
(1)全局块:配置服务器整体运行的配置指令
比如 worker_processes 1;处理并发数的配置
(2)event块:影响Nginx服务器与用户的网络连接
比如 worker_connections 1024; 支持的最大连接数为 1024
(3)http块
这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里
-
http全局块
http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
-
server块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
(1)全局 server 块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
(2)location 块
一个 server 块可以配置多个 location 块。
这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
2.4 Nginx配置实例
2.4.1 反向代理实例一
1、实现效果
打开浏览器,在浏览器地址栏输入地址 www.123.com,跳转到 liunx系统 tomca主页面中
2、准备工作
在liunx 系统安装 tomcat,使用默认端口8080
tomcat安装文件放到liunx系统中,解压
进入 tomcat 的 bin 目录中,./startup.sh启动 tomcat 服务器
3、对外开放8080端口
对外开放访问端口
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload
查看已经开放的端口号
firewall-cmd --list-all
4、在windows系统浏览器中访问tomcat主页面
linux IP地址:8080
5、访问过程分析
也可以不用域名,用Linux的ip地址也行 然后nginx把它交给tomcat处理
6、具体配置
不适用域名,跳过修改host文件
第一步:在nginx.conf进行具体配置
上面的IP地址是linux 的ip地址
下面是加进去的
7、最终测试
个人理解·:nginx配置linux虚拟机的ip地址,主机通过访问这个IP地址,也就是访问nginx代理服务器,代理服务器在转发到127.0.0.1:8080也就是tomcat
2.4.2 反向代理实例二
1、实现效果
使用nginx 反向代理,根据访问的路径跳转到不同端口的服务中
nginx监听端口为9001
访问 http:// 192.168.17.129:9001/edu/ 直接跳转到 127.0.0.1:8080
访问 http:// 192.168.17.129:9001/vod/ 直接跳转到 127.0.0.1:8081
2、准备工作
(1)准备两个tomcat服务器,一个8080端口,一个8081端口
其实是两个tomcat文件,一个设置8080端口,一个设置8081端口,改完后记得开放8081端口,具体介绍前面有
(2)准备工作
在为8080端口的tomcat的webapps创建名为 edu的文件夹,里面放入a.html
在为8081端口的tomcat的webapps创建名为 vod的文件夹,里面放入a.html
访问结果如下图
(3)具体配置
-
进入配置文件
cd /usr/local/local/nginx/conf
vim nginx.conf
-
-
~ 表示该式是正则表达式~
-
对外开放9001、8080、8081端口号
-
重启nginx
cd /usr/local/nginx/sbin
./nginx -s stop
./nginx
-
最终效果
location 指令说明
该指令用于匹配 URL。
语法如下:
location = uri{ }
1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配
成功,就停止继续向下搜索并立即处理该请求。
2、~:用于表示 uri 包含正则表达式,并且区分大小写。
3、~*:用于表示 uri 包含正则表达式,并且不区分大小写。
4、^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字
符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。
注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。
2.4.3 负载均衡实例
1、实现效果
浏览器地址栏输入地址 192.168.17.129/edu /a.html,负载均衡效果,平均8080和8081端口中
2、准备工作
(1)准备两台服务器,一台8080端口号,一台8081端口号
(2)在两台tomcat里面webapps目录中,创建名称是edu文件夹(两者都是),在edu文件夹中创建页面a.html,用于测试
(3)在nginx的配置文件中进行负载均衡的配置
myserver 是自己起的名字
记得重启nginx
(4)最终效果
点击刷新,两者来回变动,这是轮询,待会会介绍
2.4.4 负载均衡分配方式
随着互联网信息的爆炸性增长,负载均衡(load balance)已经不再是一个很陌生的话题,顾名思义,负载均衡即是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验。快速增长的访问量和数据流量催生了各式各样的负载均衡产品,很多专业的负载均衡硬件提供了很好的功能,但却价格不菲,这使得负载均衡软件大受欢迎,nginx 就是其中的一个,在 linux 下有 Nginx、LVS、Haproxy 等等服务可以提供负载均衡服务,而且 Nginx 提供了几种分配方式(策略):
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器*down掉,能自动剔除。
2、weight
weight代表权重默认为1,权重越高被分配的客户端越多
指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。
3、ip_hash
每个请求按访问ip 的hash结果分配,这样每个访客固定访问一个后端服务器
比如我第一次访问到的是8080端口,那么我后面还是用这个IP访问,访问到的一直是8080
使用ip_hash负载均衡方式,可以保证用户的每一次会话都只会发送到同一台特定的Tomcat里面,它的session不会跨到其他的tomcat里面去的,从而session不会丢失
4、fair
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
2.4.5 动静分离实例
1、动静分离
Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx 处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种,
一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。
通过 location 指定不同的后缀名实现不同的请求转发。通过 expires(在location块里面加) 参数设置,可以设置浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。如果经常更新的文件,不建议使用 expires 来缓存,比如我这里设置 3d,表示在这 3 天之内访问这个 URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码 200。
2、准备工作
(1)在linux系统上准备静态资源,用于访问
注:在根目录下创建data目录,里面有两个目录,一个放图片,一个放网页
(2)在 nginx.conf 中进行配置、
当nginx的配置中autoindex为on时,访问目录
3、最终测试
出现目录的这种情况,正是 autoindex起了作用
网页效果
2.4.6 高可用集群的配置
1、高可用
2、准备工作
(1)需要两台服务器
(2)在两台服务器安装nginx
(3)在两台服务器安装keepalived
使用命令:yum install keepalived -y
安装之后,在 /etc里面生成目录keepalived,有文件keepalived.conf
3、完成高可用配置
(1)这是主服务器,修改/etc/keepalived/keepalived.conf文件
global_defs { # 全局定义
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.17.125 #注意这是当前linux的IP地址
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh" # 检测脚本的路径,检测当前nginx是否宕机
interval 2 #(检测脚本执行的间隔)
weight 2 # 权重
}
vrrp_instance VI_1 {
state MASTER # 备份服务器上将 MASTER 改为 BACKUP
interface eth0 //网卡 ifconfig可看出
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 150 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.17.50 // VRRP H 虚拟地址
} }
(2)从服务器
global_defs { # 全局定义
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.17.129 #注意这是当前linux的IP地址
smtp_connect_timeout 30
router_id LVS_DEVEL # 访问到主机
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh" # 检测脚本的路径,检测当前nginx是否宕机
interval 2 #(检测脚本执行的时间间隔)
weight 2 # 权重
}
vrrp_instance VI_1 {
state BACKUP # 备份服务器上将 MASTER 改为 BACKUP
interface eth0 //网卡 ifconfig可看出
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.17.50 // VRRP H 虚拟地址
} }
(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
(4)把两台服务器的nginx和keepalived都启动起来
./nginx
启动keepalived:systemctl start keepalived.service
(5)最终效果
3、Nginx的原理
1、master和worker
2、worker是如何进行工作的
master-workers 的机制的好处
首先,对于每个 worker 进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master 进程则很快启动新的worker 进程。当然,worker 进程的异常退出,肯定是程序有 bug 了,异常退出,会导致当前 worker 上的所有请求失败,不过不会影响到所有请求,所以降低了风险。
3、一个 master 和多个 woker有好处
(1)可以使用 nginx –s reload 热部署,利用nginx进行热部署操作
(2) 每个woker 是独立的进程,如果有其中的一个woker出现问题,其他woker独立的,继续进行争抢,实现请求过程,不会造成服务中断
4、设置多少个woker合适
worker数和服务器的cpu数相等是最为适宜的
5、连接数worker_connection
第一个:发送请求,占用了 woker 的几个连接数? 答案:2 或者 4 个 第二个:nginx 有一个 master,有四个 woker,每个 woker 支持最大的连接数 1024,支持的最大并发数是多少?
普通的静态访问最大并发数是: worker_connections * worker_processes /2,
而如果是 HTTP 作 为反向代理来说,最大并发数量应该是 worker_connections * worker_processes/4。
j解释:一个 nginx 能建立的最大连接数,应该是 worker_connections * worker_processes。当然,这里说的是最大连接数,对于HTTP 请 求 本 地 资 源 来 说 , 能 够 支 持 的 最 大 并 发 数 量 是 worker_connections * worker_processes,如果是支持 http1.1 的浏览器每次访问要占两个连接,所以普通的静态访问最大并发数是: worker_connections * worker_processes /2,而如果是HTTP 作 为反向代理来说,最大并发数量应该是 worker_connections * worker_processes/4。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。
#设置 worker 数量。 worker_processes 4 #work 绑定 cpu(4 work 绑定 4cpu)。 worker_cpu_affinity 0001 0010 0100 1000 #work 绑定 cpu (4 work 绑定 8cpu 中的 4 个) 。 worker_cpu_affinity 0000001 00000010 00000100 00001000