linux nginx 部署Vue

499 阅读2分钟

本文已参与[新人创作礼]活动,一起开启掘金创作之路。

nginx配置一个简单的前端文件

主要介绍了把打包好的Vue项目静态资源使用nginx代理部署到服务器上。

1.项目打包并上传至服务器

项目打包出现错误:

image.png

解决方法:运行npm install后再运行npm run build。

将打包后的文件压缩为.zip的包,上传至服务器。将静态资源包放在自己指定的目录,这里在home目录下创建了test文件夹,前端资源包就放在这里面。

安装解压zip的依赖:

yum -y install zip unzip

解压:unzip dist.zip

2.修改nginx配置文件

进入nginx安装目录的conf目录,修改nginx.conf文件。

配置nginx.conf文件(这里只是简单的配置):

...
 server {
        listen       8080; #监听的端口
        server_name  XX.XX.XX.XX;  #所在域名即nginx所在服务器ip

        location / {
            root   /home/test/dist; #上传的前端项目文件所在位置
            try_files $uri $uri/ /index.html   #解决post请求出现404问题
            index  index.html index.htm;
        }
        
        error_page 500 502 503 504 /50x.html;

        location = /50x.html{
                root html;
        }
    }
...

重新加载nginx

systemctl reload nginx

3.访问

访问:域名加端口。

http://ip:port

405问题解决

页面访问成功,但访问接口出现出现405问题。

image.png

解决:

...
location / {
            root   /home/test/dist; #上传的前端项目文件所在位置
            try_files $uri $uri/ /index.html   # 解决post请求出现404问题
            index  index.html index.htm;
            # 解决post请求出现405问题,增加下面配置信息 
            error_page 405 =200  $request_uri;
        }
...

出现:We're sorry but hello-vue doesn't work properly without JavaScript enabled. Please enable it to continue.的问题。

image.png

原因:nginx配置异常,没有正确配置后端服务代理地址。

解决方法1:将路由的模式改为hash模式。

在nginx中配置转发访问后端的具体地址。

解决方法2:修改nginx。

...
location / {
            root   /opt/dist;
            try_files $uri $uri/ /index.html
            index  index.html index.htm;
            error_page 405 =200 http://$host$request_uri;
        }
...
# ip 是后端项目发布的服务器的ip。
# port 是后端允许访问的端口。
# api 是前端使用的请求后端的时候的baseURL。
location ^~ /api/ {
    proxy_pass http://ip:port/;
}

即下面文件里面的baseURL。

image.png

如果没有baseURL即:

baseURL: '/'

可以查看vue.config.js接口代理的配置:

如:

...
devServer: {
    // 服务代理
    proxy: {
        '/{{contextPath}}': {
            target: '{{ url }}',
            ws: true,
            changeOrigin: true
        },
        '/abc/def/': {
            target: 'http://xx.xx.xx.xx:xxxx/',
            ws: true,
            changeOrigin: true
        }
    }
}
...

可以知道接口 xx.xx.xx.xx:xxxx/ 共有的前缀为/abc/def/,所以在nginx中需要在location中配置转发访问后端的具体地址(xx.xx.xx.xx:xxxx/)

server {
    listen       8080; #监听的端口
    server_name  XX.XX.XX.XX;  #所在域名即nginx所在服务器ip

    location / {
        root   /home/test/dist; #上传的前端项目文件所在位置
        try_files $uri $uri/ /index.html   # 解决post请求出现404问题
        index  index.html index.htm;
    }
    
    # 配置转发访问后端的地址
    location /abc/ {
        proxy_pass http://ip:port;
    }
    
    error_page 500 502 503 504 /50x.html;

    location = /50x.html{
            root html;
    }
}

注意,每次修改完nginx配置文件,都要重新加载。

proxy_pass后面的url加/和不加/的区别

这里简单介绍一下proxy_pass后面的url加/和不加/的区别:

1.加/,表示绝对根路径。

2.不加/,表示相对路径,把匹配的路径部分也带走。

如访问 http://192.168.1.1:8080/test/index.html 地址


不加/

location /test/ {
        proxy_pass http://192.168.1.2:9000;
}

则把匹配的路径也带走,这时代理的url为:http://192.168.1.2:9000/test/index.html


加/

location /test/ {
        proxy_pass http://192.168.1.2:9000/;
}

这时代理的url为:http://192.168.1.2:9000/index.html


location /test/ {
        proxy_pass http://192.168.1.2:9000/abc/;
}

这时代理的url为:http://192.168.1.2:9000/abc/index.html


location /test/ {
        proxy_pass http://192.168.1.2:9000/abc;
}

这时代理的url为:http://192.168.1.2:9000/abcindex.html


Nginx解析location/后面的字符串

Nginx解析location/后面的字符串,配置不同的字符串,从而匹配不同的URL进行反向代理。

worker_processes  1;  
  
  
events {  
    worker_connections  1024;  
}  
  
  
http {  
    include       mime.types;  
    default_type  application/octet-stream;  
  
    sendfile        on;  
  
    keepalive_timeout  65;  
  
    server {  
        listen       8080;  
        server_name  localhost;  
        location / {  
            root   html;  
            index  index.html index.htm;  
        }  
        location /abcd {  
            proxy_pass http://192.168.1.1:8081;  
            proxy_set_header   Host    $host;  
            proxy_set_header   X-Real-IP   $remote_addr;   
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;  
        }  
        location /efgh {  
            proxy_pass http://192.168.1.1:8082;  
            proxy_set_header   Host    $host;  
            proxy_set_header   X-Real-IP   $remote_addr;   
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;  
        }  
        location /ijkl {  
            proxy_pass http://192.168.1.2:8081;  
            proxy_set_header   Host    $host;  
            proxy_set_header   X-Real-IP   $remote_addr;   
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;  
        }  
        location /mnop {  
            proxy_pass http://192.168.1.2:8082;  
            proxy_set_header   Host    $host;  
            proxy_set_header   X-Real-IP   $remote_addr;   
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;  
        }  
        error_page   500 502 503 504  /50x.html;  
        location = /50x.html {  
            root   html;  
        }  
    }  
} 

上面根据匹配的不同字符串,反向代理不同的URL:

如访问

http://192.169.11.11:8080/abcd/index.html

http://192.169.11.11:8080/efgh/index.html

http://192.169.11.11:8080/ijkl/index.html

http://192.169.11.11:8080/mnop/index.html

地址,使用上面的nginx配置。

则代理的URL分别为:

http://192.168.1.1:8081/abcd/index.html

http://192.168.1.1:8082/efgh/index.html

http://192.168.1.2:8081/ijkl/index.html

http://192.168.1.2:8082/mnop/index.html

root与alias区别

1.alias是一个目录别名的定义,root则是最上层目录的定义。

root指定项目的根目录:使用root时,会到root + location 寻找资源。

alias指定虚拟目录:使用alias时,会到alias后定义的目录中找资源。

2.alias后面必须要用 / 结束,否则会找不到文件的,而root则可有可无。