本篇内容:Nginx 入门到实战案例 配置反向代理、负载均衡、动静分离以及对Nginx高可用的服务器集群
文章专栏:前端知识(后端需掌握知识点)
前后端分离项目(Vue + SpringBoot)
最近更新:2022年2月3日 JWT 工作原理及其应用 从0~0.5 快速整合SpringBoot以及Mybatis 二刷绝对适合你~
个人简介:一只二本院校在读的大三程序猿,本着注重基础,打卡算法,分享技术作为个人的经验总结性的博文博主,虽然可能有时会犯懒,但是还是会坚持下去的,如果你很喜欢博文的话,建议看下面一行~(疯狂暗示QwQ)
点赞 收藏 ⭐留言 一键三连 关爱程序猿,从你我做起
学习参考文献
官方学习文档:nginx 文档
强烈推荐的视频教学:尚硅谷Nginx教程由浅入深(一套打通丨初学者也可掌握)_哔哩哔哩_bilibili
什么是nginx?它能干什么?
官网给出了很好地解释:The Architecture of Open Source Applications (Volume 2): nginx (aosabook.org)
通俗的理解就是:Nginx是一个专注于高性能
、高并发
、占用内存少
的免费开源Web服务器
。他同时具备了其他的一部分功能,如负载均衡
,缓存
,访问
以及网络带宽控制
等能力。
说道反向代理之前我们需要先知道:什么是正向代理?
正向代理:客户通过配置代理服务器,通过代理服务器进行访问
自己无法直接访问的服务器网页。
反向代理:我们只需要将请求发送到反向代理服务器
,由反向代理服务器去选择目标服务器获取数据后
,再返回给用户,此时反向代理
服务器和目标服务器对外就是一个服务器
,暴露
的是代理服务器的地址
,隐藏了实际访问服务器的真实地址
。
单个服务器无法解决高并发的情况
,我们可以通过增加服务器的数量
,然后将请求分发到各个服务器上
,将原先请求集中到单个服务器上
的情况
改为将请求分发到多个服务器
上,将负载分担到不同的服务器
上,这就是负载均衡
。
动静分离:其目的是为了加快网站的解析速度
,将动态页面和静态页面
资源交由给不同的资源服务器进行托管
,加快解析速度的同时
,降低了原来单个服务器的压力
。
Linux 系统下 安装 Nginx
安装包的下载地址
官方下载:nginx: Linux packages
官方的安装文档写的非常详细,跟着他的步骤来就是了
。
步骤1:安装必备的组件
[root@Alascanfu ~]# sudo yum install yum-utils
步骤2:设置yum存储库,创建一个nginx.repo的文件
1、创建指定的仓库文件
vim /etc/yum.repos.d/nginx.repo
2、进行仓库文件的配置
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
步骤3:进行安装Nginx
1、安装需要的组件
[root@Alascanfu ~]# yum install gcc zlib zlib-devel pcre-devel openssl openssl-devel
2、安装nginx
sudo yum install nginx
注意:
第一个注意点
:安装期间可能会提示您去接受GPG密钥,按Y一路操作到底接受就好了~第二个注意点
:博主使用的是阿里云的服务器第一次使用的时候建议将/etc/nginx/nginx.conf下的user配置改为nobody进行学习,后续会讲到单独配置。步骤4:安装成功配置后,进行启动nginx服务器
[root@Alascanfu nginx]# systemctl start nginx
步骤5:打开浏览器进行测试
通过你的ip地址进行访问哦~
注意事项:因为访问对应ip的端口为默认的端口80
,所以防火墙需要对80端口的请求放行
,所以需要对防火墙进行设置,小付这里是购买的云服务器直接在阿里云中设置防火墙拦截打开即可
。
查看防火墙的配置等指令
firewall-cmd --list-all
可见防火墙放行的端口如图所示。
添加防火墙放行端口
[root@Alascanfu ~]# firewall-cmd --add-port=9090/tcp --permanent
success
重启防火墙
[root@iZtwohfxym2lzeZ ~]# firewall-cmd --reload
success
当我们用配置文件进行测试时可能会出现如下错误端口被占用
[root@Alascanfu nginx]# nginx -c ./nginx.conf
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
解决方法:找到nginx对应的进程号 然后干掉这俩进程号就好了
[root@Alascanfu nginx]# ps -A | grep nginx
5137 ? 00:00:00 nginx
5138 ? 00:00:00 nginx
[root@Alascanfu nginx]# kill -9 5137
[root@Alascanfu nginx]# kill -9 5138
[root@Alascanfu nginx]# systemctl start nginx
查看Nginx的版本号
[root@Alascanfu ~]# nginx -v
nginx version: nginx/1.21.6
查看Nginx可以进行的操作
[root@iZtwohfxym2lzeZ ~]# nginx -h
nginx version: nginx/1.21.6
Usage: nginx [-?hvVtTq] [-s signal] [-p prefix]
[-e filename] [-c filename] [-g directives]
Options:
-?,-h : this help # 用于查看关于nginx命令的帮助
-v : show version and exit # 用于查看版本号
-V : show version and configure options then exit #用于查看版本以及配置
-t : test configuration and exit
-T : test configuration, dump it and exit
-q : suppress non-error messages during configuration testing
-s signal : send signal to a master process: stop, quit, reopen, reload #用于Nginx服务器的停止、暂停、重启等操作
-p prefix : set prefix path (default: /etc/nginx/)
-e filename : set error log file (default: /var/log/nginx/error.log)
-c filename : set configuration file (default: /etc/nginx/nginx.conf)
-g directives : set global directives out of configuration file
启动Nginx服务器
[root@Alascanfu ~]# systemctl start nginx
开机自动启动Nginx服务器
[root@Alascanfu ~]# systemctl enable nginx
关闭Nginx进程
[root@Alascanfu ~]#nginx -s stop
对Nginx进行测试
[root@Alascanfu html]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重新加载Nginx配置文件
[root@Alascanfu html]# nginx -s reload
查看Nginx进程
[root@Alascanfu html]# ps -ef |grep nginx
Nginx配置文件所处位置
我们刚才通过命令 nginx -h
知道了Nginx服务器默认的配置文件位置在
set configuration file (default: /etc/nginx/nginx.conf)
cd /etc/nginx
vim nginx.conf
对其查看以及进行配置Nginx 配置文件分为 三 部分
全局块
作用:从配置文件开头到 events 块之前
的内容,这块区域主要设置的是一些影响Nginx服务器整体运行的配置指令
。
# 设置运行 用户 和 权限用户组 nobody是伪用户 默认是nginx
user nobody;
# 这个是Nginx服务器并发处理服务的关键配置,worker_processes值越大,可以支持处理的并发量越多 会受到硬件、软件设备的影响
worker_processes auto;
# 这个是错误日志生成的日志目录
error_log /var/log/nginx/error.log notice;
# 运行进程的pid
pid /var/run/nginx.pid;
events块
作用:events
块涉及的指令主要就是影响 Nginx 服务器与用户的网络连接
。
# 支持最大的用户连接数
worker_connections 1024;
http块
最重要的配置文件部分!!!
注意
:http块可以包括http全局块
、server块
HTTP块:
# 包含了MIME-TYPE 定义
include /etc/nginx/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"';
access_log /var/log/nginx/access.log main;
# 开启文件发送
sendfile on;
# 这个是依赖于sendfile配置的,允许或禁止套接字选项 文件发送
tcp_nopush on;
# 连接超时时间
keepalive_timeout 65;
# 开启gzip压缩
gzip on;
# 扩展配置(虚拟主机配置文件)
include /etc/nginx/conf.d/*.conf;
server块:
注意
:server块也分为全局server块和多个location块全局server块作用:多数配置的是当前Nginx服务的监听配置和虚拟主机的名称或者ip地址
。
location块作用:对实际地址访问页面
进行相对的配置
。
# 目前监听的端口号为80
listen 80;
# 主机名称
server_name localhost;
# 当请求/时进行配置访问的页面
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# 当请求发生重定向为服务器错误时进行配置访问的页面
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
之前已经讲过了反向代理的基本原理
:我们现在所需要实现一个反向代理的配置案例:如我们正常通过访问域名,域名接受之后会交给Nginx反向代理服务器
,服务器将请求转发到目的的代理服务器
,用户不知道自己真实访问到的服务器端口
,这里用Tomcat进行演示。
项目需求:通过访问装有Nginx服务器的地址将请求转发到到指定服务器的对应端口——这里用一台服务器进行演示,将请求转发到Tomcat首页即可。
进入到默认配置文件中进行配置
vim /etc/nginx/conf.d/default.conf
default.conf
在location中编写proxy_pass http://127.0.0.1:8080
即可通过反向代理到我们的Tomcat服务器上了。
保存之后进行测试
首先需要重启Nginx服务器
nginx -s reload
随后进入客户端浏览器进行测试
注意:对应请求转发的服务器地址必须将其访问的端口对外开放才可以访问哦~
项目需求:通过Nginx服务器反向代理,根据路由跳转到不同端口的服务中
为我们的新的反向代理创建一个配置文件,然后导入到我们的nginx.conf中去就可以了。
这里我们需要先了解一下location指令配置说明
:
# 如果我们访问到/user/路径则直接将请求转发到 http://127.0.0.1:8088地址上去
# 不同的服务业务模块是不同的可以分布到多个服务器上来进行访问
# 这个是user业务的模块
location ~ /user/ {
proxy_pass http://127.0.0.1:8088;
}
# 这个是emp业务的模块
location ~ /emp/ {
proxy_pass http://127.0.0.1:8089;
}
注意:不同服务器之间都必须要将对应的端口放行,否则无法将请求转发到指定的服务器中去。
vim newReverseProxy.conf
newReverseProxy.conf
server{
listen 9090;
server_name localhost;
location ~ /user/ {
proxy_pass http://127.0.0.1:8088;
}
location ~ /emp/ {
proxy_pass http://127.0.0.1:8089;
}
}
重新启动Nginx配置nginx -s reload
老样子进行测试即可看到对应的模块首页了,这里不再进行演示了。
重要的事情说三遍!!!一定不要忘记开启放行端口不然无法进行访问。
上述提过了负载均衡的概念
了,为了解决单个节点压力过大
,而采取的加快相应措施的改进方法,将请求负载分配给每台服务器上
。
对nginx.conf中的http块进行配置
http {
# ... 省略其它配置
# 配置分担负载的反向代理服务器的服务器集群
upstream myBalance {
server xxx.xxx.xx.xx1:3699;
server xxx.xxx.xx.xx2:3699;
server example.com:3699;
}
server {
listen 80;
# 分担myBalance分担集群组中的集群
location / {
proxy_pass http://myBalance;
}
}
# ... 省略其它配置
}
proxy_pass
: http://myBalance
将所有请求转发到myBalance
分担负载的服务器组当中的某一台服务器。upstream模块
:配置Nginx的反向代理的服务器组群,Nginx会根据配置,将请求分发给分担负载的组里的某一台服务器。myBalance是分担负载服务器组的名称。upstream模块
下的server指令
:配置处理请求的服务器IP或域名
,端口可选,不配置默认使用80端口。依次交付请求。配置完成后我们重新启动配置进行测试.
我们通过访问的请求会平均分配到指定的分担负载的服务器集群当中,比如当两个用户同时访问了 当前服务器的域名解析后的ip地址,会将一名用户的请求转发到
xxx.xxx.xx.xx1:3699
进行业务处理,而另一名用户的请求就会转发到xxx.xxx.xx.xx2:3699
进行业务处理。
轮询(default)
:每个请求按照时间顺序逐一分配到不同的后端服务器
,如果后端服务器down
掉,能自动剔除
。权重分配(weight)
:weight 代表权,重默认为1,权重所占比例越高
,分配的负载所需分担的就越多
。
weight = 权重
ip_hash
:每个请求按照访问的ip地址的hash值进行分配
,这样每个访客一个后端服务器,可以解决Session的问题
。一般都用JWT来解决了~ip_hash
即可。fair(响应优先策略)
:通常采用这种,按照后端服务器响应时间快慢
来进行分配请求,响应时间短的优先分配策略
。
upstream配置末尾
中添加 fair
即可在服务器的根目录配置好相应的静态资源数据库
随后到nginx配置文件中进行配置动静分离
配置文件
# 创建一个用于配置动静分离的配置文件
vim /etc/nginx/conf.d/dynamicAndStatic.conf
配置内容
server {
listen 80;
server_name localhost;
location /www/ {
root /resources/;
}
location /images/ {
root /resources/;
autoindex on; # 开启文件夹显示
}
}
进行动静分离测试
1、需要同时拥有两台Nginx服务器
2、需要keepalived用于监控Nginx主机是否宕机,是否启用从机
3、需要构建一个虚拟ip地址
小付这里是之前购买了三个个服务器用于测试集群搭建
已经为两个服务器都已经安装好了Nginx了同时也要安装好keepalived,
另外一台服务器用于当业务模块服务器
如果没有购买服务器可以通过构建两个虚拟机进行测试 也是一样的
安装keepalived
[root@Alascanfu nginx]# yum install keepalived
如图所示安装成功即可!
安装成功之后,会在etc里面生成目录keepalived,有文件keepalived.conf
! Configuration File for keepalived
#全局配置
global_defs {
#一个没有重复的名字即可 一般填写ip地址
router_id server_master
}
# 配置自检脚本
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
# 此处不设置为MASTER,MASTER代表主服务器 BACKUP代表从服务器
state MASTER
# 网卡名字
interface eth0
# 主从的virtual_router_id必须一致
virtual_router_id 51
# 权重,master要大于slave
priority 100
# 主从通讯间隔
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
#虚拟ip地址
virtual_ipaddress {
192.168.11.188
}
}
详细配置参阅大佬的这篇文章:
公网与内网配置高可用Nginx服务器
注意1
:通过路由创建出来的公网IP
也必须是注册在互联网上服务器的唯一可用IP地址
。
注意2
:绝对不能使用外网网卡中唯一的真正的公网IP来作为vip
,不然当vip切换的时候,外网网卡中唯一的真正 的公网IP就会变会被注册到别的机器上
,那么便无法访问原主机了。因此只能使用通过路由创建出来的公网IP来作为vip
。
检测脚本的创建
vim /home/data/nginx_check.sh
cd /home/data
chmod 777 nginx_check.sh
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ]
then
echo 'nginx server is died'
sudo killall keepalived
fi
当我们的Nginx服务启动后,其进程就有如下两个与之相关的进程了。
[root@Alascanfu ~]# ps -ef |grep nginx
官网给出的图
一个Master对应多个Worker
每个Woker是独立的进程
,如果有其中的Worker出现了问题的话,其它的Worker都是独立的,继续进行争抢
,实现请求过程
,不会造成服务中断
。
在配置文件中都已经默认设置好了自动设置Worker进程的数量,通常来说Worker进程的数量等于服务器的cpu数量最为合适
。
当我们发送请求时,占用的连接数?
当用户发出请求,Worker进行争抢接受
,Worker可能会去Nginx服务器中的静态资源
访问直接返回
给用户一来一回就是两个连接数
,但是如果用户请求动态加载的页面需要Nginx服务器进行反向代理
,那么就会出现四个连接数
。
花了两天时间再次整理了Nginx服务器的相关基础知识,也对自己的服务器进行了手动配置Nginx的服务器配置实现了反向代理,负载均衡,动静分离等相关的配置,也拿着自己的服务器配置了一下高可用的Nginx集群
,依靠keepalived+Nginx
构建的高可用集群
,二刷之后收获还是相比于第一次更大
。希望如果有空的崽崽们也能手动配置
,冲冲冲~!