在 WHAT - Nginx 系列(一) 中我们介绍了什么是 Nginx,以及相关的基本使用。
今天我们主要介绍一些真实配置实例,包括常见的反向代理、负载均衡和动态分离。
一、反向代理(1):proxy_pass
1.1 预期效果
打开浏览器输入 www.test.com 跳转到 Linux 系统启动 Tomcat 主页面。具体图示:
1.2 准备工作
- 安装 Nginx
- 安装 Tomcat
1.3 步骤
- 根据Nginx官网安装
- 根据Tomcat官网安装并启动8080端口服务
- 配置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
- 主机修改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 准备工作
- 安装 Nginx
- 安装 Tomcat
2.3 步骤
- 根据Nginx官网安装
- 根据Tomcat官网安装并启动8080端口服务a,另外启动8081端口服务b。并分别添加两个测试页面a.html和b.html
- 配置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
- 浏览器输入不同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 的顺序,确保最具体的匹配出现在更靠前的位置。
=
表示精确匹配,即用于不含正则表达式的 uri 前,要求请求字符串和 uri 严格匹配。
~
用于表示 uri 包含正则表达式,并且区分大小写。
~*
用于表示 uri 包含正则表达式,并且不区分大小写。
^~
表示精确匹配,即匹配成功后停止搜索其他的 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 准备工作
- 安装 Nginx
- 安装 Tomcat
3.3 步骤
- 根据Nginx官网安装
- 根据Tomcat官网安装并启动8080端口服务a,另外启动8081端口服务b。并分别添加同一个测试页面a.html,只不过一个渲染 “8080”,一个渲染 “8081”
- 配置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
- 在浏览器多次输入 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共享的正确性和性能。
四、动静分离
对于动静分离,一般有两种实现方式:
- (常用)将静态资源独立成单独的域名放在单独服务器上,然后动态请求走单独的接口服务
- 动态和静态资源混合在一起发布,只是通过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/*;
}
}
}