2[服務(wù)器篇]nginx和tomcat的區(qū)別是什么?

前言

用100篇文章講清面試過程中80%的知識(shí)點(diǎn),只要這100篇文章熟練掌握,了然于胸,就可以面試勢(shì)如破竹,對(duì)面試官進(jìn)行360°的反擊,吊打大部分面試官,瘋狂收割大廠Offer!

文章持續(xù)更新,每周兩篇。會(huì)按照知識(shí)點(diǎn)進(jìn)行分類。分為服務(wù)器篇、PHP篇、數(shù)據(jù)庫(kù)篇、緩存篇、消息隊(duì)列篇、算法設(shè)計(jì)模式篇、分布式服務(wù)篇。

本系列的寫作思路是,用一個(gè)大部分程序員容易混淆或者不太理解的概念入手,用第一性原理講解問題涉及的知識(shí)點(diǎn),如何將知識(shí)點(diǎn)用到實(shí)際項(xiàng)目中,以及存在哪些坑、如何避坑,一切站在實(shí)戰(zhàn)的角度。爭(zhēng)取用一篇文章講清楚,以后您再遇到此類問題,直接參考文中的解決思路即可,無需再浪費(fèi)時(shí)間,查閱大量隔靴搔癢的文章。

上篇文章我們最后介紹了nginx和tomcat。當(dāng)然兩者均可以作為web服務(wù)器,收到客戶端請(qǐng)求,然后給瀏覽器返回處理后的數(shù)據(jù)。但這不是這篇文章的重點(diǎn),這篇文章主要講講對(duì)于大中小項(xiàng)目,是如何使用nginx來實(shí)現(xiàn)靜動(dòng)分離,提高服務(wù)器的并發(fā)性能,所以本質(zhì)上講,這是一篇關(guān)于靜態(tài)資源和動(dòng)態(tài)資源如何部署的文章。當(dāng)你所在的項(xiàng)目遇到訪問瓶頸的時(shí)候,希望這篇文章能對(duì)你有所啟發(fā)。

這是上篇文章介紹的nginx和tomcat的區(qū)別的,大家可以再看一下:
雖然Tomcat也可以認(rèn)為是HTTP服務(wù)器,內(nèi)部集成了http服務(wù)器的相關(guān)功能,但通常它仍然會(huì)和Nginx配合在一起使用。
nginx常用做靜態(tài)內(nèi)容服務(wù)和反向代理服務(wù)器,以及頁(yè)面前端高并發(fā)服務(wù)器。
嚴(yán)格的來說,Nginx 應(yīng)該叫做「HTTP Server」;而 Tomcat 則是一個(gè)「Application Server」,或者更準(zhǔn)確的來說,是一個(gè)「Servlet/JSP」應(yīng)用的容器(Ruby/Python 等其他語(yǔ)言開發(fā)的應(yīng)用也無法直接運(yùn)行在 Tomcat 上),這種特性導(dǎo)致了它們?cè)谑褂弥杏忻鞔_的分工職責(zé)。tomcat更多用來做做一個(gè)應(yīng)用容器,讓java web app跑在里面的東西。大部分適用于靜態(tài)資源文件的訪問(圖片,文件)

一 本篇文章要解決的問題

什么是靜態(tài)資源,什么是動(dòng)態(tài)資源
常規(guī)web服務(wù)器如何來訪問靜態(tài)和動(dòng)態(tài)資源
如何使用nginx來實(shí)現(xiàn)靜態(tài)資源和動(dòng)態(tài)資源的分離

二 什么是靜態(tài)資源,什么是動(dòng)態(tài)資源

靜態(tài)資源

對(duì)于移動(dòng) APP 來說,這些靜態(tài)資源主要是圖片、視頻和流媒體信息;對(duì)于 Web 網(wǎng)站來說,則包括了 JavaScript 文件、CSS 文件、靜態(tài) HTML 文件等等。

友情提示:雖然大家都知道,但還是要說一個(gè)很小白的問題。并不是不會(huì)動(dòng)的就是靜態(tài)資源。有些同學(xué)把視頻、動(dòng)態(tài)圖片認(rèn)為是動(dòng)態(tài)資源,這是不對(duì)的。

動(dòng)態(tài)資源

一般如果一次請(qǐng)求會(huì)從操作數(shù)據(jù)庫(kù)或者緩存中的數(shù)據(jù),那可以認(rèn)為此次請(qǐng)求是動(dòng)態(tài)請(qǐng)求,只要涉及到數(shù)據(jù)庫(kù)的操作,必然會(huì)使用到后臺(tái)的語(yǔ)言,如python,java,php。所以也可以大概的這樣認(rèn)為,就是后綴名是后臺(tái)語(yǔ)言開發(fā)的腳本就是動(dòng)態(tài)文件。如要訪問一個(gè)php文件 test.php,一個(gè)python文件test.py,這個(gè)就是動(dòng)態(tài)資源。

