一、Nginx介紹
Nginx(engine x) 是一個(gè)高性能的HTTP和反向代理服務(wù)器,也是一個(gè)IMAP/POP3/SMTP服務(wù)器。其將源代碼以類(lèi)BSD許可證的形式發(fā)布,因它的穩(wěn)定性、豐富的功能集、示例配置文件和低系統(tǒng)資源的消耗而聞名。Nginx是一款輕量級(jí)的Web服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器,并在一個(gè)BSD-like 協(xié)議下發(fā)行。其特點(diǎn)是占有內(nèi)存少,并發(fā)能力強(qiáng),事實(shí)上nginx的并發(fā)能力確實(shí)在同類(lèi)型的網(wǎng)頁(yè)服務(wù)器中表現(xiàn)較好。
創(chuàng)新互聯(lián)是專(zhuān)業(yè)的清苑網(wǎng)站建設(shè)公司,清苑接單;提供網(wǎng)站設(shè)計(jì)制作、網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行清苑網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
高并發(fā)連接:官方測(cè)試能支撐5萬(wàn)并發(fā)連接,在實(shí)際生產(chǎn)環(huán)境中跑到2,~3W并發(fā)連接。
內(nèi)存消耗少:在3W并發(fā)連接下,開(kāi)啟的10個(gè)NGINX進(jìn)程才消耗150M內(nèi)存(15M*10=150M)
配置文件非常簡(jiǎn)單:風(fēng)格跟程序一樣通俗易懂。
成本低廉:Nginx作為開(kāi)源軟件,可以免費(fèi)使用,而購(gòu)買(mǎi)F5 BIG-IP、NetScaler等硬件負(fù)載均衡交換機(jī)則需要十多萬(wàn)至幾十萬(wàn)人民幣。
支持rewrite重寫(xiě)規(guī)則:能夠根據(jù)域名、URL的不同,將HTTP請(qǐng)求分發(fā)到不同的后端服務(wù)器群組。
內(nèi)置的健康檢查功能:如果Nginx Proxy后端的后臺(tái)web服務(wù)器宕機(jī)了,不會(huì)影響前端訪問(wèn)。
節(jié)省帶寬:支持GZIP壓縮,可以添加瀏覽器本地緩存的Header頭。
穩(wěn)定性高:用于反向代理,宕機(jī)的概率微乎其微。
對(duì)于一個(gè) Web 服務(wù)器來(lái)說(shuō),一個(gè)請(qǐng)求的基本過(guò)程是:建立連接—接收數(shù)據(jù)—發(fā)送數(shù)據(jù),在系統(tǒng)底層看來(lái) :上述過(guò)程(建立連接—接收數(shù)據(jù)—發(fā)送數(shù)據(jù))在系統(tǒng)底層就是讀寫(xiě)事件。
如果采用阻塞調(diào)用的方式,當(dāng)讀寫(xiě)事件沒(méi)有準(zhǔn)備好時(shí),那么就只能等待,當(dāng)前線(xiàn)程被掛起,等事件準(zhǔn)備好了,才能進(jìn)行讀寫(xiě)事件。
如果采用非阻塞調(diào)用的方式:事件馬上返回,告訴你事件還沒(méi)準(zhǔn)備好呢,過(guò)會(huì)再來(lái)吧。過(guò)一會(huì),再來(lái)檢查一下事件,直到事件準(zhǔn)備好了為止,在這期間,你就可以先去做其它事情,然后再來(lái)看看事件好了沒(méi)。雖然不阻塞了,但你得不時(shí)地過(guò)來(lái)檢查一下事件的狀態(tài),你可以做更多的事情了,但帶來(lái)的開(kāi)銷(xiāo)也是不小的。非阻塞調(diào)用指在不能立刻得到結(jié)果之前,該調(diào)用不會(huì)阻塞當(dāng)前線(xiàn)程
非阻塞通過(guò)不斷檢查事件的狀態(tài)來(lái)判斷是否進(jìn)行讀寫(xiě)操作,這樣帶來(lái)的開(kāi)銷(xiāo)很大,因此就有了異步非阻塞的事件處理機(jī)制。這種機(jī)制讓你可以同時(shí)監(jiān)控多個(gè)事件,調(diào)用他們是非阻塞的,但可以設(shè)置超時(shí)時(shí)間,在超時(shí)時(shí)間之內(nèi),如果有事件準(zhǔn)備好了,就返回。這種機(jī)制解決了上面阻塞調(diào)用與非阻塞調(diào)用的兩個(gè)問(wèn)題。
以 epoll 模型為例:當(dāng)事件沒(méi)有準(zhǔn)備好時(shí),就放入 epoll(隊(duì)列)里面。如果有事件準(zhǔn)備好了,那么就去處理;當(dāng)事件沒(méi)有準(zhǔn)備好時(shí),才在 epoll 里面等著。這樣,我們就可以并發(fā)處理大量的并發(fā)了,當(dāng)然,這里的并發(fā)請(qǐng)求,是指未處理完的請(qǐng)求。線(xiàn)程只有一個(gè),所以同時(shí)能處理的請(qǐng)求當(dāng)然只有一個(gè)了,只是在請(qǐng)求之間進(jìn)行不斷地切換而已,切換也是因?yàn)楫惒绞录礈?zhǔn)備好,而主動(dòng)讓出的。這里的切換是沒(méi)有任何代價(jià),可以理解為循環(huán)處理多個(gè)準(zhǔn)備好的事件。
多線(xiàn)程方式相比,這種事件處理方式是有很大的優(yōu)勢(shì)的,不需要?jiǎng)?chuàng)建線(xiàn)程,每個(gè)請(qǐng)求占用的內(nèi)存也很少,沒(méi)有上下文切換, 事件處理非常的輕量級(jí),并發(fā)數(shù)再多也不會(huì)導(dǎo)致無(wú)謂的資源浪費(fèi)(上下文切換)。對(duì)于 apache 服務(wù)器,每個(gè)請(qǐng)求會(huì)獨(dú)占一個(gè)工作線(xiàn)程,當(dāng)并發(fā)數(shù)上到幾千時(shí),就同時(shí)有幾千的線(xiàn)程在處理請(qǐng)求了。這對(duì)操作系統(tǒng)來(lái)說(shuō),是個(gè)不小的挑戰(zhàn):因?yàn)榫€(xiàn)程帶來(lái)的內(nèi)存占用非常大,線(xiàn)程的上下文切換帶來(lái)的 cpu 開(kāi)銷(xiāo)很大,自然性能就上不 去,從而導(dǎo)致在高并發(fā)場(chǎng)景下性能下降嚴(yán)重。
總結(jié):通過(guò)異步非阻塞的事件處理機(jī)制,Nginx 實(shí)現(xiàn)由進(jìn)程循環(huán)處理多個(gè)準(zhǔn)備好的事件,從而實(shí)現(xiàn)高并發(fā)和輕量級(jí)。
二、搭建Nginx服務(wù)器
Nginx官方下載地址:http://nginx.org/download/
本人提供的下載地址:https://pan.baidu.com/s/1PL0GyzRQ8zSPD74309R44g
提取碼:4mt4
1、將nginx-1.14.0.tar.gz上傳至服務(wù)器(由于后面有一個(gè)升級(jí)Nginx的操作,所以先安裝一個(gè)低版本的Nginx)
[root@nginx ~]# rz #在xshell中上傳所需源碼包
[root@nginx ~]# tar zxf nginx-1.14.0.tar.gz -C /usr/src #解包
[root@nginx ~]# cd /usr/src/nginx-1.14.0/ #切換至解壓后的目錄
[root@nginx nginx-1.14.0]# useradd -M -s /sbin/nologin nginx #創(chuàng)建運(yùn)行Nginx的用戶(hù)
[root@nginx nginx-1.14.0]# yum -y erase httpd #卸載系統(tǒng)自帶的httpd服務(wù),以免沖突
[root@nginx nginx-1.14.0]# yum -y install openssl-devel pcre-devel
[root@nginx nginx-1.14.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module && make && make install
三、Nginx服務(wù)的版本升級(jí)至1.2
[root@nginx nginx-1.14.0]# /usr/local/nginx/sbin/nginx #啟動(dòng)Nginx服務(wù)
[root@nginx nginx-1.2.4]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.14.0 #注意,現(xiàn)在版本為nginx/1.14.0
.......................#省略部分信息
[root@nginx ~]# rz #在xshell中上傳所需源碼包
[root@nginx ~]# tar zxf nginx-1.2.4.tar.gz -C /usr/src #解壓
[root@nginx ~]# cd /usr/src/nginx-1.2.4/ #切換至解壓后的路徑
[root@nginx nginx-1.2.4]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module && make
#注意,升級(jí)時(shí),不要執(zhí)行make install 命令,否則會(huì)覆蓋原有的低版本配置文件
[root@nginx nginx-1.2.4]# pwd #確認(rèn)當(dāng)前路徑
/usr/src/nginx-1.2.4
[root@nginx nginx-1.2.4]# mv /usr/local/nginx/sbin/nginx nginx.bak
#將舊版本的服務(wù)控制命令進(jìn)行更名
[root@nginx nginx-1.2.4]# cp objs/nginx /usr/local/nginx/sbin/ #復(fù)制新生成的控制命令至指定目錄
[root@nginx nginx-1.2.4]# kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
#生成新的PID號(hào)
[root@nginx nginx-1.2.4]# kill -HUP `cat /usr/local/nginx/logs/nginx.pid` #重啟Nginx服務(wù)
[root@nginx nginx-1.2.4]# /usr/local/nginx/sbin/nginx -V #查看是否已經(jīng)升級(jí)
nginx version: nginx/1.2.4 #版本為1.2.4,升級(jí)成功
四、修改Nginx服務(wù)頭部信息
一般是為了提高安全性,我們會(huì)對(duì)客戶(hù)端進(jìn)行隱藏Nginx的版本信息,具體操作如下:
#修改前,客戶(hù)端訪問(wèn),可以看到我們Nginx服務(wù)器的版本等信息,如下:
[root@nginx nginx-1.2.4]# curl -I 127.0.0.1 #獲取頭部信息
HTTP/1.1 200 OK
Server: nginx/1.2.4 #版本信息顯示的很詳細(xì)
Date: Thu, 17 Oct 2019 14:40:50 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Thu, 17 Oct 2019 14:20:40 GMT
Connection: keep-alive
Accept-Ranges: bytes
#現(xiàn)在進(jìn)行修改如下:
[root@nginx nginx-1.2.4]# pwd #確定當(dāng)前工作路徑在源碼包中
/usr/src/nginx-1.2.4
[root@nginx nginx-1.2.4]# vim src/core/nginx.h #修改該文件,隨便修改即可
#define nginx_version 1002004
#define NGINX_VERSION "666" #這里為版本號(hào)信息
#define NGINX_VER "ljz/" NGINX_VERSION #這里原來(lái)為Nginx,現(xiàn)更改為ljz
#注意,上述配置項(xiàng)前面的注釋符號(hào)不用刪除
#更改完成后,保存退出即可
[root@nginx nginx-1.2.4]# vim src/http/ngx_http_header_filter_module.c
#編輯該配置文件
static char ngx_http_server_string[] = "Server: ljz" CRLF;
#搜索“nginx”,定位到該行,然后更改其中原來(lái)的nginx為ljz,注意,這里必須和前一個(gè)配置文件中指定的名字一樣
#更改完成后,保存退出即可
[root@nginx nginx-1.2.4]# vim src/http/ngx_http_special_response.c #編輯此配置文件
static u_char ngx_http_error_tail[] = #注意,有一段配置和這段內(nèi)容非常相似,主要區(qū)分這一行即可
#如果改錯(cuò)了,在后面將會(huì)報(bào)錯(cuò)
"
ljz " CRLF #將此行中間的nginx更改為ljz。
"
" CRLF "