在上一篇的文章中,學習了 Nginx 指令的兩種格式, 還有參考官方文檔了解每個指令都有對應的限制。

今天要來學習 Nginx 中寫設定檔時也是相當重要的變數功能。


Variables

我們可以從官方的變數清單 文檔 中,了解到 Nginx 內建就提供了多種變數,並且每個模組都有事先定義好的變數只要我們有啟用 或安裝對應的模組就可以直接使用該變數。

例如我想要使用 $geoip_city 這個變數那麼就需要先安裝 ngx_http_geoip_module 這個模組。

不過有大部分的變數都是包含在核心模組裡面 ngx_http_core_module, 這個模組是預先就有安裝所以我們可以先使用核心模組的變數來進行測試。

首先也是使用 Play with Docker 建立一台新的虛擬機安裝 nginx 並修改 http.d/default.conf

apk add nginx
vi /etc/nginx/http.d/default.conf

在設定檔中使用 location 指令定義了一組 uri 所以等我們待會訪問 /uri 這個路徑時就會回傳 uri 與後方的參數

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        # Everything is a 404
        location / {
                return 404;
		}

		location /uri {
			add_header Content-Type text/plain;
			return 200 $request_uri;
		}

        # You may need this to prevent return 404 recursion.
        location = /404.html {
                internal;
        }
}

設定完成後重啟 Nginx 開放 80 端口,即可以在瀏覽器上看到回傳的 uri 與參數

Nginx05-Request-Uri-Variable

Set

內建的變數可能沒辦法滿足需求,這個時候就可以使用 Set 指令來定義自己的參數。

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        # Everything is a 404
        location / {
                return 404;
		}

		location /uri {
			add_header Content-Type text/plain;
			set $a '2024';
			return 200 $a;
		}

        # You may need this to prevent return 404 recursion.
        location = /404.html {
                internal;
        }
}
Nginx05-A-Variable

另外也可以將兩個變數組合之後同時輸出。

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        # Everything is a 404
        location / {
                return 404;
		}

		location /uri {
			add_header Content-Type text/plain;
			set $a '2024';
			set $b '0731';
			return 200 $a$b;
		}

        # You may need this to prevent return 404 recursion.
        location = /404.html {
                internal;
        }
}
Nginx05-AB-Variable

Summary

今天學習了變數該如何使用與這個指令的相關應用,例如我們可以使用 $http_user_agent 這個變數檢查目前客戶端的 User Agent 為何,如果檢查後判斷是 不正常的 User Agent 就使用 limit_rate 指令進行限速,或者是定義日誌格式類似的應用。