Nginx超詳細常用功能演示,夠用啦~~~

前言

Nginx(“engine x”)是一款是由俄羅斯的程序設計師Igor Sysoev所開發高性能的 Web和 反向代理 服務器,也是一個 IMAP/POP3/SMTP 代理服務器。

Nginx在部署網站時,可以說是小夥伴們的首選,當然不能說全部項目都使用,對於一些小項目,直接IIS(.Net)、Tomcat(Java)等就搞定了,但對於大項目或微服務架構,Nginx肯定是少不了啦,一張圖看清Nginx有多火:

image-20210512180943911

Nginx之所以招人喜愛,那是它本身性能好,支持並發量大,內存消耗少,配置簡單,提供功能給力,最重要是開源免費。接下來會挑重要的來說說,了解我的小夥伴都應該知道,我喜歡邊實操,邊說理論;走起來~~~

正文

關於安裝我就不一步一步來演示啦,如果需要詳細安裝步驟,點這裡,菜鳥教程很詳細了,接下來就重點說說平時用得比較多的功能。

以下演示是通過阿里雲服務器演示,系統為Centos7,nginx版本為1.18.0。用到連接雲服務器的工具為Xshell6,上傳文件為Xftp 6.

1. 配置文件解讀

Nginx和Redis一樣,只需簡單的文件配置,就能輕鬆實現吊炸天的功能,所以先來了解一下配置文件內容,不用太急着知道怎麼用,接下來在功能實操的時候還會用到。

nginx.conf文件是經常需要配置的,我這裡安裝完成之後,該配置文件的路徑見下圖:

image-20210512232839435

文件主要內容如下:

#指定用戶,可以不進行設置
#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內),然後就可以間接獲取到信息啦,這種形式就叫正向代理。如下圖:

image-20210514215521618

反向代理與正向代理剛好相反,反向代理和目標服務器在同一個LAN內,小夥伴直接訪問反向代理服務器地址,由反向代理將請求轉發給目標服務服務器,然後將結果返回給小夥伴。如下圖:

image-20210514215550936

案例演示:

新建一個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拷貝到雲服務器上,然後將其啟動,如下:

image-20210514225829951

運行之後,由於阿里云云服務器的安全組沒有對外開放5000端口,所以外網是訪問不了的,但可以在服務器內通過curl命令測試站點是否啟動,如下:

image-20210514230150410

我這個服務器,80端口是對外開放的,可以訪問到的,如下:

image-20210514230540920

所以現在我們通過nginx能訪問的80端口,反向代理到我們內部開啟的測試項目,即5000那個端口。nginx配置如下:

image-20210514232125238

重啟nginx之後,就可以訪問啦,如下:

image-20210514232315254

關鍵知識:

  • 在Server塊中指定對外的端口和server_name(域名或IP);

  • 配置對應Server塊中的location塊;配置location可以進行正則匹配,語法如下:

    location [ = | ~ | ~* |^~] uri{
    
    } # 匹配的路徑
    

    =: 表示uri不包含正則表達式,要求請求字符串與uri嚴格匹配,只要匹配成功立即處理該請求,不在繼續尋求匹配的規則;

    ~:用於表示uri中包含正則表達式,區分大小寫;

    ~*:用於表示uri中包含正則表達式,不區分大小寫;

    ^~:表示uri不包含正則表達式,找到請求字符串與uri匹配度最高的location後,然後立即處理請求。

    例:

    image-20210516224017884

    實操如下:

    image-20210515220254539

  • 在location中使用proxy_pass配置需要轉發到的目標服務器地址;

nginx反向代理好處:

  • 屏蔽目標服務器的真實地址,相對安全性較好;
  • nginx的性能好,便於配置負載均衡和動靜分離功能,合理利用服務器資源。
  • 統一入口,當做負載均衡時,不管目標服務器怎麼擴展部署,調用者只訪問代理服務器入口即可。
3.2 負載均衡

系統的高可用是比較重要的,所以站點會通常以集群的方式進行部署, 但為了讓請求均勻分配到各服務器上,則就要用到負載均衡策略啦,不管是軟件的方式還是硬件的方式都可以實現(這裡就不詳細列舉啦),大概模式如下圖:

image-20210515234435742

案例演示

案例採用一個nginx做為反向代理,並通過簡單的配置實現負載均衡功能;由於設備有限,目標服務器採用端口不同的形式進行模擬,端口分別是5000和6000,然後在原來的項目中增加一個獲取端口的接口,用於便於案例演示,代碼如下:

image-20210515234953003

然後將編譯完成之後的項目文件通過xFtp拷貝到雲服務器上,然後用以不同端口的形式分別在不同終端啟動,命令如下:

image-20210515235807206

另外打開一個終端,如上圖一樣啟動項目,只是配置端口為5000打開,這樣項目就啟動了兩個(集群),接下來就通過配置nginx來實現負載均衡的功能。如下圖:

image-20210516150849476

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目錄,用於存放相關靜態資源:

image-20210516170210266

結構如下:

image-20210516170022641

動靜分離配置

image-20210516170643978

重啟nginx(或重新加載配置文件),然後訪問看效果

image-20210516171030833

動靜分離思想就是這樣直觀,小夥伴可以根據自己的需要,定義location的匹配規則即可。

4. 其他功能

除了以上常用的功能,可能還有一些小功能也會常用到哦,比如根據http狀態碼配置指定頁面、訪問權限控制、適配PC或移動端等,以下挑幾個平時比較常用的演示一把,如下:

  • 根據狀態碼配置指定頁面

    就拿平時常見的404舉例,默認可能就是簡單的頁面提示,如下:

    image-20210516184449753

    但是對於很多企業都喜歡做自己個性化的頁面,還有一些用來做公益廣告等等;nginx配置很簡單,如下:

    image-20210516202253227

    其他http狀態碼也可以通過上面的方式進行自定義頁面展示。

  • 訪問權限控制

    為了系統安全,會針對請求增加訪問權限控制,比如使用黑白名單的方式來進行控制,將訪問IP加入到白名單就可以訪問,加入到黑名單就不可以訪問啦,如下:

    image-20210516204346526

    上圖是拒絕指定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目錄,如下:

    image-20210516211628483

    目錄裏面內容如下:

    image-20210516211838444

    兩個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;
    }
    

    運行效果如下:

    image-20210516213220397

    本質就是判斷請求頭中User-Agent,只要匹配到移動端,就去找指定移動頁面就行啦。

總結

nginx的常用功能就先說到這吧,分享的功能對於搞開發的小夥伴來說應該是隨便夠用了,如果需要深入,還得下下功夫;下次來說說如何配置高可用:主從模式、雙主模式。

一個被程序搞丑的帥小伙,關注”Code綜藝圈”,跟我一起學~~~

圖片