五、Nginx的配置实例1——反向代理1
5.1 实现效果
- 打开浏览器,在浏览器地址栏中输入地址www.123.com,跳转到Linux系统tomcat主页面中
5.2 准备工作
在linux系统中安装tomcat,使用默认端口8080
- 将tomcat压缩包放到linux系统的
/usr/src
文件夹中,并tar -zxvf apache-tomcat-7.0.70.tar.gz
- 进入解压后的文件夹的
bin
目录中,./startup.sh
启动服务器
- 将tomcat压缩包放到linux系统的
对外开放访问的端口(centos7)
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd -reload
- 在windows系统中通过浏览器访问tomcat服务器
5.2.1 问题解决
- 使用命令
./startup.sh
开启tomcat服务后,进入tomcat文件夹下的logs
文件夹,使用命令tail -f catalina.out
,出现如下错误信息
错误原因是
JAVA_HOME
环境变量设置错误,需要调整正确解决:
- 输入命令:
vim /etc/profile
- 将
JAVA_HOME
修改为正确路径 - 输入命令:
source /etc/profile
,<font color="red">使修改立即生效!!(这步别忘!)</font>
- 输入命令:
5.3 反向代理过程分析
5.4 具体配置(nginx.conf)
5.4.1 配置域名ip关系映射
- 在windows系统的host文件进行域名和ip对应关系的配置
C:\Windows\System32\drivers\etc
该路径下找到HOSTS文件
- 用文本编辑共计,将修改信息写入
5.4.2 请求转发配置(反向代理配置)
- 在nginx进行请求转发的配置(反向代理配置)
- 修改nginx配置文件,路径为:
/usr/local/nginx/conf/nginx.conf
- 在全局server块中修改
server_name
为linux主机IP10.66.120.37
修改location块,加入
proxy_pass http://127.0.0.1:8080
- 进入
/usr/local/nginx/sbin
,输入命令./nginx
开启
5.4.3 测试
- 在浏览器中输入www.123.com进行测试
五、Nginx配置实例2——反向代理2
5.1 实现效果
- 使用nginx反向代理,根据访问的路径跳转到不同端口的服务中。nginx监听端口为9001
- 访问
http://127.0.0.1:9001/edu/
,直接跳转到127.0.0.1:8080
- 访问
http://127.0.0.1:9001/vod/
,直接跳转到127.0.0.1:8081
5.2 准备工作
5.2.1 准备两个tomcat
- 准备两个tomcat,在
/usr.src
目录下新建两个文件夹,分别拖入tomcat压缩包
- 进入8080文件夹,不用改端口,解压后直接进入
apache/bin/startup.sh
启动 - 进入8081文件夹,解压后进入
conf
文件夹,修改vim server.xml
文件,修改端口为8081,其他默认的端口也需要修改,详见下图
- 开启8081的tomcat,此时,已经开启端口分别为8080和8081的两个服务器
5.2.2 创建文件夹和测试页面
- 创建测试页面a.html
- 在8080服务器的webapp目录下,创建edu目录,将a.html拖入
- 测试
- 同上面步骤,在8081服务器的webapp目录下,创建vod目录,将a.html拖入,内容改为
<h1>8081</h1>
5.3 具体配置(nginx.conf)
- 进入
/usr/local/nginx/conf/
,修改该目录下的nginx.conf
文件 - 补充一下代码
- 开放8080、8081、9001的端口(我这里是centos6,图方便,将防火墙全部关闭了
service iptables stop
) - 启动nginx,进入
/usr/local/nginx/sbin
,然后直接./nginx
启动
- 测试
5.4 location块的详解
=
:用于不含正则表达式的uri
前,要求请求字符串与uri
严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。~
:用于标识uri
包含正则表达式,并且区分大小写~*
:用于标识uri
包含正则表达式,并且不区分大小写^~
:用于不含正则表达式的uri
前,要求nginx服务器找到标识uri
和请求字符串匹配度最高的location
后,立即使用此location
处理请求,而不再使用location
块中的正则uri
和请求字符串做匹配。- 注意:如果
uri
包含正则表达式,则必须要有~
或者~*
标识。
六、Nginx的配置实例——负载均衡
- 负载均衡:增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中在单个服务器上的情况改为请求分发到多个服务器上,将负载分发到不同的服务器,也就是所谓的负载均衡。
6.1 实现效果
- 浏览器中输入地址
http://10.66.93.167/edu/a.html
,实现负载均衡效果,将请求平均分配到8080和8081端口中
6.2 准备工作
- 准备两个tomcat服务器(反向代理案例2中已完成)
- 在两个tomcat中的webapps目录中,创建名称是edu的文件夹,在该文件夹中创建页面a.html,用于测试
6.3 具体配置(nginx.conf)
- 进入
/usr/local/nginx/conf/
,修改该目录下的nginx.conf
文件 - 具体修改如下:
- 重启
nginx.conf
:进入nginx/sbin
目录下,执行./nginx - s reload
命令。 - 用火狐浏览器测试成功,用谷歌浏览器可能因为缓存的原因没有成功
6.4 nginx常用分配方式
6.4.1 轮询(默认)
- 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down了,会自动剔除该服务器。
upstream myserver{
server 10.66.93.167:8080;
server 10.66.93.167:8081;
}
6.4.2 weight
- weight代表权重,默认为1,权重越高被分配的客户端请求越多。指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
upstream myserver{
server 10.66.93.167:8080 weight=10;
server 10.66.93.167:8081 weight=10;
}
6.4.3 ip_hash
- 每个请求按访问ip的hash结果分配,这样每个方可固定访问一个后端服务器,可以解决
session
问题。
upstream myserver{
ip_hash;
server 10.66.93.167:8080;
server 10.66.93.167:8081;
}
6.4.4 fair(第三方)
- 按后端服务器的响应时间分配请求,响应时间短的优先分配。
upstream myserver{
server 10.66.93.167:8080;
server 10.66.93.167:8081;
fair;
}
七、Nginx的配置实例——动静分离
7.1 什么是动静分离
- nginx动静分离简单来说就是把动态请求和静态请求分离开,不能理解成只是单纯的把动态页面和静态页面物理分离。可以理解成使用nginx处理静态页面,tomcat处理动态页面。
动静分离从目前的实现角度大致分为两种:
- 纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案。
- 动态和静态文件混合在一起发布,通过nginx来分开。
- 通过
location
指定不同的后缀名实现不同的请求转发。通过expire
参数设置,可以使浏览器缓存过期时间,减少与服务器之间的请求和流量。 具体
expire
定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所有不会产生额外的流量。这种方法非常适合不经常变动的资源,经常更新的文件不建议使用expire
来缓存。- 举例:若将
expire
设定为3d,表示这三天内访问这个url,发送一个访问请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304
;如果有修改,直接从服务器重新下载,返回状态码200
。
- 举例:若将
7.2 准备工作
- 在
/
根目录下创建data
文件夹,在其中创建www
和image
文件夹
7.3 具体配置(nginx.conf)
- 进入
/usr/local/nginx/conf/
,修改该目录下的nginx.conf
文件 具体修改如下:
autoindex on
:列出文件目录
- 重启
nginx.conf
:进入nginx/sbin
目录下,执行./nginx - s reload
命令。 - 测试:输入地址
http://10.66.93.167/image/01.jpg
和http://10.66.93.167/www/a.html
七、Nginx的配置实例——高可用
7.1 什么是高可用
- 简单理解高可用,就是nginx挂了,但是还能访问,并提供服务
- 需要两台nginx服务器
- 需要keepalived
- 需要绑定虚拟ip
7.2 配置高可用的准备工作
- 需要两台虚拟机
- 在两台服务器上都安装nginx
在两台服务器上都安装keepalived:
yum install keepalived -y
rpm -q -a keepalived
:查询安装情况- 安装完成后,会在
/etc
里面生成目录keepalived
,有文件keepalived.conf
完成高可用配置(主从配置)
修改
/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 10.66.93.167 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 BACKUP #备份服务器上将MASTER改为BACKUP interface ens33 #网卡名 ifconfig查看 virtual_router_id 51 #主、备机的virtual_router_id必需相同 priority 90 #主、备机取不同的优先级,主机值较大,备份机值较小 advert_int 1 authentication{ auth_type PASS auth_pass 1111 } virtual_ipaddress{ 10.66.93.50 #VRRP H虚拟地址 } }
在
/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启动
- 启动nginx:
./nginx
- 启动keepalived:
systemctl start keepalived.service
- 启动nginx:
最终测试:
- 在地址栏中输入虚拟ip地址 10.66.93.50
- 把主服务器的nginx和keepalived停止,再次输入虚拟地址
7.3 高可用配置文件详解
7.3.1 全局块(global_defs)
global_defs{
notification_email{
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 10.66.93.167
smtp_connect_timeout 30
router_id LVS_DEVEL #访问到主机,这个在/etc/host中进行修改
}
7.3.2 脚本块(vrrp_script chk_http_port)
vrrp_script chk_http_port{
script "/usr/local/src/nginx_check.sh" #执行该目录下的脚本
interval 2 #(检测脚本执行的间隔为2s)
weight 2 #权重
}
7.3.3 虚拟ip(vrrp_instance VI_1)
vrrp_instance VI_1{
state MASTER #备份服务器上将MASTER改为BACKUP
interface ens33 #网卡名 ifconfig查看
virtual_router_id 51 #主、备机的virtual_router_id必需相同
priority 100 #主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1 #每隔1s检测服务器是否还活着
authentication{
auth_type PASS
auth_pass 1111
}
virtual_ipaddress{
10.66.93.50 #VRRP H虚拟地址
}
}
7.3.4 脚本详解(nginx_check.sh)
#!/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的原理
8.1 master&worker
master
相当于小老板,将大老板管理员派下来的活分散给各个工人worker
8.2 worker是如何工作的
8.3 1个master和n个worker的好处
- 可以使用
nginx -s reload
热部署,利用nginx进行热部署操作 - 每隔
worker
是独立的进程,如果有其中的一个worker
出现问题,其他worker
独立的,继续进行争抢,实现请求过程,不会造成服务中断。 - 首先,对于每个
worker
进程来说,独立的进程,不需要加锁,所以声嗲了锁带来的开销,同时在编程以及问题查找时,也会方便很多。 - 其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其他进程还在工作,服务不会中断,
master
进程则很快启动的新的worker
进程。 worker
进程的异常退出,会导致当前worker
上的所有请求失败,但不会影响到所有请求,降低了风险。
8.4 设置多少个worker合适
worker
数量和服务器的cpu数相等时最好的。- nginx和redis类似都采用了io多路复用机制,每个
worker
都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式处理请求,即使是成千上万个请求也没问题。每个worker
的线程可以把一个cpu的性能发挥到极致。所以worker
数量和服务器的cpu数相等时最好的,少了浪费,多了增加损耗。
8.5 连接数worker_connection
8.5.1 发送一个请求,占用了worker的几个连接数
- 2或4个
8.5.2 nginx有一个master,有4个worker,每个worker支持的最大连接数是1024,支持的最大并发数是多少?
- 普通的静态访问最大并发数是:
worker_connections*worker_processes/2
- 如果是http作为反向代理来说,最大并发数量是
worker_connections*worker_processes/4