1. nginx基本概念
1.1 nginx是什么,做什么事情
nginx是高性能的 HTTP 和反向代理的服务器,处理高并发能力是十分强大的, 能经受高负载的考验。有报告表明能支持高达 50,000 个并发连接数。
1.2 反向代理
正向代理
nginx不仅可以做反向代理,实现负载均衡。还能用作正向代理来进行上网等功能。
正向代理:如果把局域网外的Internet 想象成一个巨大的资源库,则局域网中的客户端要访问 Internet ,则需要通过代理服务器来访问,这种代理服务就称为正向代理。
需要在客户端(浏览器)配置代理服务器,然后通过代理服务器去访问网址,将内容返回
反向代理
反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问。
我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。
1.3 负载均衡
客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕后,再将结果返回给客户端。
这种架构模式对于早期的系统相对单一,并发请求相对较少的情况下是比较适合的。
但是随着信息数量的不断增长,访问量和数据量的飞速增长,以及系统业务的复杂度增加,这种架构会造成服务器相应客户端的请求日益缓慢,并发量特别大的时候,还容易造成服务器直接崩溃。
要解决这个问题,可能最先想到的就是单纯提高电脑配置。但是类似于天猫双十一当天如此大的并发情况,即使都增加到现有的顶级配置,都不能满足需求。
那么我们可以横向增加服务器的数量。这时候集群的概念产生了,单个服务器解决不了,我们可以增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。
1.4 动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
2. nginx安装、常用命令和配置文件
2.1 Linux中安装nginx
-
使用XShell连接CentOS
-
安装nginx相关依赖
- 安装pcre
-
下载pcre
-
上传到linux服务器中
-
解压
tar -xvf pcre-8.37.tar.gz
-
进入到解压之后的目录
-
执行configure
./configure
需要GCC:
yum -y install gcc gcc-c++ kernel-devel
-
执行完成后,执行make并且安装
make && make install
-
可执行 pcre-config --version 查看安装的pcre版本号来验证成功安装
-
- 安装 openssl 和 zlib
yum -y install make zlib zlib devel gcc c++ libtool openssl openssl devel
yum install openssl openssl-devel -y
可通过下面这条命令一键安装所有依赖
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
- 安装pcre
-
安装nginx
-
解压nginx安装包
tar -xvf nginx-1.22.1.tar.gz
-
进入解压后的nginx目录
-
执行configure
./configure
-
make && make install
-
安装成功后会在usr/local下多出一个文件夹nginx
-
nginx文件夹中的sbin下有nginx的启动脚本
./nginx
启动nginx -
通过浏览器访问ip地址出现nginx即启动成功
若无法访问成功,即防火墙端口未开放
firewall-cmd --list-all
可查看开放的端口号通过下面的命令设置开放的端口
firewall-cmd --add-service=http --permanent
firewall-cmd --add-port=80/tcp --permanent
重启防火墙
firewall-cmd --reload
还可直接关闭防火墙
1、输入命令
systemctl status firewalld.service
2、在下方可以看到“active(running)”,此时说明防火墙被打开。
3、在命令行中输入
systemctl stop firewalld.service
命令,关闭防火墙。4、然后再使用命令
systemctl status firewalld.service
,在下方出现disavtive(dead),这样就说明防火墙已经关闭。5、再在命令行中输入命令
systemctl disable firewalld.service
命令,即可永久关闭防火墙。
-
2.2 nginx常用命令
使用nginx操作命令的前提条件:进入nginx的目录 cd /usr/local/nginx/sbin
-
启动命令
./nginx
-
查看nginx版本号
./nginx -v
-
关闭命令
./nginx -s stop
-
重新加载命令
./nginx -s reload
2.3 nginx配置文件
nginx 安装目录下,其默认的配置文件都放在这个目录的 conf 目录下(/usr/local/nginx/conf
),而主配置文件nginx.conf 也在其中,后续对 nginx 的使用基本上都是对此配置文件进行相应的修改
配置文件中有很多 开头的表示注释内容,我们去掉所有以 # 开头的段落,精简之后的内容如下:
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;
}
}
}
nginx配置文件由三部分组成:全局块、events块、http块
-
第一部分:全局块
从配置文件开始到 events 块之间的内容,主要会设置一些影响nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。
上面例子第一行配置
worker_processes 1;
这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约
-
第二部分:events块
events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个word process 可以同时支持的最大连接数等。
events { worker_connections 1024; }
上述例子就表示每个 work process 支持的最大连接数为1024。
这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。
-
第三部分:http块
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; } } }
http块算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。 需要注意的是:http 块也可以包括 http全局块、server 块。
-
http全局块
http全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
-
server 块
server 块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
-
全局 server 块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。
-
location 块
一个 server 块可以配置多个 location 块。
location 块的主要作用是,基于 nginx 服务器接收到的请求字符串(例如 server_name),对虚拟主机名称(也可以是IP别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
-
-
3. nginx配置实例1 - 反向代理
3.1 反向代理实例一
实现效果:使用 nginx 反向代理,访问 www.123.com 直接跳转到 192.168.2.175:8080
实验步骤:
-
启动一个 tomcat ,浏览器地址栏输入 192.168.2.175:8080 ,tomcat初始页面
-
通过修改本地 host 文件,将 www.123.com 映射到 192.168.2.175
192.168.2.175 www.123.com
配置完成之后,我们便可以通过 www.123.com:8080 访问到第一步出现的 Tomcat初始界面。那么如何只需要输入 www.123.com 便可以跳转到 Tomcat初始界面呢?便用到 nginx的反向代理。
-
在 nginx.conf 配置文件中增加如下配置
server { listen 80; server_name 192.168.17.129; location / { root html; proxy_pass http://127.0.0.1:8080 index index.html index.htm; } }
如上配置,我们监听80端口,访问域名为www.123.com,不加端口号时默认为80端口,故访问该域名时会跳转到192.168.17.128:8080路径上
3.2 反向代理实例二
实现效果:使用 nginx 反向代理, 根据访问的路径跳转到不同端口的服务中
nginx 监听端口为 9001
访问 http://192.168.2.175:9001/edu/ 直接跳转到 127.0.0.1:8080
访问 http://192.168.2.175:9001/vod/ 直接跳转到 127.0.0.1:8081
实验步骤:
-
第一步,准备两个 tomcat ,一个 8080 端口,一个 8081 端口,分别在webapps目录中创建edu和vod文件夹,并准备好测试的页面
-
第二步,修改 nginx 的配置文件
在http 块中添加 server{}server { listen 9001; server_name 192.168.2.175; location ~ /edu/ { proxy_pass http://localhost:8080; } location ~ /vod/ { proxy_pass http://localhost:8081; } }
location指令说明
location [= | ~ | ~* | ^~] uri { }
1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
2、~:用于表示 uri 包含正则表达式,并且区分大小写。
3、~*:用于表示 uri 包含正则表达式,并且不区分大小写。
4、^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。
如果 uri 包含正则表达式,则必须要有 ~ 或者 ~ 标识。*
4. nginx配置实例2 - 负载均衡
实现效果:浏览器输入地址http://192.168.2.175/edu/a.html,实现负载均衡效果。平均分担到8080和8081端口
实验步骤:
-
准备两台tomcat服务器,一台8080,另一台8081
-
在两台tomcat里的webapps目录中创建名称是edu的文件夹,在文件夹中创建页面a.html,用于测试
-
在 nginx 的配置文件中进行负载均衡的配置
在http块中添加配置:
upstream myserver{ server 192.168.2.175:8080; server 192.168.2.175:8081; }
-
在 nginx 的配置文件中修改server配置
server { listen 80; server_name 192.168.2.175; location / { proxy_pass http://myserver; root html; index index.html index.htm; } }
Nginx 提供了几种分配方式策略:
-
轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
-
weight
weight代表权重,默认为 1, 权重越高被分配的客户端越多
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
如:
upstream myserver{ server 192.168.2.175:8080 weight=5; server 192.168.2.175:8081 weight=10; }
那么分配到8081比分配到8080的几率多一倍
-
ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
例如:
upstream server_pool{ ip_hash; server 192.168.2.175:8080; server 192.168.2.175:8081; }
-
fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream server_pool{ server 192.168.2.175:8080; server 192.168.2.175:8081; fair; }
5. nginx配置实例3 - 动静分离
Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx 处理静态页面,Tomcat处理动态页面。
动静分离从目前实现角度来讲大致分为两种。
一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。
通过 location 指定不同的后缀名实现不同的请求转发。
通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。
具体 Expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码 304,如果有修改,则直接从服务器重新下载,返回状态码 200。
实现效果:通过nginx能够访问静态资源a.html和1.png
实验步骤:
-
在linux系统中准备静态资源,用于进行访问
根目录下创建文件夹data
cd /
mkdir data
在data中创建www和image两个文件夹
cd data
mkdir www
mkdir image
进入www文件夹,创建一个html页面
cd www
vim a.html
<h1>test html!!!</h1>
进入image文件夹,放入一张图片1.png
-
修改nginx配置
server { listen 80; server_name 192.168.2.175; location /www/ { root /data/; index index.html index.htm; } location /image/ { root /data/; autoindex on; #表示列出文件夹中的文件 } }
重启nginx
-
测试
浏览器中输入地址http://192.168.2.175/image/1.png即可查看图片
http://192.168.2.175/image/可查看文件列表
浏览器中输入地址http://192.168.2.175/www/a.html即可访问页面
6. nginx配置高可用集群
6.1 什么是 nginx 高可用
在最初,用户访问服务器,通过nginx转发到不同的tomcat中。
但是这个过程中会产生一些问题:tomcat宕机(nginx会自动剔除)、nginx宕机
如果nginx宕机,那么用户请求结果失败
因此可配置nginx高可用集群来避免这个问题的发生
nginx高可用集群:
- 需要两台nginx服务器
- 需要keepalived
- 需要虚拟ip
两台nginx,一台作为主服务器(MASTER),一台从服务器/备份服务器(BACKUP),都可将请求转发到不同的tomcat
当MASTER宕机,会自动切换到BACKUP,实现高可用的效果
而主从切换的实现需要用到keepalived软件,类似于路由,用于检测当前的nginx是否正常,如果不正常,切换到另一台服务器
6.2 实现nginx高可用
准备工作:
- 需要两台服务器
- 在两台服务器安装nginx
- 在两台服务器安装keepalived
实现步骤:
-
准备两台虚拟机:192.168.2.175 192.168.2.198(右键一台虚拟机—管理—克隆)
-
两个服务器都安装nginx
安装nginx步骤
- 上传nginx压缩包到/usr/src
- tar -zvxf nginx-1.22.1.tar.gz解压缩
- 安装https
yum install openssl openssl-devel -y
- 执行configure
./configure
- 编译,执行
make
- 安装,
make install
- 进入/usr/local/nginx/sbin启动nginx
-
防火墙打开80端口
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --reload
-
两个服务器都安装keepakived
-
使用yum命令安装
yum install keepalived -y
-
使用命令
rpm -q -a keepalived
可查看安装结果 -
安装之后,在 etc 里面生成目录 keepalived ,有文件 keepalived.conf
-
-
完成高可用配置(主从配置)
-
修改/etc/keepalived/keepalived.conf
#全局定义 global_defs { notification_email { [email protected] [email protected] [email protected] } notification_email_from [email protected] smtp_server 192.168.17.129 smtp_connect_timeout 30 router_id LVS_DEVEL } #检测脚本和一些权重的参数 vrrp_script chk_http_port { #检测nginx是否存活的脚本 script "/usr/local/src/nginx_check.sh" interval 2 #(检测脚本执行的间隔) weight 2 } #虚拟IP配置 vrrp_instance VI_1 { state MASTER # 备份服务器上将 MASTER 改为 BACKUP interface ens33 //网卡 virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同 priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.2.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 #nginx启动路径 sleep 2 if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then killall keepalived fi fi
-
把两台服务器上 nginx 和 keepalived 启动
./nginx
systemctl start keepalived.service
-
-
最终测试
在浏览器地址栏输入 虚拟 ip 地址 192.168.2.50
可以访问到主服务器的nginx
把主服务器 192.168.2.175 nginx 和 keepalived 停止,再输入 192.168.2.50,可访问从服务器的nginx
配置文件中分为三部分:全局配置、脚本配置、虚拟IP配置
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.17.129
smtp_connect_timeout 30
router_id LVS_DEVEL #访问到主机
}
全局配置中最关键的是router_id,LVS_DEVEL是主机ID(服务器名字)
可通过/etc/hosts文件查看或修改服务器名
127.0.0.1 LVS_DEVEL
脚本配置中
#检测脚本和一些权重的参数
vrrp_script chk_http_port {
#脚本路径
script "/usr/local/src/nginx_check.sh"
#检测脚本执行的间隔 即每隔2s执行一次
interval 2
#当脚本中条件成立,当前主机的权重降低20
weight -20
}
虚拟IP配置中
#虚拟IP配置
vrrp_instance VI_1 {
#表示当前服务器是主服务器(MASTER)还是从/备份服务器(BACKUP)
state MASTER
#绑定的网卡
interface ens33
#主/从服务器的id
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
#主/从服务器的优先级 值越大 优先级越高 一般将主服务器的值设置为100 从服务器要比主服务器要小
priority 100
#时间间隔 表示每隔多长时间发送一次心跳 检测存活状态 默认每隔1s发送一次
advert_int 1
#权限校验方式
authentication {
#权限校验方式为密码
auth_type PASS
#密码为1111
auth_pass 1111
}
#表示虚拟IP 可绑定多个
virtual_ipaddress {
192.168.2.50 // VRRP H 虚拟地址
}
}
7. nginx原理
-
下图是nginx最基本的执行过程。涉及到两部分:master和worker
master相当于领导,将任务分配给worker
-
下图是worker的工作方式
worker通过争抢机制获得master的下发的任务,worker可以进行反向代理,用tomcat完成具体操作
一个nginx有一个master,可以有多个worker
-
一个 master 和多个 woker 有好处
- 可以使用
./nginx -s reload
热部署,利用 nginx 进行热部署操作 - 每个 worker 是独立的进程,如果有其中的一个 woker 出现问题,其他 woker 独立的,继续进行争抢,实现请求过程,不会造成服务中断
- 可以使用
-
应该设置多少个 woker 才合适
nginx同 redis 类似都采用了 io 多路复用机制,每个 worker 都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话下。每个 worker 的线程可以把一个 cpu 的性能发挥到极致。所以 worker 数和服务器的 cpu数相等是最为适宜的。设少了会浪费 cpu ,设多了会造成 cpu 频繁切换上下文带来的损耗。
- worker 数和服务器的 cpu 数相等是最为适宜的
worker_processes 4
-
连接数worker_connection多少合适?
-
如果发送一个请求,占用了worker的几个连接数?
答案:2个或者4个
如果只访问静态资源,那么接收与返回各占一个连接,所以是两个
如果需要访问Tomcat,那么就多出了worker与Tomcat的接收与返回的连接,所以是4个
-
若nginx 有一个 master ,有四个worker ,每个 worker 支持最大的连接数 1024 ,那么支持的最大并发数是多少?
- 普通的静态访问最大并发数是:4*1024/2
- 而如果是 HTTP 作 为反向代理来说,最大并发数量应该是 4*1024/4
-