Ubuntu:一个部署好的tomcat应用(war包)怎么用Nginx实现动静分离?
今天想把之前的一个demo用Nginx把资源分离开来,在网上看了一天,整整弄了一天,硬是没弄出来。
要么全是同样的内容的,要么就是环境跟我这里不一样的。再加上对Nginx没接触过,给我都整哭了差点。
终于,到了下午有一点起色了,终于没有白费,还有最重要的一点事,早看日志早完事了!!!
说明
这篇文章默认条件是你的nginx和tomcat都装好了,装好就可以,没配置可以看着文章一起配。
如果没有装的,可以参考下这里:nginx安装,tomcat安装
我这里就不弄负载均衡了,因为我只是想把静态资源抽离出来交给nginx而已。
然后关于nginx的什么反向代理,负载均衡,什么什么架构这些,我就不解释了,还不知道的可以先去看一下。
当然我觉得你要是能看这篇文章,这些基本的知识都知道了。
这些都不重要,重要的是,怎么搭出来,怎么配置出来,所以我觉得重中之重的就是nginx的配置。
我遇到的问题是这样的,我一个挂在服务器上的demo,是ssm写的,其中用了tomcat的虚拟目录来装商品图片。
它里面还用到了一些别的静态资源如js、css、txt、jpg等等,总之就是静态资源,懂不懂哈哈哈。
我的demo是实打实的用网址加8080端口访问出来的,
所以就是说一个已经正常运行的项目需要在nginx的帮助下,实现动静分离依然正常运行,
因为我看了一天的博文都是将如何从0开始搭的,我这就是半路出家,半路开始搭的。
虚拟目录
在那之前先来了解下Tomcat的虚拟目录,官方知识我就不普及了,我们直接看效果。
<Context path="/pimg" docBase="/home/pimg" debug="" privileged="true" reloadable="true"/>
上面的<Context>标签就是在$TOMCAT/conf/server.xml这个文件里的,相信跑过demo的都知道。
path="/pimg" 是一个虚拟目录,是用来访问的, docBase="/home/pimg" 是一个物理目录,是用来存储的。
我访问 /pimg/aa.jpg ,真正去读的文件的是 /home/pimg/aa.jpg 。
所以说其实就是 /pimg 映射着 /home/pimg 这个路径。
访问地址是: www.daibu.cn:8080/pimg/aa.jpg
注意虚拟目录的访问是紧跟端口后面的。
关于虚拟目录的简单介绍就是这样,已经足矣。
Nginx的匹配规则
关于它的匹配规则有好几个,有server_name的,有location的,甚至rewirte的也算。
网上一搜一大把,我也不贴我的博客了,省得看起来像抄别人的一样。
而且抄也直接抄,错都不知道,我也是佛了,这都敢这样放自己博客上。


也不算错,就是他们最后一个应该是匹配字符串的结束,是打错字了,但抄的那个人也直接抄了。
命令
修改nginx的配置文件之后先检查再重启,如果觉得写的不错,可以跳过检查部分
检查
nginx -t //这个是用默认的命令检查默认的配置文件 -t表示检查
/usr/local/nginx/sbin/nginx -tc /usr/local/nginx/conf/nginx.conf //这是网上的,他们的nginx位置跟我的不一样
//可以简写成这个,nginx是在sbin里面的,sbin是$PATH的值,所以不用写路径。
nginx -tc /usr/local/nginx/conf/nginx.cnof
//然后-c代表指定配置文件,因为如果不指定就是加载默认的配置文件了
重启
nginx -s reload
解读配置文件
我的demo访问地址是http://www.daibu.cn:8080/sssmshop
目录结构如下

