使用nginx同域名下部署多个vue项目并使用反向代理的方法
效果
目前有2个项目(project1,project2),还有一个nginx自带的index.html,我添加了对应的链接代码(稍后粘贴出来),为了统一管理子项目的路由。
我期望实现下面的效果(假设ip:localhost,port:8080):
http://localhost:8080/进入最外层的index.html
http://localhost:8080/project1进入项目一
http://localhost:8080/project2进入项目二
废话不多说,开始配置
Vue的配置
本人使用的是vue-cli2搭建的项目,所以对应的需要修改一些vue的配置参数。
config文件夹下的index.js,因为是打包,所以我们需要在build.assetsPublicPath更改对应项目名,譬如
//project1
module.exports={
dev:{},
build:{
assetsPublicPath:'/project1/'//注意前后的‘/'
}
}
//project2
module.exports={
dev:{},
build:{
assetsPublicPath:'/project2/'//注意前后的‘/'
}
}
config文件夹下的prod.env.js修改成这样:
//project1
module.exports={
NODE_ENV:'"production"',
BASE_API:'"/api/pro1"'//这里待会与nginx配置对应
}
//project2
module.exports={
NODE_ENV:'"production"',
BASE_API:'"/api/pro2"'//这里待会与nginx配置对应
}
[注意]因为我在项目中使用到了BASE_API作为代理的前缀,如果你的不在这边,你需要找到你自己的代理配置
因为每个人的vue-router文件配置不一样,你需要找到你的router配置文件,内部修改为:
//我采用了history模式,hash模式我没有测试,感觉应该是一样的效果
//project1
exportdefaultnewRouter({
base:'/project1/',//注意更改你子项目名,这个对应你的build.assetsPublicPath
mode:'history',
scrollBehavior:()=>({y:0}),
routes:[]
})
//project2
exportdefaultnewRouter({
base:'/project2/',//注意更改你子项目名,这个对应你的build.assetsPublicPath
mode:'history',
scrollBehavior:()=>({y:0}),
routes:[]
})
[注意]在npmrunbuild可能会报错:.tap(*)之类的,那是因为打包中的html-webpack-plugin版本出现了问题,可以执行下面的语句
#这个版本就是你的package.json中的版本,只不过你需要重新再指定这个版本 $npmihtml-webpack-plugin@4.0.0-alpha-D
Nginx的配置
首先我的目录是这样的,无关文件全部以...展示
. ├─conf │├─...#其他文件 │└─nginx.conf │ ├─html#只看这里,其他暂时我没用到 │├─project1 ││└─static ││├─css ││├─fonts ││└─js ││├─g ││└─V │├─project2 ││└─static ││├─css ││├─fonts ││└─js ││├─g ││└─V │├─index.html │└─50x.html └─...#其他文件
[解释]我的nginx目录就是原生的,内部包含了一个html文件夹,为了省事,我直接使用这个,当然你也可以指定其他的目录,但是目前还请和我一样的配置,后面可以自己定制化。
现在我们开始配置在conf文件夹下的nginx.conf文件
我是直接在原始文件上修改的,而修改的配置都是在http模块中,所以其他的不需要的代码我直接用...代替。
#...
#反向代理
http{
includemime.types;
default_typeapplication/octet-stream;
#log_formatmain'$remote_addr-$remote_user[$time_local]"$request"'
#'$status$body_bytes_sent"$http_referer"'
#'"$http_user_agent""$http_x_forwarded_for"';
sendfileon;
keepalive_timeout65;
client_max_body_size20M;
client_body_buffer_size10M;
large_client_header_buffers4128k;
#这里可以做集群
upstreamp1_server{
serverlocalhost:8081;
}
#这里可以做集群
upstreamp2_server{
serverlocalhost:8082;
}
server{
listen8080;
server_namelocalhost;
charsetutf-8;
proxy_connect_timeout180;
proxy_send_timeout180;
proxy_read_timeout180;
proxy_set_headerHost$host;
proxy_set_headerX-Forwarder-For$remote_addr;
roothtml;#这里指定刚刚我们的文件夹
#总的项目路由,我偷懒直接写在了同一个文件
#如果有很多可以在配置多个conf文件,使用include关联进来
location/{
try_files$uri$uri//index.html;#这里可以理解指定到html文件夹下的index.html
}
#project1
#这里就是刚刚我们在vue项目中config/index.js的配置build.assetsPublicPath,
#也是vue项目中配置的router中的base
location^~/project1{
try_files$uri$uri//project1/index.html;#这里可以理解指定到html文件夹下project1文件夹的index.html
}
#project2
#这里是项目二的配置
location^~/project2{#
try_files$uri$uri//project2/index.html;#这里可以理解指定到html文件夹下project2文件夹的index.html
}
#这里是project1配置需要调用的接口
location/api/pro1{#这里就是在vue项目中prod.env.js的配置BASE_API
proxy_redirectoff;
proxy_set_headerHost$host;
proxy_set_headerX-Real-IP$remote_addr;
proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;
proxy_passhttp://p1_server;#此处的p1_server对应的上面的配置upstreamp1_server{},这里可以做集群,我用不到,就简单配置了
}
#这里是project1配置需要调用的接口
location/api/pro2{#这里就是在vue项目中prod.env.js的配置BASE_API
proxy_redirectoff;
proxy_set_headerHost$host;
proxy_set_headerX-Real-IP$remote_addr;
proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;
proxy_passhttp://p2_server;#此处的p2_server对应的上面的配置upstreamp2_server{},这里可以做集群,我用不到,就简单配置了
}
#...
}
#...
}
最后贴出我修改的index.html的代码
因为我是追加的,所以直接贴出我追加的代码,其他的采用...
...Thankyouforusingnginx.
项目一| 项目二