四、Nginx的配置实例
1、反向代理
实例1
① 实现效果
1)打开浏览器,在浏览器地址栏输入www.123.com,跳转Linux系统中的tomcat主页面
② 准备工作
1)在Linux系统上安装tomcat,使用默认端口8080
- 使用xftp上传tomcat压缩包,并解压
- 进入tomcat的bin目录中,使用 ./startup.sh 启动tomcat服务器
2)对外开放访问的8080端口
firewall-cmd --add-port=8080/tcp --permanent # 开放8080端口
firewall-cmd --reload # 重启防火墙
3)在浏览器中访问tomcat服务器
③ 访问过程分析
④ 具体配置
第一步 在windows系统的host文件进行域名和ip对应关系的配置
添加内容到host文件中。此配置表示访问www.123.com时,会转发请求到192.168.242.135上,此IP时我虚拟机的IP。
第二步 在nginx中进行请求转发的配置(反向代理配置)
- 将server_name这一栏改为自己虚拟机的ip地址,因为我是在本机上配置的虚拟机,所以可以用localhost
- 在location块中设置:
proxy_pass http://127.0.0.1:8080
如上配置,我们监听80端口,访问域名为www.123.com,不加端口号时默认为80端口,故访问域名时会跳转到127.0.0.1:8080路径上。在浏览器端输入www.123.com,结果如下
实例2
① 实现效果
使用nginx反向代理,根据访问的路径跳转到不同端口的服务中
- nginx监听端口为9001
- 访问http://虚拟机ip:9001/edu/ 直接跳转到127.0.0.1:8080
- 访问http://虚拟机ip:9001/vod/ 直接跳转到127.0.0.1:8081
② 准备工作
1)准备两个tomcat服务器,一个8080端口,一个8081端口
- 新建两个文件夹,分别来放两个tomcat服务器
mkdir tomcat8080
mkdir tomcat8081
- 修改8081端口的tomca的配置文件
2)创建文件夹和测试页面
- 进入tomcat8080的文件夹,在webapps目录下创建/edu目录,并在文件夹中创建一个测试页面
另一个服务器同理。
③ 具体配置
1)找到nginx配置,进行反向代理配置
2)对外开放9001、8081、8080端口
④ 最终测试
location指令说明
该指令用于匹配URL
语法如下:
location [ = | ~ | ~* | ^~] uri{
...
}
- = :用于不含正则表达式的uri前,要求请求字符串与uri严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
- ~:用于表示uri包含正则表达式,并且区分大小写。
- ~*:用于表示uri包含正则表达式,并且不区分大小写。
- ^~:用于不含正则表达式的uri前,要求Nginx服务器找到标识uri和请求字符串匹配度最高的location 后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配。。
2、负载均衡
① 实现效果
1)浏览器地址栏输入http://虚拟机ip/edu/a.html
,负载均衡效果,平均分发到8081和8080端口
② 准备工作
1)准备两台tomcat服务器,8080和8081
2)在两台tomcat里面的webapps目录中,创建名称edu文件夹,在edu文件夹中创建页面a.html,用于测试
③ 在nginx的配置文件中进行负载均衡的配置
这里填tomcat的默认ip 127.0.0.1好像也可以
④ 最终测试
每次刷新浏览器都会重新分发到另一个tomcat上
⑤ Nginx负载均衡的几种分配方式(策略)
轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除weight
weight代表权,重默认为1,权重越高被分配的客户端越多。
指定轮询几率,weight和访问比率成正比用于后端服务器性能不均的情况。
upstream server_pool{
server 192.168.242.135:8080 weight=5 #8080端口权重为5
server 192.168.242.135:8081 weight=10 #8081端口权重为10
}
ip_hash
每个请求按访问IP的hash结果分配,这样每个固定访问一个后端服务器,可以解决session问题。
upstream server_pool{
ip_hash
server server 192.168.242.135:8080
server server 192.168.242.135:8081
}
fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配
upstream server_pool{
ip_hash
server server 192.168.242.135:8080
server server 192.168.242.135:8081
fair
}
3、动静分离
① 什么是动静分离
- Nginx动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat 处理动态页面。
- 动静分离从目前实现角度来讲大致分为两种,
- 一种是纯粹把静态文件独立成单独的域名放在独立的服务器上,也是目前主流推崇的方案。
- 另外一种方法就是动态跟静态文件混合在一起发布,通过nginx来分开。
- 通过location指定不同的后缀名实现不同的请求转发。通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。
- 具体Expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用Expires来缓存),我这里设置3d,表示在这3天之内访问这个URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码200。
② 准备工作
1)在linux系统中准备静态资源,用于进行访问
先在根目录下创建一个data文件夹,这里面有两个文件夹,一个放图片,一个用来存放html文件。
③ 具体配置
1)在nginx配置文件中进行动静分离配置
autoindex on : 表示是否将所有资源以列表的形式列举出来
④ 最终测试
1)浏览器中输入地址:http://192.168.242.137/image/
出现以下页面时因为配置文件中的 autoindex on
2) 在浏览器地址栏输入地址
http://192.168.242.137/www/a.html
4、高可用的集群
① 什么是高可用
- 一般情况下,我们通过主服务器发送请求,当主服务器的nginx宕机了,自动切换到从服务器,通过从服务器的nginx去访问tomcat,此时从服务器作为主服务器来完成请求过程。
- 此过程需要keepalived的软件来完成,keepalived通过脚本来监测nginx是否宕机,如果宕机了,那就切换到从服务器。
- 因为主从服务器IP不同,需要对外声明一个虚拟IP,将这个虚拟IP绑定到两台服务器上,通过虚拟IP来访问主从服务器。
1)需要两个nginx服务器
2)需要keepalived
3)需要虚拟ip
② 配置高可用的准备工作
1)需要配置两台linux服务器
nginx1:192.168.242.137
nginx2:192.168.242.130
2)在两台服务器上安装nginx
Nginx的安装在我的Nginx学习笔记(一)中
3)在两台服务器上安装keepalived
使用yum命令安装
yum install keepalived -y
查看一下是否安装成功
keepalived的文件目录为:/etc/keepalived
,里面有一个配置文件
③ 完成高可用配置(主从配置)
1)修改 /etc/keepalived/keepalived.conf 配置文件
主机配置文件
# 全局配置
global_defs{
router_id LVS_DEVELBACK # 主机的名字,通过它访问到主机。在/etc/下的hosts文件里面设置
script_user root
}
# 脚本配置
vrrp_script chk_nginx{
script " /usr/local/src/nginx_check.sh" # 脚本文件的路径
interval 2 # 脚本的执行间隔
weight 2 # 权重
user root
}
# 虚拟ip配置
vrrp_instance VI_1 {
state MASTER # 指定主从服务器,从机为BACKUP
interface ens33 # 网卡
virtual_router_id 51 # 主从机的virtual_router_id 必须相同
priority 130 # 主从机取不同的优先级,主机值较大,从机值较小
advert_int 1 # 每隔一秒检测服务器是否宕机
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.242.50 #指定虚拟ip
}
track_script {
chk_nginx
}
}
从机配置文件
global_defs{
router_id LVS_DEVELBACK
script_user root
}
vrrp_script chk_nginx{
script " /usr/local/src/nginx_check.sh"
interval 2
weight 2
user root
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 130
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.242.50
}
track_script {
chk_nginx
}
}
配置成功时,使用ip addr 可以查看到虚拟ip
2)在 /usr/local/src 下添加检测脚本nginx_check.sh
#!/bin/bash
A=`ps -C nginx -no-header |wc -1`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header | wc -1` -eq 0];then
killall keepalived
fi
fi
使脚本可以运行:
chown 777 /usr/local/src/nginx_check.sh
3)把两台服务器的nginx和keepalived启动
nginx:
/usr/local/nginx/sbin/nginx
keepalived:
systemctl start keepalived.service
④ 最终测试
1)在浏览器地址栏输入 虚拟ip地址 192.168.242.50
这里我为了做区分,在主服务器的nginx中配置了反向代理,让他转发到tomcat的默认页面。
2)把主服务器的nginx和keepalived停止,在输入
systemctl stop keepalived.service
./nginx -s stop
这一次就访问到了nginx的默认页面
5、Nginx的原理
① master和worker
通过查看进程,可以发现nginx启动后,有两个进程,一个master和一个worker
② worker如何进行工作
发送请求,先到master进程,相当于管理员,管理员得到一个任务后派发给worker,worker通过争抢机制获取到任务,然后进行反向代理转发给tomcat。
③ 一个master和多个worker的好处
1)可以使用nginx -s reload热部署
2)每个worker是独立的进程,如果有其中的一个worker出现问题,其他worker独立的,可以继续争抢实现请求过程,不会造成服务中断。
④ 这是多少个worker合适
- Nginx同redis类似都采用了io多路复用机制,每个worker都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求,即使是千上万个请求也不在话下。
- 每个worker的线程可以把一个cpu的性能发挥到极致。所以worker数和服务器的cpu数相等是最为适宜的。设少了会浪费cou,设多了会造成cpu频繁切换上下文带来的损耗。
⑤ 连接数 worker_connection
- 发送请求,占用了worker2个或者4个连接数
- nginx有一个master,有四个worker,每个worker支持的最大连接数是1024,支持的最大并发数为:
- 普通的静态访问最大并发数是 worker_connections * worker_processes/2
- HTTP作为反向代理来说,最大并发数量应该是 worker_connections * worker_ processes/4
因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务器的连接,会占用两个连接