内容概览
第1章 Nginx简介
1.1 Nginx概述
Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等
1.2 Nginx作为web服务器
Nginx可以作为静态页面的web服务器,同时还支持CGI协议的动态语言,比如perl、php等。但是不支持java。Java程序只能通过与tomcat配合完成。Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率 ,能经受高负载的考验,有报告表明能支持高达 50,000个并发连接数。
https://news.netcraft.com/archives/category/web-server-survey/
1.3 反向代理
Nginx不仅可以做反向代理,实现负载均衡。还能用作正向代理来进行上网等功能。
正向代理:如果把局域网外的Internet想象成一个巨大的资源库,则局域网中的客户端要访问Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。
反向代理:其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。
1.4 负载均衡
客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕后,再将结果返回给客户端。
这种架构模式对于早期的系统相对单一,并发请求相对较少的情况下是比较适合的,成本也低。但是随着信息数量的不断增长,访问量和数据量的飞速增长,以及系统业务的复杂度增加,这种架构会造成服务器相应客户端的请求日益缓慢,并发量特别大的时候,还容易造成服务器直接崩溃。很明显这是由于服务器性能的瓶颈造成的问题,那么如何解决这种情况呢?
我们首先想到的可能是升级服务器的配置,比如提高CPU执行频率,加大内存等提高机器的物理性能来解决此问题,但是我们知道摩尔定律的日益失效,硬件的性能提升已经不能满足日益提升的需求了。最明显的一个例子,天猫双十一当天,某个热销商品的瞬时访问量是极其庞大的,那么类似上面的系统架构,将机器都增加到现有的顶级物理配置,都是不能够满足需求的。那么怎么办呢?
上面的分析我们去掉了增加服务器物理配置来解决问题的办法,也就是说纵向解决问题的办法行不通了,那么横向增加服务器的数量呢?这时候集群的概念产生了,单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。
1.5 动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
一般网站初建时因为流量小、业务简单等原因,不进行动静分离,将两种数据放到一台服务器上提供服务。在一个网站中,静态资源(js、css、img)是比较占宽带资源的。当访问量大到一定程度之后,就可能出现带宽不足、甚至磁盘高 IO 等问题。此时就可以采用动静分离,将图片等静态资源同步到另一台 WEB 服务器。
很多网站中的静态资源一般都存放在第三方存储平台上,例如:七牛云、阿里云、腾讯云等。这些第三方存储平台内置CDN,进行内容分发,采用就近访问原则。
第2章 Nginx安装
2.1 下载http://nginx.org/
2.2 安装包
pcre-8.37.tar.gz
openssl-1.0.1t.tar.gz
zlib-1.2.8.tar.gz
nginx-1.20.1.tar.gz
2.3 在线安装
第一步,安装pcre
第一步 联网下载pcre
wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz
第二步 解压压缩文件
使用命令 tar -zxvf pcre-8.37.tar.gz
第三步 ./configure完成后,回到pcre目录下执行make,最后执行make install
第四步 pcre-config --version 检查版本
第二步,安装openssl 、zlib 、 gcc 依赖
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
第三步,安装nginx
使用命令解压
./configure
make && make install
进入目录 /usr/local/nginx/sbin 执行./nginx 启动服务
第四步,关闭防火墙,访问nginx
在windows系统中访问linux中nginx,默认不能访问的,因为防火墙问题
关闭防火墙-开放访问的端口号,80端口
查看开放的端口号
firewall-cmd --list-all
设置开放的服务或端口号
firewall-cmd --add-service=http --permanent
firewall-cmd --add-port=80/tcp --permanent
重启防火墙
firewall-cmd --reload
2.4 离线安装
第一步 安装pcre
解压缩pcre-xx.tar.gz包
进入解压缩目录,执行./configure
注意:如果提示错误,需要提前安装gcc++
./configure完成后,回到pcre目录下执行make,再执行make install
第二步 安装openssl
解压缩openssl-xx.tar.gz包
进入解压缩目录,执行./config
make && make install
第三步 安装zlib
解压缩zlib-xx.tar.gz包
进入解压缩目录,执行./configure
make && make install
第四步 安装nginx
解压缩nginx-xx.tar.gz包
进入解压缩目录,执行./configure
make && make install
第五步 关闭防火墙,开放端口【参考2.3第四步】
第3章 Nginx常用的命令和配置文件
3.1 nginx常用的命令
(1)启动命令:在/usr/local/nginx/sbin目录下执行 ./nginx
(2)关闭命令:在/usr/local/nginx/sbin目录下执行 ./nginx -s stop
(3)重新加载命令:在/usr/local/nginx/sbin目录下执行 ./nginx -s reload
(4)查看版本:在/usr/local/nginx/sbin目录下执行 ./nginx -v
(5)查看进程:ps -ef|grep nginx
3.2 nginx.conf 配置文件
nginx 安装目录(/usr/local/nginx/conf/nginx.conf,不是/opt/nginx-1.20.1/conf/nginx.conf)下,其默认的配置文件都放在这个目录的 conf 目录下,而主配置文件 nginx.conf 也在其中,后续对 nginx 的使用基本上都是对此配置文件进行相应的修改
配置文件中有很多#, 开头的表示注释内容,我们去掉所有以 # 开头的段落,精简之后的内容如下:
根据上述文件,我们可以很明显的将 nginx.conf 配置文件分为三部分:
第一部分:全局块
从配置文件开始到 events 块之间的内容,主要会设置一些影响nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。
比如上面第一行配置的:
这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约。
第二部分:events块
比如上面的配置:
events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 work process 可以同时支持的最大连接数等。
上述例子就表示每个 work process 支持的最大连接数为 1024.
这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。
第三部分:http块
这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。
需要注意的是:http 块也可以包括 http全局块、server 块。
①、http 全局块
http全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
②、server 块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
1、全局 server 块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。
2、location 块
一个 server 块可以配置多个 location 块。
这块的主要作用是基于 Nginx 服务器接收到的请求字符串
(例如 server_name/uri-string),对虚拟主机名称(也可以是IP别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
第4章 Nginx配置实例-反向代理
4.1 反向代理案例一
实现效果:使用nginx反向代理,访问 www.123.com 直接跳转到127.0.0.1:8080
4.1.1 准备工作
1) 启动一个 tomcat
在linux系统安装tomcat;将tomcat安装文件放到linux系统/opt中,解压;进入tomcat的bin目录中,./startup.sh启动tomcat服务器 ,使用默认端口8080
2) linux本机访问:localhost:8080
3) 在windows系统中通过浏览器访问tomcat服务器,注意防火墙或开放端口
4) 映射域名,通过修改本地 C:/Windows/System32/drivers/etc/hosts 文件,将 www.123.com 映射到 192.168.137.129
5) 配置完成之后,访问www.123.com:8080
4.1.2 案例一
那么,如何只需要输入 www.123.com 便可以跳转到 Tomcat初始界面呢?便用到 nginx的反向代理。
Ø 在 nginx.conf 配置文件中增加如下配置
4.2 反向代理案例二
实现效果:使用nginx反向代理,根据访问的路径跳转到不同端口服务
nginx监听端口为9000,
访问 http://127.0.0.1:9000/edu/ 直接跳转到127.0.0.1:8080
访问 http://127.0.0.1:9000/vod/ 直接跳转到127.0.0.1:8081
4.2.1 准备工作
第一步,准备两个tomcat,一个8080端口,一个8081端口,并准备好测试的页面
webapps/edu/index.html
webapps/vod/index.html
由于一个ip服务器上启动两个tomcat,端口不能相同。所以,需要修改端口:22行8005->9005;69行8080->8081;
第二步,修改nginx的配置文件,在http块中添加server{}
4.2.2 案例二
4.3 location指令说明
该指令用于匹配 URL。
语法如下:
1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
2、^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。
3、~:用于表示 uri 包含正则表达式,并且区分大小写。
4、~*:用于表示 uri 包含正则表达式,并且不区分大小写。
注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。
第5章 Nginx配置实例-负载均衡
5.1 实现效果
浏览器地址栏输入地址 http://192.168.137.129/edu/a.html,负载均衡效果,将请求平均分配到8080和8081两台服务器上。
5.2 准备工作
(1)准备两台tomcat服务器,一台8080,一台8081
(2)在两台tomcat里面webapps目录中,创建名称是edu文件夹,在edu文件夹中创建页面a.html(让a.html内容不一样,查看效果),用于测试
5.3 负载均衡配置
upstream称为上游服务器,即真实处理请求的业务服务器。
5.4 nginx分配服务器策略
随着互联网信息的爆炸性增长,负载均衡(load balance)已经不再是一个很陌生的话题,顾名思义,负载均衡即是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验。快速增长的访问量和数据流量催生了各式各样的负载均衡产品,很多专业的负载均衡硬件提供了很好的功能,但却价格不菲,这使得负载均衡软件大受欢迎,nginx就是其中的一个,在linux下有Nginx、LVS、Haproxy等等服务可以提供负载均衡服务,而且Nginx提供了几种分配方式(策略):
5.4.1 轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除
5.4.2 weight
weight代表权,重默认为1,权重越高被分配的客户端越多
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 例如:
upstream server_pool{
server 192.168.10.1 weight=1;
server 192.168.10.2 weight=2;
server 192.168.10.3 weight=3;
}
5.4.3 ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 例如:
upstream server_pool{
ip_hash;
server 192.168.10.1:80;
server 192.168.10.2:80;
server 192.168.10.3:80;
}
5.4.4 fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream server_pool{
server 192.168.10.1:80;
server 192.168.10.2:80;
server 192.168.10.3:80;
fair;
}
5.4.5 其他参数
第6章 Nginx配置实例-动静分离
Nginx 动静分离简单来说就是把动态请求跟静态请求分开,Nginx 处理静态请求,Tomcat处理动态请求。
动静分离从目前实现角度来讲大致分为两种:
l 一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
l 另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。
通过 location 指定不同的后缀名实现不同的请求转发。
第7章 Nginx原理与优化参数配置
7.1 Nginx原理
l master-workers的机制的好处
首先,对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。
其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快启动新的worker进程。
当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险。
l 需要设置多少个worker
Nginx 同redis类似都采用了IO多路复用机制,每个worker都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话下。每个worker的线程可以把一个cpu的性能发挥到极致。所以worker数和服务器的cpu数相等是最为适宜的。设少了会浪费cpu,设多了会造成cpu频繁切换上下文带来的损耗。
l #设置worker数量
worker_processes 4
#work绑定cpu (8 work绑定8个cpu) 。
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000
l #连接数
worker_connections 1024
这个值是表示每个worker进程所能建立连接的最大值,所以,一个nginx能建立的最大连接数,应该是worker_connections * worker_processes。
当然,这里说的是最大连接数,对于HTTP请求本地资源来说,能够支持的最大并发数量是worker_connections * worker_processes