Nginx使用场景&&Nginx基础&&Nginx的负载均衡策略&&Nginx配置文件&&Nginx+Tomcat集群示例&&Nginx部署静态网站&&根据Tomcat容器实际IP修改Nginx配置

目录

1. Nginx使用场景

2. Nginx中的进程

2.1 Nginx中的多进程模型

2.2 多进程模式的优点:

2.3 缓存

3. Ngnix的负载均衡策略

3.1 轮询法

3.2 加权轮询

3.3 原地址哈希

3.4 最小连接数法

3.5 Fair

3.6 url_hash

3. Nginx配置文件

4. Nginx+tomcat 集群示例

4.1 下载镜像

4.2 在宿主机中创建需要挂载的目录

4.3 常见测试用的index.html

4.4 创建Nginx配置文件

4.5 启动3个tomcat容器准备集群

4.6 根据tomcat容器实际IP修改Nginx配置文件

4.7 启动Nginx容器

4.8 测试集群

5. Nginx部署静态网站

5.1 准备前端应用

5.2 创建构建目录

5.3 构建镜像

5.4 运行容器


1. Nginx使用场景

Nginx的主要使用场景:

  • HTTP服务器
    Nginx可以作为静态服资源服务器来使用,例如在前后端分离的架构中可以将前端应用部署在Nginx服务器中。也可作为上传服务器、图片服务器等使用
  • 作为反向代理
    Nginx可以作为反向代理,将来自互联网的外部请求转发到内网中应用服务器。通过反向代理可以实现负载均衡。
    Nginx内置了丰富的负载均衡算法:轮询,基于权重,ip_hash等,通过第三方支持,还有fair(响应时间短的优先分配),url_hash等。

2. Nginx中的进程

2.1 Nginx中的多进程模型

Nginx的具有很高的性能,有庞大的使用群体,这与它的基本架构有紧密关系。
在Nginx运行时后台包括一个master主进程和多个worker进程。Nginx也可以支持多线程方式工作,但模式使用多进程,也是主流的使用方式。

  • master进程
    主进程主要进行Nginx配置文件解析,数据结构初始化,模块注册配置,信号处理,网络监听,工作进程生成和管理等工作。监控worker进程的状态,在worker进程异常退出后可以自动重新启动进程。

  • worker进程
    多个worker进程之间是对等的关系,竞争去处理客户的请求,一个请求只有一个worker去处理。worker进程数量一般与机器cpu数量相当。每个worker都是单线程的,采用异步非阻塞方式处理请求。是Nginx服务器提供服务的主体。

当一个请求进来时,多个worker会竞争处理这个请求,但有且只有一个worker可以获取到该请求的处理权限。

2.2 多进程模式的优点:

每个worker进程是互相独立的,互相不影响,一个进程的退出不影响其他的进程服务。每个worker进程使用异步非阻塞方式来处理请求,具有很高的性能。

2.3 缓存

Nginx服务器为提供请求的处理效率,减轻网络压力,采用缓存机制。缓存机制将历史应答的数据缓存到本地,并且在Nginx启动后会启动一个专门的后台进程对本地缓存内容建立维护索引,以此来加快缓存文件的访问。

所以Nginx的后台进程出master进程,worker进程以外,还有后端服务进程。

3. Ngnix的负载均衡策略

Nginx中支持多种负载均衡策略,在不同的使用场景中我们可以选择合适的负载均衡策略

3.1 轮询法

将请求轮流分配到注册的后端服务器中,平等的对待所用的后端服务器,不关心服务器的实际连接数就负载情况。比较适合后端服务器的配置都差不多的情况。例如如下配置:

upstream server {
    server 192.160.0.123:8080;
    server 192.160.0.124:8080;
    server 192.160.0.125:8080;
}

3.2 加权轮询

可以为每个武器配置一个权重值,权重值越大将会有机会分担更多的请求,该配置方式比价适合集群中各个服务器配置不均衡的情况,对高的服务器可以配置大一些的权重,对配置低的机器可以配置小一些的权重。

upstream server {
    server 192.160.0.123:8080 weight=4;
    server 192.160.0.124:8080 weight=2;
    server 192.160.0.125:8080 weight=1;
}

3.3 原地址哈希

根据获取客户端的IP地址,通过哈希函数计算得到一个数值,用该数值对服务器的大小进行取模计算,得到的结果作为客户端要访问的服务器的序号。

