目录
[server 块](#server 块)
基本介绍
1、通过不同的URI来访问不同的服务(反向代理)
2、如果服务是集群,通过URI轮询访问(负载均衡)
3、动静分离
4、高可用集群(多个Nginx)
Gateway也可以做到
请求先到Nginx,再反向代理到网关,再找到真正服务的接口
Nginx核心功能
正向代理
反向代理
不希望公开目标服务器,只允许反向代理访问,提供一个统一的访问IP
客户端将请求发送到代理服务器,代理服务器去选择目标服务器获取数据,返回给客户端,这种代理方式为反向代理
反向代理帮助的对象是目标服务器,反向代理会屏蔽目标服务器的信息,实现负载均衡
负载均衡
当客服端向反向代理服务器(比如Nginx)发出请求,如果Nginx代理了多个Web服务器(集群),Nginx会将请求/负载分发到不同的服务器,也就是负载均衡
动静分离
加快网站的解析速度,把动态和静态资源由不同的服务器来解析,降低单个服务器的压力
静态资源也会发出Http请求,服务器压力很大,把静态资源剥离出来
Nginx下载&安装&启动
安装 Nginx
首先安装依赖:yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
启动 Nginx
Linux浏览器输入localhsot,nginx默认端口是80
配置防火墙
让Windos访问Nginx:IP:端口(默认80,可以不写)
查看防火墙状态:firewall-cmd --list-all设置开放的端口号:firewall-cmd --add-port=80/tcp --permanent
设置关闭的端口号:firewall-cmd --remove-port=80/tcp --permanent
**每次开启/关闭必须重启:**firewall-cmd --reload
Nginx常用命令
查看监听的端口:netstat -anp | more
Nginx配置文件
Nginx 的配置文件是在**/usr/local/nginx/conf** 目录中的nginx.conf 文件
Nginx 的配置文件分由三部分组成:全局块、events块、http块
css
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
全局块
从配置文件开始到 events 块之间的内容
主要会设置一些影响nginx 服务器整体运行的配置指令,主要包括配 置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。
java
worker_processes 1;
这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是 会受到硬件、软件等设备的制约。
events块
events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接
常用的设置包括是否开启对多 work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 wordprocess 可以同时支持的最大连接数等。
java
events {
worker_connections 1024;
}
上述例子就表示每个 work process 支持的最大连接数为 1024,这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。
http块
这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。
需要注意的是:http 块也可以包括 http 全局块 和 server 块。
http全局块
http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
server 块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了 节省互联网服务器硬件成本。
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
每个 server 块也分为全局 server 块,以及可以同时包含多个 location 块。
全局 server 块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。
location 块
一个 server 块可以配置多个 location 块。
这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称 (也可以是IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。 比如地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
检查配置信息
查看nginx.conf配置错误信息:nginx -t
快速入门
安装JDK
1、将压缩包上传到/opt/jdk并解压,移动到/usr/local/java
2、配置环境变量:vim /etc/profile,按 i 进入编辑模式,在最后添加配置
export JAVA_HOME=/usr/local/java/jdk1.8.0_261
export PATH=JAVA_HOME/bin:**PATH**必须要带$PATH,保留原本的PATH路径
3、添加完成,按ESC
键,退出insert
,下方-- insert --
会消失,然后再输入:wq
,退出并保存
4、刷新环境变量:source /etc/profile,查看PATH:echo $PATH
5、查看JDK版本:java -version
安装Tomcat
1、将压缩包上传到/opt/tomcat并解压
2、进入解压目录\bin,启动tomcat:./startup.sh(也可以配环境变量,这里就不配了)
3、开放端口8080,可以在windows通过 IP:端口 访问tomcat页面
反向代理分析
关闭8080端口,windows浏览器输入www.hsp.com
Location语法规则
带^~不一定就是正则匹配,^~优先级比正则匹配高
一、精准匹配(成功直接返回,否则继续普通匹配)(location = /uri/{...})
二、普通匹配(不按顺序)(location /uri/{...})
1、含有^~,匹配成功直接返回,不做正则匹配
2、不含有^~,匹配成功记录下来(记录最长匹配结果),继续正则匹配
三、正则匹配(按顺序)
1、匹配成功直接返回
2、匹配不成功,返回普通匹配最长匹配结果
反向代理配置-Location实例
修改配置文件
创建Tomcat文件
默认访问webapps目录
linux新建product文件夹和hi.html
member新建product文件夹和hi.html
linux防火墙打开10000端口
linux访问Windows Tomcat(关闭Windows的防火墙)
启动linux和windows的Tomcat,可以使用 **netstat -anp | more****来查看是否启动
重新加载Nginx,Windows浏览器输入:**www.hspmall.com:10000/product/hi.html
负载均衡规则
Nginx分配服务器策略
1. 轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
2. weight
weight 代表权重, 默认为 1,权重越高被分配的客户端越多
css
upstream myserver {
server 208.208.128.122:8081 weight=1;
server 208.208.128.122:8082 weight=10;
}
server {
listen 80;
server_name 208.208.128.122;
location / {
root html;
proxy_pass http://myserver;
index index.html index.htm;
}
3. ip_hash
ip_hash 每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决session问题
css
upstream myserver {
ip_hash;
server 208.208.128.122:8081 ;
server 208.208.128.122:8082 ;
}
server {
listen 80;
server_name 208.208.128.122;
location / {
root html;
proxy_pass http://myserver;
index index.html index.htm;
}
4. fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
css
upstream myserver {
server 208.208.128.122:8081 ;
server 208.208.128.122:8082 ;
fair;
}
server {
listen 80;
server_name 208.208.128.122;
location / {
root html;
proxy_pass http://myserver;
index index.html index.htm;
}
负载均衡-配置实例
修改配置文件
创建Tomcat文件
默认访问webapps目录
在Linux的Tomcat8080创建search文件夹和look.html
在当前目录拷贝一份:cp -rf ./apache-tomcat-8.5.59 ./apache-tomcat-8.5.59new
修改look.html
将端口修改成8081
redirectPort要和另一个Tomcat不一样
linux防火墙打开80端口
启动linux的两个Tomcat,可以使用 **netstat -anp | more****来查看是否启动
重新加载Nginx,Windows浏览器输入:**www.hspcrm.com/search/look.html
动静分离
创建Tomcat文件
其他配置在负载均衡已经配置过了
在Tomcat8080和8081的search目录下创建cal.jsp和image目录,即可通过传统方法实现功能
动静分离优化
在/usr/local/nginx/html目录下创建/search/image目录,图片的路径就是ip/search/image
重启Nginx
Nginx工作机制&参数设置
master-worker机制
nginx 启动后,是由两个进程组成的。master(管理者)和worker(工作者)。
一个nginx 只有一个master。但可以有多个worker
Master-Worker 模式
- Nginx 在启动后,会有一个 master 进程和多个相互独立的 worker 进程。
- Master 进程接收来自外界的信号(Request请求),向各 worker 进程发送信号,每个进程都有可能来处理这个连接。
- Master 进程能监控 Worker 进程的运行状态,当 worker 进程退出后(异常情况下),会自动启动新的 worker 进程。
accept_mutex 解决 "惊群现象"
- 所有子进程都继承了父进程的 sockfd,当连接进来时,所有子进程都将收到通知并"争着"与它建立连接,这就叫"惊群现象"。
- 大量的进程被激活又挂起,只有一个进程可以 accept() 到这个连接,会消耗系统资源。
- Nginx 提供了一个 accept_mutex ,这是一个加在 accept 上的一把共享锁。即每个 worker 进程在执行 accept 之前都需要先获取锁 ,获取不到就放弃执行 accept()。有了这把锁之后,同一时刻,就只会有一个进程去 accpet(),就不会有惊群问题了。
- 当一个 worker 进程在 accept() 这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,完成一个完整的请求。
- 一个请求,完全由 worker 进程来处理,而且只能在一个 worker 进程中处理。
用多进程结构而不用多线程结构的好处
- 节省锁带来的开销, 每个 worker 进程都是独立的进程,不共享资源,不需要加锁。在编程以及问题查上时,也会方便很多。
- 独立进程,减少风险。采用独立的进程,可以让互相之间不会影响,一个进程退出后, 其它进程还在工作,服务不会中断,master 进程则很快重新启动新的 worker 进程
实现高并发的秘密-IO多路复用
- 对于 Nginx 来讲,一个进程只有一个主线程,那么它是怎么实现高并发的呢?
- 采用了 IO 多路复用的原理,通过异步非阻塞的事件处理机制,epoll 模型,实现了轻量级和高并发,worker获取到锁首先会注册事件(上图)
- nginx 是如何具体实现的呢,举例来说:每进来一个 request,会有一个 worker 进程去处理。但不是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方,比如向上游(后端)服务器转发 request,并等待请求返回。那么,这个处理的 worker 不会这么傻等着,他会在发送完请求后,注册一个事件:"如果 upstream 返回了,告诉我一声,我再接着干"。 于是他就休息去了。此时,如果再有 request 进来,他就可以很快再按这种方式处理。而 一旦上游服务器返回了,就会触发这个事件,worker 才会来接手,这个 request 才会接着 往下走。由于 web server 的工作性质决定了每个 request 的大部份生命都是在网络传输中, 实际上花费在 server 机器上的时间片不多,这就是几个进程就能解决高并发的秘密所在
- 可以理解为去吃饭点菜,服务员通知厨师,不会一直在旁边等待
参数设置
worker-processes
- 需要设置多少个 worker
cpu 的性能发挥到极致。所以 worker 数和服务器的 cpu 数相等是最为适宜的。设少了会浪费 cpu,设多了会造成 cpu 频繁切换上下文带来的损耗。- 每个 worker 的线程可以把一个 设置 worker 数量, Nginx 默认没有开启利用多核 cpu,可以通过增加 worker_cpu_affinity 配置参数来充分利用多核 cpu 的性能
重启Nginx,输入:ps -ef | grep nginx
worker_connection
配置Linux最大打开文件数
搭建高可用集群
Keepalived+Nginx高可用集群(主从模式)
集群架构图
具体搭建步骤
搭建基础环境
查看虚拟机IP,原本是130,现在新的两个是131和132
修改nginx.conf,启动tomcat,重启nginx,目前是独立的两台Linux服务器
在两台Linux服务器安装keepalived,按照步骤安装好即可
集群配置
修改192.168.102.131为Master:vi /etc/keepalived/keepalived.conf
修改192.168.102.132为BACKUP
测试
启动keepalived的指令:/usr/local/sbin/keepalived
命令:ip a 查看是否成功
查看进程:ps -ef | grep keepalived
杀掉进程:killall keepalived
重启:/usr/local/sbin/keepalived
保证Windows能ping通192.168.198.18(ping不同就使用192.168.102.133)
浏览器输入:192.168.198.18/search/cal.jsp
虚拟IP绑定到主nginx(根据优先级决定) ,找不到再绑定到从nginx(支持负载均衡)
自动检测Nginx异常,终止keeppalived
如果直接停止主Nginx,但keepalived没有关闭,仍会访问keepalived,浏览器返回错误信息
需求,自动检测,如果Nginx关闭,就自动关闭对应的keepalived,让虚拟IP重新绑定
bash
#!/bin/bash
num=`ps -C nginx --no-header | wc -l`
if [ $num -eq 0 ];then
killall keepalived
fi
修改配置文件:vi /etc/keepalived/keepalived.conf
配置文件keepalived.conf详解
Puppet
#这里只注释要修改的地方
global_defs {
notification_email {
test@foxmail.com #接收通知的邮件地址
}
notification_email_from Alexandre.Cassen@firewall.loc #发送邮件的邮箱
smtp_server 192.168.200.1 #smtp server 地址
smtp_connect_timeout 30
router_id Node132 #Node132 为主机标识
vrrp_skip_check_adv_addr
#vrrp_strict #这里需要注释,避免虚拟 ip 无法 ping 通
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER #主节点 MASTER 备用节点为 BACKUP
interface ens33 #网卡名称
virtual_router_id 51 #VRRP 组名,两个节点的设置必须一样,指明属于同一 VRRP 组
priority 100 #主节点的优先级(1-254 之间),备用节点必须比主节点优先级低
advert_int 1 #组播信息发送间隔,两个节点设置必须一样
authentication { #设置验证信息,两个节点必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #指定虚拟 IP, 两个节点设置必须一样
192.168.200.16
}
}