使用Nginx的try_files实现动态页面纯静态化的简单解决方案

原文地址:http://www.glxxw2018.com/study/blog/detail/ag6Gf13MuC.html

1、nginx既作反向代理服务器,又作为动静分离服务器。

2、首先假设我只有一个以Java框架实现的后台博客应用程序,这个博客应用程序的内容页面从后台使用jsp模板等构造页面内容,并返回到客户端进行显示。这里博客内容页面所括的大部分内容如标题,正文等都不是经常变化的,所以如果将这个页面静态化就减少了在后台在数据库中查询博客相关数据的损耗。少量的实事信息可以通过ajax动态请求后台,那么这样一个方案怎么用nginx实现呢?

3、我们都知道,在nginx中有一个html目录,这个是静态文件的根目录,想法是前客户端请求nginx时,nginx先在html根目录下找到相关的静态内容页面,如果没有找到就转到反向代理请求网站后台数据。这样就简单实现了动态页面静态化。

4、第3步说明的就是网站后台本身就是通构建一个html内容返回给客户端的,如果把这个构建好的内容存一份静态html页面放在nginx的html根据目录,这样不就大大减小后台的压力了吗?

location ~ \.html$ {
    root html;
    index index.html;
    try_files $request_uri @fight;
}

location @fight {
    proxy_pass http://localhost:8080;
    proxy_connect_timeout 10;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

location / {
    proxy_pass http://localhost:8080;
    proxy_connect_timeout 10;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

 

5、配置文件解释如下:

nginx的location从上向下依次匹配,基中@开头的location名称是nginx内容请求的,外部不可访问。

首先,以html接尾的请求,nginx首先在html目录下查找,如果找到就返回,如果找不到,就尝试请求@fight的location路由,请求地址为$request_uri,这个参数也是客户端请求nginx的访问地址,@fight就是通过反向代理访问后端。如果对于那些没有生成html页面放在html根目录下的资源来说,如js、css、图片等都会匹配到location /这个通配路由,这样就不致于某些资源无法访问。总是添加这个通用路由是个好习惯,当然,上面提到的js、css、图片等静态资源也可以放在html根目录下,修改下location ~ \.html$的规则就行,如location ~ \.(html|js|css|png)$,当然,你要将你后端tomcat下的静态资源存一份到nginx的html中就可以了。

6、上面的方法大家都知道,那么问题来了,如果生成静态文件。在这里,笔者观念是这样子的,你可以通过后台的Java方法,在保存或更新博客内容时,或者在前端访问时,在响应阶段进行拦截将response中的内容取出,分析请求的URI将response中的内容存成相应的html文件保存在html中与请求路径对应的目录路径下;还有一种方法就是单独写一个python服务,在后台博客保存好后,将地址发送给这个python服务,python使用爬虫技术,将页面爬出并保存在nginx的html的根目录下。就样就是按需生成静态页面。

更多优质PDF电子书:http://www.glxxw2018.com/study/pdf/index.html

你可能感兴趣的:(使用Nginx的try_files实现动态页面纯静态化的简单解决方案)