Nginx服務(wù)部署與配置全過(guò)程
一、 概述
Nginx 是開源、高性能、高可靠的 Web服務(wù)器 和反向代理服務(wù)器,而且支持熱部署,幾乎可以做到 7 * 24 小時(shí)不間斷運(yùn)行,即使運(yùn)行幾個(gè)月也不需要重新啟動(dòng),還能在不間斷服務(wù)的情況下對(duì)軟件版本進(jìn)行熱更新。
性能是 Nginx 最重要的考量,其占用內(nèi)存少、并發(fā)能力強(qiáng)、能支持高達(dá) 5w 個(gè)并發(fā)連接數(shù),最重要的是, Nginx 是免費(fèi)的并可以商業(yè)化,配置使用也比較簡(jiǎn)單。
1.1 Nginx 特點(diǎn)
- 高并發(fā)、高性能;
- 模塊化架構(gòu)使得它的擴(kuò)展性非常好;
- 異步非阻塞的事件驅(qū)動(dòng)模型(epoll)這點(diǎn)和 Node.js 相似;
- 相對(duì)于其它服務(wù)器來(lái)說(shuō)它可以連續(xù)幾個(gè)月甚至更長(zhǎng)而不需要重啟服務(wù)器使得它具有高可靠性;
- 熱部署、平滑升級(jí);
- 完全開源,生態(tài)繁榮。
1.2 Nginx 作用
- http服務(wù)器。Nginx可以獨(dú)立提供http服務(wù)。可做網(wǎng)頁(yè)靜態(tài)服務(wù)器。
- 虛擬主機(jī)。可以實(shí)現(xiàn)在一臺(tái)服務(wù)器虛擬出多個(gè)虛擬服務(wù)器。
- 反向代理,負(fù)載均衡。當(dāng)網(wǎng)站的訪問(wèn)量達(dá)到一定程度后,單臺(tái)服務(wù)器不能滿足用戶的請(qǐng)求時(shí),需要用多臺(tái)服務(wù)器集群可以使用nginx做反向代理。并且多臺(tái)服務(wù)器可以平均分擔(dān)負(fù)載,不會(huì)應(yīng)為某臺(tái)服務(wù)器負(fù)載高宕機(jī)而某臺(tái)服務(wù)器閑置的情況。
- nginx 中也可以配置安全管理、比如可以使用Nginx搭建API接口網(wǎng)關(guān),對(duì)每個(gè)接口服務(wù)進(jìn)行攔截。
Nginx 是一個(gè)高性能的 HTTP 和 反向代理 服務(wù)器,也是一個(gè) IMAP/POP3/SMTP 代理服務(wù)器。它的工作原理主要基于 事件驅(qū)動(dòng)架構(gòu) 和 異步非阻塞 I/O 模型,使其能夠高效處理大量并發(fā)連接。以下是 Nginx 的核心工作原理:
1.3 Nginx工作原理
1. 事件驅(qū)動(dòng)架構(gòu)(Event-Driven)
Nginx 采用 事件驅(qū)動(dòng) 模型(如 epoll、kqueue),而不是傳統(tǒng)的多線程/多進(jìn)程模型(如 Apache 的 prefork)。
優(yōu)勢(shì):
- 單個(gè)工作進(jìn)程可以處理數(shù)千個(gè)并發(fā)連接,減少上下文切換和內(nèi)存開銷。
- 通過(guò)事件循環(huán)(Event Loop)監(jiān)聽文件描述符(如 Socket),當(dāng)數(shù)據(jù)就緒時(shí)觸發(fā)回調(diào)函數(shù),避免阻塞。
2. 多進(jìn)程模型(Master-Worker)
Nginx 啟動(dòng)時(shí)分為兩類進(jìn)程:
Master 進(jìn)程:
- 負(fù)責(zé)讀取配置文件、管理 Worker 進(jìn)程(啟動(dòng)、停止、重載配置)。
- 不直接處理客戶端請(qǐng)求。
Worker 進(jìn)程:
- 實(shí)際處理請(qǐng)求的進(jìn)程(數(shù)量可配置,通常與 CPU 核心數(shù)相同)。
- 每個(gè) Worker 是獨(dú)立的,通過(guò)事件驅(qū)動(dòng)機(jī)制高效處理并發(fā)連接。
優(yōu)勢(shì):
- Worker 進(jìn)程崩潰時(shí),Master 可以快速重啟新的 Worker,提高穩(wěn)定性。
- 多 Worker 利用多核 CPU,避免線程競(jìng)爭(zhēng)。
3. 異步非阻塞 I/O
Nginx 使用 非阻塞 I/O 操作:
- 當(dāng) Worker 處理一個(gè)請(qǐng)求時(shí),如果遇到 I/O 操作(如讀取文件、訪問(wèn)數(shù)據(jù)庫(kù)),不會(huì)等待完成,而是立即處理其他請(qǐng)求。
- I/O 操作完成后,通過(guò)事件通知(如
epoll)觸發(fā)回調(diào)繼續(xù)處理。
對(duì)比傳統(tǒng)阻塞模型:
- Apache 的每個(gè)連接可能需要一個(gè)線程/進(jìn)程,高并發(fā)時(shí)資源消耗大。
- Nginx 的 Worker 僅在 CPU 計(jì)算時(shí)占用資源,I/O 等待時(shí)不阻塞。
4. 請(qǐng)求處理流程
接收請(qǐng)求:
- Worker 通過(guò)監(jiān)聽端口(如 80)接收客戶端連接。
解析請(qǐng)求:
- 解析 HTTP 頭部,確定 Host、URL、方法(GET/POST)等。
匹配 Location:
- 根據(jù)配置文件中的
server和location塊匹配請(qǐng)求。
處理靜態(tài)/動(dòng)態(tài)內(nèi)容:
- 靜態(tài)文件:直接讀取文件并返回(高效,默認(rèn)開啟
sendfile零拷貝)。 - 動(dòng)態(tài)請(qǐng)求:通過(guò)反向代理(如 FastCGI、uWSGI)轉(zhuǎn)發(fā)到后端服務(wù)(如 PHP、Python)。
返回響應(yīng):
- 組裝 HTTP 響應(yīng),通過(guò)非阻塞 I/O 發(fā)送給客戶端。
5. 高性能關(guān)鍵設(shè)計(jì)
- 零拷貝(sendfile):靜態(tài)文件直接從磁盤發(fā)送到網(wǎng)絡(luò),無(wú)需經(jīng)過(guò)應(yīng)用層緩沖區(qū)。
- 連接復(fù)用(Keepalive):減少 TCP 握手/揮手的開銷。
- 內(nèi)存池:減少頻繁的內(nèi)存分配/釋放,提高內(nèi)存管理效率。
- 負(fù)載均衡:作為反向代理時(shí),支持輪詢、IP Hash、加權(quán)分配等算法。
6. 擴(kuò)展性
- 模塊化設(shè)計(jì):核心功能(如 HTTP、Mail)和第三方模塊(如 Lua、WebSocket)可動(dòng)態(tài)加載。
- 熱部署:修改配置后,通過(guò)
nginx -s reload平滑重啟,不中斷現(xiàn)有連接。
總結(jié):
Nginx 的高性能源于:
- 事件驅(qū)動(dòng) + 非阻塞 I/O:用少量進(jìn)程處理高并發(fā)。
- 多進(jìn)程隔離:避免單點(diǎn)故障,利用多核 CPU。
- 高效內(nèi)存/文件處理:零拷貝、內(nèi)存池等優(yōu)化。
適合場(chǎng)景:靜態(tài)資源服務(wù)、反向代理、負(fù)載均衡、API 網(wǎng)關(guān)等。
二、Nginx服務(wù)搭建
2.1 Ningx安裝
2.1.1 yum安裝
yum 安裝默認(rèn)安裝在
[root@nginx1~]#yum install -y nginx ##驗(yàn)證安裝結(jié)果 [root@nginx1~]#rpm -q nginx nginx-1.20.1-7.el7.x86_64
2.1.2 編譯安裝
[root@bogon ~]# tar xf nginx-1.25.3.tar.gz [root@bogon ~]# ls anaconda-ks.cfg ceph-release-1-1.el7.noarch.rpm nginx-1.25.3 nginx-1.25.3.tar.gz [root@bogon ~]# yum install -y pcre-devel [root@bogon ~]# yum install -y zlib-devel [root@bogon ~]# cd nginx-1.25.3 [root@bogon nginx-1.25.3]# ./configure --prefix=/usr/local/nginx checking for OS + Linux 3.10.0-1160.el7.x86_64 x86_64 checking for C compiler ... found + using GNU C compiler + gcc version: 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
三、Nginx服務(wù)平滑升級(jí)
3.1 Nginx添加新模塊
在已編譯安裝Nginx的基礎(chǔ)上添加–with-http_image_filter_module模塊。
(1)進(jìn)入Nginx解壓目錄
[root@bogon nginx-1.25.3]# /usr/local/nginx/sbin/nginx -V nginx version: nginx/1.25.3 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) configure arguments: --prefix=/usr/local/nginx
(2)添加–with-http_image_filter_module模塊。
[root@bogon nginx-1.25.3]# /usr/local/nginx/sbin/nginx -V nginx version: nginx/1.25.3 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) configure arguments: --prefix=/usr/local/nginx –with-http_image_filter_module
[root@bogon nginx-1.25.3]# make
備份原Nginx二進(jìn)制文件
[root@bogon nginx-1.25.3]# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
復(fù)制新的nginx二進(jìn)制文件,進(jìn)入新的nginx源碼包
[root@bogon nginx-1.25.3]# cp /root/nginx-1.25.3/objs/nginx /usr/local/nginx/sbin/nginx
測(cè)試新版本的nginx是否正常
[root@bogon nginx-1.25.3]# /usr/local/nginx/sbin/nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
3.2 Nginx版本升級(jí)
1.25版本------>1.27版本
#解壓新版本 [root@bogon ~]# tar zxf nginx-1.27.3.tar.gz -C /usr/local/ [root@bogon ~]# cd /usr/local/nginx-1.27.3/ [root@bogon nginx-1.27.3]# ./configure --prefix=/usr/local/nginx checking for OS + Linux 3.10.0-1160.el7.x86_64 x86_64 checking for C compiler ... found #進(jìn)行編譯 #注意:這里不能進(jìn)行,make install 操作,否則將會(huì)被覆蓋,可能會(huì)影響線上業(yè)務(wù)。 [root@bogon nginx-1.27.3]# make #拷貝Nginx1.27版本的二進(jìn)制文件到1.25版本 [root@bogon ~]# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak #先備份一份 [root@bogon ~]# cp /usr/local/nginx-1.18.0/objs/nginx /usr/local/nginx/sbin/ #啟動(dòng)新的主進(jìn)程,查看升級(jí)后的版本 [root@bogon ~]# kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid) #查看升級(jí)后的版本 [root@bogon ~]# /usr/local/nginx/sbin/nginx -V
四、Nginx服務(wù)反向代理
概述
什么是反向代理
反向代理代理的是服務(wù)端
反向代理:(reverse proxy),指的是代理外網(wǎng)用戶的請(qǐng)求到內(nèi)部的指定的服務(wù)器,并將數(shù)據(jù)返回給用戶的一種方式
客戶端不直接與后端服務(wù)器進(jìn)行通信,而是與反向代理服務(wù)器進(jìn)行通信,隱藏了后端服務(wù)器的 IP 地址
4.1反向代理實(shí)戰(zhàn)
- 反向代理服務(wù)器 192.168.49.134
- 主機(jī) 192.168.49.135
- 服務(wù)器 192.168.49.136
要求主機(jī)訪問(wèn)反向代理服務(wù)器時(shí),其實(shí)是去找服務(wù)器,隱藏服務(wù)器ip地址
反向代理服務(wù)器 安裝nginx 配置好文件
在nginx.conf中配置
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://192.168.49.136;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
#測(cè)試nginx
nginx -t
#重新加載
nginx -s reload
五、Nginx服務(wù)負(fù)載均衡
服務(wù)端 192.168.49.136 ;客戶端 192.168.49.135
- 代理端 192.168.49.134
- 反向代理實(shí)現(xiàn)負(fù)載均衡配置:
- NGINX的負(fù)載均衡原理是基于反向代理和事件驅(qū)動(dòng)的機(jī)制。
當(dāng)客戶端發(fā)送請(qǐng)求時(shí),NGINX作為反向代理服務(wù)器接收請(qǐng)求,并根據(jù)配置的負(fù)載均衡算法將請(qǐng)求轉(zhuǎn)發(fā)到后端的多個(gè)服務(wù)器上,實(shí)現(xiàn)負(fù)載均衡。
常見配置參數(shù)
location / {
proxy_pass http://192.168.49.136;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
輪詢實(shí)現(xiàn)負(fù)載均衡配置:
upstream group1{
server 192.164.49.134;
server 192.164.49.136;
}
location / {
pass_proxy http://group1;
}
nginx -t
nginx -s reload
#重新加載
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
淺析nginx 客戶端返回499的錯(cuò)誤碼的問(wèn)題
我們服務(wù)器客戶端一直有返回錯(cuò)誤碼499的日志,以前覺得比例不高,就沒有仔細(xì)查過(guò),最近有領(lǐng)導(dǎo)問(wèn)這個(gè)問(wèn)題,為什么耗時(shí)只有0.0幾秒,為啥還499了?最近幾天就把這個(gè)問(wèn)題跟蹤定位了一下,這里做個(gè)記錄,對(duì)nginx返回499錯(cuò)誤碼相關(guān)知識(shí)感興趣的朋友一起看看吧2022-10-10
使用Nginx服務(wù)器如何實(shí)現(xiàn)動(dòng)靜分離和反向代理
這篇文章主要介紹了使用Nginx服務(wù)器如何實(shí)現(xiàn)動(dòng)靜分離和反向代理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
Centos系統(tǒng)中如何在指定位置下安裝Nginx
這篇文章主要介紹了Centos系統(tǒng)中如何在指定位置下安裝Nginx,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
強(qiáng)大的 Web 應(yīng)?服務(wù)器OpenResty安裝(Nginx倉(cāng)庫(kù))
OpenResty 是?個(gè)強(qiáng)大的 Web 應(yīng)?服務(wù)器,Web 開發(fā)?員可以使用 Lua 腳本語(yǔ)?調(diào)動(dòng) Nginx ?持的各種 C 以及 Lua 模塊,更主要的是在性能方面,OpenResty可以快速構(gòu)造出足以勝任 10K 以上并發(fā)連接響應(yīng)的超高性能 Web 應(yīng)用系統(tǒng)2023-06-06
Nginx Lua 緩存配置的實(shí)現(xiàn)步驟
在Web應(yīng)用緩存層次中,Nginx Lua緩存因其高效的協(xié)程機(jī)制,與Nginx的集成,以及OpenResty的擴(kuò)展性,成為了一種高性能的緩存解決方案,本文就來(lái)詳細(xì)介紹,感興趣的可以了解一下2022-05-05
nginx配置多個(gè)前端項(xiàng)目實(shí)現(xiàn)步驟
本文主要介紹了nginx配置多個(gè)前端項(xiàng)目實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03

