Nginx大纲
- Nginx基本概念
- nginx是什么,做什么事情
- 反向代理
- 负载均衡
- 动静分离
- nginx安装、常用命令和配置文件
- 在linux系统中安装nginx
- nginx常用命令
- nginx配置文件
-
nginx配置实例 1-反向代理
-
nginx 配置实例 2-负载均衡
-
nginx 配置实例 3-动静分离
-
nginx配置高可用集群
Nginx简介
官方介绍
http://nginx.org/en/
百度百科
https://baike.baidu.com/item/nginx/3817705?fr=aladdin
nginx [engine x] 是 HTTP 和反向代理服务器、邮件代理服务器和通用 TCP/UDP 代理服务器,最初由Igor Sysoev编写。很长一段时间以来,它一直在许多负载重的俄罗斯网站上运行,包括 Yandex、 Mail.Ru、 VK和 Rambler。根据 Netcraft 的数据, 2022 年 9 月,nginx 服务或代理了 21.48% 最繁忙的站点。以下是一些成功案例: Dropbox、 Netflix、 Wordpress.com、 FastMail.FM。
相关概念
正向代理和反向代理
https://blog.csdn.net/Dax1_/article/details/124652162?ops_request_misc=&request_id=&biz_id=102&utm_term=%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-2-124652162.nonecase&spm=1018.2226.3001.4187
正向代理
概念
意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。
特点:
- 正向代理需要主动设置代理服务器ip或者域名进行访问,由设置的服务器ip或者域名去访问内容并返回
- 正向代理是代理客户端,为客户端收发请求,使真实客户端对服务器不可见。
使用场景
正向代理的典型用途是为防火墙内的局域网客户端提供访问服务器的途径,正向代理还可以使用缓冲特性减少网络利用率。
反向代理
概念
反向代理是指以代理服务器来接收客户端的请求,然后将请求转发给内部网络上的服务器,将从服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器。
对于客户端来说,反向代理就相当于目标服务器,只需要将反向代理当作目标服务器一样发送请求就可以了,并且客户端不需要进行任何设置。
特点:
-
正向代理需要配置代理服务器,而反向代理不需要做任何设置。
-
反向代理是代理服务器,为服务器收发请求,使真实服务器对客户端不可见。
使用场景
反向代理的典型用途是将防火墙外的服务器提供给客户端访问,反向代理还可以为后端的多台服务器提供负载均衡,或者为后端较慢的服务器提供缓冲服务。
用途
- 隐藏服务器真实ip:使用反向代理,可以对客户端隐藏服务器的ip地址
- 负载均衡:反向代理服务器可以做负载均衡,根据所有真实服务器的负载情况,将客户端请求分发到不同的真实服务器上
- 提高访问速度:反向代理服务器可以对静态内容及短时间内有大量访问请求的动态内容提供缓存服务,提高访问速度
- 提供安全保障:反向代理服务器可以作为应用层防火墙,为网站提供对基于web的攻击行为(例如DoS/DDoS)的防护,更容易排查恶意软件等。还可以为后端服务器统一提供加密和SSL加速(如SSL终端代理),提供HTTP访问认证等。
正向代理和反向代理的异同
相同点
正向代理和反向代理所处的位置都是客户端和真实服务器之间,所做的事情也都是把客户端的请求转发给服务器,再把服务器的响应转发给客户端。
不同点
- 正向代理是客户端的代理,服务器不知道真正的客户端是谁;反向代理是服务器的代理,客户端不知道真正的服务器是谁
- 正向代理一般是客户端架设的;反向代理一般是服务器架设的
- 正向代理主要是用来解决访问限制问题;反向代理则是提供负载均衡、安全防护等作用。二者都能提高访问速度
负载均衡和动静分离
负载均衡
需求
大型网站都要面对庞大的用户量,高并发,海量数据等挑战。为了提升系统整体的性能,可以采用垂直扩展和水平扩展两种方式。
垂直扩展:在网站发展早期,可以从单机的角度通过增加硬件处理能力,比如 CPU 处理能力,内存容量,磁盘等方面,实现服务器处理能力的提升。但是,单机是有性能瓶颈的,一旦触及瓶颈,再想提升,付出的成本和代价会极高。这显然不能满足大型分布式系统(网站)所有应对的大流量,高并发,海量数据等挑战。
水平扩展:通过集群来分担大型网站的流量。集群中的应用服务器(节点)通常被设计成无状态,用户可以请求任何一个节点,这些节点共同分担访问压力。水平扩展有两个要点:
通过集群来分担大型网站的流量。集群中的应用服务器(节点)通常被设计成无状态,用户可以请求任何一个节点,这些节点共同分担访问压力。水平扩展有两个要点:
-
应用集群:将同一应用部署到多台机器上,组成处理集群,接收负载均衡设备分发的请求,进行处理,并返回相应数据。
-
负载均衡:将用户访问请求,通过某种算法,分发到集群中的节点。
什么是负载均衡
负载均衡(Load Balance,简称 LB)是高并发、高可用系统必不可少的关键组件,目标是 尽力将网络流量平均分发到多个服务器上,以提高系统整体的响应速度和可用性。
负载均衡的主要作用如下:
高并发:负载均衡通过算法调整负载,尽力均匀的分配应用集群中各节点的工作量,以此提高应用集群的并发处理能力(吞吐量)。
伸缩性:添加或减少服务器数量,然后由负载均衡进行分发控制。这使得应用集群具备伸缩性。
高可用:负载均衡器可以监控候选服务器,当服务器不可用时,自动跳过,将请求分发给可用的服务器。这使得应用集群具备高可用的特性。
安全防护:有些负载均衡软件或硬件提供了安全性功能,如:黑白名单处理、防火墙,防 DDos 攻击等。
4304
动静分离
在Linux系统安装
1.远程工具连接linux
2.安装4个插件
yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
一次安装如果有问题,可以试一下分开安装
yum install gcc-c++
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
yum install -y openssl openssl-devel
安装的插件的作用
1.gcc 可以编译 C,C++,Ada,Object C和Java等语言(安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境)
2.pcre pcre-devel pcre是一个perl库,包括perl兼容的正则表达式库,nginx的http模块使用pcre来解析正则表达式,所以需要安装pcre库
3.zlib zlib-devel zlib库提供了很多种压缩和解压缩方式nginx使用zlib对http包的内容进行gzip,所以需要安装
4.openssl openssl-devel OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。
5.nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库
3.安装nginx
使用wget命令下载(推荐)。确保系统已经安装了wget,如果没有安装,执行 yum install wget 安装
wgte https://nginx.org/download/nginx-1.21.6.tar.gz
解压
tar xvf nginx-1.21.6.tar.gz
cd nginx-1.21.6
配置
./configure
编译并安装
make && make install
查看安装路径
whereis nginx
设置开机启动
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx service
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
说明:
Description:描述服务
After:描述服务类别
[Service]服务运行参数的设置
Type=forking是后台运行的形式
ExecStart为服务的具体运行命令
ExecReload为重启命令
ExecStop为停止命令
PrivateTmp=True表示给服务分配独立的临时空间
注意:[Service]的启动、重启、停止命令全部要求使用绝对路径
[Install]运行级别下服务安装的相关设置,可设置为多用户,即系统运行级别为3
保存退出
加入开机自启动
systemctl enable nginx.service
取消开机自启动
systemctl disable nginx.service
服务的启动/停止/刷新配置文件/查看状态
#启动nginx服务
systemctl start nginx.service
#停止服务
systemctl stop nginx.service
#重新启动服务
systemctl restart nginx.service
#查看所有已启动的服务
systemctl list-units --type=service
#查看服务当前状态
systemctl status nginx.service
#设置开机自启动
systemctl enable nginx.service
# 停止开机自启动
systemctl disable nginx.service
4.防火墙端口设置
查看开放的端口号
firewall-cmd --list-all
设置开放80端口
-cmd --add-port=80/tcp --permanent
重启防火墙
firewall-cmd --reload
nginx常用命令
前提条件:进入nginx的目录
cd /usr/local/nginx/sbin/
查看版本号
./nginx -v
查看nginx进程状态
ps -ef | grep nginx
关闭nginx
./nginx -s stop
启动nginx
./nginx
重新加载nginx
./nginx -s reload
nginx配置文件
位置
/usr/local/nginx/conf/nginx.conf
三部分
配置反向代理
案例一
1.实现效果
(1)打开浏览器,在浏览器地址栏输入地址:www.123.com,跳转到linux系统tomcat主页面中
2.准备工作
(1)在linux系统中安装tomcat,使用默认端口8080
(2)安装tomcat
(3)对外开放8080端口(tomcat)和80端口(nginx)
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --reload
(4)在windows中的浏览器访问tomcat服务器
3.具体配置
一 在windows系统的host文件进行域名和ip对应关系的配置
C:\Windows\System32\drivers\etc
ip + www.123.com
二 在nginx进行请求转发的配置(反向代理配置)
4.测试效果
重启nginx
cd /usr/local/nginx/sbin/
./nginx -s reload
访问www.123.com
案例二
需求
2.准备工作
vim /usr/local/nginx/conf/nginx.conf
(2)开放对外访问的端口号 9001 8080 8081
firewall-cmd --add-port=9001/tcp --permanent
firewall-cmd --reload
(3)重启nginx
cd /usr/local/nginx/sbin/
./nginx -s reload
(4)测试,访问http://192.168.17.129:9001/edu/ 和 http://192.168.17.129:9001/vod/
配置负载均衡
upstream 服务器名称{
server 192.168.17.129:8080;
server 192.168.17.129:8081;
}
proxy_pass http://服务器名称;
4、重启nginx
cd /usr/local/nginx/sbin/
./nginx -s reload
5、测试负载均衡是否实现
访问192.168.17.129/edu/a.html
刷新,发现一下是8080!! 一下是8081!!
配置成功!!!
负载均衡分配方式(策略)
配置动静分离
配置高可用
nginx原理
推荐博客CSDN-Nginx-详解其原理
Nginx结合了多进程机制
和异步机制
对外提供服务
Nginx服务启动后,会产生一个主进程
和多个工作进程
。
master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程
而基本的网络事件,则是放在worker进程中来处理了。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的求,worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致
Master进程的作用是?
读取并验证配置文件nginx.conf;管理worker进程;
Worker进程的作用是?
每一个Worker进程都维护一个线程(避免线程切换),处理连接和请求;注意Worker进程的个数由配置文件决定,一般和CPU个数相关(有利于进程切换),配置几个就有几个Worker进程。
热部署
master来管理worker进程,所以我们只需要与master进程通信就行了。master进程会接收来自外界发来的信号,再根据信号做不同的事情,比如我们前面常用的
./sbin/nginx -c conf/nginx.conf -s reload
执行这个命令时,master收到这个信号以后先启动一个新的Nginx进程,而新的Nginx进程在解析到reload参数后,就知道是要控制Nginx来重新加载配置文件,它会向master进程发送信号,然后master会重新加载配置文件,在启动新的worker进程,并向所有老的worker进程发送信号,告诉他们可以退休了,新的worker启动之后就可以以新的配置文件接收新的请求了 – 热部署的原理
worker进程是如何处理请求?
我们基本上知道了在操作nginx时,nginx内部所做的事情,那么worker进程是如何处理请求的呢? 在Nginx中,所有的worker进程都是平等的,每个进程处理每个请求的机会是一样的。当我们提供80端口的http服务时,一个连接请求过来,每个进程都可能处理这个连接。
worker进程是从master进程fork过来的,而在master进程中,会先建立好需要listen的socket,然后fork出多个worker进程,当有新连接请求过来时work进程可以去处理,为了避免惊群效应,worker进程在处理请求之前先要去抢占accept_mutex,也就是互斥锁,当获得锁成功以后,就可以去解析处理这个请求。请求处理完以后再返回给客户端。
进程模型的处理方式带来的一些好处就是:进程之间是独立的,也就是一个worker进程出现异常退出,其他worker进程是不会受到影响的;此外,独立进程也会避免一些不需要的锁操作,这样子会提高处理效率,并且开发调试也更容易。
worker进程会竞争监听客户端的连接请求:这种方式可能会带来一个问题,就是可能所有的请求都被一个worker进程给竞争获取了,导致其他进程都比较空闲,而某一个进程会处于忙碌的状态,这种状态可能还会导致无法及时响应连接而丢弃discard掉本有能力处理的请求。这种不公平的现象,是需要避免的,尤其是在高可靠web服务器环境下。
针对这种现象,Nginx采用了一个是否打开accept_mutex选项的值,ngx_accept_disabled标识控制一个worker进程是否需要去竞争获取accept_mutex选项,进而获取accept事件
ngx_accept_disabled值:nginx单进程的所有连接总数的八分之一,减去剩下的空闲连接数量,得到的这个ngx_accept_disabled。
当ngx_accept_disabled大于0时,不会去尝试获取accept_mutex锁,并且将ngx_accept_disabled减1,于是,每次执行到此处时,都会去减1,直到小于0。不去获取accept_mutex锁,就是等于让出获取连接的机会,很显然可以看出,当空闲连接越少时,ngx_accept_disable越大,于是让出的机会就越多,这样其它进程获取锁的机会也就越大。不去accept,自己的连接就控制下来了,其它进程的连接池就会得到利用,这样,nginx就控制了多进程间连接的平衡了。
连接数worker_connection
问题1:发送一个请求,要占用几个woker的连接数?
2或4
原因:普通的静态访问,客户端发送一个请求,worker将请求返回。2个
HTTP作为反向代理,worker接收到客户端的请求后,需要发送请求给tomcat来访问数据库,tomcat再返回给worker,再给client。4个
问题2:nginx有一个master,4个worker,每个worker支持最大的连接数为1024,worker支持的最大并发数为?
1024*4/2
1024*4/4
- 普通的静态访问,worker_connections*worker_processes/2
- HTTP作为反向代理,worker_connections*worker_processes/4