个人主页:啊陈晓
学习方向:java后端开发
我的上一篇文章:【深入浅出Nginx系列】Nginx入门?看这一篇就够了(概念篇)
如果我的文章对你有帮助,点赞、收藏、留言都是对我最大的动力
【注意】:
由于篇幅原因,博主将Nginx的教学分为概念篇和实战篇,大家可以根据需求进行不同的模块的学习,当然搭配在一起学习效果更佳喔~
【深入浅出Nginx系列】Nginx入门?看这一篇就够了(概念篇)
【深入浅出Nginx系列】Nginx入门?看这一篇就够了(实战篇)
现在让我们正式开启进入今天的正文
前言
一、Linux环境下Nginx的搭建
1.环境准备
2.安装包下载
3.安装步骤
二、Nginx实战实例——反向代理
1.环境准备
2.启动一个tomcat并测试
3.在host文件中配置映射
4.在 nginx.conf 配置文件中增加如下配置
5.测试
三、Nginx实战实例——负载均衡
1.环境准备
2.在 nginx.conf 配置文件中增加如下配置
3.测试
四、Nginx实战实例——动静分离
1.环境准备
2.在 nginx.conf 配置文件中增加如下配置
3.测试
五、Nginx实战实例——搭建高可用集群
1.环境准备
2.对主从服务器的keepalived.conf 配置文件进行修改
3.添加检测脚本
4.测试
六、实战过程中遇到的问题
1.防火墙问题
2.配置目录问题
3.location优先级问题
总结
博主最近在学习SpringCloud Alibaba相关的内容,在学习到Nacos集群的搭建和持久化时,发现整个集群架构需要搭建Niginx集群来实现整个集群的高可用性。而在此之前,博主也只是仅仅听闻过Nginx的一些信息,于是为了能够顺利搭建nacos集群,博主恶补了Nginx,并将所学的内容通过文章的形式分享给大家~
下图即Nacos集群架构图:
注意:今天我们所讲的内容都是基于上一讲中的概念、模型进行实战,因此在这一次的文章中对上文中已经讲解过的概念不再做赘述。
JVM环境 |
使用Xshell进行远程连接 |
Nginx官网直通车http://nginx.org/
进入官网后如下图所示:
然后选择当前稳定的版本的Linux安装包,这里我选择的是1.22.0
下载完后解压即可
先准备一台虚拟机并命名为Nginx-1
打开终端输入ifconfig,获取ip后通过xshell进行远程连接
输入su切换到root,我们开始安装~
在安装Nginx之前,我们先安装与Nginx相关的四个依赖包--通过以下命令一键安装四个依赖
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
进入到/opt/software 目录(如果没有 software则自己创建)
cd /opt/software #进入对应目录
mkdir software #如果目录不存在则在对应路径下创建文件夹
将下载好的压缩包上传到software中,可以使用文件上传工具,也可以直接拖进去。
接下来按如下顺序进行操作:
1、解压Nginx压缩包
tar -xvf nginx-1.12.2.tar.gz
2、进入解压缩目录,依次输入以下命令
./configure make && make install
3、进入/usr/local/nginx/sbin目录,启动Nginx
./nginx #启动nginx #下面是nginx的一些其他常用命令、均要在/usr/lcoal/nginx/sbin目录下执行 ./nginx -s stop #停止nginx服务 ./nginx -s reload #nginx热部署,更新配置资源重载nginx
4.此时输入进程查询命令,可以看到Nginx已经启动
ps -ef|grep nginx
关于反向代理的概念,我们在上一篇文章中已经进行了详细的介绍,接下来我们就使用Nginx完成反向代理。
实现效果:在浏览器访问www.666.com能够直接跳转到ip:8080
上文中的Nginx环境 |
tomcat环境 |
由于篇幅原因,上文中的tomcat就不带着大家配置啦,大家可以在网上查找tomcat的安装教程自行进行安装~
进入tomcat解压缩目录的bin,输入以下命令启动tomcat
./startup.sh
在浏览器地址栏输入ip:8080测试tomcat是否启动成功
如若出现上图中无法访问的功能,可能是防火墙未关闭,我们可以查看防火墙的状态并关闭防火墙:
systemctl status firewalld #查看防火墙状态 systemctl stop firewalld #关闭防火墙
再次访问ip:8080,访问成功
进入windows系统中C:\Windows\System32\drivers\etc目录,对host文件进行修改
在最下面一行添加www.666.com到ip:8080的映射
修改 usr/local/nginx/conf目录中的nginx.conf文件
vi /usr/local/nginx/conf/nginx.conf
按下图所示修改配置后wq保存退出
上图配置中:
- listen: 表示我们检测80端口
- server_name: 访问域名为 www.666.com
- proxy_pass:代理转发模块,主要功能是把请求转发到其它服务,即将www.666.com的请求转发到http://192.168.137:8080;
配置完成后,进入/usr/local/nginx/sbin目录重加载Nginx
./nginx -s reload #重加载Nginx
在浏览器地址栏中输入www.666.com
在实现了上文的反向代理实例后,我们继续进阶,在反向代理的知识基础上使用Nginx实现负载均衡。
实现效果:启动两台服务器,在tomcat中分别放置两个内容不同的网页资源test.html,在浏览器中输入ip/test/test.html时,将请求均衡到端口为8080和8081的服务器中,实现负载均衡。
准备两个页面,均命名为test.html,内容分别如下:
welcome to service 8080
welcome to service 8081
将上文中的apache解压缩包重命名为apache8080
mv apache-tomcat-7.0.70 apache8080
进入Webapps目录并创建一个新的test文件夹
cd webapps mkdir test
内容为8080的test.html传入test文件夹中
重新解压一个新的apache压缩包并命名为apache8081,步骤与上文中一致
进入conf 目录中修改server.xml
按下图所示修改配置后wq保存退出
然后重复上图中的步骤,进入webapps、新建一个test文件夹、将内容为8081的test.html传入test文件夹中
然后分别进入apache8080、apache8081的bin目录中,启动tomcat
./shutdown.sh #停止tomcat服务 ./startup.sh #启动tomcat服务
访问ip:8080/test/test.html,出现如下图所示页面
apache8081也是同样的操作
修改 usr/local/nginx/conf目录中的nginx.conf文件
vi /usr/local/nginx/conf/nginx.conf
按下图所示修改配置后wq保存退出
置完成后,进入/usr/local/nginx/sbin目录重加载Nginx
./nginx -s reload #重加载Nginx
在浏览器地址栏中输入www.666.com/test/test.html
访问后结果如下所示,刷新页面,会发现页面内容在8080和8081中进行切换,即实现了将请求分发给两个服务器,实现了负载均衡:
我们继续学习Nginx的下一个应用场景——动静分离。截止到现在,我们上文中的所有请求都是在动态服务器上完成的,因此,为了能够实现动态分离,我们便通过Nginx对静态资源的访问进行配置。
实现效果:
在根目录下创建一个文件夹data,在里面放置静态资源文件,然后通过配置实现对data目录下静态资源的访问。
在虚拟机跟目录下创建一个文件夹data,在data文件夹下创建两个文件夹,分别为html、image
将一个网页资源test.html放置进html文件夹
将一张图片1.png放置进image文件夹
配置完成后,进入/usr/local/nginx/sbin目录重加载Nginx
./nginx -s reload #重加载Nginx
在浏览器地址栏中分别输入
http://www.666.com/html/test.html
http://www.666.com/image/1.png
若结果如下图所示即动静分离实现成功
这是我们上一篇文章中没有提到的内容,在这里,我们对Nginx高可用集群做出解释:
在进行实战教学之前,我们先来了解什么是高可用性:
“高可用性”(High Availability)通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性。Nginx于Keepalived可以实现高可用,实现双机热备+自动切换,这种操作在现在的集群系统中。
人话:
在只有nginx服务器在工作的时候,一旦这台服务器发生宕机,就会导致整个系统发生故障,造成数据的丢失。为了保证整个系统的可用性,于是我们增加了一台nginx备用机,也称为从机,一旦nginx主机宕机,从机就会接替他的任务继续工作,大大的提高了整个系统的可用性。
现在我们正式开始搭建Nginx集群
keepalived环境 |
两台Nginx服务器 |
定义一个虚拟IP |
首先,我们在原本的基础上,将原本的Nginx服务器进行克隆,得出第二台Nginx服务器。
开启两台服务器并使用Xshell进行连接。
接下来使用在两台服务器使用下面的命令安装keepalived
yum install keepalived –y
安装完成后,我们可以在/etc/目录下看见生成了一个目录keepalived,目录中有一个keepalived.conf文件
主机:192.168.17.137
修改etc/keepalived目录下的keepalived.conf:
其中最底层的(192.168.154.99即为虚拟IP)
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.154.137
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 ens33 //网卡
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.154.99 // VRRP H 虚拟地址
} }
从机:192.168.17.147
修改etc/keepalived目录下的keepalived.conf:
其中最底层的(192.168.154.99即为虚拟IP)
从机的keepalived.conf配置文件只需将主机的keepalived.conf文件的基础上将下图中的state修改成BACKUP即可。
分别在两台服务器的/usr/local/src 添加检测脚本nginx_check.sh(新建一个文件存进去)
#!/bin/bash
A=`ps -C nginx –no-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
添加完成后,启动两台服务器上的nginx和keepalived
./nginx #sbin目录下启动nginx systemctl start keepalived.service #启动keepalived服务
访问:http://192.168.154.99/,结果如下图所示
然后我们关闭掉主机的nginx和keepalived
./nginx -s stop #在sbin目录下关闭nginx服务 systemctl stop keepalived.service #关闭keepalived服务 systemctl satus keepalived.service #查看keepalived服务状态
再次访问:http://192.168.154.99/,结果如下所示
说明在主机宕机后,从机接替了主机的工作,保证了系统的高可用性。
在学习过程中,所遇到的问题都是因为不够细心而导致的配置、脚本编写错误,但是在除了这些问题之外,学习过程中还是有很多值得分享的问题,我在这里分享给大家~
在进行外网访问时,如果发现出现无法访问的状态,可能是防火墙的问题,大家在查找问题的时候可以先关注一下是否防火墙已经关闭或者是否防火墙有开放服务的端口。
第一种:nginx.conf的nginx.pid被注释掉了
解决方案:将pid改成正确的路径并取消注释
第二种:没有指定配置目录
解决方案:
sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
当设置了多个location时,要注意location之间的优先级顺序,否则就会很容易出现访问错误的问题。
相信看到这里的你,已经掌握了Nginx这门技术。希望你通过这个教程的学习,能够有所收获。如果还有不理解的地方,欢迎在评论区留下评论,也可以私信博主与博主进行技术层面的交流~
那么,此次的深入浅出Nginx系列的教学到此结束~