柚子快報(bào)邀請(qǐng)碼778899分享:linux Nginx服務(wù)
柚子快報(bào)邀請(qǐng)碼778899分享:linux Nginx服務(wù)
本章資源下載
【前置資源地址】:
一、Nginx服務(wù)基礎(chǔ)
1.1、 Nginx 簡(jiǎn)介
Nginx 是一個(gè)高性能的 HTTP 和反向代理服務(wù)器。
Nginx 是由 Igor Sysoev 為俄羅斯訪問點(diǎn)開量第二的 Rambler.ru 站發(fā)的,第一個(gè)公開版本 0.1.0 發(fā)布于 2004 年 10 月 4 日。
其將源代碼以類 BSD 許可證的形式發(fā)布,因它的穩(wěn)定性、豐富的功能集、示例配置文件和低系統(tǒng)資源的消耗而聞名。
2011 年 6 月 1 日,Nginx 1.0.4 發(fā)布。1.18 1.20 1.22 1.12 Nginx 是一款輕量級(jí)的 Web 服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器, 單臺(tái)物理服務(wù)器可支持30 000~50 000個(gè)并發(fā)請(qǐng)求。并在一個(gè) BSD-like 協(xié)議下發(fā)行。由俄羅斯的程序設(shè)計(jì)師 Igor Sysoev 所開發(fā),供俄國(guó)大型的入口網(wǎng)站及搜索引擎 Rambler(俄文:Рамблер)使用。
其特點(diǎn)是占有內(nèi)存少,并發(fā)能力強(qiáng),事實(shí)上 Nginx 的并發(fā)能力確實(shí)在同類型的網(wǎng)頁(yè)服務(wù)器中表現(xiàn)較好,中國(guó)大陸使用 Nginx 網(wǎng)站用戶有:百度 BWS、新浪、網(wǎng)易、騰訊、等。
1.2、Nginx 官網(wǎng)
nginx news
關(guān)于Tengine
Tengine 是由淘寶網(wǎng)發(fā)起的 Web 服務(wù)器項(xiàng)目。它在 Nginx 的基礎(chǔ)上,針對(duì)大訪問量網(wǎng)站的需求, 添 加了很多高級(jí)功能和特性。
The Tengine Web Server (taobao.org)
1.3、Nginx 功能介紹
靜態(tài)的web資源服務(wù)器html,圖片,js,css,txt等靜態(tài)資源http/https協(xié)議的反向代理 ,7層 url結(jié)合FastCGI /uWSGI/SCGI等協(xié)議反向代理動(dòng)態(tài)資源請(qǐng)求tcp/udp協(xié)議的請(qǐng)求轉(zhuǎn)發(fā)(反向代理) 4層
1.4、基礎(chǔ)特性
模塊化設(shè)計(jì),較好的擴(kuò)展性高可靠性支持熱部署:不停機(jī)更新配置文件,升級(jí)版本,更換日志文件低內(nèi)存消耗:10000個(gè)keep-alive連接模式下的非活動(dòng)連接,僅需2.5M內(nèi)存以及如下特性
①、Event-Driven(事件驅(qū)動(dòng)),
②、AIO(Asynchronous I/O,異步I/O),
③、mmap(Memory-Mapped File,內(nèi)存映射文件)
④、sendfile是一種高效地在網(wǎng)絡(luò)套接字之間傳輸文件的系統(tǒng)調(diào)用。與傳統(tǒng)的read-write模式(即先從文件中讀取數(shù)據(jù)到用戶空間,然后寫入到網(wǎng)絡(luò)套接字)相比,sendfile減少了數(shù)據(jù)的復(fù)制次數(shù),并允許內(nèi)核直接處理文件和網(wǎng)絡(luò)之間的數(shù)據(jù)傳輸,從而提高了數(shù)據(jù)傳輸?shù)男省?/p>
sendfile通常用于Web服務(wù)器等需要高效傳輸靜態(tài)文件的場(chǎng)景。通過(guò)使用sendfile,Web服務(wù)器可以更快地響應(yīng)客戶端的文件請(qǐng)求,減少CPU的使用率,并提升整體性能。
1.5、Web 服務(wù)相關(guān)的功能
虛擬主機(jī)(server)支持 keep-alive 和管道連接(利用一個(gè)連接做多次請(qǐng)求)訪問日志(支持基于日志緩沖提高其性能)url rewirte路徑別名基于IP及用戶的訪問控制支持速率限制及并發(fā)數(shù)限制重新配置和在線升級(jí)而無(wú)須中斷客戶的工作進(jìn)程
1.6、Nginx 應(yīng)用場(chǎng)景
① 靜態(tài)服務(wù)器 (圖片、視頻服務(wù)、文本)
② 動(dòng)態(tài)服務(wù)
③ 反向代理, 負(fù)載均衡
④ 緩存服務(wù)
nginx 中http七層代理和四層代理
web服務(wù)器
做:代理服務(wù)器,反向代理, 負(fù)載均衡
1.7、簡(jiǎn)述Nginx和Apache的差異
Nginx是一個(gè)甚于事件的Web服務(wù)器,Apache是一個(gè)基于流程的服務(wù)器;Nginx避免子進(jìn)程的概念,Apache是基于子進(jìn)程的;Nginx在內(nèi)存消耗和連接方面更好,Apache在內(nèi)存消耗和連接方面一般;Nginx的性能和可伸縮性不依賴于硬件,Apache依賴于CPU和內(nèi)存等硬件; Nginx支持熱部署,Apache不支持熱部署;Nginx對(duì)于靜態(tài)文件處理具有更高效率,Apache相對(duì)一般;Nginx在反向代理場(chǎng)景具有明顯優(yōu)勢(shì),Apache相對(duì)一般。
1.8、Nginx 相對(duì)于 Apache 的優(yōu)點(diǎn)
1、輕量級(jí),同樣是 web 服務(wù)(采用C進(jìn)行編寫),比 Apache 占用更少的內(nèi)存及資源;
2、高并發(fā),Nginx 處理請(qǐng)求是異步非塞的(以epoll and kqueue作為開發(fā)模型),而 Apache 則是阻塞型的(在處理后端慢或者前端壓力很大的情況下, 很容易出現(xiàn)進(jìn)程數(shù)飆升,從而拒絕服務(wù)的現(xiàn)象),而高并發(fā)下 Nginx 能保持低資源低消耗高性能;
3、高度模塊化的設(shè)計(jì)編寫模塊相對(duì)簡(jiǎn)單;社區(qū)活躍,各種高性能模塊出品迅速。
4、配置簡(jiǎn)潔,正則配置讓很多事情變得簡(jiǎn)單,而且改完配置能使用 -t 測(cè)試配置有沒有問題,apache 配 置復(fù)雜 ,重啟的時(shí)候發(fā)現(xiàn)配置出錯(cuò)了,會(huì)很崩潰
5、一般用于處理靜態(tài)文件,靜態(tài)處理性能比apache高三倍以上
6、作為負(fù)載均衡服務(wù)器,支持7層負(fù)載均衡
7、本身就是一個(gè)反向代理服務(wù)器,而且可以作為非常優(yōu)秀的郵件代理服務(wù)器
8、nginx啟動(dòng)特別容易, 并且?guī)缀蹩梢宰龅?7*24 不間斷運(yùn)行,即使運(yùn)行數(shù)個(gè)月也不需要重新啟動(dòng), 支持熱部署,比如:實(shí)現(xiàn)不間斷服務(wù)的情況下進(jìn)行軟件版本的升級(jí)與版本的回退
反過(guò)來(lái)
Apache 相對(duì)于 Nginx 的優(yōu)點(diǎn):
1、Nginx 處理動(dòng)態(tài)請(qǐng)求是弱項(xiàng),一般動(dòng)態(tài)請(qǐng)求要 Apache 去做,Nginx 只適合靜態(tài)和反向,雖然Nginx也可以處理動(dòng)態(tài)內(nèi)容,但通常需要與其他后端服務(wù)器(如PHP-FPM)配合使用。而Apache則內(nèi)置了對(duì)多種動(dòng)態(tài)內(nèi)容的支持,如PHP、Python等,這使得它在處理動(dòng)態(tài)請(qǐng)求時(shí)更為直接和高效。
2、apache的Rewrite(重寫)比nginx強(qiáng)大,在rewrite頻繁的情況下,用apache。(但是還是要看歷史背景和特定情境下)
3、成熟,少 bug ,Nginx 的 bug 相對(duì)較多;
4、超穩(wěn)定 存在就是理由,可以在多種操作系統(tǒng)上運(yùn)行,一般來(lái)說(shuō),需要性能的 web 服務(wù),用 Nginx 。如果不需要性能只求穩(wěn)定,那就 Apache。
1.9、Nginx 架構(gòu)
上圖是 Nginx 的進(jìn)程模型,下面我們會(huì)簡(jiǎn)單講解圖中不同部分的含義:
?主進(jìn)程(Master) ?工作進(jìn)程(Worker)
在服務(wù)器編程中,尤其是在使用多進(jìn)程模型來(lái)處理并發(fā)連接時(shí),經(jīng)常采用“主從模型”
(Master-Worker 模型)來(lái)組織進(jìn)程。這種模型下,有一個(gè)主進(jìn)程(Master)負(fù)責(zé)監(jiān)聽網(wǎng)絡(luò)端口上的連接請(qǐng)求,而多個(gè)工作進(jìn)程(Worker)則負(fù)責(zé)處理這些連接請(qǐng)求的實(shí)際任務(wù)。
--------------------------------------------------------------------------------------------------------------------------
1.主進(jìn)程首先創(chuàng)建一個(gè)套接字(socket),這個(gè)套接字用于監(jiān)聽網(wǎng)絡(luò)上的連接請(qǐng)求。通常,這個(gè)套接字被綁定到服務(wù)器的一個(gè)特定IP地址和端口上,并通過(guò)listen()函數(shù)設(shè)置為監(jiān)聽狀態(tài)。?????listenfd(監(jiān)聽文件描述符)是主進(jìn)程創(chuàng)建的用于監(jiān)聽連接請(qǐng)求的套接字。它代表了服務(wù)器在網(wǎng)絡(luò)上的一個(gè)“入口點(diǎn)”,等待客戶端的連接請(qǐng)求。
2.在設(shè)置好監(jiān)聽套接字后,主進(jìn)程會(huì)通過(guò)fork()系統(tǒng)調(diào)用創(chuàng)建多個(gè)工作進(jìn)程。每個(gè)工作進(jìn)程都是主進(jìn)程的一個(gè)副本,包括它們的代碼、數(shù)據(jù)以及打開的文件描述符(包括監(jiān)聽套接字)
3.每個(gè)工作進(jìn)程在啟動(dòng)后通常會(huì)關(guān)閉監(jiān)聽套接字(listenfd),因?yàn)楸O(jiān)聽連接的工作由主進(jìn)程負(fù)責(zé),工作進(jìn)程的任務(wù)是處理已經(jīng)被接受的連接。
4.工作進(jìn)程不直接監(jiān)聽新的連接請(qǐng)求,但它們從主進(jìn)程接收已經(jīng)建立的連接。這通常通過(guò)一些進(jìn)程間通信(IPC)機(jī)制實(shí)現(xiàn),但在傳統(tǒng)的UNIX網(wǎng)絡(luò)編程中,更常見的是使用套接字對(duì)(socket pair)或管道(pipe)來(lái)傳遞新的連接描述符給工作進(jìn)程,或者使用更現(xiàn)代的機(jī)制如UNIX域套接字。
5.?worker 進(jìn)程之間是平等的,每個(gè)進(jìn)程,處理請(qǐng)求的機(jī)會(huì)也是一樣的。 當(dāng)我們提供 80 端口的 http 服務(wù)時(shí),一個(gè)連接請(qǐng)求過(guò)來(lái),每個(gè)進(jìn)程都有可能處理這個(gè)連接。
(1)所有 worker 進(jìn)程的 listenfd 會(huì)在新連接到來(lái)時(shí)變得可讀,為保證只有一個(gè)進(jìn)程處理該連接,所有?worker 進(jìn)程會(huì)在注冊(cè) listenfd 讀事件前搶 accept_mutex,搶到互斥鎖的那個(gè)進(jìn)程注冊(cè) listenfd讀事件,然后在讀事件里調(diào)用 accept 接受該連接。(解決驚群) (2)當(dāng)一個(gè) worker 進(jìn)程在 accept 這個(gè)連接之后,就開始讀取請(qǐng)求、解析請(qǐng)求、處理請(qǐng)求。產(chǎn)生數(shù)據(jù)后,再返回給客戶端,最后才斷開連接(被外部信號(hào)(如SIGTERM)中斷,或者主進(jìn)程通知它們退出),這樣一個(gè)完整的請(qǐng)求就是這樣的了。
我們可以看到:一個(gè)請(qǐng)求,完全由 worker 進(jìn)程來(lái)處理,而且只在一個(gè) worker 進(jìn)程中處理。
也許你還有個(gè)疑問,那就是 Nginx 采用多 worker 的方式來(lái)處理請(qǐng)求,每個(gè) worker 里面只有一個(gè)主線程。那能夠處理的并發(fā)數(shù)很有限啊,多少個(gè) worker 就能處理多少個(gè)并發(fā),何來(lái)高并發(fā)呢?
這就是 Nginx?的高明之處,Nginx 采用了異步非阻塞的方式來(lái)處理請(qǐng)求,也就是說(shuō),Nginx 是可以同時(shí)處理成千上萬(wàn)個(gè)請(qǐng)求的。
-------------------------------------------------------------------------------------------------------------------------- 這里簡(jiǎn)單補(bǔ)充一下一些知識(shí)點(diǎn)
Socket的概念:
一個(gè)Socket是一對(duì)IP地址和端口。 Socket可以看成在兩個(gè)程序進(jìn)行通訊連接中的一個(gè)端點(diǎn),一個(gè)程序?qū)⒁欢涡畔懭隨ocket中,該Socket將這段信息發(fā)送給另外一個(gè)Socket中,使這段信息能傳送到其他程序中。你可以這么理解:socket是進(jìn)程之間用來(lái)對(duì)話的中間層工具。
異步非阻塞的概念: 異步的概念是和同步相對(duì)的,也就是不同事件之間不是同時(shí)發(fā)生的。 非阻塞的概念是和阻塞對(duì)應(yīng)的,阻塞是事件按順序執(zhí)行,每一事件都要等待上一事件的完成,而非阻塞是如果事件沒有準(zhǔn)備好,這個(gè)事件可以直接返回,過(guò)一段時(shí)間再進(jìn)行處理詢問,這期間可以做其他事情。
驚群效應(yīng)(Thundering Herd Problem):
是操作系統(tǒng)中多進(jìn)程(或多線程)在同時(shí)等待同一資源時(shí)可能出現(xiàn)的一種現(xiàn)象。具體來(lái)說(shuō),就是當(dāng)多個(gè)進(jìn)程或線程在等待同一個(gè)事件時(shí),一旦該事件發(fā)生,所有進(jìn)程或線程都會(huì)被內(nèi)核喚醒,但通常只有一個(gè)進(jìn)程或線程能夠成功處理該事件,而其他進(jìn)程或線程在發(fā)現(xiàn)無(wú)法獲取該事件后又重新進(jìn)入等待狀態(tài)。這種現(xiàn)象會(huì)導(dǎo)致系統(tǒng)資源的浪費(fèi)和性能下降。
補(bǔ)充:socket是什么和io模型-阻塞和非阻塞以及驚群的一些解決辦法? ? ?整理
文檔地址:【前置資源】
1.10、Nginx 進(jìn)程結(jié)構(gòu)
web請(qǐng)求處理機(jī)制多進(jìn)程方式:服務(wù)器每接收到一個(gè)客戶端請(qǐng)求就有服務(wù)器的主進(jìn)程生成一個(gè)子進(jìn)程響應(yīng)客戶端,直到用戶關(guān)閉連接,這樣的優(yōu)勢(shì)是處理速度快,子進(jìn)程之間相互獨(dú)立,但是如果訪問過(guò)大會(huì)導(dǎo)致服務(wù)器資源耗盡而無(wú)法提供請(qǐng)求。
多線程方式:與多進(jìn)程方式類似,但是每收到一個(gè)客戶端請(qǐng)求會(huì)有服務(wù)進(jìn)程派生出一個(gè)線程來(lái)個(gè)客 戶方進(jìn)行交互,一個(gè)線程的開銷遠(yuǎn)遠(yuǎn)小于一個(gè)進(jìn)程,因此多線程方式在很大程度減輕了web服務(wù)器 對(duì)系統(tǒng)資源的要求,但是多線程也有自己的缺點(diǎn),即當(dāng)多個(gè)線程位于同一個(gè)進(jìn)程內(nèi)工作的時(shí)候,可 以相互訪問同樣的內(nèi)存地址空間,所以他們相互影響,一旦主進(jìn)程掛掉則所有子線程都不能工作 了,IIS服務(wù)器使用了多線程的方式,需要間隔一段時(shí)間就重啟一次才能穩(wěn)定。
工作進(jìn)程(worker process)的功能:
所有 Worker 進(jìn)程都是平等的
實(shí)際處理:網(wǎng)絡(luò)請(qǐng)求,由 Worker 進(jìn)程處理
Worker進(jìn)程數(shù)量:一般設(shè)置為核心數(shù),充分利用CPU資源,同時(shí)避免進(jìn)程數(shù)量過(guò)多,導(dǎo)致進(jìn)程競(jìng)爭(zhēng)CPU資源,
增加上下文切換的損耗
接受處理客戶的請(qǐng)求
將請(qǐng)求依次送入各個(gè)功能模塊進(jìn)行處理
I/O調(diào)用,獲取響應(yīng)數(shù)據(jù)
與后端服務(wù)器通信,接收后端服務(wù)器的處理結(jié)果
緩存數(shù)據(jù),訪問緩存索引,查詢和調(diào)用緩存數(shù)據(jù)
發(fā)送請(qǐng)求結(jié)果,響應(yīng)客戶的請(qǐng)求
接收主程序指令,比如重啟、升級(jí)和退出等
1.11、Nginx 模塊
核心模塊:是 Nginx 服務(wù)器正常運(yùn)行必不可少的模塊,提供錯(cuò)誤日志記錄 、配置文件解析 、事件 驅(qū)動(dòng)機(jī)制 、進(jìn)程管理等核心功能 標(biāo)準(zhǔn)HTTP模塊:提供 HTTP 協(xié)議解析相關(guān)的功能,比如: 端口配置 、 網(wǎng)頁(yè)編碼設(shè)置 、 HTTP響應(yīng) 頭設(shè)置 等等 可選HTTP模塊:主要用于擴(kuò)展標(biāo)準(zhǔn)的 HTTP 功能,讓 Nginx 能處理一些特殊的服務(wù),比如:Flash 多媒體傳輸 、解析 GeoIP 請(qǐng)求、 網(wǎng)絡(luò)傳輸壓縮 、 安全協(xié)議 SSL 支持等 郵件服務(wù)模塊:主要用于支持 Nginx 的 郵件服務(wù) ,包括對(duì) POP3 協(xié)議、 IMAP 協(xié)議和 SMTP協(xié)議 的支持 Stream服務(wù)模塊: 實(shí)現(xiàn)反向代理功能,包括TCP協(xié)議代理 四層 第三方模塊:是為了擴(kuò)展 Nginx 服務(wù)器應(yīng)用,完成開發(fā)者自定義功能,比如: Json 支持、 Lua 支 持等。
nginx高度模塊化,但其模塊早期不支持DSO機(jī)制;1.9.11 版本支持動(dòng)態(tài)裝載和卸載
常用模塊
ngx_http_core_module 核心模塊
ngx_http_access_module 訪問控制
ngx_http_auth_basic_module 身份驗(yàn)證
ngx_http_gzip_module 壓縮模塊
ngx_http_log_module 日志模塊
ngx_http_proxy_module 代理模塊
ngx_http_rewrite_module 重寫模塊
ngx_http_stub_status_module 狀態(tài)頁(yè)模塊
ngx_http_upstream_module 反向代理
ngx_http_stream_module 四層代理
核心模塊:core module 標(biāo)準(zhǔn)模塊: HTTP 模塊: ngx_http_* HTTP Core modules ? #默認(rèn)功能 HTTP Optional modules #需編譯時(shí)指定 Mail 模塊: ngx_mail_* Stream 模塊 ngx_stream_* 第三方模塊
二、編譯安裝nginx 服務(wù)
2.1、 擴(kuò)展在線安裝nginx
1、yum部署Nginx
①使用yum部署Nginx需要先安裝epel-release擴(kuò)展包,官方源默認(rèn)沒有Nginx的yum源。
安裝epel-release擴(kuò)展源
yum install epel-release -y
②擴(kuò)展源安裝完后直接安裝Nginx。
安裝nginx服務(wù)
yum install nginx -y
③使用yum安裝的nginx配置文件位置在:/etc/nginx.conf。
默認(rèn)根目錄在:/usr/share/nginx/html。
默認(rèn)日志文件在:/var/log/nginx/路徑下。
2.2、Nginx編譯安裝
關(guān)閉防火墻,將安裝nginx所需軟件包傳到/opt目錄下
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
1.下載安裝包:nginx-1.18.0.tar.gz(以此為實(shí)驗(yàn))在這里可以下載你的安裝包
wget https://nginx.org/download/nginx-1.18.0.tar.gz
其他類似? https://nginx.org/download/nginx-1.20.1.tar.gz
2.安裝依賴包
Nginx的配置及運(yùn)行需要pcre、zlib等軟件包的支持,因此需要安裝這些軟件的開發(fā)包,以便提供相應(yīng)的庫(kù)和頭文件。
yum -y install pcre-devel zlib-devel gcc gcc-c++ make
3.創(chuàng)建運(yùn)行用戶與組
創(chuàng)建運(yùn)行用戶、組(Nginx 服務(wù)程序默認(rèn)以 nobody 身份運(yùn)行,建議為其創(chuàng)建專門的用戶賬號(hào),以便更準(zhǔn) 確地控制其訪問權(quán)限)
useradd -M -s /sbin/nologin nginx
?編譯安裝Nginx
cd /opt
tar xzvf nginx-1.18.0.tar.gz -C /opt/
cd nginx-1.18.0/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module
make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
檢查?
nginx -t
沒有創(chuàng)建用戶
代表成功
2.2.1、添加 Nginx 系統(tǒng)服務(wù)
方法一: service 系統(tǒng)管理
通用
vim /etc/init.d/nginx
#!/bin/bash
#chkconfig: 35 99 20 #這是固定格式,2345表示運(yùn)行級(jí)別,之后為開機(jī)執(zhí)行順序和關(guān)機(jī)執(zhí)行順序
#description:Nginx Service Control Script #描述,最好也添加
COM="/usr/local/nginx/sbin/nginx"
PID="/usr/local/nginx/logs/nginx.pid"
case "$1" in
start)
$COM
;;
stop)
kill -s QUIT $(cat $PID)
;;
restart)
$0 stop
$0 start
;;
reload)
kill -s HUP $(cat $PID)
;;
*)
echo "Usage: $0 {start|stop|restart|reload}"
exit 1
;;
esac
exit 0
chmod +x /etc/init.d/nginx chkconfig --add nginx #添加為系統(tǒng)服務(wù) systemctl stop nginx systemctl start nginx
也可以? ? ? service nginx start | stop | restart | reload ?
方法二:
常用
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl? enable nginx.service
檢測(cè)
輸入ip地址
2.2.2、Nginx 信號(hào)
nginx命令支持向其發(fā)送信號(hào),實(shí)現(xiàn)不同功能 nginx
查看
nginx -h
當(dāng)做單獨(dú)命令使用有以下選項(xiàng)?
2.2.3、普通升級(jí)
新版本升級(jí):
tar -zxvf nginx-1.xx.xx.tar.gz 1.22.0
tar -zxvf nginx-1.xx.xx.tar.gz 1.22.0
2.2.4、附加:平滑升級(jí)
擴(kuò)展還有一種方式叫做 平滑升級(jí) 在不影響生產(chǎn)環(huán)境的情況升級(jí)在【前置資源】
2.3、nginx主配置文件nginx.conf
在Nginx服務(wù)的主配置文件 nginx.conf
vim /usr/local/nginx/conf/nginx.conf
2.3.1、 全局配置
2P:2個(gè)物理CPU
4C:1物理核有4個(gè)核心一共有2*4=8個(gè)邏輯核
8G內(nèi)存 4C 16G 高效盤 40G (系統(tǒng)盤) ? 存儲(chǔ) oss 網(wǎng)絡(luò)存儲(chǔ) nas 50M
2.3.2、 I/O 事件配置
1.使用epoll模型以提高性能
epoll是Linux內(nèi)核為處理大批句柄而作改進(jìn)的poll,是Linux下多路復(fù)用IO接口select/poll的增強(qiáng)版本,它能顯著的減少程序在大量并發(fā)連接中只有少量活躍的情況下的系統(tǒng)CPU利用率。
2.還有在Linux平臺(tái)上,在進(jìn)行高并發(fā)TCP連接處理時(shí),最高的并發(fā)數(shù)量都要受到系統(tǒng)對(duì)用戶單一進(jìn)程同時(shí)可打開文件數(shù)量的限制
(這是因?yàn)橄到y(tǒng)為每個(gè)TCP連接都要?jiǎng)?chuàng)建一個(gè)socket句柄,每個(gè)socket句柄同時(shí)也是一個(gè)文件句柄)
可使用ulimit -a命令查看系統(tǒng)允許當(dāng)前用戶進(jìn)程打開的文件數(shù)限制【展示當(dāng)前資源限制】。
如提高每個(gè)進(jìn)程的連接數(shù)還需執(zhí)行“ulimit -n 65535”命令臨時(shí)修改本地每個(gè)進(jìn)程可以同時(shí)打開的最大文件數(shù)。
?/etc/security/limits.conf?? 是一個(gè)用于配置用戶或用戶組資源限制的配置文件。這個(gè)文件通常用于設(shè)置系統(tǒng)資源的軟限制和硬限制,以及一些特殊權(quán)限。
若工作進(jìn)程數(shù)為 8,每個(gè)進(jìn)程處理 4096 個(gè)連接,則允許 Nginx 正常提供服務(wù)的連接數(shù) 已超過(guò) 3 萬(wàn)個(gè)(4096×8=32 768),當(dāng)然具體還要看服務(wù)器硬件、網(wǎng)絡(luò)帶寬等物理?xiàng)l件的性 能表現(xiàn)。
附加:IO模型的知識(shí)點(diǎn)【前置資源】
2.3.3、?HTTP 配置
使用“http { }”界定標(biāo)記,包括訪問日志、HTTP 端口、網(wǎng)頁(yè)目錄、默認(rèn)字符集、連接保持,以及后面要講到的虛擬 Web 主機(jī)、PHP 解析等一系列設(shè)置,其中大部分配置語(yǔ)句都包含在子界定標(biāo)記“server { }”內(nèi)
http {
##文件擴(kuò)展名與文件類型映射表
include mime.types;
##默認(rèn)文件類型
default_type application/octet-stream;
##日志格式設(shè)定
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
##訪問日志位置
#access_log logs/access.log main;
##支持文件發(fā)送(下載)
sendfile on;
##此選項(xiàng)允許或禁止使用socket的TCP_CORK的選項(xiàng)(發(fā)送數(shù)據(jù)包前先緩存數(shù)據(jù)),此選項(xiàng)僅在使用
sendfile的時(shí)候使用
#tcp_nopush on;
##連接保持超時(shí)時(shí)間,單位是秒
#keepalive_timeout 0;
keepalive_timeout 65;
##gzip模塊設(shè)置,設(shè)置是否開啟gzip壓縮輸出
#gzip on;
##Web 服務(wù)的監(jiān)聽配置
server {
##監(jiān)聽地址及端口
listen 80;
##站點(diǎn)域名,可以有多個(gè),用空格隔開
server_name www.kgc.com;
##網(wǎng)頁(yè)的默認(rèn)字符集
charset utf-8;
##根目錄配置
location / {
##網(wǎng)站根目錄的位置/usr/local/nginx/html
root html;
##默認(rèn)首頁(yè)文件名
index index.html index.php;
}
##內(nèi)部錯(cuò)誤的反饋?lái)?yè)面
error_page 500 502 503 504 /50x.html;
##錯(cuò)誤頁(yè)面配置
location = /50x.html {
root html;
}
}
}
三、實(shí)戰(zhàn)
3.1、Nginx的訪問狀態(tài)統(tǒng)計(jì)
-------訪問狀態(tài)統(tǒng)計(jì)配置--------
1.先使用命令/usr/local/nginx/sbin/nginx -V 查看已安裝的 Nginx 是否包含
HTTP_STUB_STATUS 模塊
cat /opt/nginx-1.18.0/auto/options |grep YES
#可查看 nginx 已安裝的所有模塊
2.修改 nginx.conf 配置文件,指定訪問位置并添加 stub_status 配置
cd /usr/local/nginx/conf
#備份
cp nginx.conf nginx.conf.bak
#配置
vim /usr/local/nginx/conf/nginx.conf
------------------------------------------------------------------
http {
......
server {
listen 80;
server_name www.yc.com;
charset utf-8;
location / {
root html;
index index.html index.php;
}
##添加 stub_status 配置##
location /status {
#訪問位置為/status
stub_status on;
access_log off;
}
}
}
-------------------------------------------------------------------
3.重啟服務(wù),訪問測(cè)試
systemctl restart nginx
#打開狀態(tài)統(tǒng)計(jì)功能
#關(guān)閉此位置的日志記錄
瀏覽器訪問 http://192.168.10.19/status
Active connections :表示當(dāng)前的活動(dòng)連接數(shù); server accepts handled requests :表示已經(jīng)處理的連接信息,三個(gè)數(shù)字依次表示
已處理的連接數(shù)、成功的TCP握手次數(shù)、 已處理的請(qǐng)求數(shù)。 可 curl -s http://192.168.10.19/status 結(jié)合 awk與if 語(yǔ)句進(jìn)行性能監(jiān)控。
補(bǔ)充:也可以nginx-module-vts監(jiān)控nginx流量
也放在【前置資源】
3.2、基于授權(quán)的訪問控制
--------基于授權(quán)的訪問控制--------
1.生成用戶密碼認(rèn)證文件
yum install -y httpd-tools
htpasswd -c /usr/local/nginx/passwd.db zhangsan
chown nginx /usr/local/nginx/passwd.db
chmod 400 /usr/local/nginx/passwd.db
2.修改主配置文件相對(duì)應(yīng)目錄,添加認(rèn)證配置項(xiàng)
vim /usr/local/nginx/conf/nginx.conf
......
server {
location / {
......
##添加認(rèn)證配置##
auth_basic "secret";
}
}
#設(shè)置密碼提示框文字信息
auth_basic_user_file /usr/local/nginx/passwd.db;
??3.重啟服務(wù),訪問測(cè)試 nginx -t systemctl restart nginx 瀏覽器訪問 http://192.168.10.19
輸入密碼以后
3.3、基于客戶端的訪問控制
--------基于客戶端的訪問控制--------
訪問控制規(guī)則如下:
deny IP/IP 段:拒絕某個(gè) IP 或 IP 段的客戶端訪問。
allow IP/IP 段:允許某個(gè) IP 或 IP 段的客戶端訪問。
規(guī)則從上往下執(zhí)行,如匹配則停止,不再往下匹配。
vim /usr/local/nginx/conf/nginx.conf
......
server {
location / {
......
##添加控制規(guī)則##
allow 192.168.10.20; #允許訪問的客戶端 IP
deny all; #拒絕其它IP客戶端訪問
}
}
systemctl restart nginx
3.4、基于域名的 Nginx 虛擬主機(jī)
--------基于域名的 Nginx 虛擬主機(jī)--------
1.為虛擬主機(jī)提供域名解析
echo "192.168.xx www.yc.com www.benet.com" >> /etc/hosts
2.為虛擬主機(jī)準(zhǔn)備網(wǎng)頁(yè)文檔
mkdir -p /var/www/html/benet
mkdir -p /var/www/html/yc
echo "
this is www.yc.com
" > /var/www/html/yc/index.htmlecho "
this is www.benet.com
" > /var/www/html/benet/index.html3.修改Nginx的配置文件
vim /usr/local/nginx/conf/nginx.conf
......
http {
......
server {
listen 80;
server_name www.yc.com; #設(shè)置域名www.yc.com
charset utf-8;
access_log logs/www.yc.access.log; #設(shè)置日志名
location / {
root /var/www/html/yc; #設(shè)置www.yc.com 的工作目錄
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
server {
listen 80;
server_name www.benet.com; #設(shè)置域名www.benet.com
charset utf-8;
access_log logs/www.benet.access.log;
location / {
root /var/www/html/benet;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
}
?4.重啟服務(wù),訪問測(cè)試 systemctl restart nginx
瀏覽器訪問 http://www.yc.com http://www.benet.com
3.5、基于IP 的 Nginx 虛擬主機(jī)
--------基于IP 的 Nginx 虛擬主機(jī)--------
ifconfig ens33:0 192.168.10.40 netmask 255.255.255.0
vim /usr/local/nginx/conf/nginx.conf
------------------------------------------------------------------------------------------
http {
......
server {
listen 192.168.10.19:80; #設(shè)置監(jiān)聽地址192.168.10.19
server_name www.yc.com;
charset utf-8;
access_log logs/www.yc.access.log;
location / {
root /var/www/html/yc;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}1
}
server {
listen 192.168.10.40:80; #設(shè)置監(jiān)聽地址192.168.10.40
server_name www.benet.com;
charset utf-8;
access_log logs/www.benet.access.log;
location / {
root /var/www/html/benet;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
}
systemctl restart nginx 瀏覽器訪問 http://192.168.10.40 ?http://192.168.80.11
3.6、基于端口的 Nginx 虛擬主機(jī)
--------基于端口的 Nginx 虛擬主機(jī)--------
vim /usr/local/nginx/conf/nginx.conf
......
http {
......
server {
listen 192.168.80.10:8080; #設(shè)置監(jiān)聽 8080 端口
server_name www.kgc.com;
charset utf-8;
access_log logs/www.kgc.access.log;
location / {
root /var/www/html/kgc;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
server {
listen 192.168.80.10:8888; #設(shè)置監(jiān)聽 8888 端口
server_name www.benet.com;
charset utf-8;
access_log logs/www.benet.access.log;
location / {
root /var/www/html/benet;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
}
?systemctl restart nginx 瀏覽器訪問 http://192.168.80.11:8080 ?http://192.168.80.11:8888 ?
四、lnmp架構(gòu)部署及應(yīng)用
Nginx 工作原理 這里需要結(jié)合 Apache 的工作,對(duì) PHP 文件處理過(guò)程的區(qū)別
1:Nginx 是通過(guò) php-fpm 這個(gè)服務(wù)來(lái)處理 php 文件
2:Apache 是通過(guò) libphp5.so 這個(gè)模塊來(lái)處理 php 文件 Apache: Apache 的 libphp5.so 隨著 Apache 服務(wù)器一起運(yùn)行,而 Nginx 和 php-fpm 是各自獨(dú)立運(yùn)行,所 以在運(yùn)行過(guò)程中,Nginx 和 php-fpm 都需要分別啟動(dòng)! 修改 Nginx 配置文件,啟動(dòng) Nginx 服務(wù),修改 php 配置文件,啟動(dòng) php-fpm 服務(wù) 反向代理 對(duì)應(yīng)頁(yè)面Ip:端口
具體過(guò)程【前置資源】
柚子快報(bào)邀請(qǐng)碼778899分享:linux Nginx服務(wù)
推薦閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。