動靜分離,提高網頁訪問速度


起源

    有些人總是不帶我喝咖啡,認為喝咖啡高雅,吃大蒜低俗,還好,沒有俗就沒有雅。。。我就俗了,怎么地,打我呀。。。。哈哈

 

    動靜分離,那么什么動態的,什么是靜態的呢?

 

    訪問網頁的時候,我們總會發現瀏覽器會加載各種各樣的文件,有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:

[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:

[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環境變量:

[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:

[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環境變量:

[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是否安裝成功:

[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的目錄層次結構,寫一個基本的頁面,如下:

[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目錄):

<Host name="www.kel.com" appBase="webapps" unpackWARS="true" autoDeploy="true">

        <Context path="" docBase="kel" reloadable="true" />

      </Host>

    測試訪問:

[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

 

    配置主機名解析:

[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目錄中,用來測試靜態文件的訪問:

[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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM