No.1 Nginx(反向代理、负载均衡、动静分离、集群)

1. 内容介绍

  1. Nginx的基本概念
    1. nginx是什么,做什么事情?
    2. 反向代理
    3. 负载均衡
    4. 动静分离
  2. Nginx安装、常用命令和配置文件
    1. 在Linux系统中安装nginx
    2. nginx常用命令
    3. nginx配置文件
  3. nginx配置实例1-反向代理
  4. nginx配置实例2-负载均衡
  5. nginx配置实例3-动静分离
  6. nginx配置高可用集群
  7. nginx原理

2. Nginx基本概念

2.1 Nginx概述(摘自百度百科)

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。

其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

2.2 Nginx作为web服务器

Nginx可以作为静态页面的web服务器,同时还支持CGI协议的动态语言,比如perl、php等。但是不支持java,java程序只能通过与tomcat配合完成。Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验。有报告称能支持高达50000个并发。

Nginx介绍:https://lnmp.org/nginx.html

2.3 正向代理

Nginx不仅可以作为反向代理,实现负载均衡。还能作为正向代理来进行上网等功能。

正向代理:在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问。

正向代理:如果把局域网外的Internet想象成一个巨大的资源库,则局域网中的客户端要访问Internet,则需要通过代理服务器来访问,这种代理服务器就称为正向代理!


image.png

2.4 反向代理

反向代理:其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址!


image.png

2.5 负载均衡

单个服务器解决不了,但是可以增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡!


image.png

2.6 动静分离

为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解决,加快解析速度。降低原来单个服务器的压力


image.png

3. Nginx安装

3.1 进入官网下载Nginx

官网地址:http://nginx.org/
我选择了1.16.1版本

image.png

3.2 安装Nginx

3.2.1. 安装pcre

  1. 官网下载pcre
    官网地址:https://sourceforge.net/projects/pcre/
    我下载了10.34版本
    image.png
  1. 把pcre的压缩文件放到Linux系统中
    我这里放到了usr下的src目录中
  2. 解压压缩文件
tar -xvf pcre2-10.34.tar.gz
  1. 进入解压后的目录然后执行命令
./configure
  1. 编译安装
make && make install
  1. 安装以后使用命令查看版本号
pcre-config -version

3.2.2 安装openssl和安装zlib

yum -y install make zlib zlib devel gcc-c++ libtool openssl-devel

3.2.3 安装Nginx

  1. 把nginx压缩包丢到linux的 /usr/src 目录下
  2. 解压缩
tar -xvf nginx-1.16.1.tar.gz
  1. 检查。进入解压后的目录执行命令
./configure
  1. 编译安装
make && make install

安装成功之后,在 /usr 目录中会有个 local/nginx目录,在nginx中有sbin有启动脚本

  1. 启动nginx
# 进入目录
cd /usr/local/nginx/sbin
# 执行启动脚本
./nginx
  1. 查看nginx的配置文件
# 找到nginx的配置目录里的配置文件
cd /usr/local/nginx/conf
# 打开nginx的配置文件
vim nginx.conf
image.png

在浏览器可以通过端口号和ip地址访问到nginx


image.png

3.2.4 linux端口解决

  1. 查看开放的端口号
firewall-cmd --list-all
  1. 设置开放端口号
sodu firewall-cmd --add-port=80/tcp --permanent
  1. 重启防火墙
firewall-cmd -reload

3.3 Nginx常用命令

  1. 进入nginx目录
cd /usr/local/nginx/sbin
  1. 查看nginx版本号
nginx -v
  1. 查看nginx是否启动
ps -ef | grep nginx
  1. 停止nginx
./nginx -s stop
  1. 启动nginx
./nginx
  1. 重新加载nginx(比如修改了nginx的配置文件,不想重启nginx)
./nginx -s -reload

3.4 Nginx的配置文件

3.4.1 nginx的配置文件位置

在linux中的位置(安装目录下的conf目录下的nginx.conf文件)

/usr/local/nginx/conf/nginx.conf
image.png

3.4.2 nginx配置文件组成

3.4.2.1 全局快

从配置文件开始到events块之间的内容,主要会设置一些影响Nginx服务器整体运行的配置命令。主要包括配置运行Nginx服务器的用户(组)、允许生成的worker process数,进程pid存放路径、日志存放路径和类型以及配置文件的引入等。

比如 worker_processes 1; 这个值越大,可以支持的并发处理量就越多!

3.4.2.2 events块

涉及的指令主要影响Nginx服务器与用户的网络连接,常用的设置包括是否开启对多work process下的网络连接进行序列化,是否允许同时接受多个网络连接,选取哪种驱动模型来处理连接请求,每个word process可以同时支持的最大连接数等等!

