Nginx是一个高性能的HTTP和反向代理服务器,特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。Nginx,专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率﹐能经受高负载的考验,有报告表明能支持高达50, 000个并发连接数。
1.1 正向代理Nginx,不仅可以做反向代理,实现负载均衡。还能用作正向代理来进行上网等功能。
正向代理:如果把局域网外的 Internet想象成一个巨大的资源库,则局域网中的客户端要访问Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。
通俗的讲,在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问,这种方式就是正向代理。
1.2 反向代理反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。
1.3 负载均衡单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。
1.4 动静分离为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
二、nginx的安装nginx安装指南
三、nginx常用命令1. 使用nginx操作命令前提条件:必须进入nginx的目录
/usr/local/nginx/sbin
2. 查看nginx的版本号
./nginx -v
3. 启动nginx
./nginx
4. 关闭nginx
./nginx -s stop
5. 重新加载nginx
./nginx -s reload
四、nginx配置文件
4.1 nginx配置文件位置
/usr/local/nginx/conf/nginx.conf
第一部分:全局块
从配置文件开始到events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令,主要包括配置运行nginx服务器的用户组、允许生成的worker process数,进程pid存放路径,日志存放路径和类型以及配置文件的引入等。
比如上面第一行配置的:
worker_processes 1;
这是nginx服务器并发处理服务的关键配置,worker_processes值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约。
第二部分:events块
比如上面的配置
events块涉及的指令主要影响Nginx服务器与用户的网络连接,常用的设置包括是否开启对多work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个word process可以同时支持的最大连接数等。
上述例子就表示每个work process支持的最大连接数为1024.
这部分的配置对nginx的性能影响较大,在实际中应该灵活配置。
第三部分:http块
这算是nginx服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。需要注意的是:http块也可以包括http全局块、server块
(1)http全局块
http全局块配置的指令包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上限等。
(2)server块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
每个http 块可以包括多个server 块,而每个server 块就相当于一个虚拟主机。
而每个server 块也分为全局server 块,以及可以同时包含多个 locaton块。
1.全局server块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。
2.location块
一个server块可以配置多个location块。
这块的主要作用是基于nginx服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是IP别名)之外的字符串(例如 前面的/uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
五、nginx配置实例-反向代理 5.1 实现效果打开浏览器,在浏览器地址栏输入地址www.123.com,跳转到linux系统tomcat主页面中。
5.2 准备工作(1) 在linux系统安装tomcat,使用默认端口8080
tomcat安装文件放到linux系统中,解压
进入tomcat的bin目录中,./startup.sh启动tomcat服务器
安装配置jdk,tomcat
(2) 对外开放访问的端口
1. 开放8080端口
firewall-cmd --add-port=8080/tcp --permanent
2. 重启防火墙
firewall-cmd -reload
3. 查看已经开放的端口号
firewall-cmd --list-all
4. 查看防火墙状态
systemctl status firewalld
5. 开启防火墙
systemctl start firewalld
6. 关闭防火墙
systemctl stop firewalld
(3) 在windows系统中通过浏览器访问tomcat服务器
(1) 添加内容在host文件中
使用nginx反向代理,根据访问的路径跳转到不同端口的服务中
nginx监听端口为9001
访问http://127.0.0.1:9001/edu/ 直接跳转到127.0.0.1:8081
访问http://127.0.0.1:9001/vod/直接跳转到127.0.0.1:8082
6.2 准备工作 6.2.1 准备两个tomcat服务器,一个8080端口,一个8081端口1. 新建8080/8081文件夹,各拷贝一个文件解压
2. 干掉正在运行的tomcat
3. 进入8081/conf文件改端口号
4. 启动两个tomcat
5. 开启访问端口
6. 测试
在tomcat webapp下分别创建两个文件夹edu/vod
1. 找到nginx配置文件,进行反向代理配置
2. 开放对外访问的端口号9001 8080 8081
3. 重启nginx
4. location指令说明
随着互联网信息的爆炸性增长,负载均衡(load balance)已经不再是一个很陌生的话题,顾名思义,负载均衡即是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验。
7.1 实现效果(1)浏览器地址栏输入地址http://192.168.208.134:8080/edu/a.html,负载均衡效果,平均8080和8081端口中
7.2.准备工作(1)准备两台tomcat服务器,一台8080,一台8081
(2)在两台tomcat里面webapps目录中,创建名称是edu文件夹,在edu文件夹中创建页面a.html,用于测试
7.3 在nginx的配置文件中进行负载均衡的配置重启nginx
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
7.5.2 weightweight代表权重,默认为1,权重越高被分配的客户端越多。
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
upstream server_pool {
server 192.168.5.21 weight=10;
server 192.168.5.22 weight=10;
}
7.5.3 ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。例如
upstream server_pool {
ip_hash;
server 192.168.5.21;
server 192.168.5.22;
}
通俗来讲,假如第一次访问的是192.168.5.21这个服务器,那么它后面都会是访问这个服务器,让用户指定访问某一台服务器。
7.5.4 fair(第三方)按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream server_pool {
fair;
server 192.168.5.21;
server 192.168.5.22;
}
访问服务器,谁的响应时间短,先给谁分配。
八、nginx配置实例-动静分离 8.1 概念nginx动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用nginx处理静态页面,tomcat处理动态页面。
动静分离从目前实现角度来讲大致分为两种:
一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
另一种就是动态跟静态文件混合在一起发布,通过nginx来分开。通过location指定不同的后缀名实现不同的请求转发。
新建www/image文件夹
http://192.168.208.134/image/01.png
http://192.168.208.134/www/a.html
原来只有一台nginx服务,当这台宕机了以后,整个服务都不可用了
准备两个nginx服务器,一台master节点,一台bakckup节点,平时用主节点,当主节点挂了之后,能切换到备用节点。
(1)需要两台nginx服务器
(2)需要keepalived
(3)需要虚拟ip
9.3 配置高可用的准备工作(1)需要两台服务器192.168.17.129和192.168.17.131
(2)在两台服务器安装nginx
(3)在两台服务器安装keepalived
9.4 在两台服务器安装keepalived(1) 使用yum命令进行安装
1.安装
yum install keepalived -y
2.查看是否安装成功
rpm -q -a keepalived
(2)安装之后,在etc里面生成目录keepalived,有文件keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL #访问到主机
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 #检测脚本执行的间隔
weight 2 # 设置当前服务器权重
}
vrrp_instance VI_1 {
state MASTER # 备份服务器上将MASTER改为BACKUP
interface ens33 # 网卡名字
virtual_router_id 51 # 主、备机的virtual_router_id必须相同
priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1 # 检测是否还活着,默认1s
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.16
192.168.200.17 # VRRP H虚拟地址
192.168.200.18
}
}
}
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
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 MASTER # 备份服务器上将MASTER改为BACKUP
interface ens33 # 网卡名字
virtual_router_id 51 # 主、备机的virtual_router_id必须相同
priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.16
192.168.200.17 # VRRP H虚拟地址
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
}
}
}
9.5.2 在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
9.5.3 把两台服务器上nginx和keepalived启动
启动 nginx: ./nginx
启动 keepalived: systemctl start keepalived.service
(1) 在浏览器地址栏输入虚拟ip地址
(2)把主服务器nginx和keepalived停止
systemctl stop keepalived.service
cd /usr/local/nginx/sbin/
./nginx -s stop
还是可以正常访问
发送请求先到nginx的master,相当于一个管理员,管理员得到任务之后,把任务给到下面的worker,worker通过争抢机制得到一个任务,通过反向代理,用tomcat完成具体的操作。
1)可以使用nginx -s reload热部署,利于nginx进行热部署操作。
2)每个worker是独立的进程,如果有其中的一个worker出现问题,其他worker独立的,继续进行争抢,实现请求过程,不会造成服务中断。
首先,对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其他进程还在工作,服务不会中断,master进程则很快启动新的worker进程。当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险。
10.2.2 需要设置多少个workerworker数和服务器的cpu数相等是最为适宜的。
nginx通redis类似都采用了io多路复用机制,每个worker都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求,即使是成千上万个请求也不在话下。每个worker的线程可以把一个cpu的性能发挥到极致。所以worker数和服务器的cpu数相等是最为适宜的。设少了会浪费cpu,设多了会造成cpu频繁切换上下文带来的损耗。
10.2.3 设置worker数量worker_processes 4
1.work绑定cpu(4work绑定4cpu)
worker_cpu_affinity 0001 0010 0100 1000
2.work绑定cpu(4work绑定8cpu中的4个)
worker_cpu_affinity 0000001 00000010 00000100 00001000
10.2.4 连接数worker_connection第一个:发送请求,占用了worker的几个连接数?
答案:2或者4个
第二个:nginx有一个master,有四个worker,每个worker支持最大的连接数1024,支持的最大并发数是多少?
普通的静态访问最大并发数是:worker_connections*worker_processes/2,不经过tomcat
而如果是HTTP作为反向代理来说,最大并发数量应该是worker_connections*worker_processes/4
视频教程