特点:这种方式可以保证来自同一ip的请求被打的固定机器上,可以解决session问题。

示例:

upstream server {
    ip_hash;
    server 192.160.0.123:8080 weight=1;
    server 192.160.0.124:8080 weight=2;
    server 192.160.0.125:8080 weight=1;
}

3.4 最小连接数法

该算法根据后端服务器当前的连接情况,动态的选取其中当前堆积的连接数最少的一台服务器来处理请求,以便于提高服务的利用率。

这种算法比较适合后端各个服务器配置不同的情况。

示例:

upstream server {
    least_conn;
    server 192.160.0.123:8080 weight=1;
    server 192.160.0.124:8080 weight=2;
    server 192.160.0.125:8080 weight=1;
}

3.5 Fair

Fair负载均衡比基于权重,和ip_hash算法更加智能,可以根据后端服务器的响应时间来分配请求,响应时间短优先分配。
该算法由第三方提供,需要安装upstream_fair模块。

示例:

upstream server {
    fair;
    server 192.160.0.123:8080 weight=1;
    server 192.160.0.124:8080 weight=2;
    server 192.160.0.125:8080 weight=1;
}

3.6 url_hash

与ip_hash比较接近,该算法根据url的哈希结果来分配请求,使每个url定向到一台后端服务器上。

该算法为第三方提供,使用时需要先安装Nginx的hash软件包

upstream server {
    hash $request_uri;
    server 192.160.0.123:8080 weight=1;
    server 192.160.0.124:8080 weight=2;
    server 192.160.0.125:8080 weight=1;
}

3. Nginx配置文件

Nginx配置文件主要有4部分:

  • main(全局配置)
    Main部分的设置影响其他所有部分的设置
  • server(主机配置)
    主要用于指定虚拟机主机域名,ip和端口等内容
  • upstream(上游服务器配置,用于反向代理,负载均衡)
    用于设置一系列的后端服务器,设置反向代理及后端服务器的负载均衡
  • location(url匹配特定位置的配置)
    用于匹配网页位置(如,跟目录“/”,”/images”等)

nginx配置文件示例:

#指定用户和用户组,不指定默认为nobody
user  nginx;

#工作进程数,根据机器情况设置
worker_processes  1;

#日志设置
error_log  /var/log/nginx/error.log warn;

#pid文件
pid        /var/run/nginx.pid;

events {
	#配置事件驱动模型,其他还要select,poll,kqueue等
	use epoll;
	#配置每个worker最大连接数
    worker_connections  1024;
}

