WHAT - Nginx 系列(二)

WHAT - Nginx 系列(一) 中我们介绍了什么是 Nginx,以及相关的基本使用。

今天我们主要介绍一些真实配置实例,包括常见的反向代理、负载均衡和动态分离。

一、反向代理(1):proxy_pass

1.1 预期效果

打开浏览器输入 www.test.com 跳转到 Linux 系统启动 Tomcat 主页面。具体图示:

请添加图片描述

1.2 准备工作

  1. 安装 Nginx
  2. 安装 Tomcat

1.3 步骤

  1. 根据Nginx官网安装
  2. 根据Tomcat官网安装并启动8080端口服务
  3. 配置Nginx反向代理

修改 nginx.conf:

http {
	server {
		listen 80;
		server_name 192.168.17.129;
		location / {
			proxy_pass http:127.0.0.1:8080;
		}
	}
}

保存修改后执行

nginx -s reload
  1. 主机修改host文件映射
192.168.17.129	wwww.test.com

如此,在浏览器输入 wwww.test.com 会映射到 192.168.17.129。192.168.17.129 监听后会反向代理到 http:127.0.0.1:8080,即 Tomcat 的页面。

二、反向代理(2):proxy_pass

2.1 预期效果

根据访问的路径跳转到不同端口的服务中,Nginx 监听端口设为 9001,访问 http://192.168.17.129:9001/a 跳转到远端服务器的 http://127.0.0.0.1:8080、访问 http://192.168.17.129:9001/b 跳转到远端服务器的 http://127.0.0.1:8081

具体图示:
请添加图片描述

2.2 准备工作

  1. 安装 Nginx
  2. 安装 Tomcat

2.3 步骤

  1. 根据Nginx官网安装
  2. 根据Tomcat官网安装并启动8080端口服务a,另外启动8081端口服务b。并分别添加两个测试页面a.html和b.html
  3. 配置Nginx负载均衡

修改 nginx.conf:

http {
	server {
		listen 9001;
		server_name 192.168.17.129;
		
		location ~ /a/ {
			proxy_pass http:127.0.0.1:8080;
		}
		location ~ /b/ {
			proxy_pass http:127.0.0.1:8081;
		}		
	}
}

保存修改后执行

nginx -s reload
  1. 浏览器输入不同url验证
  • http://192.168.17.129:9001/a/a.html
  • http://192.168.17.129:9001/b/b.html

2.4 拓展:location 指令说明

该指令用于匹配 URI。

语法如下:location [ = | ~ | ~* | ^~ ] uri {}

在配置时需要注意 location 的顺序,确保最具体的匹配出现在更靠前的位置。

  1. =

表示精确匹配,即用于不含正则表达式的 uri 前,要求请求字符串和 uri 严格匹配。

  1. ~

用于表示 uri 包含正则表达式,并且区分大小写。

  1. ~*

用于表示 uri 包含正则表达式,并且不区分大小写。

  1. ^~

表示精确匹配,即匹配成功后停止搜索其他的 location,而正则表达式会一直搜索所有匹配的模式。具体来说,如果一个请求字符串与 uri 完全匹配,那么 Nginx 将停止搜索其他location块,直接使用当前location块中的配置。

location ^~ /images/ {
	alias /path/to/images/;
	expires 30d;
	add_header Cache-Control "public, max-age=2592000";
}

在这个例子中,如果请求的 URI 以 /images/ 开头Nginx 将会匹配到这个 location,并且停止搜索其他 location,直接使用这个 location 中的配置。这种方式可以用于确保对某些特
定路径的请求采用精确匹配,而不受其他正则表达式的影响。

三、负载均衡:upstream

3.1 预期效果

打开浏览器多次输入 http://192.168.17.129:9001/a/a.html 代理服务器可以将请求平均分配到不同端口服务上,如此可以避免某个服务压力过大。

请添加图片描述

3.2 准备工作

  1. 安装 Nginx
  2. 安装 Tomcat

3.3 步骤

  1. 根据Nginx官网安装
  2. 根据Tomcat官网安装并启动8080端口服务a,另外启动8081端口服务b。并分别添加同一个测试页面a.html,只不过一个渲染 “8080”,一个渲染 “8081”
  3. 配置Nginx负载均衡

