Nginx配置动静分离

1、准备工作

我们最终想实现的效果如下:

即访问以 /webTestProject 为前缀的资源时,我们认为是静态资源。我们把静态资源直接放在 Nginx 服务器上,通过 Nginx 来直接返回静态资源。

当访问的资源以 /serviceTestProject 为前缀时,我们认为是动态资源。此时通过 Nginx 把请求代理转发至 192.168.32.130 服务器上,通过该服务器来处理动态请求。

 

上面也是常见的前后端分离项目的架构,实际上我们接下来的配置也是示例前后端分离在实际生产上的架构。

1.1、准备静态资源

首先先准备静态资源项目即前端项目 webTestProject,然后将该项目放到 192.168.32.128 服务器的 /usr/myTestData/webTestProject 目录下:

index.html 文件内容如下,只是显示一些简单内容发出求一个请求:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <h1>Nginx练习页面</h1>

    <script>
        var xmlhttp;
        if (window.XMLHttpRequest) {
            //  IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码
            xmlhttp = new XMLHttpRequest();
        } else {
            // IE6, IE5 浏览器执行代码
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
        xmlhttp.onreadystatechange = function () {
            if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                console.log(xmlhttp.responseText);
            }
        }

        //请求根路径下的/serviceTestProject/ajaxResponse.do,实际上会由Nginx转发至动态资源服务器
        xmlhttp.open("GET", "/serviceTestProject/ajaxResponse.do", true);
        xmlhttp.send();
    </script>
</body>

</html>

 

1.2、准备动态资源

我们新建一个简单的 maven javaweb 项目,并且建立一个 ajaxResponse.do 请求以供前端访问。

ajaxResponse.do 的代码如下:

@Controller
public class ControllerTest01 {

    //直接给 ajax 请求返回字符串
    @RequestMapping("/ajaxResponse.do")
    public void ajaxResponse(HttpServletRequest request, HttpServletResponse response) throws Exception{
        PrintWriter out = response.getWriter();
        out.write("hello");
    }
}

将该 web 项目打包,并且将打成的 war 包放在 192.168.32.130 服务器上的 tomcat 目录下的 webapps 目录下:

 

2、配置动静分离

将前端静态资源和后台动态资源分别部署到不同服务器上后,我们就可以开始进行配置了。

打开 192.168.32.128 服务器上的 Nginx 配置文件 /usr/local/nginx/conf/nginx.conf ,进行如下修改:

即监听本服务器上的 80 端口,当请求的资源以 /webTestProject 为前缀时,将请求直接转发至访问本服务器上 /usr/myTestData/ 目录下的资源,即直接将该目录下的静态资源返回。

当请求的资源以 /serviceTestProject 为前缀时,将请求转发至 192.168.32.130 服务器上,由该服务器来处理动态请求,我们将后台项目部署在了该服务器上。

 

配置完成后,我们可以在浏览器访问 http://192.168.32.128/webTestProject/index.html 可以看到如下效果:

ajaxResponse.do 请求:

可以看到 ajaxResponse.do 请求能正常访问,并不会有跨域问题。这是因为这些动态资源已经由 Nginx 进行了反向代理,虽然实际上是由 192.168.32.130 服务器进行处理并返回的,但浏览器并不能感知到。因为发出的动态资源请求是请求 192.168.32.128 服务器上的资源的,然后再由该服务器上的 Nginx 转发至 192.168.32.130 服务器上的。

实际上,动态资源是由 192.168.32.130 服务器处理并返回的,静态资源是由 192.168.32.128 上的 Nginx 服务器直接返回的。

 

2.1、完整的Nginx配置文件

完整的Nginx配置文件如下:

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  192.168.32.128;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location /webTestProject/ {
            root   /usr/myTestData/;
            index  index.html index.htm;
        }
        
        location /serviceTestProject/ {
            proxy_pass http://192.168.32.130:8080;
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

 

posted @ 2021-07-11 22:46  wenxuehai  阅读(3043)  评论(0编辑  收藏  举报
//右下角添加目录