文章目录
- 基本介绍
- 准备工作
- 配置 Nginx
基本介绍
动静分离指的是将动态请求和静态请求分隔开,然后分别路由到相应的后端服务器。通常用户的请求中,一部分需要后台程序处理,例如查询数据库或者进行一些数据运算,这类请求我们称之为动态请求;还有一部分不需要后台程序处理,如请求 css、html、js、图片等静态资源,这类请求我们称之为静态请求。Nginx 实现动静分离的基础是它可以根据配置对不同的请求做不同的转发,动静分离有利于提高整个服务器系统的性能。
准备工作
在本机(Linux 虚拟机)中安装 Nginx,并确保 Nginx 可以正常运行。为了便于实践,我们在一台机器上执行所有操作,也就是在本机中部署 Nginx 和处理动态请求的后端服务,同时本机也会作为静态资源服务器存放静态文件。注意,实际中可使用不同的机器分开部署。
静态资源准备
在本机 /usr/local/
目录下创建 /data/img
和 /data/html
文件夹,分别存放 test.png 和 test.html:
后端服务
写一个简单的 “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
得到如下响应:
这里我们并没有指定端口,因为 HTTP 的默认端口就是 80,而 Nginx 配置文件中也监听了 80 端口,真实的请求为 localhost:8080/hello
。
静态请求
浏览器中输入 localhost/img
,得到如下响应:
上图中列举出了 /img
目录下的文件,这是因为配置文件中设置了 autoindex on;
,它表示打开目录浏览功能。
浏览器中输入 localhost/img/test.png
,得到如下响应:
浏览器中输入 localhost/html/test.html
,得到如下响应:
上述操作中,我们实现了静态请求和动态请求的分离,当访问静态资源(如 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 就可以访问到这些资源,当然不同类型的资源也可以分开存放。