-
HTTP網(wǎng)站資源類型
-
HTTP網(wǎng)站訪問度量
-
企業(yè)常用網(wǎng)站服務(wù)軟件
-
nginx網(wǎng)站服務(wù)特性
-
nginx服務(wù)部署安裝
1.HTTP網(wǎng)站資源類型
?1) 每個(gè)頁(yè)面都有一個(gè)固定的URL/URI地址,且URL一般以.html悦陋、.htm、.shtml等常見形式為后綴揽咕,而且地址中不含有問號(hào)“?”或“&”等特殊符號(hào)舞虱。
?2) 網(wǎng)頁(yè)內(nèi)容一經(jīng)發(fā)布到網(wǎng)站服務(wù)器上蔫仙,無論是否有用戶訪問,每個(gè)網(wǎng)頁(yè)的內(nèi)容都是保存在網(wǎng)站服務(wù)器文件系統(tǒng)上的府蔗,也就是說,靜態(tài)網(wǎng)頁(yè)是實(shí)實(shí)在在保存在服務(wù)器上的文件實(shí)體汞窗,每個(gè)網(wǎng)頁(yè)都是一個(gè)獨(dú)立的文件姓赤。 缺點(diǎn)
?3) 網(wǎng)頁(yè)內(nèi)容是固定不變的,因此仲吏,容易被搜索引擎收錄(容易被用戶找到)(優(yōu)點(diǎn))不铆。
?4) 因?yàn)榫W(wǎng)頁(yè)沒有數(shù)據(jù)庫(kù)的支持蝌焚,所以在網(wǎng)站制作和維護(hù)方面的工作量較大,當(dāng)網(wǎng)站信息量很大時(shí)誓斥,完全依靠靜態(tài)網(wǎng)頁(yè)比較困難(缺點(diǎn))只洒。
?5) 網(wǎng)頁(yè)的交互性較差,在程序的功能實(shí)現(xiàn)方面有較大的限制(缺點(diǎn))劳坑。
?6) 網(wǎng)頁(yè)程序在用戶瀏覽器端解析毕谴,如IE瀏覽器,程序解析效率很高距芬,由于服務(wù)器端不進(jìn)行解析涝开,并且不需要讀取數(shù)據(jù)庫(kù),因此服務(wù)器端可以接受更多的并發(fā)訪問框仔。當(dāng)客戶端向服務(wù)器請(qǐng)求數(shù)據(jù)時(shí)忠寻,服務(wù)器會(huì)直接從磁盤文件系統(tǒng)上返回?cái)?shù)據(jù)(不做任何解析)。待客戶端拿到數(shù)據(jù)后存和,在瀏覽器端解析并展現(xiàn)出來(優(yōu)點(diǎn))。
?1) 網(wǎng)頁(yè)擴(kuò)展名后綴常見為:.asp衷旅、.aspx捐腿、.php、.js柿顶、.do茄袖、.cgi等。
?2) 網(wǎng)頁(yè)一般以數(shù)據(jù)庫(kù)技術(shù)為基礎(chǔ)嘁锯,大大降低了網(wǎng)站維護(hù)的工作量宪祥。
?3) 采用動(dòng)態(tài)網(wǎng)頁(yè)技術(shù)的網(wǎng)站可以實(shí)現(xiàn)更多的功能,如用戶注冊(cè)家乘、用戶登錄蝗羊、在線調(diào)查、投票仁锯、用戶管理耀找、訂單處理、發(fā)博文等业崖。
?4) 動(dòng)態(tài)網(wǎng)頁(yè)并不是獨(dú)立存在于服務(wù)器上的網(wǎng)頁(yè)文件野芒,當(dāng)用戶請(qǐng)求服務(wù)器上的動(dòng)態(tài)程序時(shí),服務(wù)器解析這些程序并可能通過讀取數(shù)據(jù)庫(kù)來返回一個(gè)完整的網(wǎng)頁(yè)內(nèi)容双炕。
?5) 動(dòng)態(tài)網(wǎng)頁(yè)中的“狞悲?”在搜索引擎的收錄方面存在一定的問題,搜索引擎一般不會(huì)從一個(gè)網(wǎng)站的數(shù)據(jù)庫(kù)中訪問全部網(wǎng)頁(yè)妇斤,或者出于技術(shù)等方面的考慮摇锋,搜索蜘蛛一般不會(huì)去抓取網(wǎng)址中“丹拯?”后面的內(nèi)容,因此在企業(yè)通過搜索引擎進(jìn)行推廣時(shí)乱投,需要針對(duì)采用動(dòng)態(tài)網(wǎng)頁(yè)的網(wǎng)站做一定的技術(shù)處理(偽靜態(tài)技術(shù))咽笼,以便適應(yīng)搜索引擎的抓取要求。
什么是盜鏈:
其它公司網(wǎng)站盜取本地網(wǎng)站鏈接資源,消耗本地網(wǎng)站流量
?1) 網(wǎng)頁(yè)一般以數(shù)據(jù)庫(kù)技術(shù)為基礎(chǔ)戚炫,大大降低了網(wǎng)站維護(hù)的工作量剑刑。
?2) 采用動(dòng)態(tài)網(wǎng)頁(yè)技術(shù)的網(wǎng)站可以實(shí)現(xiàn)更多的功能,如用戶注冊(cè)双肤、用戶登錄施掏、在線調(diào)查、投票茅糜、用戶管理七芭、訂單處理、發(fā)博文等
?3) 網(wǎng)頁(yè)內(nèi)容是固定不變的蔑赘,因此狸驳,容易被搜索引擎收錄(容易被用戶找到)(優(yōu)點(diǎn))
2.網(wǎng)站訪問度量方式:
ip:記錄每一個(gè)用戶源IP地址,進(jìn)行統(tǒng)計(jì)(不同ip訪問ip數(shù)據(jù)累加,統(tǒng)計(jì)方式:awk數(shù)組缩赛,分析日志耙箍,ELK(開源軟件程序),百度統(tǒng)計(jì)等)
pv:記錄統(tǒng)計(jì)頁(yè)面訪問量pageview
uv:記錄獨(dú)立訪客數(shù)
cookie的由來:
HTTP協(xié)議是無狀態(tài)的酥馍,無狀態(tài)的意思是每次請(qǐng)求都是獨(dú)立的辩昆,它的執(zhí)行情況和結(jié)果與前面的請(qǐng)求和之后的請(qǐng)求都無直接關(guān)系,它不會(huì)受前面的請(qǐng)求響應(yīng)情況直接影響旨袒,也不會(huì)直接影響后面的請(qǐng)求響應(yīng)情況汁针。
一句有意思的話來描述就是人生只如初見,對(duì)服務(wù)器來說砚尽,每次請(qǐng)求都是全新的施无。
狀態(tài)可以理解為客戶端和服務(wù)器在某次會(huì)話中產(chǎn)生的數(shù)據(jù),那無狀態(tài)的就以為這些數(shù)據(jù)不會(huì)被保留必孤。會(huì)話中產(chǎn)生的數(shù)據(jù)又是我們需要保存的帆精,也就是說要“保持狀態(tài)”。因此cookie就是在這樣一個(gè)場(chǎng)景下誕生隧魄。
什么是cookie:
cookie具體指的是一段小信息卓练,它是服務(wù)器發(fā)送出來存儲(chǔ)在瀏覽器上的一組組鍵值對(duì),下次訪問服務(wù)器時(shí)瀏覽器會(huì)自動(dòng)攜帶這些鍵值對(duì)购啄,以便服務(wù)器提取有用信息襟企。
:
session的由來:
cookie雖然在一定程度上解決了“保持狀態(tài)“的需求,但是由于cookie本身最大支持4096字節(jié)狮含,以及cookie本身保存在客戶端顽悼,可能被攔截或竊取曼振,因此就需要有一種新的東西,它能支持更多的字節(jié)蔚龙,并且他保存在服務(wù)器冰评,有較高的安全性。這就是session木羹。
問題來了甲雅,基于http協(xié)議的無狀態(tài)特征,服務(wù)器根本就不知道訪問者是”誰“坑填。那么上述的cookie就起到橋接的作用抛人。
我們可以給每個(gè)客戶端的cookie分配一個(gè)唯一的id,這樣用戶在訪問時(shí)脐瑰,通過cookie妖枚,服務(wù)器就知道來的人是”誰“。然后我們?cè)俑鶕?jù)不同的cookie的id苍在,在服務(wù)器上保存一段時(shí)間的私密資料绝页,如”賬號(hào)密碼“等。
總結(jié)而言:cookie彌補(bǔ)了http無狀態(tài)的不足寂恬,讓服務(wù)器知道來的人是”誰“抒寂,但是cookie以文本的形式保存在本地,自身安全性較差掠剑,所以我們就通過cookie識(shí)別不同的用戶,對(duì)應(yīng)的在session里保存私密的信息以及超過4096字節(jié)的文本郊愧。
ps:cookie以文本格式存儲(chǔ)在瀏覽器上朴译,存儲(chǔ)量有限;而會(huì)話存儲(chǔ)在服務(wù)端属铁,可以無限量存儲(chǔ)多個(gè)變量并且比cookie更安全
3.企業(yè)常用網(wǎng)站web服務(wù)
靜態(tài)web服務(wù): nginx apache Tengine
動(dòng)態(tài)web服務(wù): php(php編寫動(dòng)態(tài)頁(yè)面) tomcat(java編寫動(dòng)態(tài)頁(yè)面) python(框架編寫動(dòng)態(tài)頁(yè)面)
nginx網(wǎng)站服務(wù):
?特點(diǎn):處理高并發(fā)能力眠寿,占用本地服務(wù)器資源比較少(內(nèi)存資源)
?功能:⑴.nginx可以實(shí)現(xiàn)網(wǎng)站web服務(wù)功能
??⑵.nginx可以實(shí)現(xiàn)負(fù)載均衡功能
??⑶.nginx可以實(shí)現(xiàn)數(shù)據(jù)緩存功能
?緩存的作用是用來減緩后端壓力
nginx使用的網(wǎng)絡(luò)模型是epoll
apache使用的網(wǎng)絡(luò)模型是select
epoll與select:
?select,epoll都是IO多路復(fù)用的機(jī)制焦蘑。I/O多路復(fù)用就通過一種機(jī)制盯拱,可以監(jiān)視多個(gè)描述符,一旦某個(gè)描述符就緒(一般是讀就緒或者寫就緒)例嘱,能夠通知程序進(jìn)行相應(yīng)的讀寫操作狡逢。但select,epoll本質(zhì)上都是同步I/O拼卵,因?yàn)樗麄兌夹枰谧x寫事件就緒后自己負(fù)責(zé)進(jìn)行讀寫奢浑,也就是說這個(gè)讀寫過程是阻塞的,而異步I/O則無需自己負(fù)責(zé)進(jìn)行讀寫腋腮,異步I/O的實(shí)現(xiàn)會(huì)負(fù)責(zé)把數(shù)據(jù)從內(nèi)核拷貝到用戶空間雀彼。
一.問題引出
問題的引出壤蚜,當(dāng)需要讀兩個(gè)以上的I/O的時(shí)候,如果使用阻塞式的I/O徊哑,那么可能長(zhǎng)時(shí)間的阻塞在一個(gè)描述符上面袜刷,另外的描述符雖然有數(shù)據(jù)但是不能讀出來,這樣實(shí)時(shí)性不能滿足要求莺丑,大概的解決方案有以下幾種:
1.使用多進(jìn)程或者多線程著蟹,但是這種方法會(huì)造成程序的復(fù)雜,而且對(duì)與進(jìn)程與線程的創(chuàng)建維護(hù)也需要很多的開銷窒盐。(Apache服務(wù)器是用的子進(jìn)程的方式草则,優(yōu)點(diǎn)可以隔離用戶)
2.用一個(gè)進(jìn)程,但是使用非阻塞的I/O讀取數(shù)據(jù)蟹漓,當(dāng)一個(gè)I/O不可讀的時(shí)候立刻返回炕横,檢查下一個(gè)是否可讀,這種形式的循環(huán)為輪詢(polling)葡粒,這種方法比較浪費(fèi)CPU時(shí)間份殿,因?yàn)榇蠖鄶?shù)時(shí)間是不可讀,但是仍花費(fèi)時(shí)間不斷反復(fù)執(zhí)行read系統(tǒng)調(diào)用嗽交。
3.異步I/O(asynchronous I/O)卿嘲,當(dāng)一個(gè)描述符準(zhǔn)備好的時(shí)候用一個(gè)信號(hào)告訴進(jìn)程,但是由于信號(hào)個(gè)數(shù)有限夫壁,多個(gè)描述符時(shí)不適用拾枣。
4.一種較好的方式為I/O多路轉(zhuǎn)接(I/O multiplexing)(貌似也翻譯多路復(fù)用),先構(gòu)造一張有關(guān)描述符的列表(epoll中為隊(duì)列)盒让,然后調(diào)用一個(gè)函數(shù)梅肤,直到這些描述符中的一個(gè)準(zhǔn)備好時(shí)才返回,返回時(shí)告訴進(jìn)程哪些I/O就緒邑茄。select和epoll這兩個(gè)機(jī)制都是多路I/O機(jī)制的解決方案姨蝴,select為POSIX標(biāo)準(zhǔn)中的,而epoll為L(zhǎng)inux所特有的肺缕。
區(qū)別(epoll相對(duì)select優(yōu)點(diǎn))主要有三:
1.select的句柄數(shù)目受限左医,在linux/posix_types.h頭文件有這樣的聲明:#define __FD_SETSIZE 1024 表示select最多同時(shí)監(jiān)聽1024個(gè)fd。而epoll沒有同木,它的限制是最大的打開文件句柄數(shù)目浮梢。
2.epoll的最大好處是不會(huì)隨著FD的數(shù)目增長(zhǎng)而降低效率,在selec中采用輪詢處理彤路,其中的數(shù)據(jù)結(jié)構(gòu)類似一個(gè)數(shù)組的數(shù)據(jù)結(jié)構(gòu)黔寇,而epoll是維護(hù)一個(gè)隊(duì)列,直接看隊(duì)列是不是空就可以了斩萌。epoll只會(huì)對(duì)“活躍”的socket進(jìn)行操作---這是因?yàn)樵趦?nèi)核實(shí)現(xiàn)中epoll是根據(jù)每個(gè)fd上面的callback函數(shù)實(shí)現(xiàn)的缝裤。那么屏轰,只有“活躍”的socket才會(huì)主動(dòng)的去調(diào)用 callback函數(shù)(把這個(gè)句柄加入隊(duì)列),其他idle狀態(tài)句柄則不會(huì)憋飞,在這點(diǎn)上霎苗,epoll實(shí)現(xiàn)了一個(gè)“偽”AIO。但是如果絕大部分的I/O都是“活躍的”榛做,每個(gè)I/O端口使用率很高的話唁盏,epoll效率不一定比select高(可能是要維護(hù)隊(duì)列復(fù)雜)。
3.使用mmap加速內(nèi)核與用戶空間的消息傳遞检眯。無論是select厘擂,poll還是epoll都需要內(nèi)核把FD消息通知給用戶空間,如何避免不必要的內(nèi)存拷貝就很重要锰瘸,在這點(diǎn)上刽严,epoll是通過內(nèi)核于用戶空間mmap同一塊內(nèi)存實(shí)現(xiàn)的。
二避凝、接口
1)select
1. int select(int maxfdp1舞萄, fd_set *restrict readfds, fd_set *restrict writefds管削, fd_set *restrict exceptfds倒脓, struct timeval *restrict tvptr);
struct timeval{
long tv_sec;
long tv_usec;
}
有三種情況:tvptr == NULL 永遠(yuǎn)等待;tvptr-》tv_sec == 0 && tvptr-》tv_usec == 0 完全不等待含思;不等于0的時(shí)候?yàn)榈却臅r(shí)間崎弃。select的三個(gè)指針都可以為空,這時(shí)候select提供了一種比sleep更精確的定時(shí)器含潘。注意select的第一個(gè)參數(shù)maxfdp1并不是描述符的個(gè)數(shù)饲做,而是最大的描述符加1,一是起限制作用调鬓,防止出錯(cuò),二來可以給內(nèi)核輪詢的時(shí)候提供一個(gè)上屆酌伊,提高效率腾窝。select返回-1表示出錯(cuò),0表示超時(shí)居砖,返回正值是所有的已經(jīng)準(zhǔn)備好的描述符個(gè)數(shù)(同一個(gè)描述符如果讀和寫都準(zhǔn)備好虹脯,對(duì)結(jié)果影響是+2)。
2.int FD_ISSET(int fd奏候, fd_set *fdset); fd在描述符集合中非0循集,否則返回0
3.int FD_CLR(int fd, fd_set *fd_set); int FD_SET(int fd蔗草, fd_set *fdset) ;int FD_ZERO(fd_set *fdset);
用一段linux 中man里的話“FD_ZERO() clears a set.FD_SET() and FD_CLR() respectively add and remove a given file descriptor from a set. FD_ISSET() tests to see if a file descriptor is part of the set; this is useful after select() returns.”這幾個(gè)函數(shù)與描述符的0和1沒關(guān)系咒彤,只是添加刪除檢測(cè)描述符是否在set中疆柔。
2)epoll
1.int epoll_create(int size);
創(chuàng)建一個(gè)epoll的句柄,size用來告訴內(nèi)核這個(gè)監(jiān)聽的數(shù)目一共有多大镶柱。這個(gè)參數(shù)不同于select()中的第一個(gè)參數(shù)旷档,給出最大監(jiān)聽的fd+1的值。需要注意的是歇拆,當(dāng)創(chuàng)建好epoll句柄后鞋屈,它就是會(huì)占用一個(gè)fd值,在linux下如果查看/proc/進(jìn)程id/fd/故觅,是能夠看到這個(gè)fd的厂庇,所以在使用完epoll后,必須調(diào)用close()關(guān)閉输吏,否則可能導(dǎo)致fd被耗盡权旷。
2. int epoll_ctl(int epfd, int op评也, int fd炼杖, struct epoll_event *event);
epoll的事件注冊(cè)函數(shù),它不同與select()是在監(jiān)聽事件時(shí)告訴內(nèi)核要監(jiān)聽什么類型的事件盗迟,而是在這里先注冊(cè)要監(jiān)聽的事件類型坤邪。第一個(gè)參數(shù)是epoll_create()的返回值,第二個(gè)參數(shù)表示動(dòng)作罚缕,用三個(gè)宏來表示:
EPOLL_CTL_ADD:注冊(cè)新的fd到epfd中艇纺;
EPOLL_CTL_MOD:修改已經(jīng)注冊(cè)的fd的監(jiān)聽事件;
EPOLL_CTL_DEL:從epfd中刪除一個(gè)fd邮弹;
第三個(gè)參數(shù)是需要監(jiān)聽的fd黔衡,第四個(gè)參數(shù)是告訴內(nèi)核需要監(jiān)聽什么事,struct epoll_event結(jié)構(gòu)如下:
struct epoll_event {
__uint32_t events; /* Epoll events */
epoll_data_t data; /* User data variable */
};
events可以是以下幾個(gè)宏的集合:
EPOLLIN :表示對(duì)應(yīng)的文件描述符可以讀(包括對(duì)端SOCKET正常關(guān)閉)腌乡;
EPOLLOUT:表示對(duì)應(yīng)的文件描述符可以寫盟劫;
EPOLLPRI:表示對(duì)應(yīng)的文件描述符有緊急的數(shù)據(jù)可讀(這里應(yīng)該表示有帶外數(shù)據(jù)到來);
EPOLLERR:表示對(duì)應(yīng)的文件描述符發(fā)生錯(cuò)誤与纽;
EPOLLHUP:表示對(duì)應(yīng)的文件描述符被掛斷侣签;
EPOLLET: 將EPOLL設(shè)為邊緣觸發(fā)(Edge Triggered)模式,這是相對(duì)于水平觸發(fā)(Level Triggered)來說的急迂。
EPOLLONESHOT:只監(jiān)聽一次事件影所,當(dāng)監(jiān)聽完這次事件之后,如果還需要繼續(xù)監(jiān)聽這個(gè)socket的話僚碎,需要再次把這個(gè)socket加入到EPOLL隊(duì)列里
關(guān)于epoll工作模式ET猴娩,LT
LT(level triggered)是缺省的工作方式,并且同時(shí)支持block和no-block socket.在這種做法中,內(nèi)核告訴你一個(gè)文件描述符是否就緒了卷中,然后你可以對(duì)這個(gè)就緒的fd進(jìn)行IO操作矛双。如果你不作任何操作,內(nèi)核還是會(huì)繼續(xù)通知你的仓坞,所以背零,這種模式編程出錯(cuò)誤可能性要小一點(diǎn)。傳統(tǒng)的select/poll都是這種模型的代表.
ET (edge-triggered)是高速工作方式无埃,只支持no-block socket徙瓶。在這種模式下,當(dāng)描述符從未就緒變?yōu)榫途w時(shí)嫉称,內(nèi)核通過epoll告訴你侦镇。然后它會(huì)假設(shè)你知道文件描述符已經(jīng)就緒,并且不會(huì)再為那個(gè)文件描述符發(fā)送更多的就緒通知织阅,直到你做了某些操作導(dǎo)致那個(gè)文件描述符不再為就緒狀態(tài)了壳繁,但是請(qǐng)注意,如果一直不對(duì)這個(gè)fd作IO操作(從而導(dǎo)致它再次變成未就緒)荔棉,內(nèi)核不會(huì)發(fā)送更多的通知(only once)
3. int epoll_wait(int epfd闹炉, struct epoll_event * events, int maxevents润樱, int timeout)
等待事件的產(chǎn)生渣触,類似于select()調(diào)用。參數(shù)events用來從內(nèi)核得到事件的集合壹若,maxevents告之內(nèi)核這個(gè)events有多大嗅钻,這個(gè)maxevents的值不能大于創(chuàng)建epoll_create()時(shí)的size,參數(shù)timeout是超時(shí)時(shí)間(毫秒店展,0會(huì)立即返回养篓,-1永久阻塞)。該函數(shù)返回需要處理的事件數(shù)目赂蕴,如返回0表示已超時(shí)柳弄。
簡(jiǎn)單來說:
epoll:
宿舍管理員: 查詢?nèi)藛T登記表
幼兒園阿姨: 需要上廁所,站到一個(gè)圈里
seletc:
宿舍管理員: 一個(gè)一個(gè)房間去找(遍歷)
幼兒園阿姨: 一個(gè)一個(gè)小朋友去問
4.nginx軟件部署安裝過程:
方式一:直接yum安裝nginx
yum install -y nginx ------歷史穩(wěn)定版本
方式二:官方源yum安裝nginx
更新nginx官方源:
vim /etc/yum.repo.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
yum install -y nginx ----最新穩(wěn)定版本
方式三:利用編譯方式安裝軟件
第一個(gè)里程:下載并解壓源碼包
wget http://nginx.org/download/nginx-1.16.1.tar.gz
tar xf nginx-1.16.1.tar.gz
第二個(gè)里程:解決軟件依賴關(guān)系
yum install -y pcre-devel openssl-devel
pcre: 兼容perl語言正則表達(dá)式
openssl: 可以實(shí)現(xiàn)HTTPS訪問功能
第三個(gè)里程:編譯安裝軟件
第一個(gè)步驟:進(jìn)入源碼包目錄,進(jìn)行配置過程
cd nginx-1.16.1
useradd www -M -s /sbin/nologin
./configure --prefix=/app/nginx-1.16.1 --user=www --group=www --with-http_ssl_module --with-http_stub_status_module
--prefix=PATH --- 指定軟件程序目錄
--sbin-path=PATH --- 指定軟件命令文件存儲(chǔ)路徑
--conf-path=PATH --- 指定軟件配置文件保存路徑
--error-log-path=PATH --- 指定軟件日志文件保存路徑
--user=USER --- 指定nginx服務(wù)worker進(jìn)程管理用戶
--group=GROUP --- 指定nginx服務(wù)worker進(jìn)程管理用戶組
--with-http_ssl_module --- 讓nginx開啟HTTPS功能
--with-http_stub_status_module
第二個(gè)步驟: 編譯過程==翻譯過程
nginx-1.16.1目錄下
make
第三個(gè)步驟: 編譯安裝
make install
二三步驟可以合并執(zhí)行 make && make install