Nginx超詳細常用功能演示,夠用啦~~~
前言
Nginx(“engine x”)是一款是由俄羅斯的程序設計師Igor Sysoev所開發高性能的 Web和 反向代理 服務器,也是一個 IMAP/POP3/SMTP 代理服務器。
Nginx在部署網站時,可以說是小夥伴們的首選,當然不能說全部項目都使用,對於一些小項目,直接IIS(.Net)、Tomcat(Java)等就搞定了,但對於大項目或微服務架構,Nginx肯定是少不了啦,一張圖看清Nginx有多火:
Nginx之所以招人喜愛,那是它本身性能好,支持並發量大,內存消耗少,配置簡單,提供功能給力,最重要是開源免費。接下來會挑重要的來說說,了解我的小夥伴都應該知道,我喜歡邊實操,邊說理論;走起來~~~
正文
關於安裝我就不一步一步來演示啦,如果需要詳細安裝步驟,點這裡,菜鳥教程很詳細了,接下來就重點說說平時用得比較多的功能。
以下演示是通過阿里雲服務器演示,系統為Centos7,nginx版本為1.18.0。用到連接雲服務器的工具為Xshell6,上傳文件為Xftp 6.
1. 配置文件解讀
Nginx和Redis一樣,只需簡單的文件配置,就能輕鬆實現吊炸天的功能,所以先來了解一下配置文件內容,不用太急着知道怎麼用,接下來在功能實操的時候還會用到。
nginx.conf文件是經常需要配置的,我這裡安裝完成之後,該配置文件的路徑見下圖:
文件主要內容如下:
#指定用戶,可以不進行設置
#user nobody;
#Nginx進程,一般設置為和CPU核數一樣
worker_processes 1;
#錯誤日誌存放目錄,可以根據後面的日誌級別指定到不同目錄
error_log /var/log/nginx/error.log info;
#進程pid存放位置
pid /var/run/nginx.pid;
events {
# 單個後台進程的最大並發數
worker_connections 1024;
}
http {
#文件擴展名與類型映射表,指定為當前目錄下的 mime.types
include mime.types;
#默認文件類型
default_type application/octet-stream;
#設置日誌顯示格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#nginx訪問日誌存放位置
access_log /var/log/nginx/access.log main;
#開啟高效傳輸模式
sendfile on;
#tcp_nopush on;
#保持連接的時間,也叫超時時間
keepalive_timeout 65;
#開啟gzip壓縮
#gzip on;
#server的配置可以單獨為一個子配置文件,避免單個配置文件過大
server {
#配置監聽端口
listen 80;
#配置域名
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
#指定默認目錄
root html;
#默認訪問頁面
index index.html index.htm;
}
# 指定http code 配置404頁面
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#錯誤狀態碼的顯示頁面,配置後需要重啟
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
在上面配置文件中,有幾個點需要注意:
- http配置塊中可以配置多個server塊,而每個server塊就相當於一個虛擬主機(後續會說到);
- 在server塊中可以同時包含多個location塊。
- 在http配置塊中可以使用 include 目錄/*.conf; 指定子配置文件的位置,然後自動加載配置內容進來,避免單文件配置過大。
2. 常用命令
這裡演示沒有配置環境變量,所以需要進入nginx的安裝目錄(/usr/local/nginx/sbin)中進行操作,進入可以執行以下命令:
-
開啟nginx
./nginx #啟動
-
停止nginx
# 方式1 ./nginx -s stop # 立即停止 # 方式2 ./nginx -s quit # 進程完成當前工作後在停止 # 方式3 killall nginx # 直接殺死進程
-
重新加載配置文件
./nginx -s reload
-
查看nginx的啟動情況
ps aux|grep nginx
-
查看端口號佔用情況
netstat -tlnp # 查看整體端口佔用情況 netstat -tlnp|grep 端口號 # 查看指定端口的佔用情況
3. 常用功能實戰
3.1 反向代理
經常有小夥伴要用google搜索資料,被無情的拒絕了,所以只能百度;如果非要用google進行搜索咋弄?翻牆(需要配置相關信息),其實本質是本機電腦藉助代理服務器轉到對應目標服務器(小夥伴機器和代理服務器在同一個LAN內),然後就可以間接獲取到信息啦,這種形式就叫正向代理。如下圖:
反向代理與正向代理剛好相反,反向代理和目標服務器在同一個LAN內,小夥伴直接訪問反向代理服務器地址,由反向代理將請求轉發給目標服務服務器,然後將結果返回給小夥伴。如下圖:
案例演示:
新建一個API項目,然後部署到雲服務器上,通過nginx進行反向代理,隱藏項目的真實地址,為了運行API項目,這裡需要安裝.NetCore3.1的運行環境(不是開發就不用安裝SDK啦);
#第一步,註冊 Microsoft 密鑰和存儲庫。安裝必需的依賴項。
rpm -Uvh //packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
#第二步,安裝 .NET Core3.1 運行時,不是開發環境,就不需要安裝sdk
yum install aspnetcore-runtime-3.1
然後執行dotnet --version
命令,如果顯示對應版本就可以繼續部署程序啦;
創建一個TestWebAPI項目,將編譯之後的項目文件通過Xftp拷貝到雲服務器上,然後將其啟動,如下:
運行之後,由於阿里云云服務器的安全組沒有對外開放5000端口,所以外網是訪問不了的,但可以在服務器內通過curl命令測試站點是否啟動,如下:
我這個服務器,80端口是對外開放的,可以訪問到的,如下:
所以現在我們通過nginx能訪問的80端口,反向代理到我們內部開啟的測試項目,即5000那個端口。nginx配置如下:
重啟nginx之後,就可以訪問啦,如下:
關鍵知識:
-
在Server塊中指定對外的端口和server_name(域名或IP);
-
配置對應Server塊中的location塊;配置location可以進行正則匹配,語法如下:
location [ = | ~ | ~* |^~] uri{ } # 匹配的路徑
=: 表示uri不包含正則表達式,要求請求字符串與uri嚴格匹配,只要匹配成功立即處理該請求,不在繼續尋求匹配的規則;
~:用於表示uri中包含正則表達式,區分大小寫;
~*:用於表示uri中包含正則表達式,不區分大小寫;
^~:表示uri不包含正則表達式,找到請求字符串與uri匹配度最高的location後,然後立即處理請求。
例:
實操如下:
-
在location中使用proxy_pass配置需要轉發到的目標服務器地址;
nginx反向代理好處:
- 屏蔽目標服務器的真實地址,相對安全性較好;
- nginx的性能好,便於配置負載均衡和動靜分離功能,合理利用服務器資源。
- 統一入口,當做負載均衡時,不管目標服務器怎麼擴展部署,調用者只訪問代理服務器入口即可。
3.2 負載均衡
系統的高可用是比較重要的,所以站點會通常以集群的方式進行部署, 但為了讓請求均勻分配到各服務器上,則就要用到負載均衡策略啦,不管是軟件的方式還是硬件的方式都可以實現(這裡就不詳細列舉啦),大概模式如下圖:
案例演示
案例採用一個nginx做為反向代理,並通過簡單的配置實現負載均衡功能;由於設備有限,目標服務器採用端口不同的形式進行模擬,端口分別是5000和6000,然後在原來的項目中增加一個獲取端口的接口,用於便於案例演示,代碼如下:
然後將編譯完成之後的項目文件通過xFtp拷貝到雲服務器上,然後用以不同端口的形式分別在不同終端啟動,命令如下:
另外打開一個終端,如上圖一樣啟動項目,只是配置端口為5000打開,這樣項目就啟動了兩個(集群),接下來就通過配置nginx來實現負載均衡的功能。如下圖:
nginx負載均衡策略
如上演示,默認情況下,nginx的負載均衡策略為輪詢,在實際應用場景中可以根據需要配置其他策略,如下:
-
輪詢:默認就是,指每個請求按照請求順序逐一分配到不同到目標服務器,如果目標服務器有宕機的,還能自動剔除。
-
權重(weight):通過配置權重來實現請求分配,目標服務器配置的權重越高,被分配的請求越多。
# 其他不變,只是在每個目標服務器後面增加權重即可 upstream testloadbalance { server 127.0.0.1:5000 weight=5; server 127.0.0.1:6000 weight=10; }
按照上面配置重啟nginx,多次請求測試,請求會更多的轉發到6000上面。
-
ip_hash:每個請求有對應的ip,通過對ip進行hash計算,根據這個結果就能訪問到指定的目標服務器;這種方式可以保證對應客戶端固定訪問到對應的目標服務器;
# 其他不變,只是增加一個策略進行 upstream testloadbalance { ip_hash; # 指定策略為通過ip進行hash之後轉發 server 127.0.0.1:5000; server 127.0.0.1:6000; }
-
fair:按目標服務器的響應時間來分配請求,響應時間短的優先被分配。
關於這種模式需要額外安裝nginx-upstream-fair,然後配置一下策略即可,安裝就不具體演示,點擊上面連接進入看說明;配置內容如下:
# 其他不變,只是增加一個策略進行 upstream testloadbalance { fair; # 指定策略為fair server 127.0.0.1:5000; server 127.0.0.1:6000; }
負載均衡的功能的配置是不是很簡單~~~,動動手感覺就是舒坦。
3.3 動靜分離
前後端分離開發的模式最近幾年是火的不行,在部署方面,為了提高系統性能和用戶體驗,也會將動靜分離部署,即將靜態資源(如html、js、css、圖片等)單獨部署一個站點,關於WebAPI獲取和處理信息單獨部署為一個站點。本質還是通過location匹配規則,將匹配的請求進行不同的處理即可。
環境準備
在nginx安裝目錄下創建一個static目錄,用於存放相關靜態資源:
結構如下:
動靜分離配置
重啟nginx(或重新加載配置文件),然後訪問看效果:
動靜分離思想就是這樣直觀,小夥伴可以根據自己的需要,定義location的匹配規則即可。
4. 其他功能
除了以上常用的功能,可能還有一些小功能也會常用到哦,比如根據http狀態碼配置指定頁面、訪問權限控制、適配PC或移動端等,以下挑幾個平時比較常用的演示一把,如下:
-
根據狀態碼配置指定頁面
就拿平時常見的404舉例,默認可能就是簡單的頁面提示,如下:
但是對於很多企業都喜歡做自己個性化的頁面,還有一些用來做公益廣告等等;nginx配置很簡單,如下:
其他http狀態碼也可以通過上面的方式進行自定義頁面展示。
-
訪問權限控制
為了系統安全,會針對請求增加訪問權限控制,比如使用黑白名單的方式來進行控制,將訪問IP加入到白名單就可以訪問,加入到黑名單就不可以訪問啦,如下:
上圖是拒絕指定IP,如果是允許指定IP,可進行如下配置,如下:
location /weatherforecast/ { proxy_pass //testloadbalance; # 這個ip是百度輸入ip查看到的,也可以通過nginx日誌可以看 allow 223.88.45.26; }
註:如果在同一location塊中同時配置deny和allow,配置在最前面的會覆蓋下面的,如下:
location /weatherforecast/ { proxy_pass //testloadbalance; # deny all 放在前面,就所有不能訪問,deny all 會覆蓋下面配置 #deny all; allow 223.88.45.26; # deny all 放在後面,被上面allow進行覆蓋 deny all; }
-
適配PC或移動端
現在的移動端好多都是採用H5的形式進行開發,或者是混合模式,所以也需要針對移動端部署對應的站點,那用nginx如何自動適配PC還是移動端頁面呢?
準備環境
在nginx安裝目錄中創建pcandmobile目錄,如下:
目錄裏面內容如下:
兩個index.html中的就只有一個h1標籤,分別顯示「PC端頁面」和「移動端頁面」 文字。
nginx配置
location / { root pcandmobile/pc; # 默認在pc目錄中找頁面 # 當請求頭中User-Agent中匹配如下內容時,就去mobile目錄找頁面 if ($http_user_agent ~* '(Android|webOS|iPhone|iPod|BlackBerry)') { root pcandmobile/mobile; } index index.html; }
運行效果如下:
本質就是判斷請求頭中User-Agent,只要匹配到移動端,就去找指定移動頁面就行啦。
總結
nginx的常用功能就先說到這吧,分享的功能對於搞開發的小夥伴來說應該是隨便夠用了,如果需要深入,還得下下功夫;下次來說說如何配置高可用:主從模式、雙主模式。
一個被程序搞丑的帥小伙,關注”Code綜藝圈”,跟我一起學~~~