修改 nginx.conf:

http {
	upstream myserver {
		server 192.168.17.129:8080;
		server 192.168.17.129:8081;
	}
	server {
		listen 80;
		server_name 192.168.17.129;
		
		location / {
			proxy_pass http://myserver
		}
	}
}

保存修改后执行

nginx -s reload
  1. 在浏览器多次输入 http://192.168.17.129/a/a.html 进行验证

3.4 负载均衡策略

1. 轮询(默认)

  • 每个请求按时间顺序逐个分配到不同的服务器。
  • 若某个服务挂了,自动剔除。

2. 权重

权重默认为1,权重越高该服务被分配去处理请求概率越大。

upstream myserver {
	server 192.168.17.129:8080 weight=5;
	server 192.168.17.129:8081 weight=10;
}

下面的服务处理几率高一倍。

3. ip_hash

每个请求按访问 ip 的 hash 结果进行固定分配,即某个方可会固定访问某一个服务。

upstream myserver {
	ip_hash;
	server 192.168.17.129:8080;
	server 192.168.17.129:8081;
}

该策略的优势还在于可以解决 session 共享的问题。

4. fair

按后端服务器的响应时间来分配请求,响应时间短的会被优先被分配处理请求。

upstream myserver {
	server 192.168.17.129:8080;
	server 192.168.17.129:8081;
	fair;
}

3.5 session 共享问题

在 Nginx 负载均衡中,通常会使用一些策略来解决Session共享享的问题,以确保用户在多个
后端服务器之间能够保持相同的 Session 数据。

以下是一些解决方案:

1. Sticky Session / Session Affinity

使用Sticky Session(也称为Session Affinity)的方式,确保用户的请求始终被发送到同一台后端服务器。这可以通过IP地址、Cookie等方式来实现。配置方式取决于负载均衡器和应用服务器的支持。

2. Centralized Session Storage:推荐

将Session数据存储在一个集中式的存储系统中,如数据库、缓存服务器(如Redis)等。这样,不论用户请求被发送到哪个后端服务器,都可以访问相同的Session数据。这需要应用程序确保Session数据的同步性和一致性。

3. Session Replication

在多个后端服务器之间复制Session数据。这意味着每个服务器都有相同的Session数据副本。这需要确保Session数据的同步和一致性,并可能涉及到数据复制的延迟问题。

4. JWT (JSON Web Token):推荐

使用JWT来存储Session数据,将Session数据加密并嵌入在用户请求的头部或其他位置。这样,即使请求被发送到不同的后端服务器,服务器可以解密JWT并获取Session数据。这需要在客户端和服务器端之间建立一定的信任关系。

5. DNS-Based Session Affinity

使用DNS或负载均衡器的某些策略,确保用户请求的域名解析至到同一组后端服务器。这样,用户请求会一直被路由到相同的服务器,实现Session共享。

选择哪种方法取决于应用程序的需求、架构和性能要求。通常,使用StickySession是最简单且常见的方法,但其他方法可能在某些场景下更为适用。无论选择哪种方法,都需要仔细测试以确保Session共享的正确性和性能。

四、动静分离

对于动静分离,一般有两种实现方式:

  1. (常用)将静态资源独立成单独的域名放在单独服务器上,然后动态请求走单独的接口服务
  2. 动态和静态资源混合在一起发布,只是通过Nginx来分配请求处理

今天的主题是 Nginx,所以我们将介绍第二种方式。

4.1 预期效果

在浏览器访问 http://192.168.17.129/www/test.html 时,刷新后不读取缓存,访问 http://192.168.17.129/image/01.jpg 渲染图片,刷新后会读取缓存。

请添加图片描述

4.2 具体配置

http {
	server {
		listen 80;
		server_name 192.168.17.129;

		location /www/ {
			root /data/;
			index index.html index.htm;
		}

		location /image/ {
			root /data/;

			add_header Cache-Control "public, max-age=2592000";
			expires 30d;

			gzip on;
			gzip_types text/plain text/css application/javascript image/*;
		}
	}
}
  • 22
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值