04月11, 2020

nginx部署SPA页面

前后端分离开发过程中,前端需要独立发布项目。在当前vue、react等前端主流框架下开发,都是SPA页面,具体的如何发布到web服务器上。nginx作为主流的前端服务器。如何配nginx规则。直接看配置文件吧,重点部分都含有注释,其他nginx的默认配置指不做处理。主要配置在nginx的 conf/nginx.config文件,如下所示:

#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  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;
        root        D:/webProject/goodsCenter/dist;  #单页面项目的打包后的dist目录

        location / {
            try_files $uri $uri/ @router; #需要指向下面的@router否则会出现vue的路由在nginx中刷新出现404
            index  index.html index.htm;
        }

        #nginx反向代理,实现接口转发
        location ^~ /goodsCenterWeb/ {
            proxy_pass http://10.7.28.14;  #注意路径后边不要加/
        }
        #对应上面的@router,主要原因是路由的路径资源并不是一个真实的路径,所以无法找到具体的文件
        #因此需要rewrite到index.html中,然后交给路由在处理请求资源
        location @router {
            rewrite ^.*$ /index.html break;
        }

}

SPA能正常访问的关键:在 location @router { rewrite ^.*$ /index.html break; }这部分配置。在SPA单页面访问时,实际上访问的是单页面的路由,例如/goods/list,对应的其实是单页面路由中配置的路由组件。但是对于nginx服务器来讲,被认为会寻找根目录下goods文件夹下的list文件夹,当然是找不到的。单页面实际上只有一个页面index.html,因此将所有的页面都rewirte到index页面,即可完成配置

业务能够正常跑通,就需要调用后台接口,由于前后端分离,势必会产生跨域请求,因此nginx反向代理就必不可少,也就是 location ^~ /goodsCenterWeb/ { proxy_pass http://10.7.28.14; #注意路径后边不要加/ } 这部分,会讲所有以goodsCenterWeb开始的请求转发到10.7.28.14 这台服务器。具体在实际开发过程,转发的规则、后台服务器以实际为准。涉及到其他的接口转发规则时,可以具体参考nginx正则表达式。

nginx location 匹配规则

*   ~ 波浪线表示执行一个正则匹配,区分大小写
*   ~* 表示执行一个正则匹配,不区分大小写
*   ^~ 表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录
*   = 进行普通字符精确匹配
*   @ 定义一个命名的 location,使用在内部定向时,例如 error_page, try_files

browserHistory 模式的刷新问题

browserHistory 路由模式下,使用history api可以在前端进行页面跳转,但是刷新的话,就需要对链接进行一个修复(重定向)
我们可以使用nginx 的 try_files 来实现:

location / {
    root /code/app1/build;
    index index.html index.htm;
    try_files $uri $uri/ /index.html;
}
location ^~ /app {
    alias /code/app2/build;
    index index.html;
    try_files $uri $uri/ /app/index.html;
}
location ^~ /api/ {
  proxy_pass http://api.site;
}

多个SPA的部署与重定向

首先约定发布代码目录如下:

/publish_webapp/
|-- app1/
    |-- index.html
    |-- static
|-- app2/
    |-- index.html
    |-- static

nginx 配置:

location ~* ^\/(\w+) {
    root /publish_webapp/;
    index index.html;
    try_files $uri $uri/ $uri/index.html /$1/ /$1/index.html;
}

开启gzip

gzip  on;
    gzip_min_length  1k;
    gzip_buffers     4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 9;
    gzip_types       text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php application/javascript application/json;
    gzip_disable "MSIE [1-6]\.";
    gzip_vary on;

本文链接:https://587v5.com/post/nginx部署spa页面.html

Comments