学习记录
文章目录
- Nginx
- 一、Nginx是什么?
- 二、为什么学习Nginx?
- 三、Nginx作用
- 四、Nginx下载与安装
- 五、Nginx设置成系统开机自启动服务
- 六、Nginx配置文件
- 七、配置虚拟主机
- https
- 八、配置nginx服务的反向代理
- 九、配置nginx服务的负载均衡
- 十、Location配置(重点)
- 十一、配置nginx服务的动静分离
- 十二、Http动态负载均衡
- 十三、Nginx限流
- 十四、Nginx原理:Master-Worker
- 十五、Nginx调优:worker_processes、worker_cpu_affinity
- 十六、Nginx高可用:用keepalived实现
Nginx
一、Nginx是什么?
Nginx (engine x) 是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的Web和反向代理服务器。第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。Nginx 是一个很强大的高性能 Web 和反向代理服务器,它具有很多非常优越的特性:在连接高并发的情况下,Nginx 是 Apache 服务不错的替代品。
1、 Nginx (“engine x”) 是一个高性能的静态HTTP和反向代理服务器,也是一个 IMAP/POP3/SMTP代理服务器。
2、 第一个公开版本0.1.0发布于2004年10月4日。
3、 其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
4、 官方测试nginx能够支撑5万并发链接,并且cpu、内存等资源消耗却非常低,运行非常稳定。
5、 2011年6月1日,nginx 1.0.4发布。
6、 事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:新浪、网易、腾讯、阿里、土豆网、唯品会、京东、360、优酷等。
二、为什么学习Nginx?
2.1 现实生活中的案例
2.2 web系统架构变迁中遇到的问题
单体服务架构:
应用服务集群架构:
微服务架构
2.3 如何解决这些问题?
解决的技术方案如下:
1 购买硬件负载均衡服务器,问题是需要花钱,价格不菲。
2 LVS(OSI 七层模型第四层“传输层“),配置LVS复杂,使用难度高。
3 Nginx可以有效解决高并发的问题,那么什么是Nginx呢?
三、Nginx作用
搭建虚拟主机
服务的反向代理
在反向代理中配置集群的负载均衡
在反向代理中配置集群的动静分离
代理服务器根据其代理对象的不同,可以分为正向代理服务器与反向代理服务器。这里的“正”与“反”均是站在客户端角度来说的。
3.1 正向代理
正向代理是对客户端的代理。客户端 C 想要从服务端 S 获取资源,但由于某些原因不能直接访问服务端,而是通过另外一台主机 P 向服务端发送请求。当服务端处理完毕请求后,将响应发送给主机 P,主机 P 在接收到来自服务端的响应后,将响应又转给了客户端 C。此时的主机 P,就称为客户端 C 的正向代理服务器。
客户端在使用正向代理服务器时是知道其要访问的目标服务器的地址等信息的。正向代理服务器是为服务用户(客户端)而架设的主机,与服务端无关,对服务器端透明。
###示例:xxxx康复医院,nginx正向代理配置
#(前置机)客户端 C 的ip:192.168.2.198 通外网的能访问互联网。
#目标服务器 S 的ip:192.168.2.10 客户端 C 与目标服务器 S 内网相通。
#nginx部署在(前置机)客户端 C。
#java下的tomcat、war包项目部署应用在ip:192.168.2.10(目标服务器S)
#(前置机)客户端 C 百度搜索公网固定ip,地址是不会变的,财政的服务是要设置白名单的。
#百度ip地址:110.200.110.110,加白名单。
#前置机192.168.2.198部署nginx,修改nginx-1.16.1\conf\conf.d\tomcat.conf配置文件如下
server {
listen 9000;
server_name 192.168.2.198;
location /xxxxHisServer/ {
proxy_pass http://111.111.111.111:8080/xxxxHisServer/;
}
location /xxxxProvider/ {
proxy_pass http://222.44.66.55:9000/xxxxProvider/;
}
}
3.2 反向代理
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
3.3 反向代理之负载均衡
单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,负载分发到不同的版务器,也就是我们所说的负载均衡。
3.4 反向代理之动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
四、Nginx下载与安装
4.1 Nginx下载
官网下载Nginx软件http://nginx.org
点击右侧的“download”:
网址:http://nginx.org/en/download.html
Nginx 官方提供了三个类型的版本:
Mainline Version:主线版,是最新版,但未经过过多的生产测试。
Stable Version:稳定版,生产环境使用版本。
Legacy Version:老版本。
我们需要下载的是Stable Version稳定版。其中又分为两种版本:
Linux 版与 Windows 版。开发时这两个版本我们都下载。Linux 版用于生产环境,而 Windows 版用于开发测试,选择需要的版本进行下载。
提供nginx百度网盘下载链接:
链接:https://pan.baidu.com/s/15PmoH8-ujtx5JTstmziQbw
提取码:qwer
链接:https://pan.baidu.com/s/15PmoH8-ujtx5JTstmziQbw
提取码:qwer
4.2 Nginx 的源码安装
nginx安装为源码安装,将nignx安装在192.168.164.101 node1虚拟机上。
4.2.1 首先安装Nginx依赖
nginx是C语言开发,建议在linux上运行,本文档使用CentOS7.9作为安装环境。
不安装依赖直接执行./configure后会报错:如何解决?
1.gcc
安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,需要安装gcc。安装编译命令make。安装自动编译命令automake。
yum install -y gcc make automake
2.pcre 正则表达式库
PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 Perl 兼容的正则表达式库。nginx的http模块使用Pcre来解析正则表达式,所以需要在linux上安装Pcre库。
注:pcre-devel是使用pcre开发的一个二次开发库。nginx也需要此库。
yum install -y pcre pcre-devel
3.zlib 压缩和解压缩
zlib库提供了很多种压缩和解压缩的方式,nginx使用zlib对http包的内容进行gzip,所以需要在linux上安装zlib库。
yum -y install zlib zlib-devel
4.Openssl
OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码
算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应
用程序供测试或其它目的使用。
https
nginx不仅支持http协议,还支持https(即在ssl协议上传输http),所以需要在linux安装openssl库。
yum -y install openssl openssl-devel
5.统一安装依赖环境命令(命令执行后一次性安装所有依赖)
yum -y install gcc make automake pcre pcre-devel zlib zlib-devel openssl openssl-devel
4.2.2 源码安装Nginx
1.创建存放源文件的文件夹:
首先在目录/opt下创建apps目录,用于存放源文件以及解压后的文件
2.上传Nginx到步骤/opt/apps创建的目录下
安装lrzsz文件传输上传下载命令:yum -y lrzsz
rz命令把nginx从windows系统下载传输到linux系统:
rz
补充:
或者直接执行命令下载nginx源码:
sudo curl -0 http://nginx.org/download/nginx-1.20.1.tar.gz
3.解压Nginx
解压nginx,解压到当前目录并查看:
cd /opt/apps
tar -xvf nginx-1.20.1.tar.gz
4.nginx解压目录下目录结构与目录文件作用:
进入解压目录查看nginx的目录结构:
各个目录中存放的文件作用为:
auto:存放 Nginx 自动安装的相关文件
conf:存放 Nginx 服务器配置文件
configure:命令,用于对即将安装的软件的配置,完成makefile 编译文件的生成
contrib:存放由其他机构贡献的文档材料
html:存放 Nginx 欢迎页面
man:manual,手册,存放 Nginx 帮助文档
src:存放 Nginx 源码
5.生成makefile报错处理
进入nginx-1.20.1解压目录,在 Nginx 解压目录下运行 make 命令,用于完成编译。
但此时会给出提示:没有指定目标,并且没有发现编译文件makefile。
怎么办?如何处理?(配置configure文件参数,生产makefile文件)
编译命令 make 需要根据编译文件 makefile 进行编译,所以在编译之前需要先生成编译文件 makefile。使用 configure 命令可以生成该文件。
那么,configure 命令需要配置些什么参数呢?
使用./configure --help 可以查看到可以使用的参数说明。这些参数可以分为三类:
使用./configure --help 查看使用configure命令需要配置的参数说明:
第一类:基本信息的配置
–prefix:Nginx 安装目录。注意:安装目录与解压目录不一样
–sbin-path:Nginx 命令文件
–modules-path:Nginx 模块存放路径
–conf-prefix:Nginx 配置文件存放路径
–pid-path:Nginx 的进程 id 文件
–error-log-path:错误日志文件
–http-log-path:http访问日志文件
第二类:默认没有安装,可以指定安装的模块,使用–with开头。Nginx的高扩展性就体现在这里。
–with_http_ssl_module:https 访问协议需要安装 Http安全连接协议模块 SSL(Secure SocketsLayer,安全套接层)。
注意:在执行过 configure 命令后并不会立即生成安装目录,也不会马上开始安装指定的模块,而仅仅是将命令中指定的参数及默认配置写入到即将要生成的 Makefile文件中。
第三类:默认已经安装,可以指定卸载的模块,使用–without开头。
6.配置./configure执行命令文件参数,并执行命令
下面是简单配置的命令执行。命令中每一行的最后添加了反斜杠\表示当前命令并未结束,回车不会执行该命令。执行成功后,会给出配置报告。
配置成功后,再次查看 Nginx 解压目录,发现其中多出了一个文件 Makefile。后面的编译就是依靠该文件进行的。
注意:
手动创建client目录:mkdir -p /var/temp/nginx/client
输入以下内容后在nginx-1.20.1解压目录下回车:
./configure \
--prefix=/usr/local/nginx \
--pid-path=/usr/local/nginx/logs/nginx.pid \
--error-log-path=/usr/local/nginx/logs/error.log \
--http-log-path=/usr/local/nginx/logs/access.log \
--with-http_ssl_module \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi
7.make编译,make install安装
这是两个命令,make 为编译命令,make install 为安装命
令,可以分别执行。这里使用&&将两个命令连接执行,会在前面命
令执行成功的前提下才会执行第二个命令。
编译与安装:make && make install
4.3 Nginx目录介绍
安装目录配置由–prefix=/usr/local/nginx
进入到nginx安装目录:cd /usr/local/nginx
查看目录结构:ll
4.3.1 conf目录
Nginx所有配置文件的目录,极其重要。在该目录中包含一个nginx.conf配置文件。
4.3.2 html目录
Nginx的默认站点目录。
4.3.3 logs目录
存放Nginx的日志文件。 access.log error.log nginx.pid
刚安装完nginx,从未启动过nginx的话logs目录下什么都没有。
只有执行./sbin/nginx启动nginx后,才会出现以下三个文件:
logs目录下的日志各代表是什么?(作用)
access.log 是:记录正常访问的日志
error.log 是:错误日志
nginx.pid 是:nginx进程id(83325是当前启动nginx的master进程的id)
linux的ps aux |grep 命令
查看nginx进程状态:ps aux|grep nginx
使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵尸、哪些进程占用了过多的资源等。ps是显示当前状态处于running的进程,grep表示正则化搜索搜索,而ps aux是显示所有进程和其状态
4.3.4 sbin目录
Nginx命令的目录,如Nginx的启动和关闭,都是运行sbin目录下的nginx命令。
4.4 Nginx启动
4.4.1 关闭防火墙,系统重启后还会启动防火墙,不可以启动nginx
关闭防火墙:systemctl stop firewalld
查看防火墙状态:systemctl status firewalld
4.4.2 禁用防火墙,系统重启后不会启动防火墙,可以启动nginx
禁用防火墙:systemctl disable firewalld
重启防火墙(1.才会生效):firewall-cmd --reload
禁用防火墙后重启虚拟机(2.才会生效):reboot
查看firewalld是否加入开机自启动:systemctl list-unit-files |grep firewalld
查看是否加入开机自启动项:systemctl list-unit-files |grep xxx
4.4.3 启动Nginx:运行sbin目录下的nginx命令
nginx启动必须进入到/usr/local/nginx/sbin目录下才能启动:
cd /usr/local/nginx/sbin
启动nginx:./nginx
查看nginx进程状态:ps aux|grep nginx
4.4.4 测试启动Nginx是否成功
浏览器访问http://192.168.164.101,welcome to nginx说明启动成功。
4.5 Nginx关闭
如何关闭nginx?有几种方式?
(1).立即停止服务:./nginx -s stop
这种方法比较强硬,无论进程是否在工作,都直接停止进程。
(2).从容停止服务:./nginx -s quit
这种方法较stop相比就比较温和一些了,需要进程完成当前工作后再停止。
(3).killall方法杀死进程:killall nginx
直接杀死进程,在上面无效的情况下使用,态度强硬,简单粗暴!
执行killall命令时提示:-bash: killall: command not found
没有killall命令的解决方法,执行如下命令安装就行:yum -y install psmisc
psmisc软件包包含三个帮助管理/proc目录的程序,包含下列程序:
fuser、 killall、pstree和pstree.x11( 到pstree的链接 )
fuser 显示使用指定文件或者文件系统的进程的PID
killall 杀死某个名字的进程,它向运行指定命令的所有进程发出信号
pstree 树型显示当前运行的进程
pstree.x11 与pstree功能相同,只是在退出前需要确认
五、Nginx设置成系统开机自启动服务
5.1 nginx在linux系统下设置成开机自启服务
为什么?
nginx必须进入到/usr/local/nginx/sbin目录下才能启动和停止,使用上面的方法启停nginx,每次都要进入安装目录输入命令,尤其是在系统意外重启的时候,让它自动启动的话还得登录它的控制台上,执行可执行文件非常麻烦,非常不方便,可以把nginx安装成脚本。
配置一下systemctl。
systemctl是systemd对应的进程管理命令。
可以在任意位置使用systemctl启动、停止nginx。
systemd是Linux系统最新的初始化系统(init),作用是提高系统的启动速度,尽可能启动较少的进程,尽可能更多进程并发启动。
(1)进到linux系统的服务添加路径
进到linux系统的服务添加路径/usr/lib/systemd/system/下:
cd /usr/lib/systemd/system/
/usr/lib/systemd/system目录自动存放启动文件的配置位置,里面一般包含有XXXXX.service,调用XXXXX.service该文件即可启动该服务。
(2)建立服务文件nginx.service
在系统服务路径/usr/lib/systemd/system/下新建nginx.service配置文件:
vim nginx.service
编辑配置文件:
注意nginx.service服务配置文件里的配置必须与nginx的安装路径保持一样: /usr/local/nginx/
[Unit]
Description=nginx - high performance 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
[Unit]Unit区块,服务的说明:
定义与Unit类型无关的通用选项;用于提供unit的描述信息、unit行为及依赖关系等。所以Unit这个板块负责启动顺序与依赖关系。
常用选项:
Description:服务的简单描述;意义性描述;
After:依赖,仅当依赖的服务启动之后再启动自定义的服务单元。定义unit的启动次序;表示当前unit应该晚于哪些unit启动;其功能与Before相反;
[Service]Service区块,定义如何启动当前服务:
service段的常用选项:
服务运行参数的设置
Type=forking是后台运行的形式。由ExecStart所启动的进程生成的一个子进程为主,父进程退出。
ExecStart为服务的具体运行命令。指明启动unit要运行命令或脚本。
ExecReload为重启服务时执行的命令
ExecStop为停止服务时执行的命令
注意:启动、重启、停止命令全部要求使用绝对路径
[Install]区块,服务安装的相关设置,可设置为多用户。定义如何安装这个配置文件,即怎样做到开机启动。
WantedBy字段:表示该服务所在的 Target。
Target的含义是服务组,表示一组服务。WantedBy=multi-user.target指的是,nginx所在的 Target 是multi-user.target。这个设置非常重要,因为执行systemctl enable nginx.service命令时,nginx.service的一个符号链接,就会放在/etc/systemd/system目录下面的multi-user.target.wants子目录之中。
默认的启动 Target 是multi-user.target。在这个组里的所有服务,都将开机启动。这就是为什么systemctl enable命令能设置开机启动的原因。
[Unit]
Description=nginx - high performance 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
(3)添加执行权限
在系统服务路径/usr/lib/systemd/system下以755的权限保存在/usr/lib/systemd/system目录:
chmod +x nginx.service
(4)设置nginx开机自启动
查看nginx服务当前状态:systemctl status nginx
Active: inactive (dead),说明nginx服务是关闭的
查看nginx是否设置开机自启动服务:
systemctl list-unit-files|grep nginx
nginx.service disabled,说明nginx没有设置成开机自启服务
设置开机自启动(在任意目录下执行启动nginx):systemctl enable nginx
查看nginx是否设置开机自启动服务:
systemctl list-unit-files|grep nginx
此时enable,说明nginx已经开启开机自启服务
查看nginx服务当前状态:
systemctl status nginx
dead说明nginx服务是关闭的,此时还没有开启nginx服务
(5)启动nginx服务
启动nginx服务: systemctl start nginx
查看服务当前状态: systemctl status nginx
Active: active (running),说明nginx服务已经启动
浏览器访问http://192.168.164.101,welcome to nginx说明nginx服务启动成功。
(6)重新启动nginx服务
重新启动nginx服务:systemctl restart nginx
(7)关闭nginx服务
关闭nginx服务:systemctl stop nginx
查看服务当前状态: systemctl status nginx
Active: inactive (dead),说明nginx服务已经关闭
浏览器访问http://192.168.164.101,无法访问说明nginx已关闭。
(8)关闭nginx开机自启动
关闭nginx开机自启动:systemctl disable nginx
查看nginx服务当前状态:systemctl status nginx
查看nginx是否设置开机自启动服务:systemctl list-unit-files|grep nginx
nginx.service disabled,说明关闭nginx开机自启服务
(9)查看所有已启动的服务
查看所有已启动的服务: systemctl list-units --type=service
(10)卸载nginx服务并删除nginx
- 关闭nginx服务:systemctl stop nginx
- 关闭nginx开机自启动:systemctl disable nginx
查看nginx服务当前状态:systemctl status nginx
查看nginx是否设置开机自启动服务:systemctl list-unit-files|grep nginx
nginx.service disabled,说明关闭nginx开机自启服务 - 删除创建client目录:rm -rf /var/temp/nginx/client
补充
5.2 nginx在windows系统下设置成开机自启服务
为什么?
windows下想启动nginx是很简单的,双击nginx.exe,会看到一个黑色的弹窗一闪而过,启动完成。
比如生产环境一家医院的windows系统实际部署用到nginx过程中,会有windows机器死机或者医院停电电脑重启的情况,一但windows死机或windows电脑重启nginx服务就没了。如果服务是你在维护重启电脑后nginx服务会挂掉医院就会找你,你需要手动重新打开?
不存在的,有那时间我去摸摸鱼不香么!
所以思路就是给这台windows服务器的nginx设置成开机自启动的系统服务,然后随windows系统启动。
(1)Nginx在windows64位系统下的开机自启服务
windows下nginx安装非常简单,这里主要讲一下怎么把nginx设置成windows的系统服务。
windows服务器的nginx设置成开机自启动的系统服务随windows系统启动。需要借助“Windows Service Wrapper”这个小工具将nginx做成windows系统服务实现开机启动。
windows有32位和64位,这里以64位为例介绍。
(2)下载文件服务启动执行文件WinSW-x64.exe,并重命名为nginx-service.exe
下载地址https://github.com/winsw/winsw/releases
(windows64位)WinSW-x64.exe
链接:https://pan.baidu.com/s/1_5SZ5se3Jd_1sHoMWqWc8w
提取码:qwer
链接:https://pan.baidu.com/s/1_5SZ5se3Jd_1sHoMWqWc8w
提取码:qwer
(windows32位)WinSW-x86.exe
链接:https://pan.baidu.com/s/1kmO_N0QZFG2eJsqFuGWQ9g
提取码:qwer
链接:https://pan.baidu.com/s/1kmO_N0QZFG2eJsqFuGWQ9g
提取码:qwer
下载下来后将其复制到nginx根目录,并重命名为nginx-service.exe
(3)创建配置文件:nginx-service.xml
nginx根目录下,右击“新建”->点击“文本文档”->双击打开”文本文档”复制粘贴nginx-service.xml内容如下:
<service>
<!-- 服务名 -->
<id>nginx</id>
<!-- 显示名称 -->
<name>Nginx Service</name>
<!-- 描述 -->
<description>High Performance Nginx Service</description>
<logpath>D:\nginx-1.16.1\service-logs\</logpath>
<log mode="roll-by-size">
<sizeThreshold>10240</sizeThreshold>
<keepFiles>8</keepFiles>
</log>
<executable>D:\nginx-1.16.1\nginx.exe</executable>
<startarguments>-p D:\nginx-1.16.1</startarguments>
<stopexecutable>D:\nginx-1.16.1\nginx.exe</stopexecutable>
<stoparguments>-p D:\nginx-1.16.1 -s stop</stoparguments>
</service>
Ctrl + s保存->右击“文本文档”->重命名” nginx-service.xml”
服务日志位置D:\nginx-1.16.1\service-logs</logpath>
在nginx目录下新建一个service-logs文件夹,也就是说nginx-service.xml文件产生的日志放到了service-logs
service-logs文件夹,这是一个服务相关的核心文件,指明了服务名称、显示名称、描述信息、参数信息等。(大家记得把上面的路径换成自己的)
nginx-service.xml
链接:https://pan.baidu.com/s/1mJvBRKDpgoYma-3vrqHPIg
提取码:qwer
链接:https://pan.baidu.com/s/1mJvBRKDpgoYma-3vrqHPIg
提取码:qwer
(4)创建配置文件: nginx-service.exe.config
nginx根目录下,右击“新建”->点击“文本文档”->双击打开”文本文档”复制粘贴nginx-service.exe.config内容如下:
<configuration>
<startup>
<supportedRuntime version="v2.0.50727" />
<supportedRuntime version="v4.0" />
</startup>
<runtime>
<generatePublisherEvidence enabled="false"/>
</runtime>
</configuration>
Ctrl + s保存->右击“文本文档”->重命名” nginx-service.exe.config”
这个文件是为支持NET 4.0 runtime,默认只支持NET 2.0 runtime。
nginx-service.exe.config
链接:https://pan.baidu.com/s/1UfERLq2ILVMD1J9mWs7H4Q
提取码:qwer
链接:https://pan.baidu.com/s/1UfERLq2ILVMD1J9mWs7H4Q
提取码:qwer
(5)完成之后的nginx整体的目录结构
(6)注册windows64系统下的nginx为系统服务
Win+R cmd ctrl+shift+enter管理员权限打开cmd,cd C:\nginx-1.16.1进入nginx根路径,然后执行命令,
注册系统服务:nginx-service.exe install
如图:
(注意:以管理员身份运行cmd命令 service.exe install才能安装为系统服务)
(7)查看nginx已安装windows系统服务,启动nginx服务
按Win+R 输入services.msc 回车 启动服务
(8)卸载windows系统下安装的nginx系统服务
卸载删除已注册的系统服务:nginx-service.exe uninstall
(9)相关命令
注册系统服务:nginx-service.exe install
卸载删除已注册的系统服务:nginx-service.exe uninstall
停止系统服务:nginx-service.exe stop
启动系统服务:nginx-service.exe start
重启系统服务:nginx-service.exe restart
设置开机自启的同时reload将无法使用,只能执行ln-stop.bat关闭服务
既然已经注册为服务了,除了可以手动开启关闭也可以使用dos命令来操作。
启动nginx服务:net start nginx
关闭nginx服务:net stop nginx
六、Nginx配置文件
进入到nginx安装目录下配置文件的所在位置:cd /usr/local/nginx/conf
nginx配置文件为/usr/local/nginx/conf下的nginx.conf文件
6.1 nginx配置文件的组成部分:
第一部分:全局块
全局块:从配置文件开始到 events 块之间的内容
第二部分:events块
events块:涉及的指令主要影响nginx服务器与用户的网络连接。
工作模式及连接数上限,每个work process可以同时支持的最大连接数等。
这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。
第三部分:http块
http块又包括:http全局块和server块
http全局块
http 全局块配蛋的指今包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等
http server又包括server全局块和location块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
1、server块
最常见的配置是本虚拟机主机的监听配置和本点拟主机的名称或 IP 配置。
2、location 块
一个 server 块可以配置多个 location 块。
这块的主要作用是基于 Nginx 服房器接收到的请求字符串(例如 server_name/uri-string),对虚以主机名称(也可以是 IP 别名)之外的字符用(例如 前面的 /uri-string )进行匹配,对特定的请求进行处理,地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
6.2 第一部分:全局块
全局块:从配置文件开始到 events 块之间的内容
设置nginx整体运行的配置指令:
(1)服务器的用户和用户组
(2)允许生的 worker pocess 数:这是 Nginx 服务器并发处理服务的关键配置worker process值越大,可以支持的并发处理量也就越多,但是会受到硬件软件等设备的制约。
(3)日志存放路径和类型
(4)进程pid存放路径
#全局块
#指定可以运行nginx服务的用户和用户组,只能在全局块配置
#user nobody;
#nginx进程,一般数值为cpu核数。
worker_processes 1;
#错误日志存放目录
#error_log logs/error.log; #warn error
#error_log logs/error.log notice;
#error_log logs/error.log info;
#进程pid存放位置
#pid logs/nginx.pid;
6.3 第二部分:events块
#events块
#工作模式及连接数上限
events {
#单个后台worker process进程的最大并发连接数=1024
worker_connections 1024;
}
6.4 第三部分:http块
http全局块:
http块是Nginx服务器配置中的重要部分,代理、缓存和日志定义等绝大多数的功能和第三方模块的配置都可以放在这个模块中。
http {
#文件扩展名与类型映射表
include mime.types;
#默认文件类型
default_type application/octet-stream;
#设置日志模式
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#nginx访问日志
#access_log logs/access.log main;
#开启高效传输模式
sendfile on;
#激活tcp_nopush参数可以允许把httpresponse header和文件的开始放在一个文件里发布,
#积极的作用是减少网络报文段的数量
#tcp_nopush on;
#连接超时时间,单位是秒
#keepalive_timeout 0;
keepalive_timeout 65;
#开启gzip压缩功能
#gzip on;
6.4.1 http server全局块
#server块
#server块和“虚拟主机”的概念有密切联系。一个Server就是一个虚拟主机
server {
#监听端口
listen 80;
server_name localhost;
#编码识别
#charset koi8-r;
#日志格式及日志存放路径 /usr/local/nginx/
#access_log logs/host.access.log main;
6.4.2 http location块
location / {
#站点根目录,即网站程序存放目录/usr/local/nginx/html
root html;
#首页排序
index index.html index.htm;
}
#错误页面
#error_page 404 /404.html;
#将服务器错误页面重定向到静态页面/50x.html
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
#代理PHP脚本到Apache上监听127.0.0.1:80
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
#将PHP脚本传递到正在监听127.0.0.1:9000的FastCGI服务器
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#如果Apache的文档根目录与nginx的根目录一致,则拒绝访问.htaccess文件
#location ~ /\.ht {
# deny all;
#}
}
七、配置虚拟主机
7.1、虚拟主机介绍
1、什么是虚拟主机???
虚拟主机是一种特殊的软硬件技术,它可以将网络上的每一台计算机分成多个虚拟主机,每个虚拟主机可以独立对外提供www服务,这样就可以实现一台主机对外提供多个web服务,每个虚拟主机之间是独立的,互不影响的。
虚拟主机技术是互联网服务器采用的节省服务器硬件成本的技术,虚拟主机技术主要应用于HTTP(Hypertext TransferProtocol,超文本传输协议)服务,将一台服务器的某项或者全部服务内容逻辑划分为多个服务单位,对外表现为多个服务器,从而充分利用服务器硬件资源。
2、Nginx支持三种类型的虚拟主机配置
1 基于IP的虚拟主机
2 基于端口的虚拟主机
3 基于域名的虚拟主机
7.2、基于IP的虚拟主机配置方式
1、需求准备和实现效果
-
需求准备:
一台Linux服务器192.168.164.101
绑定两个ip:192.168.164.101、192.168.164.102
访问不同的ip请求不同的html目录,即:
访问http://192.168.164.101将访问nginx的“html101”目录下html网页
访问http://192.168.164.102将访问nginx的“html102”目录下html网页
Linux绑定多IP:Linux操作系统允许绑定多IP。是在一块物理网卡上可以绑定多个lP地址。这样就能够在使用单一网卡的同一个服务器上运行多个基于IP的虚拟主机。但是在绑定多IP时需要将动态的IP分配方式修改为静态的指定IP。 -
访问过程流程分析及实现效果图:
2、将动态IP修改为静态IP
如何将动态IP修改为静态IP???
进入/etc/sysconfig/network-scripts目录使用network-scripts网络配置:cd /etc/sysconfig/network-scripts
编辑网卡配置文件配置网卡:vim ifcfg-ens33
vim /etc/sysconfig/network-scripts/ifcfg-ens33
#网络类型
TYPE=“Ethernet”
PROXY_METHOD=“none”
BROWSER_ONLY=“no”
#IP地址获取方式(DHCP|static|none)
BOOTPROTO=“static”
DEFROUTE=“yes”
IPV4_FAILURE_FATAL=“no”
IPV6INIT=“yes”
IPV6_AUTOCONF=“yes”
IPV6_DEFROUTE=“yes”
IPV6_FAILURE_FATAL=“no”
IPV6_ADDR_GEN_MODE=“stable-privacy”
NAME=“ens33”
#网卡名称
DEVICE=“ens33”
#开机启动网卡
ONBOOT=“yes”
#IP地址
IPADDR=192.168.164.101
#子网掩码
NETMAST=255.255.255.0
#网关
GATEWAY=192.168.164.2
#本网卡使用的DNS
DNS1=114.114.114.114
DNS2=8.8.8.8
修改之后:
#IP地址
IPADDR0=192.168.164.101
IPADDR1=192.168.164.102
Centos7配置完网卡要重启网卡服务:
systemctl restart network
CentOS8重启网卡服务:nmcli c reload ens33
重启Linux(各种发行版都是可以的):reboot
修改Nginx的配置文件完成基于IP的虚拟主机配置
3、Nginx的配置文件nginx.conf主要由6个部分组成:
main:用于进行nginx全局信息的配置
events:用于nginx工作模式的配置
http:用于进行http协议信息的一些配置
server:用于进行服务器访问信息的配置
location:用于进行访问路由的配置
upstream:用于进行负载均衡的配置
4、修改nginx配置文件nginx.conf完成基于IP的虚拟主机配置方式
5、创建需要的目录和html页面:
进入nginx目录下:cd /usr/local/nginx/
将html目录及其目录下的所有内容拷贝到html128新建目录下:
cp -r html/ html101
cp -r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件
编辑html101下的index.html页面:vim html101/index.html
修改为Welcome to nginx192.168.164.101!
将html目录及其目录下的所有内容拷贝到html102新建目录下:
cp -r html/ html102
编辑html102下的index.html页面:vim html102/index.html
修改为Welcome to nginx192.168.164.102!
6、重启Nginx服务,测试
重启nginx服务:systemctl restart nginx
- 测试:
1.浏览器访问http://192.168.164.101
将访问“html101”目录下的html网页,出现:Welcome to nginx192.168.164.101!说明基于IP的虚拟主机配置方式成功。
2.浏览器访问http://192.168.164.102
将访问“html102”目录下的html网页,出现:Welcome to nginx192.168.164.102!说明基于IP的虚拟主机配置方式成功。
7.3、基于端口的虚拟主机配置方式
1、需求准备和实现效果
-
需求准备:
一台Linux服务器192.168.164.101绑定一个ip:192.168.164.101。
Nginx对提供8888与9999两个端口的监听服务
请求8888端口则访问html8888目录下的index.html
请求9999端口则访问html9999目录下的index.html
访问http://192.168.164.101将访问nginx的“html101”目录下html网页
访问http://192.168.164.102将访问nginx的“html102”目录下html网页 -
访问过程流程分析及实现效果图:
2、还原ip设置/etc/sysconfig/network-scripts/ifcfg-ens33
还原IP地址为192.168.164.101:
vim /etc/sysconfig/network-scripts/ifcfg-ens33
将:
IPADDR0=192.168.164.101
IPADDR1=192.168.164.102
改为
IPADDR=192.168.164.101
重启网络服务:systemctl restart network
3、修改Nginx的配置文件nginx.conf完成基于端口的虚拟主机配置
修改Nginx的配置文件,修改后的内容如下:
vim /usr/local/nginx/conf/nginx.conf
#一个Server就是一个虚拟主机 基于端口
server {
listen 8888;
#为虚拟机指定IP或者是域名
server_name 192.168.164.101;
#主要配置路由访问信息
location / {
#用于指定访问根目录时,访问虚拟主机的web目录
root html8888;
#在不指定访问具体资源时,默认的展示资源的列表
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
#一个Server就是一个虚拟主机
server {
listen 9999;
#为虚拟机指定IP或者是域名
server_name 192.168.164.101;
#主要配置路由访问信息
location / {
#用于指定访问根目录时,访问虚拟主机的web目录
root html9999;
#在不指定访问具体资源时,默认的展示资源的列表
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
4、创建需要的目录和html页面:
进入nginx目录下:cd /usr/local/nginx/
将html目录及其目录下的所有内容拷贝到html8888新建目录下:cp -r html/ html8888
cp -r /usr/local/nginx/html /usr/local/nginx/html8888
编辑html8888下的index.html页面:vim html8888/index.html
修改为Welcome to nginx192.168.164.101:8888!
将html目录及其目录下的所有内容拷贝到html9999新建目录下:
cp -r /usr/local/nginx/html /usr/local/nginx/html9999
编辑html9999下的index.html页面:vim html9999/index.html
修改为Welcome to nginx192.168.164.101:9999!
5、重启Nginx服务,测试
重启nginx服务:systemctl restart nginx
- 测试:
1.浏览器访问http://192.168.164.101:8888
将访问“html8888”目录下的html网页,
出现:Welcome to nginx192.168.164.101:8888!
说明基于端口的虚拟主机配置方式成功。
2.浏览器访问http://192.168.164.101:9999
将访问“html8888”目录下的html网页,
出现:Welcome to nginx192.168.164.101:9999!
说明基于端口的虚拟主机配置方式成功。
7.4、基于域名的虚拟主机配置方式
1、需求准备和实现效果
-
需求准备:
一台Linux服务器192.168.164.101,绑定一个ip:192.168.164.101。
域名规划:(准备两个域名)
域名1:www.bjsxt1.cn
域名2:www.baizhan1.cn
Nginx配置文件的两个server块分别配置两个域名:
www.bjsxt1.cn和www.baizhan1.cn
当访问不同的域名请求不同的html目录,
即:
两个域名指向同一个nginx服务器,用户访问不同的域名时显示不同的内容。 -
访问过程流程分析及实现效果图:
2、修改windows的hosts文件配置域名与ip的映射
文件路径:C:\Windows\System32\drivers\etc\hosts
hosts文件添加如下内容:
192.168.164.101 node1 www.bjsxt1.cn www.baizhan1.cn
node1为linux的主机名
如果主机名不是node1修改主机名为node1命令:
sudo hostnamectl set-hostname node1
查看主机名命令:
hostnamectl
hostname
3、修改Nginx的配置文件nginx.conf完成基于域名的虚拟主机配置方式
修改Nginx的配置文件,修改后的内容如下:
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
#为虚拟机指定IP或者是域名
server_name www.bjsxt1.cn;
#主要配置路由访问信息
location / {
#用于指定访问根目录时,访问虚拟主机的web目录
root bjsxt1;
#在不指定访问具体资源时,默认的展示资源的列表
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
#一个Server就是一个虚拟主机
server {
listen 80;
#为虚拟机指定IP或者是域名
server_name www.baizhan1.cn;
#主要配置路由访问信息
location / {
#用于指定访问根目录时,访问虚拟主机的web目录
root baizhan1;
#在不指定访问具体资源时,默认的展示资源的列表
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
4、创建需要的目录和html页面:
1.进入nginx目录下:cd /usr/local/nginx/
将html及其目录下的所有内容拷贝到bjsxt新建目录下:
cp -r html/ bjsxt
cp -r /usr/local/nginx/html /usr/local/nginx/bjsxt1
编辑bjsxt下的index.html页面:vim bjsxt1/index.html
修改为Welcome to nginx bjsxt1!
2.将html目录及其目录下的所有内容拷贝到baizhan新建目录下:
cp -r html/ baizhan1
cp -r /usr/local/nginx/html /usr/local/nginx/baizhan1
ll
编辑baizhan1下的index.html页面:
vim baizhan1/index.html
修改为Welcome to nginx baizhan1!
5、重启Nginx服务,测试
重启nginx服务:systemctl restart nginx
- 测试:
- 浏览器访问www.bjsxt1.cn则访问bjsxt1目录下的index.html
出现:Welcome to nginx bjsxt1!说明基于域名的虚拟主机配置方式成功。
- 浏览器访问www.baizhan1.cn则访问baizhan1目录下的index.html
出现:Welcome to nginx baizhan1!说明基于域名的虚拟主机配置方式成功。
7.5、(待补充)增加nginx虚拟主机配置文件(conf.d)
1、Linux系统下:nginx配置多个conf文件
配置多个conf文件
我的nginx.conf路径:/etc/nginx/nginx.conf
在 /etc/nginx/下创建 conf.d/,用来存 自定义conf文件
在 nginx.conf 加入神秘代码
有时候我们安装了nginx后发现配置文件只有一个,/etc/nginx/nginx.conf
所有的配置包括虚拟目录也在此文件中配置, 这样当虚拟主机多了管理就有些不方便了,
这是需要我们把配置文件拆分开来,在/etc/nginx/conf.d/ 文件建立对应的域名配置文件,比如 /etc/nginx/conf.d/123.com.conf
怎么配置呢?
只需要在原来文件/etc/nginx/nginx.conf 的http 块下加一句话就可以了:
include /etc/nginx/conf.d/*.conf;
/etc/nginx/nginx.conf完整的代码:
之后就可以把虚拟主机的配置文件写在/etc/nginx/conf.d/目录下了,如123.com.conf
https
https://www.cnblogs.com/ambition26/p/14077773.html
2、Windows系统下:nginx配置多个conf文件
7.6、配置ssl证书,http变为https
(待补充)
现在的网站支持Https几乎是标配功能,Nginx能很好的支持Https功能。Nginx后台需要自动将Http请求转成Https的方式,这样就又能支持Http,又能保证通信安全。
1、前置条件:
在配置https之前请确保下面的步骤已经完成:
(1)服务器已经安装nginx并且通过http可以正常访问。
(2)拥有ssl证书,没有的可以去阿里购买或者免费申请一年。
2、安装Nginx的ssl模块:
(待补充)
八、配置nginx服务的反向代理
8.1 需求准备和实现效果
-
需求准备:
需要使用两台虚拟机:
192.168.164.101 node1
192.168.164.102 node2
Tomcat安装到192.168.164.102环境中,Tomcat服务端口为8080和9090,Nginx安装在192.168.164.101环境中,通过192.168.164.101主机的Nginx反向代理。 -
访问过程流程分析及实现效果:
8.2 反向代理前提:安装服务环境
反向代理需要安装tomcat,tomcat运行必须要java的jdk环境。
所以先在linux系统IP为192.168.164.102的node2主机安装jdk,再安装tomcat修改端口号。
1.上传JDK和Tomcat软件安装包
rz命令把nginx从windows系统下载传输到linux系统:rz
链接
jdk
下面给出以.rpm包结尾的jdk-8u221-linux-x64.rpm百度网盘下载链接:
链接:https://pan.baidu.com/s/10khhroDXNoj7tcWajYzHxA
提取码:qwer
链接:https://pan.baidu.com/s/10khhroDXNoj7tcWajYzHxA
提取码:qwer
tomcat
下面给出apache-tomcat-8.5.88.tar.gz下载百度网盘链接:
(如需版本不一致自己去下载所需版本)
链接:https://pan.baidu.com/s/14PQR5GoJiYhCiSGXENGynw
提取码:qwer
链接:https://pan.baidu.com/s/14PQR5GoJiYhCiSGXENGynw
提取码:qwer
2.安装JDK
查看是否安装JDK
java -version 如果显示jdk版本号证明已经安装,不显示,则没有安装
(1)将jdk压缩包传输到linux的/opt/目录下
打开xshell,安装上传下载命令:yum -y install lrzsz
进入到opt目录下:cd /opt/
rz命令上将jdk的rpm包传到linux:rz
(2)rpm命令安装当前目录下的jdk
rpm命令安装当前目录下的jdk-8u221-linux-x64.rpm:
rpm -ivh jdk-8u221-linux-x64.rpm
安装完之后,安装在哪个目录下了???
搜索java安装在了什么目录下:find / -name java
安装后目录在/usr/java/jdk1.8.0_221-amd64/bin/java
进入到jdk安装目录/usr/java/jdk1.8.0_221-amd64并查看目录结构:
cd /usr/java/jdk1.8.0_221-amd64
ll
此时查看jdk是否安装成功:java -version
-bash: /usr/local/java_jdk/jdk1.8.0_131/bin/java: 没有那个文件或目录:没有安装成功!!!
(3)配置环境变量
编辑配置文件/etc/profile:vim /etc/profile
添加以下jdk环境变量:
#自己安装的jdk环境变量配置
#jdk安装路径在/usr/java/jdk1.8.0_221-amd64
export JAVA_HOME=/usr/java/jdk1.8.0_221-amd64
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
让配置文件生效:source /etc/profile
(4)查看是否配置成功
查看jdk版本是否安装成功,显示jdk版本号证明已经安装成功:java -version
出现1.8.0_131说明jdk安装成功
输入jps查看当前用户正在运行java虚拟机的pid进程:jps
javac是java语言编程编译器:javac
到此,我们已经成功jdk。
3.安装Tomcat
(1)安装tomcat8080,并修改端口号为8080
将opt目录下的apache-tomcat-8.5.88解压到apps目录下并将apache-tomcat-8.5.88重命名为tomcat8080
解压tomcat至apps目录:
tar -zxvf apache-tomcat-8.5.88.tar.gz -C /opt/apps
将apache-tomcat-8.5.88重命名为tomcat8080:
cd /opt/apps
mv apache-tomcat-8.5.88 tomcat8080
(2)启动tomcat
进入到tomcat8080的bin目录下:
cd tomcat8080/bin
启动tomcat:./startup.sh
浏览器访问http://192.168.164.102:8080,出现Apache Tomcat/8.5.88猫说明启动成功。
(3)修改index.jsp主页为:192.168.164.102:8080
进入到/opt/apps/tomcat8080/webapps/ROOT目录下:
cd /opt/apps/tomcat8080/webapps/ROOT
编辑index.jsp:vim index.jsp
Apache Tomcat/8.5.88修改为192.168.164.102:8080
将第47行的h1一级标题的内容改为:192.168.164.102:8080
vim index.jsp修改后,保存退出,进入tomcat的bin目录下执行./shutdown.sh关闭tomcat,./startup.sh重启tomcat
再次浏览器访问http://192.168.164.102:8080,出现192.168.164.102:8080猫说明tomcat配置反向代理之前的准备工作修改成功。
(4)安装tomcat9090,并修改端口号为9090
将opt目录下的apache-tomcat-8.5.88解压到apps目录下并将apache-tomcat-8.5.88重命名为tomcat9090
解压tomcat至apps目录:
tar -zxvf apache-tomcat-8.5.88.tar.gz -C /opt/apps
将apache-tomcat-8.5.88重命名为tomcat9090:
cd /opt/apps
mv apache-tomcat-8.5.88 tomcat9090
进入tomcat9090/conf目录下,编辑server.xml文件,
cd /opt/apps/tomcat9090/conf
vim server.xml
Server port=“8005”,8005端口改为9095端口,不改的话同时启动两个tomcat抛出异常
Connector port="8080"端口改为9090端口
(5)启动tomcat
在opt/apps下进入到tomcat9090的bin目录下:
cd tomcat9090/bin
启动tomcat:./startup.sh
浏览器访问http://192.168.164.102:9090,出现Apache Tomcat/8.5.88猫说明启动成功。
(6)修改index.jsp主页为:192.168.164.102:9090
进入到/opt/apps/tomcat9090/webapps/ROOT目录下:
cd /opt/apps/tomcat9090/webapps/ROOT
编辑index.jsp:vim index.jsp
Apache Tomcat/8.5.88修改为192.168.164.102:9090
将第47行的h1一级标题的内容改为:192.168.164.102:9090
vim index.jsp修改后,保存退出,进入tomcat的bin目录下
cd /opt/apps/tomcat9090/bin
执行关闭tomcat:./shutdown.sh
重启tomcat:./startup.sh
再次浏览器访问http://192.168.164.102:9090,出现192.168.164.102:9090猫说明tomcat配置反向代理之前的准备工作修改成功。
8.3 配置Nginx实现服务的反向代理
1.修改nginx.conf配置文件:
在安装nginx那台虚拟机192.168.164.101 node1上
修改nginx.conf配置文件:
cd /usr/local/nginx/conf
vim nginx.conf
修改成如下配置:
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 0;
upstream tomcat.server1{
server 192.168.164.102:8080;
}
upstream tomcat.server2{
server 192.168.164.102:9090;
}
server {
listen 80;
#为虚拟机指定IP或者是域名
server_name www.tomcat1.com;
#主要配置路由访问信息
location / {
#用于指定访问根目录时,访问虚拟主机的web目录
proxy_pass http://tomcat.server1;
#在不指定访问具体资源时,默认的展示资源的列表
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
#一个Server就是一个虚拟主机
server {
listen 80;
#为虚拟机指定IP或者是域名
server_name www.tomcat2.com;
#主要配置路由访问信息
location / {
#用于指定访问根目录时,访问虚拟主机的web目录
proxy_pass http://tomcat.server2;
#在不指定访问具体资源时,默认的展示资源的列表
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
浏览器访问的是server块下server_name中的nginx服务名称。
2 修改windows的hosts文件配置域名与ip的映射
文件路径:C:\Windows\System32\drivers\etc\hosts
hosts文件添加如下内容:
192.168.164.101 node1 www.bjsxt1.cn
www.baizhan1.cn www.tomcat1.com www.tomcat2.com
node1为linux的192.168.164.101主机名
3 分别访问,进行测试(反向代理)
重启nginx服务:systemctl restart nginx
两个tomcat必须同时启动,tomcat8080/bin目录下启动./startup.sh,tomcat9090/bin目录下启动./startup.sh
- 浏览器访问:的是server块下server_name中的nginx服务名称
打开浏览器,在windows浏览器地址栏输入地址www.tomcat1.com,跳转到linux192.168.164.102系统tomcat8080主页面中,说明反向代理配置成功。
- 浏览器访问:的是server块下server_name中的nginx服务名称
打开浏览器,在windows浏览器地址栏输入地址www.tomcat2.com,跳转到linux192.168.164.102系统tomcat9090主页面中,说明反向代理配置成功。
九、配置nginx服务的负载均衡
9.1 什么是负载均衡?
负载均衡,英文名称为Load Balance,是高可用网络基础架构的关键组件,通常用于将工作负载分布到多个服务器来提高网站、应用、数据库或其他服务的性能和可靠性。对于 Web工程中的负载均衡,就是将相同的 Web 应用部署到多个不同的Web 服务器上,形成多个 Web 应用服务器。当请求到来时,由负载均衡服务器负责将请求按照事先设定好的比例向 Web 应用服务器进行分发,从而增加系统的整体吞吐量。
9.2 如何实现负载均衡?
负载均衡可以通过硬件负载均衡器实现,也可通过负载均衡软件实现。
- 硬件负载均衡
硬件负载均衡器的性能稳定,且有生产厂商作为专业的服务团队。但其成本很高,一台硬件负载均衡器的价格一般都在十几万到几十万,甚至上百万。知名的负载均衡器有 F5、Array、深信服、梭子鱼等。 - 软件负载均衡
软件负载均衡成本几乎为零,基本都是开源软件。
例如:LVS、HAProxy、Nginx 等。
9.3 Nginx负载均衡3种策略
1.轮询(默认)
每个请求按时间的先后顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2.指定权重
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。权重值越大被访问的几率就越大。
upstream backserver {
server 192.168.20.101;
server 192.168.20.102 weight=2;
}
3.IP绑定 ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream backserver {
ip_hash;
server 192.168.20.101;
server 192.168.20.102;
}
9.4 负载均衡配置
1 需求准备和实现效果
-
需求准备:
(1)该机群包含一台 Nginx 服务器:192.168.164.101 node1,
(2)两个 Web服务器:192.168.164.102 node2(一台虚拟机node2上通过两个端口启动两个tomcat)
Tomcat安装到192.168.164.102环境中,Tomcat服务端口为8080和9090,Nginx安装在192.168.164.101环境中,通过192.168.164.101主机的Nginx反向代理. -
访问过程流程分析及实现效果:
2 修改nginx.conf配置文件:
在安装nginx那台虚拟机192.168.164.101 node1上
修改nginx.conf配置文件:
vim /usr/local/nginx/conf/nginx.conf
添加配置内容如下:
upstream rss{
server 192.168.164.102:8080;
server 192.168.164.102:9090 weight=2;
}
server {
listen 80;
server_name www.bjsxt1.cn;
location / {
proxy_pass http://rss/;
}
}
#自定义日志格式
#nginx日志日志格式是默认的,先使用默认的记录下来。
log_format myfmt '$remote_addr - $remote_user
[$time_local] "$request" ';
upstream rss{
server 192.168.164.102:8080;
server 192.168.164.102:9090 weight=2;
}
server {
listen 80;
server_name www.bjsxt1.cn;
#为server指定使用myfmt日志格式以及将日志保存
logs/myfmt.log文件中
access_log logs/myfmt.log myfmt;
location / {
proxy_pass http://rss/;
}
}
3 访问测试(负载均衡)
重启nginx服务:systemctl restart nginx
两个tomcat必须同时启动,tomcat8080/bin目录下启动./startup.sh,tomcat9090/bin目录下启动./startup.sh
- 浏览器访问:的是server块下server_name中的nginx服务名称
打开浏览器,在windows浏览器地址栏输入地址www.bjsxt1.cn,跳转到linux192.168.164.102系统tomcat8080主页面中,浏览器刷新访问地址,跳转到linux192.168.164.102系统tomcat9090主页面中weight=2请求2次,发现已经实现了负载均衡。规律为一次8080两次9090。说明负载均衡配置成功。
中小企业一般使用该方式,优点是配置简单,缺点是如果添加新的后台服务,需要修改Nginx配置文件并且还需重启Nginx。如果后台服务变动比较频繁,而且不希望重启Nginx,可以使用Http动态负载均衡,如何实现Http动态负载均衡,后续会讲到。
9.5 自定义日志格式
1 默认日志配置及路径
默认日志配置
进入http下请求日志的路径nginx/logs/access.log:
cd /usr/local/nginx/logs/
查看日志:tail -f access.log
浏览器访问server块下server_name中的nginx服务名称www.bjsxt1.cn,
每请求1次就会在/usr/local/nginx/logs/access.log记录一条日志。
2 如何配置日志
nginx日志格式是默认的,先使用默认的记录下来。然后可以自己设置成不是默认,自定义日志格式
-
默认日志格式
-
自定义日志格式:如何配置日志为myfmt.log???
#修改日志格式,nginx/logs下的模板文件名为myfmt,只记录这四条日志信息。
将日志注释掉,只在日志记录四个信息:
log_format myfmt '$remote_addr - r e m o t e u s e r [ remote_user[ remoteuser[time_local] “$request” ';
-
如何使用自定义的日志???
要想使用自定义的日志模板myfmt,在http块把日志配置好之后,必须在server块中把日志放开。
server块中配置:把访问nginx服务日志的access.logs放在logs/myfmt.log文件中,并把文件模板原来的main改为myfmt。
重启nginx服务,就会在nginx/logs下多出myfmt.log文件。
查看监控日志myfmt.log:tail -f logs/myfmt.log
此时浏览器访问www.bjsxt1.cn,就会出现日志
-
日志干什么用?
日志可以作为大数据日志服务器,将来需要什么记录什么,不需要的不用记录。
十、Location配置(重点)
1 Location配置参考网址
参考阿里淘宝对外公开的nginx内核优化封装后起名tengine对外开源网址:http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_core_module.html
http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_core_module.html
打开这个网址,找到location。
2 location是用来干什么?
location配置是什么?是当有请求进入nginx时,什么情况下,往哪里转,怎么出去!!!
3 location语法规则
让我们用一个例子解释上面的说法:
www.bjsxt1.cn
location = / {
[ configuration A ]
}
等号斜杠= /精确匹配
location / {
[ configuration B ]
}
斜杠/最大前缀匹配
location /documents/ {
[ configuration C ]
}
斜杠/加具体内容看谁匹配的多
location ^~ /images/ {
[ configuration D ]
}
上肩号波浪线表示如果它能匹配上,就不走正则
location ~* .(gif|jpg|jpeg)$ {
[ configuration E ]
}
波浪线星号正则的比最大前缀优先级高
#请求“/”匹配配置A,
#请求“/index.html”匹配配置B,
#请求“/documents/document.html”匹配配置C,
#请求“/images/1.gif”匹配配置D,
#请求“/documents/1.jpg”匹配配置E。
4 location配置解析
- location映射(ngx_http_core_module)
location [ = | ~ | ~* | ^ ~ ] uri(…)
location URI{}:对当前路径及子路径下的所有对象都生效
location = URI{}:注意URI最好为具体路径。精确匹配指定的路径,不包括子路径,因此,只对当前资源生效。
location ~ URI {}:
location ~ * URI {}:模式匹配URI,此处的URI可使用正则表达式,~ 区分字符大小写,~ * 不区分字符大小写
location ^~ URI {}:不使用正则表达式
优先级: = > ^~ > |* > /|/dir/
/loghaha.html
/logheihei.html
^/log.*html$
5 location配置规则
- 1.location的执行逻辑跟location的编辑顺序无关。
矫正:这句话不全对,“ 普通 location ” 的匹配规则是“最大前缀”,因此“普通 location”的确与 location 编辑顺序无关; - 2.但是 “正则 location” 的匹配规则是 “顺序匹配,且只要匹配到第一个就停止后面的匹配” ;
- 3.“普通location”与“正则 location”之间的匹配顺序是? 先匹配普通 location,再“考虑”匹配正则 location。
- 4.注这里的“考虑”是“可能”的态思,也就是说匹配完 “普通 location” 后,有的时候需要继续匹配 “正则location“ ,有的时候则不需要继续匹配 “正则 location” 。
不需要继续匹配正则 location,有两种情况下:
(1)当普通 location 前面指定了 “ ^~ ” (上肩号波浪线表示如果它能匹配上,就不走正则),特别告诉 Nginx 本条普通 location 一旦匹配上,则不需要继续正则匹配。
(2)当 普通loxation 恰好严格匹配上,不是最大前缀匹配,则不再继续匹配正则。
6 nginx 的 location 总结
(1)nginx 收到请求头: 判定ip,port,hosts决定server
(2)nginx location 匹配:用客户端的uri匹配location的uri
- 先普通
-* 顺序无关
-* 最大前缀
-* 匹配规则简单 - 打断:
-* ^ ~
-* 完全匹配 - 再正则
-* 不完全匹配
-* 正则特殊性:一条URI可以和多条location匹配上
-* 有顺序的
-* 先匹配,先应用,即时退出匹配
(3)请求头
- host: 决策server负责处理
- uri: 决策location走哪出去
- 反向代理: proxy_pass ip:port[uri]
7 nginx负载均衡下的location配置
(1)修改nginx.conf配置文件
在安装nginx那台虚拟机192.168.164.101 node1上
修改nginx.conf配置文件:
vim /usr/local/nginx/conf/nginx.conf
添加配置内容如下:
server {
listen 80;
server_name www.bjsxt1.cn;
access_log logs/myfmt.log myfmt;
location / {
#请求进来往mnt目录下走
root /mnt;
autoindex on;
}
location /aabb {
#带上 / 访问该url对应的首页
proxy_pass http://192.168.164.102:8080/;
#不带 / 访问的是/opt/apps/tomcat8080/webapps/ROOT下的页面
#proxy_pass http://192.168.20.102:8080/aabb
}
}
(2)重启nginx
重启nginx服务:systemctl restart nginx
node2下的tomcat服务必须是启动状态
(3)访问测试1
- 访问测试1
在windows浏览器地址栏访问server块下server_name中的nginx服务名称:www.bjsxt1.cn,此时会跳转到linux192.168.164.101node1的根/路径mnt目录下
发现没有东西。
(4)访问测试2
- 访问测试2
此时,将/opt/apps/jdk-8u221-linux-x64.rpm拷贝到/根路径下的mnt目录
cd /usr/local/nginx
cp /opt/apps/jdk-8u221-linux-x64.rpm /mnt/
再次访问:
在windows浏览器地址栏访问server块下server_name中的nginx服务名称:www.bjsxt1.cn,此时会跳转到linux192.168.164.101node1的根/路径mnt目录下,出现jdk-8u221-linux-x64.rpm并且点击可以下载。
用途:可以做一个简易的下载网站
将dev下的sr0挂载到mnt下:mount /dev/sr0 /mnt/
取消挂载报错:查看umount后提示信息,目标忙。
解决:
yum 安装 fuser:yum install -y psmisc
查看挂载进程号:fuser -mv /dev/sr0
杀掉进程:kill -9 16004
umount取消挂载:umount /dev/sr0
查看/mnt/目录:**ls -R /mnt/**没有了说明已经取消挂载
将dev下的sr0挂载到mnt/cdrom目录下:
mkdir -p /mnt/cdrom
mount /dev/sr0 /mnt/cdrom/
再次访问:
在windows浏览器地址栏访问server块下server_name中的nginx服务名称:www.bjsxt1.cn,此时会跳转到linux192.168.164.101node1的根/路径mnt目录下,出现cdrom和jdk-8u221-linux-x64.rpm并且cdrom下的packages包,点击可以下载。
cdrom的packages下有很多rpm包可以下载
(5)访问测试3
- 访问测试3
- 根据nginx,conf下http中server块location配置,浏览器访问http://www.bjsxt1.cn/50x.html,如果程序出现500错误,就会默认跳转到错误提示页面
# error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
浏览器访问http://www.bjsxt1.cn/50x.html,默认跳转到错误提示页面
(6)访问测试4:location下proxy_pass 端口最后带/斜杠
- 访问测试4:带上 /斜杠 访问该url对应的首页
新打开一个复制192.168.164.101xshell,监控myfmt.log请求日志信息:
tail -f /usr/local/nginx/logs/myfmt.log
浏览器访问:http://www.bjsxt1.cn/aabb,根据nginx,conf下http中server块location配置,带上 /斜杠 访问该url对应的首页,跳转到192.168.164.102:8080/下aabb首页
(7)访问测试5:location下proxy_pass 最后不带/斜杠
- 访问测试5
新打开一个复制192.168.164.101xshell,监控myfmt.log请求日志信息:
tail -f /usr/local/nginx/logs/myfmt.log
此时,浏览器访问:http://www.bjsxt1.cn/aabb,根据nginx,conf下http中server块location配置,浏览器访问http://www.bjsxt1.cn/aabb,不带 / 斜杠访问会把/aabb拼接到proxy_pass后,不带 / 访问的是/opt/apps/tomcat8080/webapps/ROOT下的页面。
会报错404错误。因为/opt/apps/tomcat8080/webapps/ROOT路径下没有aabb。
- 访问测试
在192.168.164.102node2下的/opt/apps/tomcat8080/webapps/ROOT目录新建aabb文件输入内容aabb page。
cd /opt/apps/tomcat8080/webapps/ROOT
vim aabb
浏览器再次访问:http://www.bjsxt1.cn/aabb,根据nginx,conf下http中server块location配置,不带 / 斜杠访问会把/aabb拼接到proxy_pass后,访问的是/opt/apps/tomcat8080/webapps/ROOT下的aabb页面。
出现aabb page说明location配置成功。
(8)访问测试6:location如何配置转到百度?
- 访问测试6
新打开一个复制192.168.164.101xshell,监控myfmt.log请求日志信息:
tail -f /usr/local/nginx/logs/myfmt.log
修改nginx.conf配置文件如下:
重启nginx服务:systemctl restart nginx
浏览器访问:http://www.bjsxt1.cn/baidu地址进行测试,根据nginx,conf下http中server块location配置,带上/斜杠访问该url:https://www.baidu.com/对应的首页。
此时,回车后跳转到百度地址变为:https://www.baidu.com,虽然访问到了百度,但是却是通过重定向的方式,以后发生的事情和我们的服务器就没有半毛钱关系了。
- 回车后地址跳转到百度,我们地址不想让它跳走也访问百度怎么办?
尽量在服务器端跳转,不要在客户端跳转
修改nginx.conf,将location /baidu下的proxy_pass后面的http改为https,修改后配置如下:
重启nginx服务:systemctl restart nginx
浏览器访问:http://www.bjsxt1.cn/baidu进行测试,此时,回车后地址跳转到百度,而地址依然是www.bjsxt1.cn/baidu。地址栏没有重定向。
此时,我们的日志监听就变得有意义,将来看通过这个网站搜索百度的人都喜欢干什么,可以分析产生价值。
- 此时再次测试,地址栏没有重定向,但是当我们查询(比如:ssd)时出现404?如何修改配置
浏览器访问:www.bjsxt1.cn/baidu进行测试,此时,回车后地址跳转到百度,而地址依然是www.bjsxt1.cn/baidu。
但是当我们搜索框输入ssd,回车后,报错404
修改Nginx配置文件如下:
~*不区分大小写,s.*是查询开头是s的内容
proxy_pass https://www.baidu.com最后不带斜杠,因为要把/s.*拼接到后面。
重启nginx服务:systemctl restart nginx
浏览器访问:www.bjsxt1.cn/baidu进行测试,搜索框输入ssd,回车后,正常无报错。
但是现在百度也做了相应的设置,就是不想让别人收集它的日志。有时搜索一些关键词的时候就给你跳走了
十一、配置nginx服务的动静分离
1 什么是动静分离?
Nginx动静分离简单来说就是把动态和静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求和静态请求分开,可以理解成使用Nginx处理静态请求,Tomcat处理动态请求。
- 动静分离从目前实现方式大致分为两种:
- 一是纯粹的把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案。
- 二是动态和静态文件混合在一起发布,通过nginx分开。通过location指定不同的后缀名实现不同的请求转发。
2 如何实现动静分离?动静分离配置
(1)需求准备和实现效果
-
需求准备:
(1)一台 Nginx 服务器:192.168.164.101 node1
(2)一台 Nginx 服务器:192.168.164.105 node5
(3)两个 Web服务器:192.168.164.102 node2(一台虚拟机node2上通过两个端口启动两个tomcat)
Tomcat安装到192.168.164.102环境中,Tomcat服务端口为8080和9090,Nginx安装在192.168.164.101环境中,通过192.168.164.101主机的Nginx动静分离。 -
访问过程流程分析及实现效果:
(2)修改Tomcat的index.jsp页面
- 编辑tomcat8080,进入/opt/apps/tomcat8080/webapps/ROOT/index.jsp页面,修改成如下:
<link rel="stylesheet" type="text/css"
href="/css/index.css">
<img src="/image/logo.jpg" ><br/>
<font class="myfont">from 192.168.164.102:8080</font>
dG删除全部后添加上面的内容,保存并退出。
vim /opt/apps/tomcat8080/webapps/ROOT/index.jsp
2. 编辑tomcat9090,进入/opt/apps/tomcat9090/webapps/ROOT/index.jsp页面,修改成如下:
<link rel="stylesheet" type="text/css"
href="/css/index.css">
<img src="/image/logo.jpg" ><br/>
<font class="myfont">from 192.168.164.102:9090</font>
vim /opt/apps/tomcat9090/webapps/ROOT/index.jsp
(3)需要一台新的nginx服务192.168.164.105 node5
- 克隆node5并连接
192.168.164.101关机:init 0
拍摄快照,克隆一台新的192.168.164.105
xshell连接后,把新克隆的虚拟机
添加映射:
vim /etc/hosts
ip设置为192.168.164.105:
vim /etc/sysconfig/network-scripts/ifcfg-ens33
主机名设置为node5:
sudo hostnamectl set-hostname node5
重启虚拟机:
reboot
xshell连接192.168.164.105 node5。
因为是克隆的101,所以有nginx服务,不用再安装,直接使用。 - node5创建目录并上传静态图片
在node5服务器上创建目录 /data/image和/data/css,然后将logo.jpg和index.css上传到对应的目录
在node5服务器上创建目录/data/image和/data/css:
mkdir -p /data/image /data/css
然后将logo.jpg和index.css上传到对应的目录。上传logo.jpg到image目录下,上传index.css到css目录:
cd /data/image
rz
cd /data/css
rz
查看data目录下的内容:
ls -R …/data
(4)修改192.168.164.105 node5的nginx.conf配置文件:
把静态文件独立成单独的域名,放在独立的服务器node5上
修改虚拟机192.168.164.105 node5上nginx.conf配置文件:
vim /usr/local/nginx/conf/nginx.conf
添加配置内容如下:
server {
listen 80;
server_name 192.168.164.105;
location /image {
root /data;
}
location /css {
root /data;
}
}
重启nginx服务:systemctl restart nginx
(5)修改192.168.164.101 node1的nginx.conf配置文件:
修改虚拟机192.168.164.101 node1上nginx.conf配置文件:
vim /usr/local/nginx/conf/nginx.conf
添加配置内容如下:
upstream rss{
server 192.168.164.102:8080;
server 192.168.164.102:9090 weight=2;
}
server {
listen 80;
server_name www.bjsxt1.cn;
location / {
proxy_pass http://rss/;
}
location /image/ {
proxy_pass http://192.168.164.105;
}
location /css/ {
proxy_pass http://192.168.164.105;
}
}
重启nginx服务:systemctl restart nginx
重启nginx报错:
Job for nginx.service failed because the control process exited with error code. See “systemctl status nginx.service” and “journalctl -xe” for details.
解决:nginx.conf有问题,重新编辑nginx.conf文件,看少了或多了什么东西。
(6)访问测试(动静分离)
浏览器访问server块下server_name中的nginx服务名称进行测试:浏览器访问www.bjsxt1.cn测试,跳转到linux192.168.164.102系统tomcat8080主页面中,浏览器刷新访问地址,跳转到linux192.168.164.102系统tomcat9090主页面中weight=2请求2次,发现已经实现了负载均衡。规律为一次8080两次9090。说明负载均衡配置成功。
十二、Http动态负载均衡
1、什么是动态负载均衡
在使用的过程中,提供服务的服务器需要添加新的节点时,需要添加新的server配置,然后还需要重启Nginx。
upstream rss{
server 192.168.164.102:8080;
server 192.168.164.102:9090 weight=2;
#添加新的server配置,然后还需要重启Nginx
}
为什么要动态负载均衡?动态负载均衡有什么优点?
传统的负载均衡,如果Upstream参数发生变化,每次都需要重新加载nginx.conf文件,因此扩展性不是很高,所以我们可以采用动态负载均衡,实现Upstream可配置化、动态化,无需人工重新加载nginx.conf,这类似分布式的配置中心。
注册中心存放IP地址和端口号,IP区分主机、port区别进程。
2、常用服务注册与发现框架
常见服务发现框架 Consul、Eureka、 ZooKeeper、Etcd ,ZooKeeper是这种类型的项目中历史最悠久的之一,它起源于Hadoop。它非常成熟、可靠,被许多大公司(YouTube、eBay、雅虎等)使用。
Consul是一款开源的分布式服务注册与发现系统,通过HTTP、API可以使得服务注册、发现实现起来非常简单,它支持如下特性:
- 1 服务注册:服务实现者可以通过HTTP API或DNS方式,将服务注册到Consul。
- 2 服务发现:服务消费者可以通过HTTP API或DNS方式,从Consul获取服务的IP和PORT。
- 3 故障检测:支持如TCP、HTTP等方式的健康检查机制,从而当服务有故障时自动摘除。
- 4 K/V存储:使用K/V存储实现动态配置中心,其使用HTTP长轮询实现变更触发和配置更改。
- 5 多数据中心:支持多数据中心,可以按照数据中心注册和发现服务,即支持只消费本地机房服务,使用多数据中心集群还可以避免单数据中心的单点故障。
- 6 Raft算法:Consul使用Raft算法实现集群数据一致性。
3、动态负载均衡实现方案
- 1 Consul+Consul-template 每次发现配置更改需要raload nginx,重启Nginx。
- 2 Consul+OpenResty 实现无需raload动态负载均衡 (lua语言,配置文件放字典里面,每隔时间读取)
- 3 Consul+upsync+Nginx 实现无需raload动态负载均衡 (原理同上) 搭建ConsulServer专门存放负载均衡注册配置信息。nginx间隔时间动态获取最新的ConsulServer配置信息
这里选择第三种Consul+upsync+Nginx动态负载均衡实现方案
4、Consul环境搭建
注意:一定要使用nginx 1.9以上版本!
Consul是一个网络工具,提供了一个功能齐全的service-mesh控制层,服务发现,配置,和分区。
(1)下载consul_0.7.5_linux_amd64.zip
进入/opt/apps目录:cd /opt/apps/
wget命令下载:
wget https://releases.hashicorp.com/consul/0.7.5/consul_0.7.5_linux_amd64.zip
如果下载太慢,网盘链接下载下来上传到linux,链接地址为:
链接:https://pan.baidu.com/s/1yD6mSF74tfnFsANVZ8dYiw
提取码:qwer
链接:https://pan.baidu.com/s/1yD6mSF74tfnFsANVZ8dYiw
提取码:qwer
(2)安装unzip解压命令
安装unzip解压命令:yum -y install unzip
(3)解压consul_0.7.5_linux_amd64.zip
上传consul_0.7.5_linux_amd64.zip到/opt/apps目录下:rz
解压consul_0.7.5_linux_amd64.zip:
unzip consul_0.7.5_linux_amd64.zip
解压后的consul移动到/opt/目录下:mv consul /opt/
进入opt目录:cd /opt/
查看:ll
(4)测试consul是否可以正常使用
测试consul是否可以正常使用:./consul
(5)consul启动
consul启动:
./consul agent -dev -ui -node=consul-dev -client=192.168.164.101
(6)访问测试consul
浏览器访问consul服务:http://192.168.164.101:8500/ui/#/dc1/services,出现以下页面说明consul安装并启动成功
目前还没有相关服务,还没有往里面加。怎么加?
(7)consul关闭
concul是一个脚本文件
consul关闭:ctrl+c
执行ctrl+c之后,会出现
http: Shutting down http server (192.168.164.101:8500)
consul关闭:
查出consul启动的进程后,杀死进程:
ps aux|grep consul
kill -9 4677
浏览器访问:http://192.168.164.101:8500/ui/#/dc1/services,此时是访问不到的。
(8)方法2:安装consul放在root/bin下任意目录下可以启动consul
上面几步concul是安装在/opt目录下,只能进入到安装目录/opt/下启动concul。如果安装consul放到环境变量root/bin下任意目录下可以启动consul。
查看环境变量:echo $PATH
/root/目录下创建bin目录:mkdir -p /root/bin
解压consul_0.7.5_linux_amd64.zip:
unzip consul_0.7.5_linux_amd64.zip
解压的consul移动到/root/bin目录下:mv concul /root/bin
或者把consul移动到/root/bin目录下:mv /opt/consul /root/bin
root/bin下启动concul命令:
consul agent -dev -ui -node=consul-dev -client=192.168.164.101
优点:安装consul放到环境变量root/bin下任意目录下可以启动consul
5、使用PostMan注册接口
(1)为什么使用PostMan?
浏览器访问consul服务地址传参不方便:http://192.168.164.101:8500/ui/#/dc1/services,打开一个PostMan,通过postman来提交注册consul服务。
(2)PostMan下载
PostMan百度网盘下载链接:
链接:https://pan.baidu.com/s/1RypuPgRqfqGEIF4GiGxq1g
提取码:qwer
链接:https://pan.baidu.com/s/1RypuPgRqfqGEIF4GiGxq1g
提取码:qwer
(3)使用PostMan注册接口
使用PostMan注册接口:http://192.168.164.101:8500/v1/catalog/register
(4)postman以json格式注册concul服务
- 1 postman安装到windows,打开postman,输入账号qq1454413324密码qq123258,点击+加号,选则POST后面输入注册地址:http://192.168.164.101:8500/v1/catalog/register,选择body,row,json格式数据,输入json格式的数据参数1,参数1内容如下:
#参数1
{“Datacenter”: “dc1”,“Node”:“tomcat”,
“Address”:“192.168.164.102”,“Service”:
{“Id” :“192.168.164.102:8080”, “Service”:
“toov5”,“tags”: [“dev”], “Port”: 8080}}
{"Datacenter": "dc1","Node":"tomcat",
"Address":"192.168.164.102","Service":
{"Id" :"192.168.164.102:8080", "Service":
"toov5","tags": ["dev"], "Port": 8080}}
点击send发送,返还结果true,说明操作成功
- 2 打开postman,点击+加号,选则POST后面输入注册地址:http://192.168.164.101:8500/v1/catalog/register,选择body,row,json格式数据,输入json格式的数据参数2,参数2内容如下:
参数2
{“Datacenter”: “dc1”, “Node”:“tomcat”,
“Address”:“192.168.164.102”,“Service”:
{“Id” :“192.168.164.102:9090”, “Service”:
“toov5”,“tags”: [“dev”], “Port”: 9090}}
参数2
{"Datacenter": "dc1", "Node":"tomcat",
"Address":"192.168.164.102","Service":
{"Id" :"192.168.164.102:9090", "Service":
"toov5","tags": ["dev"], "Port": 9090}}
(5)json格式参数说明:
- Datacenter指定数据中心
- Address指定服务IP
- Service.Id指定服务唯一标识
- Service.Service指定服务分组
- Service.tags指定服务标签(如开发环境、测试环境、生产环境等)
- Service.Port指定服务端口
(6)检查服务是否被注册上:
- 检查192.168.164.102:8080服务是否被注册上:
浏览器访问consul服务:http://192.168.164.101:8500/ui/#/dc1/services,出现toov5,IP地址192.168.164.102,端口8080,说明注册成功。
- 检查192.168.164.102:9090服务是否被注册上:
浏览器访问consul服务:http://192.168.164.101:8500/ui/#/dc1/services,出现toov5,IP地址192.168.164.102,端口9090,说明注册成功。
此时concul服务关了之后,服务列表就没了,因为添加的两个tomcat服务没有nginx本地持久化。
(7)PostMan删除注册服务
打开postman,点击+加号,选则DELETE后面输入注册地址:http://192.168.164.101:8500/v1/catalog/register,选择body,row,json格式数据,输入要删除的json格式数据参数
6、nginx-upsync-module简介
Upsync是新浪微博开源的基于Nginx实现动态配置的第三方模块。Nginx-Upsync-Module的功能是拉取Consul的后端server的列表,并动态更新Nginx的路由信息。此模块不依赖于任何第三方模块。Consul作为Nginx的DB,利用Consul的KV服务,每个Nginx Work进程独立的去拉取各个upstream的配置,并更新各自的路由。
- 流程
- 通过用PostMan工具在consul server添加了两个tomcat服务192.168.164.128:8080和192.168.164.128.9090,如何获取添加的这两个tomcat服务,那就需要upsync定时获取服务信息。
- 需要提前安装nginx-upsync-module模块,让nginx使用到这个模块,知道这个模块的具体位置。
- 然后把nginx启动起来,在添加上相关配置,通过upsync从concul server里面拉取服务的列表。
7、nginx-upsync-module安装
Nginx-Upsync-Module的功能是拉取Consul的后端server的列表,并动态更新Nginx的路由信息。
(1)nginx-upsync-module下载
下载nginx-upsync-module命令:
wget https://github.com/weibocom/nginx-upsync-module/archive/master.zip
nginx-upsync-module百度网盘下载链接:
链接:https://pan.baidu.com/s/1D6yvkcKQ6QitQ3spuOwRJQ
提取码:qwer
链接:https://pan.baidu.com/s/1D6yvkcKQ6QitQ3spuOwRJQ
提取码:qwer
(2)nginx-upsync-module解压
nginx和nginx-upsync-module-master必须放在同一台虚拟机服务器上。nginx安装在192.168.164.101,nginx-upsync-module-master也必须安装在192.168.164.101
将nginx-upsync-module下载(或上传)到opt/apps目录下,解压:
unzip master.zip
(3)nginx-upsync-module安装
在/opt/下创建upsync目录:mkdir /opt/upsync
将解压后/opt/apps/下的nginx-upsync-module-master移动到/opt/upsync目录下:
mv /opt/apps/nginx-upsync-module-master /opt/upsync
8、重新配置安装Nginx
重新配置安装Nginx:
1.需要删除之前安装的nginx,删除前做一下文件备份。
2.解压之前需要做配置,创建nginx用户组,创建nginx用户和目录,因为有些插件是需要存放在这些目录的。
3.然后在重新源码解压安装nginx。
(1)彻底删除之前安装的Nginx
先关闭和禁用Nginx服务
关闭nginx服务:systemctl stop nginx
关闭nginx开机自启动:systemctl disable nginx
查看nginx服务当前状态:systemctl status nginx
查看nginx是否设置开机自启动服务:systemctl list-unit-files|grep nginx
删除之前安装的nginx
#先删除之前创建的/var/temp/nginx/client/目录:rm -rf /var/temp/nginx/
#先将之前安装nginx打包备份,压缩为.tar.gz:
cd /usr/local
tar -zcvf nginx_backup_upsync_pre.tar.gz nginx/
#然后删除安装目录/usr/local/nginx:rm -rf /usr/local/nginx
#最后删除/opt/apps下nginx-1.20.1.tar.gz的解压目录nginx-1.20.1:
cd /opt/apps/
rm -rf /usr/local/nginx
(因为这个nginx源码解压下的makefile是按以前代码参数配置的要删掉)
(2)Nginx重新解压、安装、配置
添加nginx用户、用户组、并且设置为伪用户
#添加nginx用户组:groupadd nginx
#添加nginx用户(用户组指定为刚刚创建的用户组nginx,nginx用户并且设置为伪用户):
useradd -g nginx -s /sbin/nologin nginx
-g nginx指定用户组为nginx
-s /sbin/nologin nginx指定nginx用户为伪用户
#查看刚刚添加的用户的信息:id nginx
uid=1004(nginx) gid=10001(nginx) 组=10001(nginx)
创建/var/temp/nginx/client/目录
#创建/var/temp/nginx/client/目录:mkdir -p /var/temp/nginx/client/
#创建/usr/local/nginx目录:mkdir /usr/local/nginx
Nginx重新解压
#Nginx重新解压:
cd /opt/apps
tar -zxvf nginx-1.20.1.tar.gz
Nginx重新配置
#进入解压后的nginx-1.20.1目录重新进行参数预置的配置
cd /opt/apps/nginx-1.20.1
输入以下内容后在nginx-1.20.1解压目录下回车:
./configure
–prefix=/usr/local/nginx
–user=nginx
–group=nginx
–with-http_ssl_module
–with-http_flv_module
–with-http_stub_status_module
–with-http_gzip_static_module
–with-http_realip_module
–http-client-body-temp-path=/var/temp/nginx/client/
–http-proxy-temp-path=/var/temp/nginx/proxy/
–http-fastcgi-temp-path=/var/temp/nginx/fcgi/
–http-uwsgi-temp-path=/var/temp/nginx/uwsgi
–http-scgi-temp-path=/var/temp/nginx/scgi
–with-pcre
–add-module=/opt/upsync/nginx-upsync-module-master
–add-module=/opt/upsync/nginx-upsync-module-master #一定是upsync的解压目录
配置configure文件参数,回车设置完之后,会生成一个makefile文件
编译与安装
#编译与安装:make&&make install
启动Nginx开机自启服务,启动Nginx
#启用nginx开机自启动:systemctl enable nginx
#查看nginx是否设置开机自启动服务:systemctl list-unit-files|grep nginx
#启动nginx服务(立即生效):systemctl start nginx
#查看nginx服务当前状态:systemctl status nginx
测试Nginx是否安装启动成功
浏览器访问http://192.168.164.101/,显示Nginx欢迎页,说明重新安装成功了。
9、配置Nginx动态负载均衡:
此时重装nginx,已经有了upsync配置,还没有实现动态负载均衡这个功能,要修改nginx配置文件nginx.conf后才可以。
(1)修改nginx配置文件nginx.conf
进入nginx安装目录编辑nginx.conf配置文件:
cd /usr/local/nginx/
vim conf/nginx.conf
dG,加上两个大括号
Esc,w先保存一下
Esc,:.,$-2d,从光标位置删除到倒数第二行,最后两个大括号留着
uppstream toov5{
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://toov5;
index index.html index.htm;
}
怎么通过upstream反向代理配置toov5,实现动态的负载均衡???
upstream{}花括号中里的内容先在notepad++编辑器里面缩进好,内容如下:
#自己虚拟出的 作为监听用的 端口号 固定死的
server 127.0.0.1:11111;
#连接consul server动态获取upstream配置负载均衡信息
#使用192.168.164.101:8500 原生的 他自己虚拟出来的 不要乱改!读取的是toov5 这个分组的!!!
upsync 192.168.164.101:8500/v1/kv/upstreams/toov5
#配置从consul拉取上游服务器配置的超时时间
upsync_timeout=6m
#配置从consul拉取上游服务器配置的间隔时间0.5秒
upsync_interval=500ms
#指定使用consul配置服务器
upsync_type=consul
#配置nginx在启动时是否强制依赖配置服务器,如果配置为on,则拉取配置失败时nginx启动同样失败。
strong_dependency=off;
#动态拉取consulServer相关负载均衡配置信息持久化到硬盘上的指定文件中
upsync_dump_path /usr/local/nginx/conf/servers/servers_test.conf;
:set paste 然后再输入i,粘贴复制的内容,如果缩进不对其,输入u撤销,多试几次
(2)创建upsync_dump_path路径下的本地持久化目录
创建/usr/local/nginx/conf/servers/目录,该目录是:由upsync_dump_path路径控制,动态拉取consulServer上游服务器相关负载均衡配置信息持久化到硬盘上指定文件的位置,这样即使consul服务器出问题了,本地还有一个备份。
创建/usr/local/nginx/conf/servers/目录:
mkdir /usr/local/nginx/conf/servers/
(3)然后启动consul :
- 进入/opt/下执行启动consul命令:
cd /opt/
./consul agent -dev -ui -node=consul-dev -client=192.168.164.101 - 启动consul报错解决:
如果在该目录下执行启动consul报错:Starting Consul agent…
==> Error starting agent: Failed to start Consul server: Failed to start RPC layer: listen tcp 127.0.0.1:8300: bind: address already in use
说明consul启动被占用consul正在运行,如果想要重启consul,那就找到该consul进程,杀死该进程,执行启动consul命令即可:
找到该consul进程:ps aux|grep consul
杀死该进程:kill -9 4677
执行启动consul命令:./consul agent -dev -ui -node=consul-dev -client=192.168.164.101
[root@node1 opt]# ./consul agent -dev -ui -node=consul-dev -client=192.168.164.101
==> Starting Consul agent...
==> Error starting agent: Failed to start Consul server: Failed to start RPC layer: listen tcp 127.0.0.1:8300: bind: address already in use
[root@node1 opt]# ps aux|grep consul
root 4677 0.0 1.0 25292 10260 pts/1 Tl 19:50 0:00 ./consul agent -dev -ui -node=consul-dev -client=192.168.164.101
root 4690 0.0 0.0 112824 988 pts/1 R+ 19:51 0:00 grep --color=auto consul
[root@node1 opt]# kill -9 4677
[root@node1 opt]# ps aux|grep consul
root 4692 0.0 0.0 112824 988 pts/1 R+ 19:51 0:00 grep --color=auto consul
[1]+ 已杀死 ./consul agent -dev -ui -node=consul-dev -client=192.168.164.101
[root@node1 opt]# ./consul agent -dev -ui -node=consul-dev -client=192.168.164.101
==> Starting Consul agent...
==> Starting Consul agent RPC...
==> Consul agent running!
Version: 'v0.7.5'
Node ID: '83d94d56-0857-2b32-7bea-8e610037c92c'
Node name: 'consul-dev'
(4)重启nginx:
- nginx.conf配置文件配置完后,重启nginx:
systemctl restart nginx
- 重启nginx报错解决:
如果重启nginx有报错:Job for nginx.service failed because the control process exited with error code. See “systemctl status nginx.service” and “journalctl -xe” for details.
网上找原因说的乱七八糟也没找到,其实就是你刚才配置的配置文件有问题,少了标点分号或多了花括号。怎么办?实在找不到就删了nginx.conf在重新下载一个nginx.conf进行配置就好了。 - 重启nginx并访问地址http://192.168.164.101/测试
新建复制一个xshell192.168.164.101, 此时如果虚拟机192.168.164.102 node2主机的tomcat8080和tomcat9090服务没有开启,浏览器访问http://192.168.164.101/是报错的!!!现在访问Nginx,出现502提示。
- 启动虚拟机192.168.164.102 node2主机的tomcat8080和tomcat9090服务
分别修改tomcat8080和tomcat9090的index.jsp页面为FROM 192.168.164.102:8080和FROM 192.168.164.102:9090,然后启动tomcat
cd /opt/apps/tomcat8080/bin
./startup.sh
cd /opt/apps/tomcat9090/bin
./startup.sh
此时,所有准备工作已经好了,下面做动态负载均衡的配置。
(5)动态负载均衡添加
添加nginx Upstream服务开始:
1、方式1:使用linux命令方式发送put请求,添加
- 添加192.168.164.102:8080
在机192.168.164.101 node1主机上,使用linux命令方式发送put请求 添加这个192.168.164.102:8080 到上游服务192.168.164.101:8500consul的toov5上,
输入命令:
curl -X PUT http://192.168.164.101:8500/v1/kv/upstreams/toov5/192.168.164.102:8080
执行后如显示结果true,表示成功。
刷新consul页面:http://192.168.164.101:8500/ui/#/dc1/services,点击KEY/VALUE–>upstream–>toov5–>192.168.164.102:8080。
此时192.168.164.102:9090服务添加上了。
点击 DELETE KEY就删除了添加的服务。
- 添加192.168.164.102:9090
在机192.168.164.101 node1主机上,使用linux命令方式发送put请求 添加这个192.168.164.102:9090 到上游服务192.168.164.101:8500consul的toov5上,
输入命令:
curl -X PUT http://192.168.164.101:8500/v1/kv/upstreams/toov5/192.168.164.102:9090
执行后如显示结果true,表示成功。
刷新consul页面:http://192.168.164.101:8500/ui/#/dc1/services,点击KEY/VALUE–>upstream–>toov5–>192.168.164.102:9090。此时就添加上了。点击 DELETE KEY就删除了添加的服务。
2、方式2:使用PostMan添加服务
- 使用PostMan添加192.168.164.102:8080服务
打开postman,输入账号qq1454413324密码qq123258,
点击+加号,
选则PUT,
后面输入注册地址:http://192.168.164.101:8500/v1/kv/upstreams/toov5/192.168.164.102:8080,
点击send,执行后出现ture说明添加成功。
- 使用PostMan添加192.168.164.102:9090服务
打开postman,
点击+加号,
选则PUT,
后面输入注册地址:http://192.168.164.101:8500/v1/kv/upstreams/toov5/192.168.164.102:9090,
点击send,执行后出现ture说明添加成功。
3、192.168.164.102:9090增加权重配置
如何给192.168.164.102:9090添加权重配置???让http://192.168.164.102:9090对应的服务性能是http://192.
168.164.102:8080对应服务性能的2倍???
访问consul页面:http://192.168.164.101:8500/ui/#/dc1/services,点击KEY/VALUE–>upstream–>toov5–>192.168.164.102:9090。
添加如下内容:
{“weight”:2, “max_fails”:2, “fail_timeout”:10,“down”:0}
添加后点击UPDATE
4、访问测试:动态负载均衡
服务器中请求192.168.164.101进行测试,刷新浏览器,1次8080,2次9090,发现在两个服务之间来回切换了。说明配置成功。
10、Nginx动态负载均衡本地持久化文件
动态拉取consulServer上游服务器相关负载均衡配置信息持久化到硬盘上指定文件的位置,这样即使consul服务器出问题了,本地还有一个备份。
192.168.164.101安装nginx的主机上,打开配置文件查看:
cd /usr/local/nginx/conf/servers/
vim /usr/local/nginx/conf/servers/servers_test.conf
十三、Nginx限流
1、生活中的 “限流”?
限流在生活中亦无处不在,下面例举:
(1)博物馆:限制每天参观总人数以保护文物
(2)高铁安检:有若干安检口,旅客依次排队,工作人员根据安检快慢决定是否放人进去。遇到节
假日,可以增加安检口来提高处理能力(横向拓展),同时增加排队等待区长度(缓存待处理任务)。
(3)办理银行业务:所有人先领号,各窗口叫号处理。每个窗口处理速度根据客户具体业务而定,
所有人排队等待叫号即可。若快下班时,告知客户明日再来(拒绝流量)。
(4)水坝泄洪:水坝可以通过闸门控制泄洪速度(控制处理速度)。
以上"限流"例子,可以让服务提供者稳定的服务客户。
2、为什么需要限流?
系统设计时一般会预估负载,当系统暴露在公网中时,恶意攻击或正常突发流量等都可能导致系统被压垮,而限流就是保护措施之一。限流即控制流量
- Nginx 的二种限流设置
-
- 一是控制速率
-
- 二是控制并发连接数
3、如何限流之控制速率
正常限流
ngx_http_limit_req_module 模块提供限制请求处理速率能力,使用了漏桶算法(leaky bucket)。
此模块在哪???
cd /opt/apps/nginx-1.20.1
./configure --help|grep http_limit_req_module
–without-http_limit_req_module disable ngx_http_limit_req_module
ngx_http_limit_req_module模块默认是安装的,如果不需要,在通过./configure预置的时候给他加上,加上之后就不装了。这个模块提前已经安装过了
3.1 如何限制单个IP的请求处理速率
使用 nginx limit_req_zone 和 limit_req 两个指令,限制单个IP的请求处理速率。
在 nginx.conf http 中添加限流配置,格式:limit_req_zone key zone rate
http {
limit_req_zone $binary_remote_addr
zone=myRateLimit:10m rate=10r/s;
}
配置 server,使用 limit_req 指令应用限流。
server {
location / {
limit_req zone=myRateLimit;
proxy_pass http://my_upstream;
}
}
limit_req_zone key zone rate 解释:
key:定义限流对象,binary_remote_addr 是一种key,表示基于 remote_addr(客户端IP) 来做限流,binary_ 的目的是压缩内存占用量。
zone:定义共享内存区来存储访问信息, myRateLimit:10m表示一个大小为10M,名字为myRateLimit的内存区域。1M能存储 16000 IP地址的访问信息,10M可以存储16W IP地址访问信息。
rate:用于设置最大访问速率,rate=10r/s 表示每秒最多处理10个请求。Nginx 实际上以毫秒为粒度来跟踪请求信息,因此 10r/s实际上是限制:每100毫秒处理一个请求。这意味着,自上一个请求处理完后,若后续100毫秒内又有请求到达,将拒绝处理该请求。
3.2 处理突发流量 burst、nodelay
上面例子限制 10r/s,如果有时正常流量突然增大,超出的请求将被拒绝,无法处理突发流量,可以结合 burst 参数使用来解决该问题。
server {
location / {
limit_req zone=myRateLimit burst=20;
proxy_pass http://my_upstream;
}
}
burst 译为突发、爆发,表示在超过设定的处理速率后能额外处理的请求数。当 rate=10r/s 时,将1s拆成10份,即每100ms可处理1个请求。
此处,burst=20 ,若同时有21个请求到达,Nginx 会处理第一个请求,剩余20个请求将放入队列,然后每隔100ms从队列中获取一个请求进行处理。若请求数大于21,将拒绝处理多余的请求,直接返回503。
不过,单独使用 burst 参数并不实用。假设 burst=50 ,rate依然为10r/s,排队中的50个请求虽然每100ms会处理一个,但第50个请求却需要等待 50 *100ms即 5s,这么长的处理时间自然难以接受。因此,burst 往往结合 nodelay 一起使用。
server {
location / {
limit_req zone=myRateLimit burst=20 nodelay;
proxy_pass http://my_upstream;
}
}
nodelay 针对的是 burst 参数,burst=20 nodelay 表示这20个请求立马处理,不能延迟,相当于特事特办。不过,即使这20个突发请求立马处理结束,后续来了请求也不会立马处理。burst=20 相当于缓存队列中占了20个坑,即使请求被处理了,这20个位置这只能按 100ms一个来释放。这就达到了速率稳定,但突然流量也能正常处理的效果。
4、如何限流之限制连接数
ngx_http_limit_conn_module 模块提供了限制连接数的能力,利用 limit_conn_zone 和 limit_conn 两个指令即可。
此模块在哪???
cd /opt/apps/nginx-1.20.1
./configure --help|grep http http_limit_conn_module
–without-http_limit_conn_module disable ngx_http_limit_conn_module
http_limit_conn_module模块默认是安装的,如果不需要,在通过./configure预置的时候给他加上,加上之后就不装了。这个模块提前已经安装过了
下面是 Nginx 官方例子:
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server {
...
limit_conn perip 10;
limit_conn perserver 100;
}
limit_conn perip 10 作用的 key 是 $binary_remote_addr,表示限制单个IP同时最多能持有10个连接。
limit_conn perserver 100 作用的 key 是 $server_name,表示虚拟主机(server) 同时能处理并发连接的总数。
需要注意的是:只有当 request header 被后端server处理后,这个连接才进行计数。
5、设置白名单
限流主要针对外部访问,内网访问相对安全,可以不做限流,通过设置白名单即可。利用 Nginx ngx_http_geo_module 和ngx_http_map_module 两个工具模块即可搞定。
ngx_http_geo_module和ngx_http_map_module这两个模块默认已经安装:
在 nginx.conf 的 http 部分中配置白名单:
geo $limit {
default 1;
39.100.243.125 0;
192.168.0.0/24 0;
172.20.0.35 0;
}
map limit limit_key {
0 "";
1 $binary_remote_addr;
}
limit_req_zone $limit_key zone=myRateLimit:10m rate=10r/s;
geo:对于白名单(子网或IP都可以) 将返回0,其他IP将返回1。
map:将limit转换为 limit_key,如果是 $limit 是0(白名单),则返回空字符串;如果是1,则返回客户端实际IP。
limit_req_zone 限流的key不再使用 binary_remote_addr,而是limit_key 来动态获取值。如果是白名单,limit_req_zone 的限流key则为空字符串,将不会限流;若不是白名单,将会对客户端真实IP进行限流。
限制数据传输速度的能力(下载速度):
除限流外,ngx_http_core_module 还提供了限制数据传输速度的能力(即常说的下载速度)。例如:
location /flv/ {
flv;
limit_rate_after 20m;
limit_rate 100k;
}
这个限制是针对每个请求的,表示客户端下载前20M时不限速,后续限制100kB/s。
十四、Nginx原理:Master-Worker
1、Master-Worker模式
- Nginx 在启动后,会有一个 master 进程和多个相互独立的 worker 进程。
- Master接收来自外界的信号,向各worker进程发送信号,每个进程都有可能来处理这个连接。
- Master进程能监控Worker进程的运行状态,当 worker 进程退出后(异常情况下),会自动启动新的 worker 进程。
worker进程在配置文件中体现:vim /usr/local/nginx/conf/nginx.conf
查看nginx进程:ps aux|grep nginx
查看nginx进程树master进程和worker进程什么关系:pstree -p
master进程是work进程的父进程
2、accept_mutex
由于所有子进程都继承了父进程的sockfd,那么当连接进来时,所有子进程都将收到通知并“争着”与它建立连接,这就叫“惊群现象”。大量的进程被激活又挂起,只有一个进程可以accept() 到这个连接,这当然会消耗系统资源。Nginx 提供了一个accept_mutex加在accept上的一把共享锁。即每个worker进程在执行accept之前都需要先获取锁,获取不到就放弃执行accept()。有了这把锁之后,同一时刻,就只会有一个进程去accpet(),这样就不会有惊群问题了。
当一个worker进程在accept()这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,完成一个完整的请求。一个请求,完全由worker进程来处理,而且只能在一个worker进程中处理。
3、为什么使用进程不使用线程?
- 节省锁带来的开销。每个worker进程都是独立的进程,不共享资源,不需要加锁。同时在编程以及问题查上时,也会方便很多。
- 独立进程,减少风险。采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快重新启动新的worker进程。当然,worker进程的也能发生意外退出。
4、如何处理并发请求?
每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方,比如向上游(后端)服务器转发request,并等待请求返回。那么,这个处理的worker不会这么傻等着,他会在发送完请求后,注册一个事件:“如果upstream返回了,告诉我一声,我再接着干”。于是他就休息去了。此时,如果再有request 进来,他就可以很快再按这种方式处理。而一旦上游服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。由于web server的工作性质决定了每个request的大部份生命都是在网络传输中,实际上花费在server机器上的时间片不多,这就是几个进程就能解决高并发的秘密所在。
5、一个master和多个worker有什么好处
(1)可以使用 nginx -s reload 热部署,利用nginx进行热部署操作。
(2)每个worker是独立的进程,如果有其中一个worker出现问题,其他worker独立的继续进行争抢,实现请求过程,不会造成服务中断。
十五、Nginx调优:worker_processes、worker_cpu_affinity
1、worker_processes 的设置
1.1 修改worker_processes值
打开 nginx.conf 配置文件,可以看到 worker_processes 的默认值为 1。
vim /usr/local/nginx/conf/nginx.conf
将worker_processes 1改成2。保存。
查看nginx进程(1个master进程1个worker进程):
ps aux|grep nginx
重启nginx之后,查看nginx进程(1个master进程2个worker进程):
systemctl restart nginx
ps aux|grep nginx
1.2 如何设置worker_processes的值???
worker_processes,工作进程,用于指定 Nginx 的工作进程数量。该值应该设置为多少合适呢?其数值一般设置为 CPU 内核数量,或内核数量的整数倍。注意,现代的 CPU 一般都是多核的,即一块 CPU 中包含多个内核。若当前系统具有 2 块 CPU,而每块 CPU 中包含 2 个内核,那么,worker_processes 的值一般可以设置为 4 或 8。当然,也可以设置为 2。
(一般cpu核数要给操作系统预留一个,cpu核数给Master预留一个)
不过需要注意,该值不仅仅取决于 CPU 内核数量,还与硬盘数
量及负载均衡模式相关。在不确定时可以指定其值为 auto。
2、worker_cpu_affinity 的设置
为了进一步提高系统性能,我们会将 worker 进程与具体的内核进行绑定。该绑定操作是通过 worker_cpu_affinity 属性进行设置的affinity,密切关系。
不过,若指定 worker_processes 的值为auto,则无法设置 worker_cpu_affinity。
该设置是通过二进制进行的。每个内核使用一个二进制位表示,0 代表内核关闭,1 代表内核开启。也就是说,有几个内核,就需要使用几个二进制位。下面通过几个例子来增进对 worker_processes 与 worker_cpu_affinity 的理解。
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
十六、Nginx高可用:用keepalived实现
keepalived实现Nginx高可用
1、为什么要学习Keepalived?
如果nginx宕机单点故障,无法为用户提供响应,整个服务器用不了了。
升级架构:
2、Keepalived概述
keepalived是集群管理中保证集群高可用的服务软件。
Keepalived的作用是检测服务器的状态,如果有一台服务器宕机或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器(如果是计算机硬件:硬盘、网卡坏了需要人工修复)。
Keepalived 原理:
VRRP协议(虚拟路由冗余协议) - Virtual Router
Redundancy Protocol
- keepalived工作在TCP/IP协议栈的IP层,TCP层,及应用层,工作原理基于VRRP协议。
-
- 网络层:Keepalived会定期向服务器群中的服务器发送一个ICMP的数据包,(既我们平时用的ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器集群中剔除。
-
- 传输层:Keepalived以TCP端口的状态来决定服务器工作正常与否,如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器集群中剔除。
-
- 应用层:只要针对应用上的一些探测方式,如URL的get请求,或者对nginx脚本检测等;可以根据用户自定义添加脚本针对特定的服务进行状态检测,当检测结果与用户设定不一致,则把这台服务器从服务器群中剔除。
3、VRRP协议的工作原理和VRRP选举机制
3.1 VRRP协议的工作原理
VRRP(Virtual Router Redundancy Protocol)虚拟路由冗余协议是一种容错的主备模式的协议,当网络设备发生故障时,可以不影响主机之间通信情况下进行设备切换,并且相对用户时切换过程时透明的。
一个VRRP路由器有唯一的标识:VRID,范围为0—255。该路由器对外表现为唯一的虚拟MAC地址,地址的格式为00-00-5E-00-01-[VRID]。
同一台路由器可以加入多个备份组,在不同备份组中有不同的优先级,使得该路由器可以在一个备份组中作为主用路由器,在其他的备份组中作为备用路由器。提供了两种安全认证措施:明文认证和IP头认证。
3.2 VRRP选举机制(怎么配置主、备、虚拟IP)
- 虚拟IP拥有者:如果某台路由器的IP地址与虚拟路由器的VIP地址一致,那么这台就会被选为主路由器。
- 优先级较高者:如果没有虚拟IP拥有者,优先级数值大的路由器会被选举出,优先级范围0~255。
- IP地址较大者:如果优先级一样高,IP地址数值大的路由器会被选举出。
192.168.20.101 192.168.20.105 MASTER
4、keepalived实现Nginx高可用:安装keepalived前的工作
(1)安装前准备
- 需求准备:
1)两台Linux服务器192.168.164.101 node1、192.168.164.105 node5作为负载均衡服务器。
2)一台Linux服务器192.168.164.102 node2上的tomcat8080和tomcat9090还是RS真实服务器。
3)修改node2的tomcat8080和tomcat9090上的index.jps,去掉样式和图片,去掉动静分离的干扰。
vim /opt/apps/tomcat8080/webapps/ROOT/index.jsp
from 192.168.164.102:8080 tomcat8080
vim /opt/apps/tomcat9090/webapps/ROOT/index.jsp
from 192.168.164.102:9090 tomcat9090
- 访问过程流程分析及实现效果图:
(2)分别备份node1、node5主机上nginx的配置文件
因为我们要修改node1和node5主机上nginx的配置文件,修改之前先把配置文件备份一下。
- 备份192.168.164.101 node1上nginx的配置文件:
cp nginx.conf nginx.conf_keepalived_pre
- 备份192.168.164.105 node5上nginx的配置文件:
cp nginx.conf nginx.conf_keepalived_pre
(3)修改node1上的nginx.conf配置文件
upstream rss {
server 192.168.164.102:8080;
server 192.168.164.102:9090 weight=2;
}
server { # check_nginx.sh脚本执行时使用
listen 80;
server_name localhost;
location / {
root html;
}
}
server {
listen 80;
#虚拟VIP:192.168.164.200
server_name 192.168.164.200;
location / {
proxy_pass http://rss/;
}
}
(4)将node1上的nginx.conf配置文件远程拷贝到node5上
备份node5的配置文件nginx.conf。
将node1上上一步(2)修改后的配置文件远程拷贝到node5上。
进入node1的/usr/local/nginx/conf/目录下:
cd /usr/local/nginx/conf/
scp远程拷贝node1的nginx.conf配置文件到node5的当前目录:
scp nginx.conf 192.168.164.105:`pwd`
(5)在node1的/home/目录下编写check_nginx.sh脚本
进入home目录:
cd /home/
编写check_nginx.sh脚本:
vim check_nginx.sh
check_nginx.sh脚本内容如下:
#!/bin/bash
#要在/usr/local/nginx/html目录下创建check.html
#check.html页面写入:check nginx
#通过访问check.html页面来检查nginx是否宕机
#url访问本机的check.html
url="http://127.0.0.1/check.html"
#通过curl访问url返回一个http_code码
code=`curl -s -o /dev/null -w %{http_code} $url`
#通过判断相应编码是否是200来确定nginx宕机
#如果code码不等于200,休眠1秒,再次通过curl访问url返回一个http_code码
if [ $code -ne 200 ];then
sleep 1
code=`curl -s -o /dev/null -w %{http_code} $url`
#如果code码还不等于200,说明nginx宕机,直接关闭本机的keepalived
if [ $code -ne 200 ];then
#确定nginx是宕机,关闭本机的keepalived
systemctl stop keepalived
fi
fi
给check_nginx.sh脚本添加执行权限:
chmod +x /home/check_nginx.sh
(6)将node1上的check_nginx.sh脚本远程拷贝到node5上
然后将node1上的/home/check_nginx.sh脚本拷贝到node5上:
scp /home/check_nginx.sh node5:/home/
(7)分别在node1、node5上/usr/local/nginx/html目录下创建check.html:check nginx
- 在node1上的/usr/local/nginx/html目录创建一个check.html,check.html页面内容写入check nginx。
[root@node1 home]# cd /usr/local/nginx/html
[root@node1 html]# vim check.html
check nginx
- 在node5上的/usr/local/nginx/html目录创建一个check.html,check.html页面内容写入check nginx。
[root@node1 home]# cd /usr/local/nginx/html
[root@node1 html]# vim check.html
check nginx
(8)测试check_nginx.sh脚本页面是否可以正常使用
-
192.168.164.101 node1主机上,测试check_nginx.sh脚本页面是否可以正常使用
重启nginx服务:
systemctl restart nginx
查看nginx进程:
ps aux|grep nginx
检查check_nginx.sh脚本程序的运行:
sh -x /home/check_nginx.sh
以上提示表示nginx正常提供服务。
停止nginx服务:
systemctl stop nginx
检查check_nginx.sh脚本程序的运行:
sh -x /home/check_nginx.sh
当停止nginx服务后,脚本运行出现停止keepalived,说明没有问题。因为此时还没有安装keepalived服务,下一步安装keepalived服务。
+ systemctl stop keepalived
Failed to stop keepalived.service: Unit keepalived.service not loaded. -
192.168.164.105 node5主机上,测试check_nginx.sh脚本页面是否可以正常使用
重启nginx服务:
systemctl restart nginx
查看nginx进程:
ps aux|grep nginx
检查check_nginx.sh脚本程序的运行:
sh -x /home/check_nginx.sh
停止nginx服务:
systemctl stop nginx
检查check_nginx.sh脚本程序的运行:
sh -x /home/check_nginx.sh
当停止nginx服务后,脚本运行出现停止keepalived,说明没有问题。因为此时还没有安装keepalived服务,下一步安装keepalived服务。
+ systemctl stop keepalived
Failed to stop keepalived.service: Unit keepalived.service not loaded.
5、keepalived实现Nginx高可用:安装keepalived
分别在node1和node5上通过yum安装keepalived服务
(1)node1主机安装keepalived:
[root@node1 html]# yum - y install keepalived
安装完之后,Linux系统中就会多一个keepalived服务。
查看keepalived是否设置开机自启动服务:
systemctl list-unit-files|grep keepalived
keepalived.service disabled,说明keepalived没有设置成开机自启服务。
(2)node5主机安装keepalived:
[root@node5 html]# yum -y install keepalived
(3)安装之后的keepalived.conf配置文件在哪?
查找keepalived.conf配置文件位置:
[root@node1 html]# find / -name keepalived.conf
/etc/keepalived/keepalived.conf
[root@node1 html]#
配置文件在/etc/keepalived/keepalived.conf。
(4)如何卸载keepalived?
卸载keepalived:yum -y remove keepalived
查找keepalived服务:find / -name keepalived
6、keepalived实现Nginx高可用:配置keepalived
分别在node1和node5上配置keepalived服务
(1)node1主机配置keepalived服务
查找keepalived.conf配置文件位置:
[root@node1 html]# find / -name keepalived.conf
/etc/keepalived/keepalived.conf
编辑keepalived.conf配置文件:
[root@node1 ~]# vim /etc/keepalived/keepalived.conf
keepalived.conf文件内容如下:
! Configuration File for keepalived
global_defs {
#配置接收邮件的邮箱地址,指定keepalived的backup在发生切换为master时, 需要发送email的邮箱地址,配置的时候一行一个邮箱。
notification_email {
qq1454413324@163.com
}
#指定发件人的邮箱。此邮箱提前就有的。
notification_email_from 1454413324@qq.com
#指定发件smtp服务器的ip地址
smtp_server 192.168.164.1
#指定当前节点连接smtp服务器的超时时间
smtp_connect_timeout 30
#运行keepalived机器的一个标识(此处用node1来标识)
router_id node1
}
#手动定义一个检查机制(这个机制就是调用我们下面写好的chk_nginx)
vrrp_script chk_nginx { #chk_nginx名称必须与下面配置检查机制中的chk_nginx名称一致。
#指定检查的脚本文件
script "/home/check_nginx.sh"
#每隔2秒检查一次
interval 2
#可以降低权重(原来优先级值为100降低20)
weight -20
}
vrrp_instance VI_1 {
#指定实例的初始化状态,两台路由器都启动后,马上会发生竞选。priority优先级高的被选为Master。
#这里的MASTER并不能代表当前实例一直为MASTER。
state MASTER
#当前实例绑定的网卡设备ens33
interface ens33
#VRID的标记(0-255)这里id是101
virtual_router_id 101
#优先级 该值高的实例优先竞选为MASTER,低的为BACKUP。(此处设置为100)
priority 100
#检查间隔,默认为1s
advert_int 1
authentication {
#认证的方式 PASS 或AH
auth_type PASS
#认证的密码 1111
auth_pass 1111
}
#指定虚拟ip地址,也是VIP
virtual_ipaddress {
#VIP为192.168.164.200/24,指定dev网卡设备ens33,起一个label标记ens33:3
192.168.164.200/24 dev ens33 label ens33:3
#192.168.200.17
}
#配置检查机制
track_script {
#调用上面定义的好的检查机制(VI_1)
chk_nginx
}
}
(2)node5主机配置keepalived服务
- 将node1上/etc/keepalived/keepalived.conf已经配置好的配置文件,以root身份,拷贝到node5主机的/etc/keepalived/目录下:
[root@node1 ~]# scp /etc/keepalived/keepalived.conf root@192.168.164.105:/etc/keepalived
登录node5主机的/etc/keepalived/目录查看keepalived.conf 配置文件:
cat /etc/keepalived/keepalived.conf
- 修改node5主机/etc/keepalived/keepalived.conf配置文件
修改node5上keepalived.conf配置文件:
vim /etc/keepalived/keepalived.conf
修改keepalived.conf的内容如下:
#运行keepalived机器的一个标识(此处用node1来标识)
router_id node5
......
#这里的MASTER并不能代表当前实例一直为MASTER。
state BACKUP
#当前实例绑定的网卡设备ens33
interface ens33
#VRID的标记(0-255)这里id是101
virtual_router_id 105
#优先级 该值高的实例优先竞选为MASTER,低的为BACKUP。(此处设置为100)
priority 90
7、keepalived实现Nginx高可用:测试keepalived
(1)node2上启动tomcat服务
- 启动node2上的两台tomcat服务:tomcat8080和tomcat9090。
启动tomcat8080服务:
[root@node2 bin]# cd /opt/apps/tomcat8080/bin
[root@node2 bin]# ./startup.sh
启动tomcat9090服务:
[root@node2 bin]# cd /opt/apps/tomcat9090/bin
[root@node2 bin]# ./startup.sh
(2)node1上启动nginx服务
node1上启动nginx服务
启动nginx服务:systemctl start nginx
查看nginx服务状态:systemctl status nginx
(3)node1上启动keepalived服务、测试
- 启动node1上keepalived
启动keepalived服务:systemctl start keepalived
查看keepalived服务状态:systemctl status keepalived
查看网卡信息:ifconfig
会出现ens33:3网卡信息
- 测试
浏览器访问192.168.164.200,根据nginx配置文件的配置,刷新后出现一次8080两次9090。说明tomcat和nginx服务都正常没有问题。
此时node1上,启动keepalived服务后的这台服务上的nginx为MASTER。
- node1主机上检查check_nginx.sh脚本程序的运行
node1上检查check_nginx.sh脚本程序的运行:
sh -x /home/check_nginx.sh
以上提示表示node1主机上nginx正常提供服务。没有关掉keepalived - 监听查看nginx服务access.log日志
[root@node1 ~]# tail -f /usr/local/nginx/logs/access.log
access.log日志监听是否每隔2秒get请求/check.html页面,返回http状态码为200(自动检测脚本check_nginx.sh) - 如果此时我们浏览器访问192.168.164.200,再次监听查看nginx服务access.log日志的显示
[root@node1 ~]# tail -f /usr/local/nginx/logs/access.log
也就说明此台nginx服务是master。
(4)node5上启动nginx服务
启动node5上的nginx服务
启动nginx服务:systemctl start nginx
查看nginx服务状态:systemctl status nginx
(5)node5上启动keepalived服务、测试
- node5上启动keepalived
启动keepalived服务:systemctl start keepalived
查看keepalived服务状态:systemctl status keepalived
查看网卡信息:ifconfig
会出现ens33:3网卡信息
- node5主机上检查check_nginx.sh脚本程序的运行
node5上检查check_nginx.sh脚本程序的运行:
sh -x /home/check_nginx.sh
以上提示表示node5主机上nginx正常提供服务。没有关掉keepalived - 监听查看nginx服务access.log日志
[root@node5 ~]# tail -f /usr/local/nginx/logs/access.log
access.log日志监听是否每隔2秒get请求/check.html页面,返回http状态码为200(自动检测脚本check_nginx.sh)
(6)node1上停止nignx服务
-
node1上停止nignx服务
停止nginx服务:
systemctl stop nginx -
当停止node1上的nginx服务,再次查看nginx的监听access.log日志,发现access.log日志已经不再增长。
tail -f /usr/local/nginx/logs/access.log
-
检查check_nginx.sh脚本程序的运行:
sh -x /home/check_nginx.sh
当停止nginx服务后,脚本运行出现停止keepalived,说明没有问题。 -
查看keepalived服务状态:
systemctl status keepalived
发现dead已经停止了
-
查看网卡服务:ifconfig
发现已经没有了ens33:3
(7)node5上查看nignx、keepalived服务为BACKUP
当我们关闭掉node1的nginx后,也就是node1的nginx-master已经宕掉。
此时查看node5的nignx、keepalived服务服务
- 监听查看nginx服务access.log日志
[root@node5 ~]# tail -f /usr/local/nginx/logs/access.log
access.log日志监听是否每隔2秒get请求/check.html页面,返回http状态码为200(自动检测脚本check_nginx.sh) - 测试
浏览器访问192.168.164.200,根据nginx配置文件的配置,刷新后出现一次8080两次9090。说明tomcat和nginx服务都正常没有问题。
node1的nginx宕掉后,此时node5上,keepalived服务上的nginx为BACKUP已经正在使用服务。
- 如果此时我们浏览器访问192.168.164.200,再次监听查看node5上nginx服务access.log日志的显示
[root@node1 ~]# tail -f /usr/local/nginx/logs/access.log
也就说明此台nginx服务是backup。
(8)node1上再次启动nignx、keepalived服务变为MASTER
- 再次重新启动node1上的nginx、keepalived服务
启动nginx服务:systemctl restart nginx
启动keepalived服务:systemctl start keepalived
- 关闭node5上的nginx:
[root@node5 ~]# systemctl stop nginx
查看node5上keepalived服务:
[root@node5 ~]# systemctl status keepalived
显示dead此时服务已经关闭
- 测试:重启node1上的nginx,关掉node5上nginx。
浏览器访问192.168.164.200,根据nginx配置文件的配置,刷新后出现一次8080两次9090。说明tomcat和nginx服务都正常没有问题。
node5的nginx宕掉后,此时node1上,keepalived服务上的nginx为MASTER已经正在使用服务。