欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

Nginx入门到实战案例配置反向代理、负载均衡、动静分离以及对Nginx高可用的服务器集群从0~0.5值得拥有

时间:2023-08-18

本篇内容:Nginx 入门到实战案例 配置反向代理、负载均衡、动静分离以及对Nginx高可用的服务器集群

 文章专栏:前端知识(后端需掌握知识点)

前后端分离项目(Vue + SpringBoot)

最近更新:2022年2月3日 JWT 工作原理及其应用 从0~0.5 快速整合SpringBoot以及Mybatis 二刷绝对适合你~

个人简介:一只二本院校在读的大三程序猿,本着注重基础,打卡算法,分享技术作为个人的经验总结性的博文博主,虽然可能有时会犯懒,但是还是会坚持下去的,如果你很喜欢博文的话,建议看下面一行~(疯狂暗示QwQ)

点赞  收藏 ⭐留言  一键三连 关爱程序猿,从你我做起

本文目录

Nginx 入门到实战案例

1、Nginx的基本概念

1、什么是Nginx2、反向代理3、负载均衡4、动静分离 2、Nginx的安装使用及配置原理

0、启动时可能出现的错误1、Nginx常用命令2、Nginx配置文件

✨1、Nginx配置文件组成✨

第一部分——全局块第二部分——events块第三部分——http块 3、Nginx常用配置实例1——反向代理✨

1、简单的反向代理实现✨2、反向代理根据路由切换反向代理至其他服务器端口✨ 4、Nginx常用配置实例2——负载均衡✨

✨1、常见的分配策略✨ 5、Nginx常用配置实例3——动静分离✨6、Nginx配置高可用集群✨

1、什么是Nginx高可用?2、了解修改keepalived.conf配置文件 7、Nginx工作原理

✨master和worker✨ 总结 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 repobaseurl=http://nginx.org/packages/centos/7/$basearch/gpgcheck=0enabled=1[nginx-mainline]name=nginx mainline repobaseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/gpgcheck=1enabled=1gpgkey=https://nginx.org/keys/nginx_signing.keymodule_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 --permanentsuccess

重启防火墙

[root@iZtwohfxym2lzeZ ~]# firewall-cmd --reloadsuccess

0、启动时可能出现的错误

当我们用配置文件进行测试时可能会出现如下错误端口被占用

[root@Alascanfu nginx]# nginx -c ./nginx.confnginx: [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 -vnginx version: nginx/1.21.6

查看Nginx可以进行的操作

[root@iZtwohfxym2lzeZ ~]# nginx -hnginx version: nginx/1.21.6Usage: 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 -tnginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: 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是伪用户 默认是nginxuser nobody;# 这个是Nginx服务器并发处理服务的关键配置,worker_processes值越大,可以支持处理的并发量越多 会受到硬件、软件设备的影响worker_processes auto;# 这个是错误日志生成的日志目录error_log /var/log/nginx/error.log notice;# 运行进程的pidpid /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块作用:对实际地址访问页面进行相对的配置。

# 目前监听的端口号为80listen 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;}

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 2weight 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.shcd /home/datachmod 777 nginx_check.sh #!/bin/bashA=`ps -C nginx --no-header |wc -l`if [ $A -eq 0 ]then echo 'nginx server is died' sudo killall keepalivedfi

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构建的高可用集群,二刷之后收获还是相比于第一次更大。希望如果有空的崽崽们也能手动配置,冲冲冲~!

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。