前言
Nginx 是一個(gè)高性能的 HTTP 和反向代理服務(wù)器,也是一個(gè) IMAP/POP3 代理服務(wù)器。它以其高并發(fā)處理能力、穩(wěn)定性、豐富的功能模塊和低內(nèi)存消耗而聞名。
一. Nginx簡(jiǎn)介
● Nginx (engine x) 是一個(gè)高性能的HTTP和反向代理web服務(wù)器,同時(shí)也提供了IMAP/POP3/SMTP服務(wù)。
● 其特點(diǎn)是占有內(nèi)存少,并發(fā)能力強(qiáng),事實(shí)上nginx的并發(fā)能力在同類(lèi)型的網(wǎng)頁(yè)服務(wù)器中表現(xiàn)較好
● Nginx 是一個(gè)安裝非常的簡(jiǎn)單、配置文件非常簡(jiǎn)潔(還能夠支持perl語(yǔ)法)、Bug非常少的服務(wù)。Nginx 啟動(dòng)特別容易,并且?guī)缀蹩梢宰龅?*24不間斷運(yùn)行,即使運(yùn)行數(shù)個(gè)月也不需要重新啟動(dòng)。
● Nginx代碼完全用C語(yǔ)言從頭寫(xiě)成。官方數(shù)據(jù)測(cè)試表明能夠支持高達(dá) 50,000 個(gè)并發(fā)連接數(shù)的響應(yīng)。
二. Nginx作用
2.1 代理
- 正向代理:代理是代理客戶端的
客戶端 <一> 代理 一>服務(wù)端
在這里插入圖片描述
正向代理是一個(gè)位于客戶端和原始服務(wù)器之間的服務(wù)器,所有客戶端的請(qǐng)求都首先發(fā)送到正向代理服務(wù)器,然后由代理服務(wù)器將請(qǐng)求轉(zhuǎn)發(fā)到原始服務(wù)器。正向代理的目的是為了隱藏客戶端的信息。
Nginx不是默認(rèn)的正向代理服務(wù)器,但可以通過(guò)配置來(lái)實(shí)現(xiàn)正向代理的功能。
通常某些服務(wù)因?yàn)榘踩珕?wèn)題,限制固定訪問(wèn),因此可以通過(guò)正向代理解決
訪問(wèn)某些國(guó)外的服務(wù)訪問(wèn)慢,可以通過(guò)正向代理中繼緩解丟包和延遲高的問(wèn)題
例如:VPN
http { resolver 8.8.8.8; server { listen 8088; location / { proxy_pass http://$http_host$request_uri; } } } AI寫(xiě)代碼
反向代理:
反向代理,客戶端對(duì)代理是無(wú)感知的,客戶端不需要任何配置就可以訪問(wèn),客戶端將請(qǐng)求發(fā)送到反向代理服務(wù)器,由反向代理服務(wù)器去選擇目標(biāo)服務(wù)器獲取數(shù)據(jù)后,再返回給客戶端,此時(shí)反向代理服務(wù)器和目標(biāo)服務(wù)器對(duì)外就是一個(gè)服務(wù)器,暴露的是代理服務(wù)器地址,隱藏了真實(shí)服務(wù)器IP地址。
Nginx是默認(rèn)的反向代理服務(wù)器。以下是一個(gè)簡(jiǎn)單的Nginx配置示例,用于設(shè)置Nginx作為反向代理服務(wù)器:
在這里插入圖片描述
比如:百度的服務(wù)器是在不同的服務(wù)器上,我們只需要搜索baidu.com就行
2.2 負(fù)載均衡
如果請(qǐng)求數(shù)過(guò)大,單個(gè)服務(wù)器解決不了,我們?cè)黾臃?wù)器的數(shù)量,然后將請(qǐng)求分發(fā)到各個(gè)服務(wù)器上,將原先請(qǐng)求集中到單個(gè)服務(wù)器的情況改為請(qǐng)求分發(fā)到多個(gè)服務(wù)器上,就是負(fù)載均衡。
Nginx提供的負(fù)載均衡策略有2種:內(nèi)置策略和擴(kuò)展策略。內(nèi)置策略為輪詢,加權(quán)輪詢,Ip hash。擴(kuò)展策略,就天馬行空,只有你想不到的沒(méi)有他做不到的。
輪詢:
在這里插入圖片描述
加權(quán)輪詢
在這里插入圖片描述
iphash
對(duì)客戶端請(qǐng)求的ip進(jìn)行hash操作,然后根據(jù)hash結(jié)果將同一個(gè)客戶端ip的請(qǐng)求分發(fā)給同一臺(tái)服務(wù)器進(jìn)行處理,可以解決session不共享的問(wèn)題。
在這里插入圖片描述
2.3 動(dòng)靜分離
在我們的軟件開(kāi)發(fā)中,有些請(qǐng)求是需要后臺(tái)處理的,有些請(qǐng)求是不需要經(jīng)過(guò)后臺(tái)處理的(如:css、html、jpg、js等等文件),這些不需要經(jīng)過(guò)后臺(tái)處理的文件稱(chēng)為靜態(tài)文件。讓動(dòng)態(tài)網(wǎng)站里的動(dòng)態(tài)網(wǎng)頁(yè)根據(jù)一定規(guī)則把不變的資源和經(jīng)常變的資源區(qū)分開(kāi)來(lái),動(dòng)靜資源做好了拆分以后,我們就可以根據(jù)靜態(tài)資源的特點(diǎn)將其做緩存操作。提高資源響應(yīng)的速度。
在這里插入圖片描述
三. 安裝
下載地址:https://nginx.org/en/download.html
下載
在這里插入圖片描述
解壓至任意非中文路徑下:
在這里插入圖片描述
運(yùn)行
直接雙擊nginx.exe 即可(一閃而過(guò)),或者進(jìn)入cmd 輸入nginx.exe
在這里插入圖片描述
檢測(cè)
瀏覽器輸入:http://localhost:80 瀏覽器默認(rèn)端口就是80 所以80端口可以不寫(xiě)
在這里插入圖片描述
配置監(jiān)聽(tīng)
nginx的配置文件是conf目錄下的nginx.conf,默認(rèn)配置的nginx監(jiān)聽(tīng)的端口為80,如果80端口被占用可以修改為未被占用的端口即可
server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } ...
當(dāng)我們修改了nginx的配置文件nginx.conf 時(shí),不需要關(guān)閉nginx后重新啟動(dòng)nginx,只需要執(zhí)行命令 nginx -s reload 即可讓改動(dòng)生效
關(guān)閉nginx
如果使用cmd命令窗口啟動(dòng)nginx, 關(guān)閉cmd窗口是不能結(jié)束nginx進(jìn)程的,可使用兩種方法關(guān)閉nginx
(1) 輸入nginx命令 nginx -s stop(快速停止nginx) 或 nginx -s quit(完整有序的停止nginx)
(2) 使用taskkill taskkill /f /t /im nginx.exe
taskkill是用來(lái)終止進(jìn)程的,
/f是強(qiáng)制終止 .
/t終止指定的進(jìn)程和任何由此啟動(dòng)的子進(jìn)程。
/im示指定的進(jìn)程名稱(chēng) .
3.2 Linux
1.安裝gcc(已經(jīng)安裝的可以忽略這個(gè)步驟)安裝 nginx 需要先將官網(wǎng)下載的源碼進(jìn)行編譯,編譯依賴 gcc 環(huán)境,如果沒(méi)有 gcc 環(huán)境,則需要安裝
yum install gcc-c++
2.PCRE pcre-devel安裝(已經(jīng)安裝的可以忽略這個(gè)步驟)PCRE(Perl Compatible Regular Expressions) 是一個(gè)Perl庫(kù),包括 perl 兼容的正則表達(dá)式庫(kù)。nginx 的 http 模塊使用 pcre 來(lái)解析正則表達(dá)式,所以需要在 linux 上安裝 pcre 庫(kù),pcre-devel 是使用 pcre 開(kāi)發(fā)的一個(gè)二次開(kāi)發(fā)庫(kù)。nginx也需要此庫(kù)。命令:
yum install -y pcre pcre-devel AI寫(xiě)代碼
3.zlib安裝(已經(jīng)安裝的可以忽略這個(gè)步驟)zlib 庫(kù)提供了很多種壓縮和解壓縮的方式, nginx 使用 zlib 對(duì) http 包的內(nèi)容進(jìn)行 gzip ,所以需要在 Centos 上安裝 zlib 庫(kù)。
yum install -y zlib zlib-devel AI寫(xiě)代碼
4.openssl安裝(已經(jīng)安裝的可以忽略這個(gè)步驟)OpenSSL 是一個(gè)強(qiáng)大的安全套接字層密碼庫(kù),囊括主要的密碼算法、常用的密鑰和證書(shū)封裝管理功能及 SSL 協(xié)議,并提供豐富的應(yīng)用程序供測(cè)試或其它目的使用。nginx 不僅支持 http 協(xié)議,還支持 https(即在ssl協(xié)議上傳輸http),所以需要在 Centos 安裝 OpenSSL 庫(kù)
yum install -y openssl openssl-devel AI寫(xiě)代碼
5.下載linux的nginx安裝包
在這里插入圖片描述
6.上傳到linux上
7.解壓縮
tar -zxvf nginx-1.26.0.tar.gz cd nginx-1.26.0/ AI寫(xiě)代碼
8.順序執(zhí)行下面三個(gè)命令
./configure make make install AI寫(xiě)代碼
9.查看安裝路徑 whereis nginx
在這里插入圖片描述
10.nginx常用命令
# cd /usr/local/nginx/sbin/ # ./nginx //啟動(dòng) # ./nginx -s stop //停止 # ./nginx -s quit //安全退出 # ./nginx -s reload //重新加載配置文件 # ps aux|grep nginx //查看nginx進(jìn)程 AI寫(xiě)代碼
確認(rèn)開(kāi)放了80端口
# 開(kāi)發(fā)端口命令 firewall-cmd --zone=public --add-port=8080/tcp --permanent # 重新加載 firewall-cmd --reload # 查看已開(kāi)放的端口 firewall-cmd --zone=public --list-ports
啟動(dòng)成功訪問(wèn) http://ip:80
在這里插入圖片描述
3.3 Docker
1.拉取鏡像
docker pull nginx
2.查看鏡像
[root@iZf8z89pv77t13an9qqmcrZ ~]# systemctl start docker [root@iZf8z89pv77t13an9qqmcrZ ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE 1panel/maxkb latest c023f10d7cab 2 weeks ago 2.66GB nginx latest 605c77e624dd 2 years ago 141MB redis latest 7614ae9453d1 2 years ago 113MB mysql latest 3218b38490ce 2 years ago 516MB nacos/nacos-server latest bdf60dc2ada3 2 years ago 1.05GB AI寫(xiě)代碼
3.運(yùn)行鏡像
[root@iZwz96byk26u1sns4xp7giZ ~]# docker run --name mn -d -p 80:80 nginx 49c02ef7c18facc452762fa7e722720235290df28fce39b6aebb8b024ae21d70
4.檢測(cè)
在這里插入圖片描述
掛載
簡(jiǎn)單啟動(dòng)nginx
docker run --name mn -d -p 80:80 nginx AI寫(xiě)代碼
創(chuàng)建配置文件夾
mkdir -p /opt/nginx AI寫(xiě)代碼
復(fù)制文件
docker cp mn:/usr/share/nginx/html /opt/mount/nginx/ docker cp mn:/etc/nginx/nginx.conf /opt/mount//nginx/ docker cp mn:/etc/nginx/conf.d /opt/mount/nginx/ AI寫(xiě)代碼
刪除原有的Nginx容器
docker rm -f mn AI寫(xiě)代碼
創(chuàng)建容器
docker run --name nginx -d -p 80:80 -p 81:81 -v /opt/mount/nginx/html:/usr/share/nginx/html -v /opt/mount/nginx/nginx.conf:/etc/nginx/nginx.conf:ro -v /opt/mount/nginx/conf.d:/etc/nginx/conf.d nginx:1.26.0 AI寫(xiě)代碼
修改配置
在這里插入圖片描述
把端口改為81
在這里插入圖片描述
四. 實(shí)戰(zhàn)
1.將某個(gè)現(xiàn)有的項(xiàng)目打包
在這里插入圖片描述
2.運(yùn)行jar項(xiàng)目
打開(kāi)window命令窗口,啟動(dòng)服務(wù)java -jar SpringBoot-Redis-1.0-SNAPSHOT.jar在這里插入圖片描述
3.在打開(kāi)另外一個(gè)窗口,啟動(dòng)一個(gè)8081的服務(wù)
java -jar SpringBoot-Redis-1.0-SNAPSHOT.jar --server.port=8081在這里插入圖片描述
4.啟動(dòng)nginx服務(wù). ginx.exe在這里插入圖片描述
5.修改nginx配置
upstream zyy { server 127.0.0.1:8080 weight=1; server 127.0.0.1:8081 weight=1; } server { listen 80; server_name localhost; location / { root html; index index.html index.htm; proxy_pass http://zyy; } ##.... }

五. 配置詳解
https://blog.csdn.net/weixin_43239880/article/details/130841067
5.1原本配置到解釋
我們把其中的注釋都刪掉,除掉了注釋之后的nginx代碼,現(xiàn)在只有22行了
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
注解版本
#nginx進(jìn)程數(shù),建議設(shè)置為等于CPU總核心數(shù)。 worker_processes 1; # 事件區(qū)塊開(kāi)始 events { #單個(gè)進(jìn)程最大連接數(shù)(最大連接數(shù)=連接數(shù)*進(jìn)程數(shù)) #根據(jù)硬件調(diào)整,和前面工作進(jìn)程配合起來(lái)用,盡量大,但是別把cpu跑到100%就行。每個(gè)進(jìn)程允許的最多連接數(shù),理論上每臺(tái)nginx服務(wù)器的最大連接數(shù)為。 worker_connections 1024; } #設(shè)定http服務(wù)器,利用它的反向代理功能提供負(fù)載均衡支持 http { #include:導(dǎo)入外部文件mime.types,將所有types提取為文件,然后導(dǎo)入到nginx配置文件中 include mime.types; #默認(rèn)文件類(lèi)型 default_type application/octet-stream; #開(kāi)啟高效文件傳輸模式,sendfile指令指定nginx是否調(diào)用sendfile函數(shù)來(lái)輸出文件,對(duì)于普通應(yīng)用設(shè)為 on,如果用來(lái)進(jìn)行下載等應(yīng)用磁盤(pán)IO重負(fù)載應(yīng)用,可設(shè)置為off,以平衡磁盤(pán)與網(wǎng)絡(luò)I/O處理速度,降低系統(tǒng)的負(fù)載。注意:如果圖片顯示不正常把這個(gè)改成off。 #sendfile指令指定 nginx 是否調(diào)用sendfile 函數(shù)(zero copy 方式)來(lái)輸出文件,對(duì)于普通應(yīng)用,必須設(shè)為on。如果用來(lái)進(jìn)行下載等應(yīng)用磁盤(pán)IO重負(fù)載應(yīng)用,可設(shè)置為off,以平衡磁盤(pán)與網(wǎng)絡(luò)IO處理速度,降低系統(tǒng)uptime。 sendfile on; #長(zhǎng)連接超時(shí)時(shí)間,單位是秒 keepalive_timeout 65; # 第一個(gè)Server區(qū)塊開(kāi)始,表示一個(gè)獨(dú)立的虛擬主機(jī)站點(diǎn) server { # 提供服務(wù)的端口,默認(rèn)80 listen 80; # 提供服務(wù)的域名主機(jī)名 server_name localhost; #對(duì) "/" 啟用反向代理,第一個(gè)location區(qū)塊開(kāi)始 location / { root html; #服務(wù)默認(rèn)啟動(dòng)目錄 index index.html index.htm; # 默認(rèn)的首頁(yè)文件,多個(gè)用空格分開(kāi) } # 錯(cuò)誤頁(yè)面路由 error_page 500 502 503 504 /50x.html; # 出現(xiàn)對(duì)應(yīng)的http狀態(tài)碼時(shí),使用50x.html回應(yīng)客戶 location = /50x.html { # location區(qū)塊開(kāi)始,訪問(wèn)50x.html root html; # 指定對(duì)應(yīng)的站點(diǎn)目錄為html } } }
5.2 整體基本理解
雖然上面有了注解,但是看起來(lái)還是很迷糊。接著解釋?zhuān)何覀兛梢园裯ginx.conf分為三個(gè)部分進(jìn)行理解:
第一部分:全局塊
第二部分:events塊
第三部分:http塊
在這里插入圖片描述
六. Nginx與網(wǎng)關(guān)的區(qū)別
本質(zhì)上API網(wǎng)關(guān)也是做了請(qǐng)求的轉(zhuǎn)發(fā),那既然Nginx也可以做請(qǐng)求轉(zhuǎn)發(fā),那這兩者有什么區(qū)別?
在這里插入圖片描述
在具體架構(gòu)設(shè)計(jì)時(shí)Nginx做負(fù)載均衡時(shí),考慮到API網(wǎng)關(guān)在系統(tǒng)中不止一個(gè)(以集群的方式做高可用),通??梢詫ginx至于API網(wǎng)關(guān)前,負(fù)責(zé)對(duì)API網(wǎng)關(guān)的負(fù)載均衡,然后再由網(wǎng)關(guān)決定進(jìn)入根據(jù)判定到哪個(gè)真實(shí)的web 服務(wù)器。讓兩者的分工更加明確,也就是:API網(wǎng)關(guān)聚合服務(wù),Nginx請(qǐng)求轉(zhuǎn)發(fā)
業(yè)務(wù)網(wǎng)關(guān)(gateway):對(duì)于具體的后端業(yè)務(wù)應(yīng)用或者是服務(wù)和業(yè)務(wù)有一定關(guān)聯(lián)性的策略網(wǎng)關(guān)。業(yè)務(wù)網(wǎng)關(guān)針對(duì)具體的業(yè)務(wù)需要提供特定的流控策略、緩存策略、鑒權(quán)認(rèn)證策略
流量網(wǎng)關(guān)(Nginx):與業(yè)務(wù)網(wǎng)關(guān)相反,定義全局性的、跟具體的后端業(yè)務(wù)應(yīng)用和服務(wù)完全無(wú)關(guān)的策略網(wǎng)關(guān)。流量網(wǎng)關(guān)通常只專(zhuān)注于全局的Api管理策略,比如全局流量監(jiān)控、日志記錄、全局限流、黑白名單控制、接入請(qǐng)求到業(yè)務(wù)系統(tǒng)的負(fù)載均衡等
業(yè)務(wù)網(wǎng)關(guān)一般部署在流量網(wǎng)關(guān)之后、業(yè)務(wù)系統(tǒng)之前,比流量網(wǎng)關(guān)更靠近業(yè)務(wù)系統(tǒng)。通常API網(wǎng)指的是業(yè)務(wù)網(wǎng)關(guān)。有時(shí)候我們也會(huì)模糊流量網(wǎng)關(guān)和業(yè)務(wù)網(wǎng)關(guān),讓一個(gè)網(wǎng)關(guān)承擔(dān)所有的工作,所以這兩者之間并沒(méi)有嚴(yán)格的界線。
在這里插入圖片描述
nginx與gateway的區(qū)別:
編寫(xiě)語(yǔ)言:
○ Nginx是用C語(yǔ)言編寫(xiě)的,這使得它在處理高并發(fā)連接時(shí)表現(xiàn)出色,但它的配置和擴(kuò)展相對(duì)有限。
○ Gateway(如Spring Cloud Gateway)通常使用Java編寫(xiě),提供了更豐富的服務(wù)治理和路由轉(zhuǎn)發(fā)功能,使得在微服務(wù)架構(gòu)中更容易實(shí)現(xiàn)擴(kuò)展功能。
功能特性:
○ Nginx更側(cè)重于反向代理和負(fù)載均衡功能,如HTTP代理、TCP代理、HTTP緩存、SSL加密等。
○ Gateway(如Spring Cloud Gateway)提供了豐富的服務(wù)治理和路由轉(zhuǎn)發(fā)功能,如服務(wù)注冊(cè)和發(fā)現(xiàn)、熔斷降級(jí)、限流等。
部署方式:
○ Nginx通常部署在傳統(tǒng)的Web服務(wù)器架構(gòu)中,可以作為流量入口,處理大量的并發(fā)連接。
○ Gateway(如Spring Cloud Gateway)通常部署在微服務(wù)架構(gòu)中,與Spring Cloud的其他組件(如Eureka、Zuul等)進(jìn)行無(wú)縫集成,提供統(tǒng)一的API路由管理。
擴(kuò)展性:
○ 對(duì)于Nginx的擴(kuò)展,通常需要結(jié)合Lua等腳本語(yǔ)言,這可能需要額外的學(xué)習(xí)成本。
○ Gateway(如Spring Cloud Gateway)由于使用Java編寫(xiě),可以更容易地集成到微服務(wù)的擴(kuò)展功能中,利用Java生態(tài)系統(tǒng)的豐富資源。
總結(jié)來(lái)說(shuō),Nginx和Gateway在微服務(wù)架構(gòu)中都發(fā)揮著重要的作用,但它們的設(shè)計(jì)目標(biāo)、功能特性和擴(kuò)展方式有所不同。選擇哪種作為網(wǎng)關(guān)取決于具體的項(xiàng)目需求和技術(shù)棧。
Nginx在其中扮演的角色是什么?
● 反向代理
● 負(fù)載均衡
SpringGateway在其中扮演的角色是什么?
● 統(tǒng)一鑒權(quán)
● 負(fù)載均衡
● 服務(wù)發(fā)現(xiàn)
-
網(wǎng)關(guān)
+關(guān)注
關(guān)注
9文章
5039瀏覽量
52246 -
服務(wù)器
+關(guān)注
關(guān)注
12文章
9596瀏覽量
86969 -
HTTP
+關(guān)注
關(guān)注
0文章
516瀏覽量
32284 -
nginx
+關(guān)注
關(guān)注
0文章
161瀏覽量
12441
原文標(biāo)題:Nginx實(shí)戰(zhàn)全攻略:從安裝配置到反向代理,詳解與網(wǎng)關(guān)的差異及性能優(yōu)化技巧
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論