前言
Nginx 是一個高性能的 HTTP 和反向代理服務(wù)器,也是一個 IMAP/POP3 代理服務(wù)器。它以其高并發(fā)處理能力、穩(wěn)定性、豐富的功能模塊和低內(nèi)存消耗而聞名。
一. Nginx簡介
● Nginx (engine x) 是一個高性能的HTTP和反向代理web服務(wù)器,同時也提供了IMAP/POP3/SMTP服務(wù)。
● 其特點是占有內(nèi)存少,并發(fā)能力強,事實上nginx的并發(fā)能力在同類型的網(wǎng)頁服務(wù)器中表現(xiàn)較好
● Nginx 是一個安裝非常的簡單、配置文件非常簡潔(還能夠支持perl語法)、Bug非常少的服務(wù)。Nginx 啟動特別容易,并且?guī)缀蹩梢宰龅?*24不間斷運行,即使運行數(shù)個月也不需要重新啟動。
● Nginx代碼完全用C語言從頭寫成。官方數(shù)據(jù)測試表明能夠支持高達 50,000 個并發(fā)連接數(shù)的響應(yīng)。
二. Nginx作用
2.1 代理
- 正向代理:代理是代理客戶端的
客戶端 <一> 代理 一>服務(wù)端
在這里插入圖片描述
正向代理是一個位于客戶端和原始服務(wù)器之間的服務(wù)器,所有客戶端的請求都首先發(fā)送到正向代理服務(wù)器,然后由代理服務(wù)器將請求轉(zhuǎn)發(fā)到原始服務(wù)器。正向代理的目的是為了隱藏客戶端的信息。
Nginx不是默認的正向代理服務(wù)器,但可以通過配置來實現(xiàn)正向代理的功能。
通常某些服務(wù)因為安全問題,限制固定訪問,因此可以通過正向代理解決
訪問某些國外的服務(wù)訪問慢,可以通過正向代理中繼緩解丟包和延遲高的問題
例如:VPN
http { resolver 8.8.8.8; server { listen 8088; location / { proxy_pass http://$http_host$request_uri; } } } AI寫代碼
反向代理:
反向代理,客戶端對代理是無感知的,客戶端不需要任何配置就可以訪問,客戶端將請求發(fā)送到反向代理服務(wù)器,由反向代理服務(wù)器去選擇目標(biāo)服務(wù)器獲取數(shù)據(jù)后,再返回給客戶端,此時反向代理服務(wù)器和目標(biāo)服務(wù)器對外就是一個服務(wù)器,暴露的是代理服務(wù)器地址,隱藏了真實服務(wù)器IP地址。
Nginx是默認的反向代理服務(wù)器。以下是一個簡單的Nginx配置示例,用于設(shè)置Nginx作為反向代理服務(wù)器:
在這里插入圖片描述
比如:百度的服務(wù)器是在不同的服務(wù)器上,我們只需要搜索baidu.com就行
2.2 負載均衡
如果請求數(shù)過大,單個服務(wù)器解決不了,我們增加服務(wù)器的數(shù)量,然后將請求分發(fā)到各個服務(wù)器上,將原先請求集中到單個服務(wù)器的情況改為請求分發(fā)到多個服務(wù)器上,就是負載均衡。
Nginx提供的負載均衡策略有2種:內(nèi)置策略和擴展策略。內(nèi)置策略為輪詢,加權(quán)輪詢,Ip hash。擴展策略,就天馬行空,只有你想不到的沒有他做不到的。
輪詢:
在這里插入圖片描述
加權(quán)輪詢
在這里插入圖片描述
iphash
對客戶端請求的ip進行hash操作,然后根據(jù)hash結(jié)果將同一個客戶端ip的請求分發(fā)給同一臺服務(wù)器進行處理,可以解決session不共享的問題。
在這里插入圖片描述
2.3 動靜分離
在我們的軟件開發(fā)中,有些請求是需要后臺處理的,有些請求是不需要經(jīng)過后臺處理的(如:css、html、jpg、js等等文件),這些不需要經(jīng)過后臺處理的文件稱為靜態(tài)文件。讓動態(tài)網(wǎng)站里的動態(tài)網(wǎng)頁根據(jù)一定規(guī)則把不變的資源和經(jīng)常變的資源區(qū)分開來,動靜資源做好了拆分以后,我們就可以根據(jù)靜態(tài)資源的特點將其做緩存操作。提高資源響應(yīng)的速度。
在這里插入圖片描述
三. 安裝
下載地址:https://nginx.org/en/download.html
下載
在這里插入圖片描述
解壓至任意非中文路徑下:
在這里插入圖片描述
運行
直接雙擊nginx.exe 即可(一閃而過),或者進入cmd 輸入nginx.exe
在這里插入圖片描述
檢測
瀏覽器輸入:http://localhost:80 瀏覽器默認端口就是80 所以80端口可以不寫
在這里插入圖片描述
配置監(jiān)聽
nginx的配置文件是conf目錄下的nginx.conf,默認配置的nginx監(jiān)聽的端口為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 時,不需要關(guān)閉nginx后重新啟動nginx,只需要執(zhí)行命令 nginx -s reload 即可讓改動生效
關(guān)閉nginx
如果使用cmd命令窗口啟動nginx, 關(guān)閉cmd窗口是不能結(jié)束nginx進程的,可使用兩種方法關(guān)閉nginx
(1) 輸入nginx命令 nginx -s stop(快速停止nginx) 或 nginx -s quit(完整有序的停止nginx)
(2) 使用taskkill taskkill /f /t /im nginx.exe
taskkill是用來終止進程的,
/f是強制終止 .
/t終止指定的進程和任何由此啟動的子進程。
/im示指定的進程名稱 .
3.2 Linux
1.安裝gcc(已經(jīng)安裝的可以忽略這個步驟)安裝 nginx 需要先將官網(wǎng)下載的源碼進行編譯,編譯依賴 gcc 環(huán)境,如果沒有 gcc 環(huán)境,則需要安裝
yum install gcc-c++
2.PCRE pcre-devel安裝(已經(jīng)安裝的可以忽略這個步驟)PCRE(Perl Compatible Regular Expressions) 是一個Perl庫,包括 perl 兼容的正則表達式庫。nginx 的 http 模塊使用 pcre 來解析正則表達式,所以需要在 linux 上安裝 pcre 庫,pcre-devel 是使用 pcre 開發(fā)的一個二次開發(fā)庫。nginx也需要此庫。命令:
yum install -y pcre pcre-devel AI寫代碼
3.zlib安裝(已經(jīng)安裝的可以忽略這個步驟)zlib 庫提供了很多種壓縮和解壓縮的方式, nginx 使用 zlib 對 http 包的內(nèi)容進行 gzip ,所以需要在 Centos 上安裝 zlib 庫。
yum install -y zlib zlib-devel AI寫代碼
4.openssl安裝(已經(jīng)安裝的可以忽略這個步驟)OpenSSL 是一個強大的安全套接字層密碼庫,囊括主要的密碼算法、常用的密鑰和證書封裝管理功能及 SSL 協(xié)議,并提供豐富的應(yīng)用程序供測試或其它目的使用。nginx 不僅支持 http 協(xié)議,還支持 https(即在ssl協(xié)議上傳輸http),所以需要在 Centos 安裝 OpenSSL 庫
yum install -y openssl openssl-devel AI寫代碼
5.下載linux的nginx安裝包
在這里插入圖片描述
6.上傳到linux上
7.解壓縮
tar -zxvf nginx-1.26.0.tar.gz cd nginx-1.26.0/ AI寫代碼
8.順序執(zhí)行下面三個命令
./configure make make install AI寫代碼
9.查看安裝路徑 whereis nginx
在這里插入圖片描述
10.nginx常用命令
# cd /usr/local/nginx/sbin/ # ./nginx //啟動 # ./nginx -s stop //停止 # ./nginx -s quit //安全退出 # ./nginx -s reload //重新加載配置文件 # ps aux|grep nginx //查看nginx進程 AI寫代碼
確認開放了80端口
# 開發(fā)端口命令 firewall-cmd --zone=public --add-port=8080/tcp --permanent # 重新加載 firewall-cmd --reload # 查看已開放的端口 firewall-cmd --zone=public --list-ports
啟動成功訪問 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寫代碼
3.運行鏡像
[root@iZwz96byk26u1sns4xp7giZ ~]# docker run --name mn -d -p 80:80 nginx 49c02ef7c18facc452762fa7e722720235290df28fce39b6aebb8b024ae21d70
4.檢測
在這里插入圖片描述
掛載
簡單啟動nginx
docker run --name mn -d -p 80:80 nginx AI寫代碼
創(chuàng)建配置文件夾
mkdir -p /opt/nginx AI寫代碼
復(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寫代碼
刪除原有的Nginx容器
docker rm -f mn AI寫代碼
創(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寫代碼
修改配置
在這里插入圖片描述
把端口改為81
在這里插入圖片描述
四. 實戰(zhàn)
1.將某個現(xiàn)有的項目打包
在這里插入圖片描述
2.運行jar項目
打開window命令窗口,啟動服務(wù)java -jar SpringBoot-Redis-1.0-SNAPSHOT.jar在這里插入圖片描述
3.在打開另外一個窗口,啟動一個8081的服務(wù)
java -jar SpringBoot-Redis-1.0-SNAPSHOT.jar --server.port=8081在這里插入圖片描述
4.啟動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進程數(shù),建議設(shè)置為等于CPU總核心數(shù)。 worker_processes 1; # 事件區(qū)塊開始 events { #單個進程最大連接數(shù)(最大連接數(shù)=連接數(shù)*進程數(shù)) #根據(jù)硬件調(diào)整,和前面工作進程配合起來用,盡量大,但是別把cpu跑到100%就行。每個進程允許的最多連接數(shù),理論上每臺nginx服務(wù)器的最大連接數(shù)為。 worker_connections 1024; } #設(shè)定http服務(wù)器,利用它的反向代理功能提供負載均衡支持 http { #include:導(dǎo)入外部文件mime.types,將所有types提取為文件,然后導(dǎo)入到nginx配置文件中 include mime.types; #默認文件類型 default_type application/octet-stream; #開啟高效文件傳輸模式,sendfile指令指定nginx是否調(diào)用sendfile函數(shù)來輸出文件,對于普通應(yīng)用設(shè)為 on,如果用來進行下載等應(yīng)用磁盤IO重負載應(yīng)用,可設(shè)置為off,以平衡磁盤與網(wǎng)絡(luò)I/O處理速度,降低系統(tǒng)的負載。注意:如果圖片顯示不正常把這個改成off。 #sendfile指令指定 nginx 是否調(diào)用sendfile 函數(shù)(zero copy 方式)來輸出文件,對于普通應(yīng)用,必須設(shè)為on。如果用來進行下載等應(yīng)用磁盤IO重負載應(yīng)用,可設(shè)置為off,以平衡磁盤與網(wǎng)絡(luò)IO處理速度,降低系統(tǒng)uptime。 sendfile on; #長連接超時時間,單位是秒 keepalive_timeout 65; # 第一個Server區(qū)塊開始,表示一個獨立的虛擬主機站點 server { # 提供服務(wù)的端口,默認80 listen 80; # 提供服務(wù)的域名主機名 server_name localhost; #對 "/" 啟用反向代理,第一個location區(qū)塊開始 location / { root html; #服務(wù)默認啟動目錄 index index.html index.htm; # 默認的首頁文件,多個用空格分開 } # 錯誤頁面路由 error_page 500 502 503 504 /50x.html; # 出現(xiàn)對應(yīng)的http狀態(tài)碼時,使用50x.html回應(yīng)客戶 location = /50x.html { # location區(qū)塊開始,訪問50x.html root html; # 指定對應(yīng)的站點目錄為html } } }
5.2 整體基本理解
雖然上面有了注解,但是看起來還是很迷糊。接著解釋:我們可以把nginx.conf分為三個部分進行理解:
第一部分:全局塊
第二部分:events塊
第三部分:http塊
在這里插入圖片描述
六. Nginx與網(wǎng)關(guān)的區(qū)別
本質(zhì)上API網(wǎng)關(guān)也是做了請求的轉(zhuǎn)發(fā),那既然Nginx也可以做請求轉(zhuǎn)發(fā),那這兩者有什么區(qū)別?
在這里插入圖片描述
在具體架構(gòu)設(shè)計時Nginx做負載均衡時,考慮到API網(wǎng)關(guān)在系統(tǒng)中不止一個(以集群的方式做高可用),通??梢詫ginx至于API網(wǎng)關(guān)前,負責(zé)對API網(wǎng)關(guān)的負載均衡,然后再由網(wǎng)關(guān)決定進入根據(jù)判定到哪個真實的web 服務(wù)器。讓兩者的分工更加明確,也就是:API網(wǎng)關(guān)聚合服務(wù),Nginx請求轉(zhuǎn)發(fā)
業(yè)務(wù)網(wǎng)關(guān)(gateway):對于具體的后端業(yè)務(wù)應(yīng)用或者是服務(wù)和業(yè)務(wù)有一定關(guān)聯(lián)性的策略網(wǎng)關(guān)。業(yè)務(wù)網(wǎng)關(guān)針對具體的業(yè)務(wù)需要提供特定的流控策略、緩存策略、鑒權(quán)認證策略
流量網(wǎng)關(guān)(Nginx):與業(yè)務(wù)網(wǎng)關(guān)相反,定義全局性的、跟具體的后端業(yè)務(wù)應(yīng)用和服務(wù)完全無關(guān)的策略網(wǎng)關(guān)。流量網(wǎng)關(guān)通常只專注于全局的Api管理策略,比如全局流量監(jiān)控、日志記錄、全局限流、黑白名單控制、接入請求到業(yè)務(wù)系統(tǒng)的負載均衡等
業(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)。有時候我們也會模糊流量網(wǎng)關(guān)和業(yè)務(wù)網(wǎng)關(guān),讓一個網(wǎng)關(guān)承擔(dān)所有的工作,所以這兩者之間并沒有嚴(yán)格的界線。
在這里插入圖片描述
nginx與gateway的區(qū)別:
編寫語言:
○ Nginx是用C語言編寫的,這使得它在處理高并發(fā)連接時表現(xiàn)出色,但它的配置和擴展相對有限。
○ Gateway(如Spring Cloud Gateway)通常使用Java編寫,提供了更豐富的服務(wù)治理和路由轉(zhuǎn)發(fā)功能,使得在微服務(wù)架構(gòu)中更容易實現(xiàn)擴展功能。
功能特性:
○ Nginx更側(cè)重于反向代理和負載均衡功能,如HTTP代理、TCP代理、HTTP緩存、SSL加密等。
○ Gateway(如Spring Cloud Gateway)提供了豐富的服務(wù)治理和路由轉(zhuǎn)發(fā)功能,如服務(wù)注冊和發(fā)現(xiàn)、熔斷降級、限流等。
部署方式:
○ Nginx通常部署在傳統(tǒng)的Web服務(wù)器架構(gòu)中,可以作為流量入口,處理大量的并發(fā)連接。
○ Gateway(如Spring Cloud Gateway)通常部署在微服務(wù)架構(gòu)中,與Spring Cloud的其他組件(如Eureka、Zuul等)進行無縫集成,提供統(tǒng)一的API路由管理。
擴展性:
○ 對于Nginx的擴展,通常需要結(jié)合Lua等腳本語言,這可能需要額外的學(xué)習(xí)成本。
○ Gateway(如Spring Cloud Gateway)由于使用Java編寫,可以更容易地集成到微服務(wù)的擴展功能中,利用Java生態(tài)系統(tǒng)的豐富資源。
總結(jié)來說,Nginx和Gateway在微服務(wù)架構(gòu)中都發(fā)揮著重要的作用,但它們的設(shè)計目標(biāo)、功能特性和擴展方式有所不同。選擇哪種作為網(wǎng)關(guān)取決于具體的項目需求和技術(shù)棧。
Nginx在其中扮演的角色是什么?
● 反向代理
● 負載均衡
SpringGateway在其中扮演的角色是什么?
● 統(tǒng)一鑒權(quán)
● 負載均衡
● 服務(wù)發(fā)現(xiàn)
-
網(wǎng)關(guān)
+關(guān)注
關(guān)注
9文章
5514瀏覽量
52714 -
服務(wù)器
+關(guān)注
關(guān)注
13文章
9749瀏覽量
87547 -
HTTP
+關(guān)注
關(guān)注
0文章
523瀏覽量
32602 -
nginx
+關(guān)注
關(guān)注
0文章
168瀏覽量
12537
原文標(biāo)題:Nginx實戰(zhàn)全攻略:從安裝配置到反向代理,詳解與網(wǎng)關(guān)的差異及性能優(yōu)化技巧
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
評論