http {
    #引入其他配置文件,在nginx服务器中有/etc/nginx/mime.types
	#当nginx收到静态请求时,在请求文件的类型在mime.types中匹配mime type
	#这些mime type数据告诉浏览器文件数据的类型,以便于更好的展示数。
    include       /etc/nginx/mime.types;
	
	#默认为二进制数据流
    default_type  application/octet-stream;

	#定义日志格式,$remote_addr,$remote_user等是nginx中的预定义变量
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" "$upstream_addr"';
	#配置日志
    access_log  /var/log/nginx/access.log  main;

    #使用sendfile系统调用来提高性能
    sendfile        on;
    #tcp_nopush     on;

	#指定 KeepAlive 的超时时间(timeout)
	#keepalive模式告诉web服务器在处理完一个请求后保存这个tcp连接,
	#如果在规定的超时时间内接收到客户端的其他请求,服务端会利用这个未关闭
	#的连接,而不需在重新创建连接
	keepalive_timeout 60s;
	
	#是否开启gzip压缩功能
    #gzip  on;

    upstream tomcat {
        server 172.17.0.2:8080;
        server 172.17.0.3:8080;
    }

    server {
        listen 80;
        server_name localhost;

		#location部分,通过指定模式与客户端请求uri进行匹配。
        #基本语法如下:location [=|~|~*|^~|@] pattern{……}
        #1.没有修饰符 表示必须以指定模式开始。例如:location /abc
        #2.=表示:必须与指定的模式精确匹配。例如:location = /abc
        #3.~表示:指定的正则表达式要区分大小写。例如:location ~ ^/abc$
        #4.~*表示:指定的正则表达式不区分大小写。例如:location ~* ^/abc$
        #5.^~ 类似于无修饰符的行为,也是以指定模式开始,不同的是,如果模式匹配,那么就停止搜索其他模式了
        #正则表达式示例:location ~* \.(gif|jpg|jpeg)$ 匹配任何以gif, jpg, or jpeg结尾的文件
		
		#通用匹配,任何请求都匹配到
        location / {
			#配置转发
			#tomcat为上面upstream部分的定义
            proxy_pass http://tomcat;
			
			#其作用是对发送给客户端的URL进行修改
            proxy_redirect off;
			
			#默认首页
            index index.html index.htm;
			
			#附加字段到请求头
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Real-Port $remote_port;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

		#静态资源配置
        location /static/ {
			#访问/static/目录中的文件时,
			#nginx会到/usr/share/nginx/html/中查找文件
            alias /usr/share/nginx/html/;
        }
    }

    include /etc/nginx/conf.d/*.conf;
}

4. Nginx+tomcat 集群示例

本示例通过使用docker容器搭建Nginx + tomcat集群,来演示使用Nginx实现负载均衡的例子。

4.1 下载镜像

root@ubuntu:/# docker pull nginx
root@ubuntu:/# docker pull tomcat

4.2 在宿主机中创建需要挂载的目录

1)在宿主机上

  • 创建用于存放nginx配置文件,及日志的目录,
  • tomcat的部署目录,及日志目录。

这些目录在稍后创建容器时会被挂载到容器中,这种方式可以很方便的通过修改宿主机中文件来改变容器中对应文件的目的。

root@ubuntu:/# mkdir -p /opt/nginx/conf/ /opt/nginx/www /opt/nginx/logs

root@ubuntu:/# mkdir -p /opt/tomcat/webapps/ROOT /opt/tomcat/conf /opt/tomcat/logs

4.3 常见测试用的index.html

在宿主机/opt/tomcat/webapps/ROOT目录下创建一个用于测试的html文件。

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8"/>
	<title>Nginx+tomcat集群</title>
</head>
<body>
	<h1>Nginx+tomcat集群部署示例</h1>
</body>
<html>

4.4 创建Nginx配置文件

在/opt/nginx/conf目录下创建nginx.conf配置文件, 具体内容请见shang“3. nginx配置文件示例”部分

4.5 启动3个tomcat容器准备集群

root@ubuntu:/# docker run -d --name tomcat1 -v /opt/tomcat/webapps:/usr/local/tomcat/webapps tomcat

root@ubuntu:/# docker run -d --name tomcat2 -v /opt/tomcat/webapps:/usr/local/tomcat/webapps tomcat

root@ubuntu:/# docker run -d --name tomcat3 -v /opt/tomcat/webapps:/usr/local/tomcat/webapps, tomcat

注意:必须将容器的挂载目录设置为:/usr/local/tomcat/webapps,因为在tomcat镜像中将目录设置为工作目录,可以通过:docker inspect tomcat 查看容器的详细信息进行验证。

获取三个tomcat容器的ip地址:

root@ubuntu:/# docker inspect tomcat1 | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
                    "IPAddress": "172.17.0.2",
root@ubuntu:/# docker inspect tomcat2 | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.3",
                    "IPAddress": "172.17.0.3",
root@ubuntu:/# docker inspect tomcat3 | grep Address
            "LinkLocalIPv6Address": "",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "GlobalIPv6Address": "",
            "IPAddress": "172.17.0.4",
            "MacAddress": "02:42:ac:11:00:04",
                    "IPAddress": "172.17.0.4",
                    "GlobalIPv6Address": "",
                    "MacAddress": "02:42:ac:11:00:04",

tomcat1, tomcat2, tomcat3 的ip地址分别为 : 172.17.0.2, 172.17.0.3,172.17.0.4

4.6 根据tomcat容器实际IP修改Nginx配置文件

4.7 启动Nginx容器

docker run -d -p 80:80 --name nginx -v /opt/nginx/www:/usr/share/nginx/html -v /opt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /opt/nginx/logs:/var/log/nginx nginx

4.8 测试集群

Nginx容器正常启动后,访问:http://192.168.62.133/,如果能出现测试页面,则说明集群正常。如下图:

5. Nginx部署静态网站

本示例基于Docker容器在Nginx中部署一个前端网站。现在项目越来越流行前后端分离的开发方式,而Nginx是目前流行的高性能的web服务器,我们可以将前端应用部署在Nginx中。

5.1 准备前端应用

准备一个用于部署的前端应用,为方便演示课件提供一个用于测试的前端应用(\docker+ngnix+vue\dist)。

5.2 创建构建目录

创建一个构建目录,如“docker+ngnix+vue”,并将用于发布的前端应用放入构建目录。然后创建Dockerfile文件。

Dockerfile文件如下:

FROM nginx:1.17.9
MAINTAINER lisen "lisensir@qq.com"

#/usr/share/nginx/html
COPY dist/ /usr/share/nginx/html/

本Dockerfile非常简单:

  • 指定基础镜像为 nginx1.17.9
  • 指定维护者信息
  • 将构建目录下的dist目录拷入到 容器的/usr/share/nginx/html/目录下,该目录是静态文件默认放置目录

5.3 构建镜像

将构建目录上传到linux中,然后在linux中进行构建目录,执行构建即可(docker build -t 镜像名称)

root@ubuntu:/home/lisen/docker+ngnix+vue# docker build -t nginx-vue .

5.4 运行容器

在镜像构建完成后,通过进行运行一个容器即可

root@ubuntu:/# docker run -p 80:80 -d --name nginxvue nginx-vue

容器启动后即可访问:http://192.168.62.133

至此部署完成。

  • 37
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于ssm+shiro+redis+nginx tomcat服务器集群管理项目源码+项目说明.zip Introduction ==== 1.搭建一个最简洁,模块划分最明确的ssm+swargger+shiro+redis+nginx整合项目,采用maven作为构建工具,在有新项目开发时可以借助此demo快速构建项目<br/> 2.实现shiro的授权信息缓存到redis数据库,减少关系数据库访问压力<br/> 3.实现session共享到redis,实现多服务器集群方案<br/> 4.配置文档中包含丰富的注释,搭建思路清晰的ssm项目框架<br/> 5.项目中的所有细节都会按照企业级开发的标准,展示如何遵循代码规范以及类文件doc注释的编写。<br/> 6.采用RESTFul的controller接口,展示RESTFul风格的API编写(shiro基于url的权限拦截与RESTFul API兼容性不好,后期可能会改写shiro以匹配RESTFul)<br/> 7.Junit单元测试,展示如何正确的使用Junit单元测试验证自己接口代码的健壮性<br/> 涉及到的技术 ==== springmvc+spring+mybatis:轻量级敏捷开发框架<br/> swargger:快速构建RestFul接口测试页面<br/> shiro:Apache开源权限管理框架,包括登录验证,授权,加密,会话管理<br/> redis:Nosql数据库,搭配shiro的会话管理功能将session存入redis中,实现tomcat多服务器集群的session共享<br/> nginx:反向代理服务器,用来调度多台tomcat<br/> h2:内存数据库,用于测试<br/> 开发环境 ==== jdk1.8+mysql5.7.22+tomcat8.5.32+IDEA<br/> 项目部署 ==== 第一次部署项目<br/> 1.修改ssm-rs\resources目录下db.properties的数据库账号密码信息<br/> 2.启动redis服务端,修改ssm-rs\resources\spring-config目录下spring-shiro.xml中redis的连接信息,没设置密码的话auth留空<br/> 2.创建数据库train_db并执行根目录下的train_db.sql数据库脚本<br/> 3.进入到ssm-build目录下,执行clean install -Dmaven.test.skip=true,对整个项目进行构建<br/> 4.启动ssm-rs项目,浏览器访问http://localhost/ssm-rs/swagger-ui.html<br/> 项目模块 ==== ssm-build <br/> 项目聚合模块,可以进入该项目目录,对整个项目进行构建。<br/> mvn clean install -Dmaven.test.skip=true <br/> ssm-parent<br/> 父模块,其他模块会继承该模块,引入公共的依赖<br/> ssm-model<br/> 模型层模块,提供各种POJO。包括与数据库表对应的模型、传输模型等。提供给service层(ssm-cs)、controller层(ssm-rs)。<br/> ssm-commons<br/> 包含各种工具类<br/> ssm-cs<br/> service层和dao层,提供具体的业务逻辑和数据库访问,需要依赖ssm-model模块,并提供出来给ssm-rs模块调用<br/> ssm-rs<br/> controller层,提供RESTFul接口。<br/>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瑶大头*^_^*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值