十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
博文大綱:
創(chuàng)新互聯(lián)公司主要從事網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)黑龍江,10余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18982081108
1.Nginx簡(jiǎn)介
2.Nginx的核心特點(diǎn)
3.Nginx平滑升級(jí)
4.修改Nginx版本信息
5.Nginx虛擬主機(jī)配置
6.nginx配置文件location選項(xiàng)的作用
7.配置https訪問nginx
8.開啟Nginx訪問認(rèn)證
Nginx是一款輕量級(jí)的網(wǎng)頁(yè)服務(wù)器、反向代理服務(wù)器以及電子郵件代理服務(wù)器。因它的穩(wěn)定性、豐富的功能集、實(shí)例配置文件和低系統(tǒng)資源消耗而聞名。
Nginx已經(jīng)在俄羅斯大的門戶網(wǎng)站上運(yùn)行,同時(shí)俄羅斯有超過20%的虛擬主機(jī)平臺(tái)采用Nginx作為反向代理服務(wù)器;在國(guó)內(nèi),Nginx已經(jīng)運(yùn)行在淘寶、新浪、網(wǎng)易等多家網(wǎng)站使用Nginx作為Web服務(wù)器或反向代理服務(wù)器。
- (1)跨平臺(tái):Nginx可以在大多數(shù)OS編譯運(yùn)行,而且也有Windows版本;
- (2)配置異常簡(jiǎn)單、非常容易上手;
- (3)非阻塞、高并發(fā)連接;官方測(cè)試能夠支撐5萬的并發(fā)連接,在實(shí)際環(huán)境中可以達(dá)到2~3萬并發(fā)連接數(shù)。(這得益于Nginx使用了最新的epoll模型);
- (4)事件驅(qū)動(dòng):采用epoll模型,支持更大的并發(fā)連接;
非阻塞通過不斷檢查事件的狀態(tài)來判斷是否進(jìn)行讀寫操作,這樣帶來的開銷很大,因此就有了異步非阻塞的事件處理機(jī)制。這種機(jī)制讓你可以同時(shí)監(jiān)控多個(gè)事件,調(diào)用他們是非阻塞的,但可以設(shè)置超時(shí)時(shí)間,在超時(shí)時(shí)間之內(nèi),如果有事件準(zhǔn)備好了,就返回。這種機(jī)制解決了上面阻塞調(diào)用與非阻塞調(diào)用的兩個(gè)問題。
以 epoll 模型為例:當(dāng)事件沒有準(zhǔn)備好時(shí),就放入 epoll(隊(duì)列)里面。如果有事件準(zhǔn)備好了,那么就去處理;當(dāng)事件沒有準(zhǔn)備好時(shí),才在 epoll 里面等待。這樣,我們就可以并發(fā)處理大量的并發(fā)請(qǐng)求了,當(dāng)然,這里的并發(fā)請(qǐng)求,是指未處理完的請(qǐng)求。線程只有一個(gè),所以同時(shí)能處理的請(qǐng)求當(dāng)然只有一個(gè)了,只是在請(qǐng)求之間進(jìn)行不斷地切換而已,切換也是因?yàn)楫惒绞录礈?zhǔn)備好,而主動(dòng)讓出的。這里的切換是沒有任何代價(jià),你可以理解為循環(huán)處理多個(gè)準(zhǔn)備好的事件。
多線程方式相比,這種事件處理方式是有很大的優(yōu)勢(shì)的,不需要?jiǎng)?chuàng)建線程,每個(gè)請(qǐng)求占用的內(nèi)存也很少,沒有上下文切換, 事件處理非常的輕量級(jí),并發(fā)數(shù)再多也不會(huì)導(dǎo)致無謂的資源浪費(fèi)(上下文切換)。對(duì)于 apache 服務(wù)器,每個(gè)請(qǐng)求會(huì)獨(dú)占一個(gè)工作線程,當(dāng)并發(fā)數(shù)上到幾千時(shí),就同時(shí)有幾千的線程在處理請(qǐng)求了。這對(duì)操作系統(tǒng)來說,是個(gè)不小的挑戰(zhàn):因?yàn)榫€程帶來的內(nèi)存占用非常大,線程的上下文切換帶來的 cpu 開銷很大,自然性能就上不去,從而導(dǎo)致在高并發(fā)場(chǎng)景下性能下降嚴(yán)重。
總結(jié):通過異步非阻塞的事件處理機(jī)制,Nginx 實(shí)現(xiàn)由進(jìn)程循環(huán)處理多個(gè)準(zhǔn)備好的事件,從而實(shí)現(xiàn)高并發(fā)和輕量級(jí)。- (5)Master/Worker 結(jié)構(gòu):一個(gè) master 進(jìn)程,生成一個(gè)或多個(gè)worker 進(jìn)程,如圖:
Master-Worker設(shè)計(jì)模式主要包含兩個(gè)主要組件Master和Work,Master維護(hù)者Worker隊(duì)列,將請(qǐng)求下發(fā)到多個(gè)Worker并行執(zhí)行,Worker主要進(jìn)行實(shí)際邏輯計(jì)算,并將結(jié)果返回給Master。
采用獨(dú)立的進(jìn)程,可以讓互相之間不會(huì)影響,一個(gè)進(jìn)程退出后,其他進(jìn)程還在工作,服務(wù)不會(huì)中斷,Master進(jìn)程則很快重新啟動(dòng)新的Worker進(jìn)程。當(dāng)然,Worker進(jìn)程的異常退出,肯定是程序中有bug了,異常退出,會(huì)導(dǎo)致當(dāng)前Worker上的所有請(qǐng)求失敗,不過不會(huì)影響到所有的請(qǐng)求,所以降低了風(fēng)險(xiǎn);- (6)內(nèi)存消耗?。禾幚砀卟l(fā)的請(qǐng)求內(nèi)存消耗非常小。在3萬并發(fā)連接下,開啟的10個(gè)Nginx進(jìn)程才消耗150M內(nèi)存;
- (7)內(nèi)置的健康檢查工作:如果Nginx代理的后端某臺(tái)Web服務(wù)器宕機(jī)了,不會(huì)影響前端的訪問;
- (8)節(jié)省帶寬:支持GZIP壓縮,可以添加到瀏覽器本地緩存的Header頭;
- (9)穩(wěn)定性高:用于反向代理,宕機(jī)的概率微乎其微;
本篇博文中所需使用的軟件包都已經(jīng)打包了,可以直接下載Nginx軟件包
所謂Nginx平滑升級(jí)就是當(dāng)前服務(wù)器正在運(yùn)行Nginx服務(wù),想將當(dāng)前運(yùn)行的Nginx服務(wù)的版本進(jìn)行升級(jí),且在服務(wù)不停止的前提進(jìn)行升級(jí)。
實(shí)現(xiàn)思路:
- 在不停止老進(jìn)程的情況下,啟動(dòng)新進(jìn)程;
- 老進(jìn)程負(fù)責(zé)處理仍然沒有處理完成的請(qǐng)求,但不再接收處理請(qǐng)求;
- 新進(jìn)程接收新請(qǐng)求;
- 老進(jìn)程處理完所有請(qǐng)求,關(guān)閉所有連接后,停止;
實(shí)現(xiàn)步驟:
[root@localhost ~]# yum -y install pcre-devel openssl-devel //安裝nginx所需依賴
[root@localhost ~]# tar zxf nginx-1.14.0.tar.gz -C /usr/src
[root@localhost ~]# cd /usr/src/nginx-1.14.0/
[root@localhost nginx-1.14.0]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module && make && make install
//編譯安裝nginx1.14版本,由于實(shí)驗(yàn)環(huán)境,配置項(xiàng)較少
[root@localhost ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin //創(chuàng)建符號(hào)鏈接
[root@localhost ~]# nginx //啟動(dòng)nginx服務(wù)
[root@localhost ~]# nginx -v //查看Nginx服務(wù)的版本信息
nginx version: nginx/1.14.0
[root@localhost ~]# tar zxf nginx-1.2.4.tar.gz -C /usr/src
[root@localhost ~]# cd /usr/src/nginx-1.2.4/
[root@localhost nginx-1.2.4]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module && make
//配置、編譯nginx1.2.4版本,注意不要進(jìn)行安裝,可以根據(jù)需要添加配置項(xiàng),但是原本的配置必須存在
[root@localhost ~]# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
//備份舊版本的nginx的執(zhí)行程序
[root@localhost ~]# cp /usr/src/nginx-1.2.4/objs/nginx /usr/local/nginx/sbin/
//替換舊的Nginx的執(zhí)行程序
[root@localhost ~]# netstat -anpt | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 4655/nginx: master
[root@localhost ~]# kill -USR2 4655 //建議針對(duì)nginx的進(jìn)程號(hào)進(jìn)行操作,不建議針對(duì)nginx的pid文件進(jìn)行操作
//生成新的進(jìn)程去接收客戶端請(qǐng)求,執(zhí)行完成后nginx安裝目錄下logs目錄會(huì)出現(xiàn)一個(gè)nginx.pid.old文件,用來存放舊版的pid信息
[root@localhost ~]# nginx -s reload //重新加載新版的nginx配置
[root@localhost ~]# kill -HUP 4655 //平滑的重啟新版的nginx進(jìn)程
[root@localhost ~]# nginx -v //查看nginx版本信息
nginx version: nginx/1.2.4
[root@localhost ~]# curl -I 127.0.0.1
HTTP/1.1 200 OK
Server: nginx/1.14.0 //頭部信息版本還未更改
Date: Sun, 01 Dec 2019 06:04:10 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Sun, 01 Dec 2019 05:59:29 GMT
Connection: keep-alive
ETag: "5de356c1-264"
Accept-Ranges: bytes
[root@localhost ~]# kill -QUIT 4655 ////平滑的關(guān)閉舊版的nginx進(jìn)程
[root@localhost ~]# nginx -v //查看nginx版本信息
nginx version: nginx/1.2.4
[root@localhost sbin]# curl -I 127.0.0.1
HTTP/1.1 200 OK
Server: nginx/1.2.4 //注意版本信息,已經(jīng)成功發(fā)生改變
Date: Sat, 30 Nov 2019 14:47:53 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Sat, 30 Nov 2019 14:42:09 GMT
Connection: keep-alive
Accept-Ranges: bytes
注意:整個(gè)過程中,建議針對(duì)進(jìn)程號(hào)進(jìn)行平滑升級(jí)、重啟、關(guān)閉等操作!
關(guān)于nginx使用kill命令常用的參數(shù):
- QUIT 平滑關(guān)閉
- HUP 平滑重啟,重新加載配置文件
- USR1 重新打開日志文件
- USR2 平滑升級(jí)可執(zhí)行程序
- WINCH 平滑關(guān)閉工作進(jìn)程
[root@localhost ~]# vim /usr/src/nginx-1.2.4/src/core//nginx.h
……………… //省略部分內(nèi)容
#define nginx_version 1002004
#define NGINX_VERSION "8.8.8.8" //根據(jù)實(shí)際情況修改為自己想要的信息
#define NGINX_VER "lzj/" NGINX_VERSION //同上,注意修改完的lzj
[root@localhost ~]# vim /usr/src/nginx-1.2.4/src/http/ngx_http_header_filter_module.c
……………… //省略部分內(nèi)容
static char ngx_http_server_string[] = "Server: lzj" CRLF; //與上一個(gè)文件中修改的名稱一樣(lzj)
static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;
[root@localhost ~]# vim /usr/src/nginx-1.2.4/src/http/ngx_http_special_response.c
……………… //省略部分內(nèi)容
static u_char ngx_http_error_tail[] =
"
lzj " CRLF //注意與上兩個(gè)文件中修改的lzj要一致
"
" CRLF "