文章目录

  • 基本介绍
  • 准备工作
  • 配置 Nginx


基本介绍

动静分离指的是将动态请求和静态请求分隔开,然后分别路由到相应的后端服务器。通常用户的请求中,一部分需要后台程序处理,例如查询数据库或者进行一些数据运算,这类请求我们称之为动态请求;还有一部分不需要后台程序处理,如请求 css、html、js、图片等静态资源,这类请求我们称之为静态请求。Nginx 实现动静分离的基础是它可以根据配置对不同的请求做不同的转发,动静分离有利于提高整个服务器系统的性能。

nginx 视频转发 nginx动态转发_后端

准备工作

在本机(Linux 虚拟机)中安装 Nginx,并确保 Nginx 可以正常运行。为了便于实践,我们在一台机器上执行所有操作,也就是在本机中部署 Nginx 和处理动态请求的后端服务,同时本机也会作为静态资源服务器存放静态文件。注意,实际中可使用不同的机器分开部署。

静态资源准备

在本机 /usr/local/ 目录下创建 /data/img/data/html 文件夹,分别存放 test.png 和 test.html:

nginx 视频转发 nginx动态转发_java_02


后端服务

写一个简单的 “Hello World” 项目并启动,端口为 8080:

@Controller
@RequestMapping
@Log
public class HelloController {
    @RequestMapping(path = "/hello", method = RequestMethod.GET)
    @ResponseBody
    public String hello() {
        return "Hello, world!";
    }
}

实际应用中的动态请求通常会涉及相关资源的调度,这里我们简化该过程,假设后端服务进行了一系列运算,最后返回字符串 “Hello, world!”。

配置 Nginx

打开 nginx.conf 配置文件,在 server 块中添加如下内容:

server {
    listen       80;
    server_name  localhost;

    location / {
        root   html;
        index  index.html index.htm;
    }
    
    #拦截动态请求
    location /hello {
        proxy_pass http://localhost:8080;
    }

    #拦截静态请求
    location /img {
        root /usr/local/data;
        autoindex on;
    }
    #拦截静态请求
    location /html {
        root /usr/local/data;
        autoindex on;
    }
}

动态请求

浏览器中输入 localhost/hello 得到如下响应:

nginx 视频转发 nginx动态转发_nginx 视频转发_03


这里我们并没有指定端口,因为 HTTP 的默认端口就是 80,而 Nginx 配置文件中也监听了 80 端口,真实的请求为 localhost:8080/hello

静态请求

浏览器中输入 localhost/img,得到如下响应:

nginx 视频转发 nginx动态转发_后端_04


上图中列举出了 /img 目录下的文件,这是因为配置文件中设置了 autoindex on;,它表示打开目录浏览功能。

浏览器中输入 localhost/img/test.png,得到如下响应:

nginx 视频转发 nginx动态转发_java_05


浏览器中输入 localhost/html/test.html,得到如下响应:

nginx 视频转发 nginx动态转发_nginx_06


上述操作中,我们实现了静态请求和动态请求的分离,当访问静态资源(如 html 和图片)时,请求并不会到达 “Hello World” 后端服务,而是从静态资源服务器(这里是本机)中获取资源,当访问 localhost/img/test.png 时,真实的请求为 localhost:80/usr/data/img/test.png。另外,也可以将负责拦截静态请求的 location 块写成如下形式:

#拦截静态请求
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ {
    root /usr/local/data;
}

下面解析一下上述配置中的匹配规则:

  • ~:表示匹配时区分大小写。
  • .*. 表示匹配除换行符 \n 之外的任何单字符,* 表示零次或多次,所以 .* 表示任意字符出现零次或多次。
  • \.:表示匹配字符 .

综上,该配置表示匹配以 .html, ···, .css 为后缀的请求,我们可以将 html、jpg 等静态资源存入到 /usr/local/data 下,然后通过指定的 URL 就可以访问到这些资源,当然不同类型的资源也可以分开存放。