三 常規(guī)web服務(wù)器如何來訪問靜態(tài)和動(dòng)態(tài)資源

以nginx作為web服務(wù)器舉例。

web服務(wù)器是這樣的一個(gè)程序,可以對(duì)用戶(如瀏覽器、APP)的請(qǐng)求進(jìn)行響應(yīng)。比如我們通過瀏覽器訪問百度,可以得到百度的首頁(yè)。
請(qǐng)求服務(wù)器時(shí)可能會(huì)請(qǐng)求靜態(tài)的資源(如一個(gè)靜態(tài)的html文件、一張圖片、一個(gè)視頻),也可能請(qǐng)求一個(gè)動(dòng)態(tài)腳本,如一個(gè)PHP文件。下面分別說下這兩種類型的文件,nginx是如何處理,然后影響給客戶端的。

  1. 首先找到服務(wù)器上nginx的配置文件的位置
    可以通過 whereis nginx 命令來查找,一般在/etc/nginx/nginx.conf

  2. 打開配置文件vim nginx.conf,找到http區(qū)塊,所以nginx相關(guān)的配置均在此處設(shè)置。

  3. 找到http區(qū)塊里的server區(qū)塊,server區(qū)塊就是一個(gè)web項(xiàng)目的設(shè)置,比如你服務(wù)器上安裝了兩個(gè)項(xiàng)目,就可以設(shè)置兩個(gè)server區(qū)塊,每個(gè)區(qū)塊對(duì)應(yīng)一個(gè)項(xiàng)目。如下圖

http{
   server{
       listen 80;
       當(dāng)我們使用www.a.com來訪問服務(wù)器時(shí),web服務(wù)器的根目錄是/var/www/project1
       server_name www.a.com
       root /var/www/project1;
       index index.html index.php
    }
  server{
       listen 80;
       當(dāng)我們使用www.b.com來訪問服務(wù)器時(shí),web服務(wù)器的根目錄是/var/www/project2,從而實(shí)現(xiàn)一臺(tái)服務(wù)器上可以存著多個(gè)項(xiàng)目,以前很多服務(wù)器廠商推出的虛擬主機(jī),就是使用這個(gè)原理來實(shí)現(xiàn)的。
       server_name www.b.com
       root /var/www/project2;
       index index.html index.php
    }
}
  1. 如何訪問一臺(tái)服務(wù)器上的靜態(tài)資源和動(dòng)態(tài)資源
    關(guān)于Nginx 收到一個(gè)請(qǐng)求時(shí),它是如何去匹配 URI 并找到合適的 Location 請(qǐng)看這篇文章
    https://www.cnblogs.com/cheyunhua/p/7927674.html
    先簡(jiǎn)單介紹一下server區(qū)塊中關(guān)于Location幾個(gè)比較常用的設(shè)置
1. 當(dāng)用戶請(qǐng)求 http://localhost/example 時(shí),這里的 $uri 就是 /example。 
try_files 會(huì)到硬盤里嘗試找這個(gè)文件。如果存在名為 /$root/example(其中 $root 是項(xiàng)目代碼安裝目錄)的文件,就直接把這個(gè)文件的內(nèi)容發(fā)送給用戶。 
顯然,目錄中沒有叫 example 的文件。然后就看 $uri/,增加了一個(gè) /,也就是看有沒有名為 /$root/example/ 的目錄。 
又找不到,就會(huì) fall back 到 try_files 的最后一個(gè)選項(xiàng) /index.php,發(fā)起一個(gè)內(nèi)部 “子請(qǐng)求”,也就是相當(dāng)于 nginx 發(fā)起一個(gè) HTTP 請(qǐng)求到 http://localhost/index.php。 

location / {
            try_files $uri $uri/ /index.php?$query_string;
}

2. 直接匹配網(wǎng)站根,通過域名訪問網(wǎng)站首頁(yè)比較頻繁,使用這個(gè)會(huì)加速處理,官網(wǎng)如是說。
#這里是直接轉(zhuǎn)發(fā)給后端應(yīng)用服務(wù)器了,也可以是一個(gè)靜態(tài)首頁(yè)
location = / {
    proxy_pass http://tomcat:8080/index
}

3.  第三個(gè)必選規(guī)則是處理靜態(tài)文件請(qǐng)求,這是nginx作為http服務(wù)器的強(qiáng)項(xiàng)
# 有兩種配置模式,目錄匹配或后綴匹配,任選其一或搭配使用
location ^~ /static/ {
    root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
    root /webroot/res/;
}

