前言
用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是如何處理,然后影響給客戶端的。
首先找到服務(wù)器上nginx的配置文件的位置
可以通過 whereis nginx 命令來查找,一般在/etc/nginx/nginx.conf打開配置文件
vim nginx.conf,找到http區(qū)塊,所以nginx相關(guān)的配置均在此處設(shè)置。找到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
}
}
- 如何訪問一臺(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;
}
}
}
- 總結(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ā)能力。