所以就是想把那些非JSP的资源给挪到nginx管理,这样tomcat只负责处理serverlet请求,
加载资源就由nginx来,两两分工,自然访问速度就快了。
我的nginx.conf文件(server部分)如下:
server {
listen ;
server_name www.daibu.cn;
location / { proxy_pass http://www.daibu.cn:8080;
}
#所有js,css相关的静态资源文件的请求由Nginx处理
location ~* .*\.(js|css)$ {
root /usr/share/nginx/jdfenli; #指定文件路径
expires 12h; #过期时间为12小时
}
#所有图片等多媒体相关静态资源文件的请求由Nginx处理
location ~* .*\.(html|jpg|jpeg|png|bmp|gif|ico|mp3|mid|wma|mp4|swf|flv|rar|zip|txt|doc|ppt|xls|pdf|ttf)$ {
root /usr/share/nginx/jdfenli; #指定文件路径
expires 7d; #过期时间为7天
}
# location ~ \.jsp$ {
# proxy_pass http://www.daibu.cn:8080;
# }
}
对上面的文件解读一下,记录下碰到的问题。
第一:我的demo实现了RESTful风格,所以不会有.jsp这个匹配,demo全都是serverlet的请求。
所以最后一个Location可以注释掉。
第二:因为我的 server_name 是www.daibu.cn,且监听80端口,所以在地址栏输入www.daibu.cn的时候
会继续匹配跳转到 location / { proxy_pass http://www.daibu.cn:8080; }
所以也就是说地址栏虽然还是www.daibu.cn,但其实nginx已经访问了http://www.daibu.cn:8080
所以返回的响应其实是tomcat返回的。其返回如下

为什么会是文字呢,因为tomcat主页的css文件被nginx拦截了,
也就是说,静态资源应该跟nginx获取,而请求应该跟tomcat获取,
所以上面的图就证明了我们的需求是成功的。
接下来,我们只需要把静态资源交给nginx就可以达到我们最初的目的啦。
第三:注意配置文件中的 root /usr/share/nginx/jdfenli ,这是我们自己随便找个地方建的文件夹,
用来存放静态资源的。
第四:因为我们用tomcat的时候都是采用ip+端口号+项目名的形式去访问,
也就是http://www.daibu.cn:8080/sssmshop,但我们现在使用nginx之后,我们希望访问地址是
http://www.daibu.cn/sssmshop,默认端口80。
第五:沿用了tomcat的访问习惯,请求任何东西都是带有项目名的,所以当请求静态资源的时候,一般是
http://www.daibu.cn/sssmshop/img/aa.jpg,这时nginx匹配到你的url结尾是.jpg,就会自己处理这个
资源,而不是去请求tomcat,它怎么处理呢,它会进入 root /usr/share/nginx/jdfenli 这个指令,
也就是去指定的文件夹/usr/share/nginx/jdfenli看看有没有sssmshop/img/aa.jpg。
没错,它原则就是将www.daibu.cn替换成/usr/share/nginx/jdfenli。
所以,如果你在jdfenli文件夹直接放img/aa.jpg的话,会请求失败,因为路劲不正确。
综上所述,root指定的文件夹下,放的是跟项目名级别的文件夹。
第六:由于tomcat的虚拟目录采用的也是跟项目名同一级别的,所以访问静态资源用的也是
www.daibu.cn/虚拟目录/abc.jpg
结合第五点,nginx的root指定的文件夹下应该有一层文件夹,是属于紧跟端口后的。

接下来才是静态资源的存放

整体而言差不多这样就能分离开来了,如果有问题可以联系我。
提醒
搞东西一定要记得看日志,我就是下午顿悟突然想起来为什么不看看日志呢。
果然一看日志之后,就发现请求地址跟我配的东西的区别了,这才能重新配正确。
经验还是太少了,以后一定要养成跟着日志走的习惯。。
Ubuntu:一个部署好的tomcat应用(war包)怎么用Nginx实现动静分离?的更多相关文章
- 转:创建一个javaweb项目,以及导出war包
一.使用IDEA创建一个javaweb项目 1.File->New Project选择Web Application 1 2 然后填写好路径和项目名称,点击确定. 1 2 2.先看一下刚创建好的 ...
- 配置tomcat下war包可以自压缩
<Host name="localhost" appBase="/home/hark/web" unpackWARs="true" a ...
- 使用Tomcat发布war包
第一步:下载tomacat 1.下载地址:http://tomcat.apache.org 2.解压后目录如下 3.双击bin文件夹下startup.bat 即可启动tomcat, 计算机会弹出控制台 ...
- Ideal打war包和tomcat展示War包
今天主要是介绍如何把java代码把成war包以及如何在tomcat中放置展示.比较简单.大家可以看看 刚开始ideal 不知道打包,网上搜索了一个教程,看了半天没看会. 主要还是说的不太明白 . 不过 ...
- Springboot中,Tomcat启动war包的流程
将一个SpringBoot项目,打成war包 <!-- 1. 修改POM依赖 --> <dependency> <groupId>org.springframewo ...
- Tomcat 发布war包提示war包超出大小修改
error信息: java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$Size ...
- 手动用tomcat启动war包,无法访问web项目
先说一下自己采的小坑,网上大多解答都是复制来复制去,不说重点在哪.我这里简单总结下访问路径问题 一.用idea打成war包,具体步骤如下图: 步骤:在项目配置选Artifacts新建Web Appli ...
- linux下tomcat运行war包常用命令
一.先是war包copy到 linux 的相关目录,我这的是/opt/soft/tomcat_ecp/webapps. 如果是老项目,在导入war的之前,习惯上是把之前的war备份一下, 如 mv p ...
- Tomcat发布War包或者Maven项目
在tomcat的conf目录下面的server.xml中修改如下: Host name="localhost" appBase="webapps" unpac ...
随机推荐
- 【TensorRT】自定义网络层的实现custom layers
参考 1. Extending TensorRT With Custom Layers; 2. TensorRT Samples: MNIST(Plugin, add a custom layer); ...
- npm 安装 -D 和-S的区别
-D 是在开发环境中协助开发需要使用的-S是生产环境打包时需要的,在package.json中 -D在devDependencies对象中,-S在dependencies对象中
- redis 部署
wget http://download.redis.io/releases/redis-4.0.14.tar.gz tar -zxvf redis-4.0.14.tar.gz mv redis-4. ...
- 机器学习之径向基神经网络(RBF NN)
本文基于台大机器学习技法系列课程进行的笔记总结. 主要内容如下图所示: 首先介绍一下径向基函数网络的Hypothesis和网络的结构,然后介绍径向基神经网络学习算法,以及利用K-means进行的学习, ...
- EscaperWrapper 转义和反转义
System.out.println("转义HTML,注意汉字:"+StringEscapeUtils.escapeHtml4("<font>chen磊 x ...
- 将linux的root用户的家目录由/root切换为/home/root
步骤1,先以root登录,然后创建目录/home/root步骤2,vi /etc/passwd里root用户的家目录为/home/root:步骤3,cp -rf /root/ /home/将原来的ro ...
- 030 Android 第三方开源下拉框:NiceSpinner的使用+自定义Button样式+shape绘制控件背景图+图片选择器(selector)
1.NiceSpinner下拉框控件介绍 Android原生的下拉框Spinner基本上可以满足Android开发对于下拉选项的设计需求,但现在越来越流行的下拉框不满足于Android原生提供的下拉框 ...
- 027 Android 可扩展的listview:ExpandableListView的使用案例
1.ExpandableListView简介 ExpandableListView是一种用于垂直滚动展示两级列表的视图,和 ListView 的不同之处就是它可以展示两级列表,分组可以单独展开显示子选 ...
- [Xamarin] - 连接 Mac Agent 显示 "couldn't connect to xxxx, please try again" 之解决
背景 在 VS 2017 的 Xamarin 项目中,配置 Mac Agent 连接到本地虚拟机中的 MacOS 失败. 1. MacOS 已启用远程登陆.2. SSH 可以登陆成功.3. 防火墙已关 ...
- Mybatis笔记4
mybatis中多对多的步骤 示例:用户和角色,一个用户可以有多个角色,一个角色可以赋予多个用户 步骤: 建立两张表:用户表,角色表,让用户表和角色表具有多对多的关系,需要使用中间表,中间表中包含两张 ...