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