worker_connections 51200; # 配置服务器与用户网络连接部分

3.4.2.3 http块

这是nginx配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。

需要注意的是:http块也可以包括http全局块、server块。

  1. http全局块
    http全局块配置的指令包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单连接请求数上限等。

下面这一块截图就是http全局块


image.png

3.4.2.4 server块(属于http块)

  • 每个http块可以有多个server块,而每个server块就相当于一个虚拟主机
  • 而每个server块也分为全局server块,以及可以同时包含多个location块。
  1. 全局server块
    最常见的配置是本地虚拟机主机的监听配置和本地虚拟主机的名称或IP配置
  2. location块
    1. 一个server块可以配置多个location块
    2. 这块的主要作用是基于Nginx服务器接收到的请求字符串(例如server_name/uri-string),对虚拟主机名称(也可以是ip别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行!

4. Nginx配置实例1-反向代理

4.1 实现效果

打开浏览器,在地址栏输入地址 www.xxx123.com ,跳转到Linux系统tomcat主页面中

4.2 准备工作

在Linux系统中安装tomcat,使用默认端口8080

  1. 下载tomcat(我这里使用tomcat8)
    官网地址:https://tomcat.apache.org/
  2. 解压安装
    我这里把tomcat压缩包放到了 /usr/src目录中
tar -xvf apache-tomcat-8.5.50.tar.gz
  1. 查看有无安装jdk。tomcat需要jdk
java -version
  1. 启动tomcat(在tomcat的安装目录中有个bin目录,进去,然后执行命令)
./startup.sh
  1. 查看tomcat日志信息(在tomcat的安装目录中有个log目录,进去,然后执行命令)
tail -f catalina.out
  1. 测试
    浏览器输入地址访问tomcat:ip:8080

4.3 访问过程分析

image.png

4.4 具体配置

  1. 在windows系统的hosts文件进行域名和ip对应关系的配置


    image.png

在hosts文件中添加一行内容:linux的ip 域名

172.16.124.45 xxx123.com
  1. 在nginx的配置文件进行请求转发的配置(反向代理配置)


    image.png

4.5 最终测试

浏览器访问地址:xxx123.com

5. Nginx配置实例2-反向代理

5.1 实现效果

使用nginx反向代理,根据访问的路径跳转到不同端口的服务中
nginx监听端口为9001

访问 ip:9001/edu/ 直接跳转到 127.0.0.1:8080
访问 ip:9001/vod/ 直接跳转到 127.0.0.1:8081

5.2 准备工作

  1. 准备2个tomcat服务器,一个8080端口,一个8081端口
    在原来tomcat同级目录中创建两个tomcat文件夹
mkdir tomcat8080
mkdir tomcat8081

分别在每个文件夹放入tomcat的安装包,并进行解压

  1. 创建文件夹和测试页面(在tomcat的webapps目录下)

5.3 具体配置

  1. 找到Nginx的配置文件,进行反向代理的配置


    image.png
  2. location指令说明

    • 该指令用于匹配URL
    • 语法如下
location [= | ~ | ~* | ^~] uri {

}
  • = :用于不含正则表达式的uri前,要求请求字符串与uri严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求!
  • ~ :用于表示uri包含正则表达式,并且区分大小写
  • ~* :用于表示uri包含正则表达式,并且不区分大小写
  • ^~ :用于不包含正则表达式的uri前,要求nginx服务器找到标识uri和请求字字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配。

注意:如果uri包含正则表达式,则必须要有 ~ 或者 ~* 标识。

6. Nginx配置实例-负载均衡

6.1 实现效果

浏览器地址栏输入地址,负载均衡效果,平均分配到8080端口和8081端口中

6.2 准备工作

  1. 准备2台tomcat服务器,一台8080,一台8081
  2. 在两台tomcat里面webapps目录中,创建名字是edu文件夹,在edu文件夹中创建页面a.html,用于测试

6.3 在nginx的配置文件中进行负载均衡的配置

image.png

6.4 测试

浏览器访问地址:ip/edu/a.html

可以看到结果是平均分配到了2个tomcat的效果!

6.5 Nginx负载均衡分配策略

6.5.1 轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,会自动剔除!

6.5.2 weight

weight代表权,重默认为1,权重越高被分配的客户端越多!

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。比如:


image.png

权重为10的那个会比权重为5的那个客户端多一倍!

6.5.3 ip_hash

每个请求按访问ip的hash解果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。


image.png

这样产生的结果:第一次这个用户被分配到了哪个服务端,以后他只会一直访问那个服务端!

6.5.4 fair(第三方)

按照后端服务器的响应时间来分配,响应时间短的优先分配!


image.png

7. Nginx配置实例-动静分离

7.1 相关概念

Nginx的动静分离简单来说就是把动态请求和静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说是动态请求跟静态请求分开,可以理解成Nginx处理静态页面,tomcat处理动态页面!

动静分离从目前实现角度上来讲分为2种:

  1. 一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案!
  2. 另一种就是动态跟静态文件混合在一起发布,通过nginx来分开!


    image.png

在Nginx中通过location指定不同的后缀名实现不同的请求转发。通过expires参数设置,可以设置浏览器的缓存过期时间,减少与服务器之间的请求和流量!

具体Expires定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量,此种方法非常适合不经常变动的资源。(如果经常变更的文件,不建议使用Expires来缓存),我这里设置3d,表示在3天内访问这个url,发送一个请求,比对服务器该文件最后更新时间没有变化,则不从服务器抓取,返回状态吗304,如果有修改,则直接从服务器下载,返回状态吗200

7.2 准备工作

在Linux根目录中的 data 目录中准备2个文件夹 www 和 image,分别放html网页和图片。文件名字分别是 a.html 和 1.jpg

7.3 具体配置

  1. 在Nginx配置文件中进行配置


    image.png

7.4 测试

重启Nginx
ip/www/a.html即可访问到那个准备的网页

8. Nginx配置实例-高可用

8.1 主备模式高可用介绍

主备模式高可用
对外暴露一个虚拟ip,用户通过虚拟ip进行访问,然后虚拟ip会自动分配寻找某个Nginx,Nginx再负载均衡寻找合适的tomcat进行返回响应!如果有一个nginx宕机了,会寻找另一个Nginx,如果有一个tomcat宕机了,也会寻找另一个可用的tomcat。


image.png

8.2 配置高可用的准备工作

  1. 需要2台服务器
  2. 在2台服务器安装Nginx
  3. 在2台服务器安装keepalived

8.3 在2台服务器安装keepalived

yum install keepalived -y

keepalived的安装位置:/etc/keepalived

这安装目录下有个配置文件名字叫:keepalived.conf

做主备的Nginx配置都是在这个配置文件中进行配置

8.4 完成高可用配置(主备配置)

配置 keepalived.conf 文件


image.png
image.png
image.png

Nginx检测脚本。(注意脚本文件名字和存放路径,要与上图中的检测脚本路径一致)


image.png

以上配置在两个服务器里面都需要配置的

8.5 把两台服务器上的 nginx 和 keepalived 启动

先启动nginx(进入到nginx的安装目录中的sbin目录,再执行命令)

./nginx

再启动keepalived

systemctl start keepalived service

8.6 测试

在浏览器地址栏输入 虚拟ip地址 192.168.17.50


image.png

在服务器输入命令

ip a
image.png

停掉主服务器上的nginx和keepalived,再进行测试访问虚拟ip。发现依然可以访问。

9. Nginx配置实例(高可用配置文件详解)

9.1 全局配置

image.png

那个是服务器的名字

在 /etc/hosts 文件中可以看到

vim /etc/hosts
image.png

9.2 脚本配置

image.png

9.3 虚拟ip配置

image.png

9.4 脚本文件配置

image.png

10. Nginx的原理解析

10.1 机制介绍

image.png
image.png
image.png

10.2 master-workers的机制的好处

  1. 可以使用 nginx -s reload 热部署
  2. 每个worker是独立的进程,如果有其中一个进程出现问题,其他work独立的,继续进行争抢,实现请求过程,不会造成服务中断!

首先,对于每个worker进程来说,独立的进程不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。其次采用独立的进程,可以让互相之间不会影响,一个进程退出后,其他进程还在工作,服务不会中断,master进程则很快启动新的 worker 进程。当然,worker进程的异常退出,肯定是程序有BUG了,异常退出,会导致当前worker上所有的请求失败,不过不会影响所有请求,所以降低了风险!

10.3 多少worker才是最合适的?

Nginx同Redis相似,都是采用io多路复用机制,每个worker都是一个独立的进程,但每个进程里面只有一个主线程,通过异步非阻塞的方式来处理请求,即时是千万个请求也不在话下。每个worker的线程可以将cpu的性能发挥到极致。所以worker数和服务器的cpu数相等是最为适宜的。设置少了会浪费cpu,设置多了会造成cpu频繁切换上下文带来的损耗!

10.4 连接数 worker_connection

  1. 发送请求,占用了worker几个连接数?
    答案:2个(访问静态资源直接返回)或者4个(使用tomcat访问数据库)
  2. nginx有一个master,有n个worker,每个worker支持的最大连接数是m,支持的最大并发数是多少?
    • 普通的静态访问最大并发数:worker_connection * worker_processes / 2
    • 而如果是作为http反向代理来说。最大并发数量应该是:worker_connection * worker_processes / 4
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容