一.Nginx简介
1. 什么是Nginx
Nginx (engine x) 是一个高性能,轻量级的HTTP和反向代理web服务器,电子邮件(IMAP/POP3)代理服务器,其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的页面服务器中表现较好。中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
场景理解:
正常情况下我们的项目由一台服务器跑起来就可以面对小规模量的访问,但是访问规模量增大后,tomcat肯定顶不住,反应不过来。
如何解决?首先想到的是使用redis来减少对数据库的访问,将数据保存到内存中去,以便快速访问,但是这根本解决不了问题,因为在高并发下单体服务器顶不住这样的压力,甚至可能导致内存突然飙升到100%
那就增加几台服务器呗,来缓解服务器压力,好像有道理,但是客户端只能访问一个服务器,且多个服务器之间的IP又都不一样,客户端则么知道因该访问哪个一?(总结的一个问题:就是如何通过客户端访问一个连接来自动映射访问到三台服务器?)
暂时无法在飞书文档外展示此内容
2. Nginx作为服务器
Nginx可以作为静态页面的web服务器,同时还支持CGI协议的动态语言,比如perl,php等。但不支持java,Java程序只能通过与Tomcat配合完成。Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受发哦负载的考验,有报告表明能支持高达5万个并发的链接数。
3. 反向代理
(1)正向代理
在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问。
(2)反向代理
其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到代理服务器,由反向代理服务器去现在目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实的IP地址。
4. 负载均衡
单个服务器解决不了,我们增加服务器数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。
负载均衡即是将负载均摊到不同的服务单元,既保证服务的可用性,又保证响应够快,给客户端更好的体验。
5. 动静分离
为了加快网站的解析速度,可以把动态页面和静态页面有不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
二.Nginx安装
安装gcc,C语言编辑器
yum install -y gcc
安装perl库
yum install -y pcre pcre-devel
安装zlib库
yum install -y zlib zlib-devel
解压安装nginx
去官网下载nignx的压缩包
tar zxvf nginx-1.12.2.tar.gz
./configure --prefix=/usr/local/nginx
make && make install
启动nginx
进入目录/usr/local/nginx/sbin
./nginx 启动
./nginx -s stop 快速停止
./nginx -s quit 优雅关闭,在退出前完成已经接受的连接请求
./nginx -s reload 重新加载配置
关于防火墙
systemctl stop firewalld.service 关闭防火墙
systemctl disable firewalld.service 禁止防火墙开机启动
firewall-cmd --zone=public --add-port=80/tcp --permanent 放行端口
firewall-cmd --reload 重启防火墙
安装成系统服务
创建服务脚本
vi /usr/lib/systemd/system/nginx.service
服务脚本内容
[Unit]
Description=nginx - web server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
systemctl daemon-reload 重新加载系统服务
systemctl status nginx.service 启动服务
systemctl enable nginx.service 开机启动
三.Nginx常用命令
使用nginx命令时,需要进入到nginx的目录中使用/user/local/nginx/sbin(每个人安装位置不同)
./nginx -v 查看版本号
./nginx 启动nginx
./nginx -s stop 关闭nginx
./nginx -s reload 重新加载
cp conf/nginx.conf.default conf/nginx.conf 重置nginx的nginx.conf文件
四.Nginx配置文件
1.nginx配置文件位置:nginx.conf
2.nginx配置文件有三部分组成:
全局块
从配置文件开始到events块之间的内容,主要设置影响nginx服务器整体运行的配置指令。
比如:worker_processes 1;这个值越大,可以支持的并发处理量越多。
#配置用户组
use 用户组名
工作进程数
worker_processes 1; (这里配置的是master下可以分配中的worker数量)
# 日志文件路径
error_log 路径
events块
涉及的指令主要影响Nginx服务器与用户的网络连接。
比如:worker_connections 1024;支持的最大连接数。
events{
# 一个进程是否同时被多个网络连接默认为no
multi_accept ;
# 事件驱动模型默认为epoll
use epoll;
# 最大连接数
worker_connections 1024;
}
http块
配置最频繁部分,其包含http全局块,server块
# 每个进程每次最大传输值
sendfile_max_chunk 100k;
# 长连接超时时间
keeplive_timeout 100;
# 响应客户端的超时时间
send_timeout 75;
- http全局块
配置的指令包括文件引入,MIME-TYPR定义,日志自定义,连接超时时间,单链接请求上限等。 - server块
这与虚拟主机有密切的关系,从用户角度看虚拟主机=硬件主机,该技术为了节省或联网服务器硬件成本
每个http块包含多个server块,每个server块相当于一个虚拟机
而每个server块分为全局server块,以及可以同时包含多个location块
server {
# 监听端口
listen 8080;
# 监听服务器地址
server_name 192.168.56.10;
# 每个连接请求上限次数
keepalive_requests 120;
# 字符集
charset utf-8;
# 服务日志所在目录以及日志格式
access_log logs/host80.log myLogFormat;
# 错误页
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
}
- 全局server块
常见的配置是本虚拟机主机的监听配置和本虚拟机主机的名称或IP配置 - location块
一个server块可以配置多个location块
这块的只要作用基于Nginx服务接收到的请求字符串,对虚拟机主机名称(Ip别名)之外街道字符串进行匹配,对特定的请求进行处理。地址定向,数据缓存和应答控制等,还有许多第三方模块的配置也在这里进行。
`... # 全局块
events { # events块
...
}
http { # http块
... # http全局块
server { # server块
... # server全局块
location [PATTERN] { # location块
...
}
location [PATTERN] {
...
}
}
server {
...
}
... # http全局块
}
五.配置实例
1. 反向代理
案例一:
1.实现效果
打开浏览器,在浏览器地址栏中输入地址www.123.com,跳转到linux系统tomcat主页中
2.具体实现
(1)在linux系统中安装tomcat,使用默认端口8080
tomcat安装文件放到linux系统中,解压
进入tomcat的bin目录中,./startup.sh启动tomcat服务器
linux中必须有jdk,可从官网下载
(2)对外开发访问的端口
firewall-cmd --add-port 8080/tcp --permanent
firewall-cmd --reload
(3)查看已经开放的端口
firewall-cmd --list-all
(4)在windows系统中通过浏览器访问tomcat
3.访问过程
4.具体步骤
在nginx进行请求转发的配置
案例二:
1.实现效果
使用nginx反向代理,根据访问的路径跳转到不同端口的服务中,nginx监听端口为9001
访问http://192.168.0.104:9001/edu/ 直接跳转到 127.0.0.1:8080
访问http://192.168.0.104:9001/vod/ 直接跳转到 127.0.0.1:8081
2.准备工作
准备两个Tomcat服务器,一个8080,一个8081
创建文件夹和测试页面
3.具体配置
找到nginx配置文件,进行反向代理
开放端口号:9001,8080,8081
location指令说明:
该指令用于匹配URL
语法:
location [ = | ~ | ~* | ^~] url{
}
1.=:用于不含正则表达式的url之前,要求字符串与uri严格匹配,如果成功,就停止搜索立即处理该请求
2.~:用于表示uri包含正常表达式,区分大小写
3.~*:用于uri包含正则表达式,不区分大小写
4.^~:用于不包含正则表达式的uri之前,要求nginx服务器找到表示uri和请求字符串匹配高度最高的locatioin后,立即生死用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配
2. 负载均衡
1.实现效果
浏览器地址栏输入http://192.168.0.104/edu/a.html,负载均衡效果,平均8080和8081端口
2.准备工作
准备两台tomcat服务器,一台8080,另一台8081
在两台tomcat里面webapps目录中创建名称edu文件夹,在edu文件夹中创建页面a.html,用于测试
Nginx提供了几种分配方式(策略)
- 轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 - Weight
weigh代表权,默认为1,权重越高被分配的客户越多。
指定轮询几率,weight和范围比率成正比,用于后端服务器性能不均的情况下。
upstream myserver{
server 192.168.0.104:8080 weight=10;
server 192.168.0.104:8081 weight=15;
}
- ip_hast
每个请求访问ip的jasj结果分配,这个每个访客固定访问一个后端服务器,可以解决session的问题
upstream server_pool{
ip_hash
server 192.168.5.21:80
server 192.168.5.22:80
}
- Fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配
upstream server_pool{
server 192.168.5.21:80
server 192.168.5.22:80
fair
}
3. 动静分离
动静分离简单说就是动态跟静态请求分开,不能理解成纯粹的把动态页面和静态页面物理分离,严格说是动态请求与静态请求分开,动静分离有两种实现方式:
- 纯粹的把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方式。
- 动态跟静态文件混合在一起发布,通过Nginx分开。
通过location指定不同的后缀名实现不同的请求转发,通过expires参数设置,可以使缓存区缓存过期时间,减少服务器之前的请求和流量。具体Expires定义:是给一个资源设定一个过期时间,也就是说无法去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此方法非常适合不经常变动的资源(如果经常更新的文件,不建议使用Expries来缓存),我这里设置3d,表示3天内访问这个URL,发送一个请求,比对服务器给文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码200
4. 高可用
1.什么nginx高可用?
2.配置高可用的准备工作
(1)需要两台服务器
(2)在两台服务器上安装nginx
(3)在两台服务器安装keepalived
3.在两台服务器安装keepalived
(1)使用yum命令进行安装
yum install keepalived -y
rpm -q -a keepalived 查看
(2)安装后,在etc里面生成目录keepalived,有文件keepalived.conf
4.完成高可用配置(主从配置)
(1)修改/etc/keepalived/keepalivec.conf配置文件
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
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 MASTER #备份服务器上将MASTER改为BACKUP
interface eth0 //网卡
virtual_router_id 51 #主,备机的virtual_router_id必须相同
priority 100 #主,备机取不同的优先级,主机值较大,备份机值较小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.17.50 //VRRP H虚拟地址
}
}
(2)在/usr/local/src添加检查脚本
#!/bin/bash
A=`ps -C nginx �Cno-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
(3)把两台服务器上nginx和keepalived启动
启动nginx: ./nginx
启动keepalived: systemctl start keepalived.service
六.Nginx的原理分析
1.工作原理:
2.worker的工作原理
3.一个master和多个woker的好处
(1)可以使用Nginx - s reload热部署,利用nginx进行热部署操作
(2)每个woker是独立的进程,不需要加锁,省略了锁带来的开销,同时在编程以及问题查找会方便许多。如果有其中一个woker出现问题,其他woker独立的,其他继续进行争抢,实现请求过程,不会造成服务中断。如果一个worker异常退出,程序肯定有bug,会吊装当前worker上所有请求失效,但是不会影响其他所有请求。
4.设置多少worker合适
nginx同redis类似,采取io多路复用机制,每个worker都是一个独立的进程,但是每个进程只有一个主线程,通过采取异步非阻塞的方式来进行处理。每个worker的线程可以把一个cpu性能发挥到极致,所有worker数和服务器的cpu数相等时最为适宜的。
5.连接数worker_connection
- 发送请求,占用了woker几个连接数?
访问静态资源是两个,访问动态资源是4个 - nginx有一个master,有四个woker,每个woker支持最大的连接数1024,支持的最大并发数是多少?
普通的静态访问最大并发数是:woker_connectionwoker_processes/2
而如果是HTTP作为反向代理来说,最大并发数应该是worker_connectionsworker_processes/4
interact.f5.com