动静分离,提高网页访问速度
起源
有些人总是不带我喝咖啡,认为喝咖啡高雅,吃大蒜低俗,还好,没有俗就没有雅。。。我就俗了,怎么地,打我呀。。。。哈哈
动静分离,那么什么动态的,什么是静态的呢?
访问网页的时候,我们总会发现浏览器会加载各种各样的文件,有html文件,有css样式表,有js脚本,还有图片,还有流媒体等各种文件,这些其实就是静态的文件,放在服务器上,无须动态生成的文件那么就是静态文件。那么什么是动态文件呢?例如java写的jsp文件,需要通过编译器进行编译成字节码文件,然后在java虚拟机上运行,运行之后,返回给客户端一个响应,有的时候,还需要到数据库中取出数据,那么这种需要经过编译的文件就称之为动态文件。
动态文件的处理比静态文件的处理速度要慢N倍,慢在啥地方呢?首先,动态文件需要编译,耗费时间,动态文件要去连接数据库,耗费时间,动态文件需要组织成http响应,耗费时间,根据java的流程,那么就是根据url,找到jsp文件,将jsp文件转换成servlet文件,然后形成类文件,然后在jvm上运行,jvm可能还要加载额外的类文件,然后组成成响应返回给servlet,然后再返回给客户端。
在使用动静分离的时候,一般使用的模型如下所示(微信公众号:运维Linux和python):
在使用动静分离的时候,需要将一些静态的文件和动态的文件分离开来,从而使用nginx来处理静态请求,而使用tomcat来处理动态的请求,从而会大大的提高处理速度,为啥?
nginx和httpd是专门用来处理静态文件的,效率极高,并且由nginx直接响应,减少了向后端转发的过程;将动态内容和静态内容进行分离,可以提高资源利用率,nginx的性能得到发挥,也让tomcat不会那么繁忙,动态服务器机器耗费性能,例如在java中的各种方法区对象的回收,堆内存的回收等。
构建动静分离的环境
要想构建动静分离的环境,那么就需要安装nginx,安装jdk,然后安装tomcat,具体的步骤如下:
编译安装nginx:
1 2 3 4 5 6 7 8 9 | [root@mogilenode2 nginx-1.10.1] # ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-pcre [root@mogilenode2 nginx-1.10.1] # make && make install [root@mogilenode2 ~] # /usr/local/nginx/sbin/nginx (启动nginx) [root@mogilenode2 ~] # netstat -tnlp|grep nginx(查看监听端口,并且使用浏览器访问测试) tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 13933 /nginx |
安装jdk:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | [root@mogilenode3 server] # rpm -ivh jdk-8u144-linux-x64.rpm Preparing... ########################################### [100%] 1:jdk1.8.0_144 ########################################### [100%] Unpacking JAR files... tools.jar... plugin.jar... javaws.jar... deploy.jar... rt.jar... jsse.jar... charsets.jar... localedata.jar... |
配置java环境变量:
1 2 3 4 5 6 7 8 9 | [root@mogilenode3 server] # echo "export JAVA_HOME=/usr/java/latest">/etc/profile.d/java.sh [root@mogilenode3 server] # echo "export PATH=$JAVA_HOME/bin:$PATH">>/etc/profile.d/java.sh [root@mogilenode3 server] # cat /etc/profile.d/java.sh export JAVA_HOME= /usr/java/latest export PATH= /bin : /usr/local/sbin : /usr/local/bin : /sbin : /bin : /usr/sbin : /usr/bin : /root/bin |
测试jdk及环境变量是否成功:
安装tomcat:
1 2 3 4 5 | [root@mogilenode3 server] # tar -xf apache-tomcat-8.5.20.tar.gz -C /usr/local/ l[root@mogilenode3 server] # ln -sv /usr/local/apache-tomcat-8.5.20/ /usr/local/tomcat ` /usr/local/tomcat ' -> `/usr/local/apache-tomcat-8.5.20/' |
配置tomcat环境变量:
1 2 3 4 5 6 7 8 9 | [root@mogilenode3 local ] # vim /etc/profile.d/tomcat.sh [root@mogilenode3 local ] # cat !$ cat /etc/profile .d /tomcat .sh export CATALINA_HOME= /usr/local/tomcat export PATH=$CATALINA_HOME /bin :$PATH |
测试tomcat是否安装成功:
1 2 3 4 5 6 7 | [root@mogilenode3 ~] # netstat -tnlp|grep java(注意浏览器访问的时候,添加端口号来进行访问) tcp 0 0 :::8080 :::* LISTEN 1125 /java tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN 1125 /java tcp 0 0 :::8009 :::* LISTEN 1125 /java |
创建动态文件
根据java的目录层次结构,写一个基本的页面,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | [root@mogilenode3 webapps] # mkdir kel [root@mogilenode3 webapps] # cd kel [root@mogilenode3 kel] # ls -l total 0 [root@mogilenode3 kel] # mkdir {META-INF,WEB-INF,classes,lib} [root@mogilenode3 kel] # vim index.jsp [root@mogilenode3 kel] # cat index.jsp <%@ page language= "java" %> <%@ page import = "java.util.*" %> <html> < head > <title>JAVA PAGE< /title > < /head > <body> <% out.println( "Hello,World" ); %> < /body > < /html > [root@mogilenode3 kel] # ls -l total 20 drwxr-xr-x 2 root root 4096 Sep 20 14:46 classes -rw-r--r-- 1 root root 201 Sep 20 14:46 index.jsp drwxr-xr-x 2 root root 4096 Sep 20 14:46 lib drwxr-xr-x 2 root root 4096 Sep 20 14:46 META-INF drwxr-xr-x 2 root root 4096 Sep 20 14:46 WEB-INF |
修改tomcat的配置文件server.xml(添加一个虚拟主机,主机名为www.kel.com,,默认路径为webapps下面的kel目录):
1 2 3 4 5 | <Host name= "www.kel.com" appBase= "webapps" unpackWARS= "true" autoDeploy= "true" > <Context path= "" docBase= "kel" reloadable= "true" /> < /Host > |
测试访问:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | [root@mogilenode3 conf] # grep "www.kel.com" /etc/hosts (设置主机名解析) 192.168.1.238 www.kel.com [root@mogilenode3 conf] # curl http://www.kel.com:8080 (使用curl进行访问) <html> < head > <title>JAVA PAGE< /title > < /head > <body> Hello,World < /body > < /html > |
配置nginx
配置主机名解析:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | [root@mogilenode2 nginx] # grep "www.kel.com" /etc/hosts 192.168.1.237 www.kel.com [root@mogilenode2 conf] # ls -l nginx.conf(修改nginx配置文件,将动态请求也就是文件后缀为jsp或者do的请求转发到tomcat上,由于是虚拟主机,所以url中必须写上主机名,静态页面在nginx上处理,静态页面在html路经下) -rw-r--r-- 1 root root 2727 Sep 20 15:09 nginx.conf server_name www.kel.com; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } location ~* \.(jsp| do )$ { proxy_pass http: //www .kel.com:8080; } |
上传静态文件到nginx的html目录中,用来测试静态文件的访问:
1 2 3 | [root@mogilenode2 nginx] # ls -l html/1.jpg -rw-r--r-- 1 root root 25854 Sep 20 15:13 html /1 .jpg |
访问nginx服务器测试静态文件访问:
访问nginx服务器,测试动态页面访问:
总结
总体上来说,动静分离还是比较简单的,主要让前端的代理服务器直接响应静态请求,让前端的代理服务器转发动态请求到后端的tomcat服务器即可。
注意上面的是实验环境,对于tomcat的运行的用户是直接的root用户,在生产中,必须修改为其他不能登录的用户,例如tomcat用户。
微信公众号:运维Linux和python
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?