📑本篇内容:Nginx 入门到实战案例 配置反向代理、负载均衡、动静分离以及对Nginx高可用的服务器集群
📘 文章专栏:前端知识(后端需掌握知识点)
前后端分离项目(Vue + SpringBoot)
🎬最近更新:2022年2月3日 JWT 工作原理及其应用 从0
0.5 快速整合SpringBoot以及Mybatis 二刷绝对适合你🙊个人简介:一只二本院校在读的大三程序猿,本着注重基础,打卡算法,分享技术作为个人的经验总结性的博文博主,虽然可能有时会犯懒,但是还是会坚持下去的,如果你很喜欢博文的话,建议看下面一行~(疯狂暗示QwQ)
🌇点赞 👍 收藏 ⭐留言 📝 一键三连 关爱程序猿,从你我做起
📖本文目录
📑Nginx 入门到实战案例
学习参考文献
官方学习文档:nginx 文档
强烈推荐的视频教学:尚硅谷Nginx教程由浅入深(一套打通丨初学者也可掌握)_哔哩哔哩_bilibili
🚀1、Nginx的基本概念
🎉1、什么是Nginx
什么是nginx?它能干什么?
官网给出了很好地解释:The Architecture of Open Source Applications (Volume 2): nginx (aosabook.org)
通俗的理解就是:Nginx是一个
专注于高性能
、
高并发
、
占用内存少
的免费
开源Web服务器
。他同时具备了其他的一部分功能,如
负载均衡
,
缓存
,
访问
以及
网络带宽控制
等能力。
🎉2、反向代理
说道反向代理之前我们需要先知道:什么是正向代理?
**正向代理:客户通过配置代理服务器,
通过代理服务器进行访问
自己无法直接访问的服务器网页。**
**反向代理:我们只需要将请求
发送到反向代理服务器
,由反向代理服务器去
选择目标服务器获取数据后
,再返回给用户,此时
反向代理
服务器和目标服务器
对外就是一个服务器
,
暴露
的是
代理服务器的地址
,
隐藏了实际访问服务器的真实地址
。**
🎉3、负载均衡
**单个服务器
无法解决高并发的情况
,我们
可以通过增加服务器的数量
,然后
将请求分发到各个服务器上
,将原先请求
集中到单个服务器上
的
情况
改为
将请求分发到多个服务器
上,将
负载分担到不同的服务器
上,这就是
负载均衡
。**
🎉4、动静分离
**动静分离:其目的是
为了加快网站的解析速度
,将
动态页面和静态页面
资源交由给
不同的资源服务器进行托管
,加快
解析速度的同时
,
降低了原来单个服务器的压力
。**
🚀2、Nginx的安装使用及配置原理
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
🎨0、启动时可能出现的错误
当我们用配置文件进行测试时可能会出现如下错误端口被占用
[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
🎨1、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 thenexit#用于查看版本以及配置
-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
🎨2、Nginx配置文件
Nginx配置文件所处位置
我们刚才通过命令
nginx -h
知道了Nginx服务器默认的配置文件位置在
set configuration file(default: /etc/nginx/nginx.conf)
- 通过命令进入指定文件夹,查看配置文件:
cd /etc/nginx
- 通过命令
vim nginx.conf
对其查看以及进行配置
✨1、Nginx配置文件组成✨
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块
作用:**
events
** 块涉及的指令主要就是
影响 Nginx 服务器与用户的网络连接
。
# 支持最大的用户连接数
worker_connections 1024;
🎗第三部分——http块
- ** 第三部分:**
http块
**
最重要的配置文件部分!!!
**
注意
:http块可以包括http全局块
、server块
HTTP块:
作用
: 主要用于文件的引入
、MIME-TYPE定义
、日志自定义
、连接超时时间
、单链接请求数上限
等。
# 包含了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 500502503504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;}
🚀3、Nginx常用配置实例1——反向代理✨
之前已经讲过了
反向代理的基本原理
:我们现在所需要实现一个反向代理的配置案例:如我们正常通过访问域名,
域名接受之后会交给Nginx反向代理服务器
,服务器将
请求转发到目的的代理服务器
,用户
不知道自己真实访问到的服务器端口
,这里用Tomcat进行演示。
🎗1、简单的反向代理实现
项目需求:通过访问装有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
随后进入客户端浏览器进行测试
注意:对应请求转发的服务器地址必须将其访问的端口对外开放才可以访问哦~
✨2、反向代理根据路由切换反向代理至其他服务器端口✨
项目需求:通过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
老样子进行测试即可看到对应的模块首页了,这里不再进行演示了。
重要的事情说三遍!!!一定不要忘记开启放行端口不然无法进行访问。
🚀4、Nginx常用配置实例2——负载均衡✨
上述提过了
负载均衡的概念
了,为了
解决单个节点压力过大
,而采取的加快相应措施的改进方法,将
请求负载分配给每台服务器上
。
对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
进行业务处理。
✨1、常见的分配策略✨
轮询(default)
:每个请求按照时间顺序逐一分配到不同的后端服务器
,如果后端服务器down
掉,能自动剔除
。权重分配(weight)
:weight 代表权,重默认为1,权重所占比例越高
,分配的负载所需分担的就越多
。 - 使用方式是在 server 配置的ip地址之后 加weight = 权重
ip_hash
:每个请求按照访问的ip地址的hash值进行分配
,这样每个访客一个后端服务器,可以解决Session的问题
。一般都用JWT来解决了~- 使用方式是在upstream配置中的第一行写好
ip_hash
即可。 fair(响应优先策略)
:通常采用这种,按照后端服务器响应时间快慢
来进行分配请求,响应时间短的优先分配策略
。 - 使用方式在upstream配置末尾
中添加fair
即可
🚀5、Nginx常用配置实例3——动静分离✨
在服务器的根目录配置好相应的静态资源数据库
随后到nginx配置文件中进行配置动静分离
配置文件
# 创建一个用于配置动静分离的配置文件vim /etc/nginx/conf.d/dynamicAndStatic.conf
配置内容
server {
listen 80;
server_name localhost;
location /www/ {
root /resources/;}
location /images/ {
root /resources/;
autoindex on;# 开启文件夹显示}}
进行动静分离测试
🚀6、Nginx配置高可用集群✨
🎗1、什么是Nginx高可用?
1、需要同时拥有两台Nginx服务器
2、需要keepalived用于监控Nginx主机是否宕机,是否启用从机
3、需要构建一个虚拟ip地址
小付这里是之前购买了三个个服务器用于测试集群搭建
已经为两个服务器都已经安装好了Nginx了同时也要安装好keepalived,
另外一台服务器用于当业务模块服务器
如果没有购买服务器可以通过构建两个虚拟机进行测试 也是一样的
安装keepalived
[root@Alascanfu nginx]# yum install keepalived
如图所示安装成功即可!
安装成功之后,会在etc里面生成目录keepalived,有文件keepalived.conf
🎗2、了解修改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
chmod777 nginx_check.sh
#!/bin/bashA=`ps -C nginx --no-header |wc -l`if[$A -eq 0]thenecho'nginx server is died'sudokillall keepalived
fi
🚀7、Nginx工作原理
✨master和worker✨
当我们的Nginx服务启动后,其进程就有如下两个与之相关的进程了。
[root@Alascanfu ~]# ps -ef |grep nginx
官网给出的图
一个Master对应多个Worker
每个Woker是独立的进程
,如果有其中的Worker出现了问题的话,其它的Worker都是独立的,
继续进行争抢
,
实现请求过程
,
不会造成服务中断
。
在配置文件中都已经默认设置好了自动设置Worker进程的数量,
通常来说Worker进程的数量等于服务器的cpu数量最为合适
。
当我们发送请求时,占用的连接数?
当用户发出请求,
Worker进行争抢接受
,Worker可能
会去Nginx服务器中的静态资源
访问
直接返回
给用户一来一回就是
两个连接数
,但是如果用户请求动态加载的页面
需要Nginx服务器进行反向代理
,那么
就会出现四个连接数
。
🙊总结
花了两天时间再次整理了Nginx服务器的相关基础知识,也对自己的服务器进行了手动配置Nginx的服务器配置实现了反向代理,负载均衡,动静分离等相关的配置,也拿着自己的服务器
配置了一下高可用的Nginx集群
,依靠
keepalived+Nginx
构建的
高可用集群
,
二刷之后收获还是相比于第一次更大
。希望如果有空的崽崽们
也能手动配置
,冲冲冲~!
版权归原作者 猿小付 所有, 如有侵权,请联系我们删除。