4. 第四個(gè)規(guī)則就是通用規(guī)則,用來轉(zhuǎn)發(fā)動(dòng)態(tài)請(qǐng)求到后端應(yīng)用服務(wù)器

#非靜態(tài)文件請(qǐng)求就默認(rèn)是動(dòng)態(tài)請(qǐng)求,自己根據(jù)實(shí)際把握
location / {
    proxy_pass http://tomcat:8080/
}

有了以上只是作為鋪墊,相信你很容易可以看懂下面的nginx服務(wù)器的設(shè)置

http{
   server{
       listen 80;
       server_name www.a.com
       # 指定網(wǎng)站根目錄
       root /var/www/project1;
       index index.html index.php
       
        匹配uri請(qǐng)求中含.php并且?guī)et參數(shù),如a.php?a=1
        location ~ \.php?.*$ {
                fastcgi_index index.php;
                此處不是本文重點(diǎn),你只需要了解,這個(gè)地方是把請(qǐng)求轉(zhuǎn)發(fā)給php,php有兩種與nginx的通信方式,一種是通過監(jiān)聽9000端口,一種是通過sock文件,此處是使用sock文件
                fastcgi_pass unix:/run/php/php7.2-fpm.sock;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include        fastcgi_params;
        }
        #  location /  對(duì)所有的請(qǐng)求有效,會(huì)匹配所有的請(qǐng)求
        location / {
               對(duì)所有根目錄下的文件、目錄,都將請(qǐng)求重定向到index.php文件,因?yàn)橐话鉖HP框架都是單入口,這樣可以保證所有的請(qǐng)求都會(huì)通過項(xiàng)目的入口文件 
                try_files $uri $uri/ /index.php?$args;
        }
    }

}
  1. 總結(jié)。我們通過server區(qū)塊的root選項(xiàng)來指定網(wǎng)站的根目錄;通過location /來配置所有的請(qǐng)求,如果請(qǐng)求的是靜態(tài)文件,直接從根目錄找到對(duì)應(yīng)的靜態(tài)文件返回給客戶端;通過location ~ .php?.*$來匹配uri中含.php的請(qǐng)求,然后轉(zhuǎn)發(fā)給php處理程序,處理完后返回給nginx,然后返回給客戶端。

四 使用nginx來實(shí)現(xiàn)靜態(tài)資源和動(dòng)態(tài)資源的分離

其實(shí)就是請(qǐng)求靜態(tài)資源直接通過nginx返回,請(qǐng)求動(dòng)態(tài)動(dòng)態(tài)資源,通過nginx的反向代理或者負(fù)載均衡,將請(qǐng)求重定向到其他服務(wù)器的處理程序,待處理完成后,返回給nginx,nginx在返回給客戶端。

實(shí)現(xiàn)靜態(tài)資源和動(dòng)態(tài)資源的分離,nginx相關(guān)設(shè)置
通過負(fù)載均衡的方式:
找到nginx的配置文件,在http區(qū)塊中添加如下內(nèi)容:
http{
  負(fù)載均衡可以隨便起名字,如我這個(gè)地方起的是my_host
  upstream my_host{
        根據(jù)實(shí)際情況設(shè)置server的值,如要訪問的真正服務(wù)在192.168.1.104:8080 端口,同時(shí)可以設(shè)置權(quán)重。
        server 要代理的ip:80 weight=5; 
        server 192.168.1.104:8080 weight=1;
  }

 server{
     listen 80;
     server_name www.baidu.com
     index index.html index.php
     
     location / {
        root /var/www/html
        根據(jù)upstream設(shè)置的名字,前加http
        proxy_pass http://my_host;
     }
     
  }
}

通過反向代理的方式:
找到nginx的配置文件,在http區(qū)塊中添加如下內(nèi)容:
http{
 server{
     listen 80;
     server_name [www.abc.com](http://www.abc.com)
     index index.html index.php


     location / {
         root /var/www/html
         可以設(shè)置反向代理相關(guān)的一些參數(shù)
         proxy_set_header Host www.54php.cn;
         設(shè)置反向代理的服務(wù)器的地址
         proxy_pass http://192.168.1.104:8080;
     }
  }
}
總結(jié)

要想實(shí)現(xiàn)靜態(tài)資源和動(dòng)態(tài)資源分離的分離,其實(shí)就是訪問的靜態(tài)資源在一臺(tái)服務(wù)器上,需要的時(shí)候,直接返回。訪問的動(dòng)態(tài)資源在另一臺(tái)服務(wù)器(通過反向代理)或幾臺(tái)服務(wù)器(通過負(fù)載均衡)上,這樣處理相關(guān)的動(dòng)態(tài)資源就不用占用本臺(tái)服務(wù)器的CPU資源,這樣就可以處理更多的請(qǐng)求,提高系統(tǒng)的并發(fā)能力。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容