從零手寫實(shí)現(xiàn) nginx-20-placeholder 占位符 $

前言

大家好,我是老馬。很高興遇到你。

我們?yōu)?java 開發(fā)者實(shí)現(xiàn)了 java 版本的 nginx

https://github.com/houbb/nginx4j

如果你想知道 servlet 如何處理的,可以參考我的另一個(gè)項(xiàng)目:

手寫從零實(shí)現(xiàn)簡(jiǎn)易版 tomcat minicat

手寫 nginx 系列

如果你對(duì) nginx 原理感興趣,可以閱讀:

從零手寫實(shí)現(xiàn) nginx-01-為什么不能有 java 版本的 nginx?

從零手寫實(shí)現(xiàn) nginx-02-nginx 的核心能力

從零手寫實(shí)現(xiàn) nginx-03-nginx 基于 Netty 實(shí)現(xiàn)

從零手寫實(shí)現(xiàn) nginx-04-基于 netty http 出入?yún)?yōu)化處理

從零手寫實(shí)現(xiàn) nginx-05-MIME類型(Multipurpose Internet Mail Extensions,多用途互聯(lián)網(wǎng)郵件擴(kuò)展類型)

從零手寫實(shí)現(xiàn) nginx-06-文件夾自動(dòng)索引

從零手寫實(shí)現(xiàn) nginx-07-大文件下載

從零手寫實(shí)現(xiàn) nginx-08-范圍查詢

從零手寫實(shí)現(xiàn) nginx-09-文件壓縮

從零手寫實(shí)現(xiàn) nginx-10-sendfile 零拷貝

從零手寫實(shí)現(xiàn) nginx-11-file+range 合并

從零手寫實(shí)現(xiàn) nginx-12-keep-alive 連接復(fù)用

從零手寫實(shí)現(xiàn) nginx-13-nginx.conf 配置文件介紹

從零手寫實(shí)現(xiàn) nginx-14-nginx.conf 和 hocon 格式有關(guān)系嗎?

從零手寫實(shí)現(xiàn) nginx-15-nginx.conf 如何通過 java 解析處理?

從零手寫實(shí)現(xiàn) nginx-16-nginx 支持配置多個(gè) server

從零手寫實(shí)現(xiàn) nginx-17-nginx 默認(rèn)配置優(yōu)化

從零手寫實(shí)現(xiàn) nginx-18-nginx 請(qǐng)求頭+響應(yīng)頭操作

從零手寫實(shí)現(xiàn) nginx-19-nginx cors

從零手寫實(shí)現(xiàn) nginx-20-nginx 占位符 placeholder

從零手寫實(shí)現(xiàn) nginx-21-nginx modules 模塊信息概覽

從零手寫實(shí)現(xiàn) nginx-22-nginx modules 分模塊加載優(yōu)化

從零手寫實(shí)現(xiàn) nginx-23-nginx cookie 的操作處理

從零手寫實(shí)現(xiàn) nginx-24-nginx IF 指令

nginx 的占位符

Nginx 是一個(gè)高性能的 HTTP 和反向代理服務(wù)器。它使用占位符(變量)來動(dòng)態(tài)地生成配置和響應(yīng)。

這些占位符可以在 Nginx 配置文件中使用,并在運(yùn)行時(shí)被特定的值替換。

以下是對(duì) Nginx 占位符的詳細(xì)介紹,包括一些常見的變量及其用法。

1. 基本語法

Nginx 變量的語法格式是 $variable_name。例如:

server {
    listen 80;
    server_name example.com;
    
    location / {
        return 200 "The request URI is $uri\n";
    }
}

在這個(gè)例子中,$uri 是一個(gè)占位符,表示請(qǐng)求的 URI。

2. 內(nèi)置變量

Nginx 提供了許多內(nèi)置變量,以下是一些常見的內(nèi)置變量:

  • $args:請(qǐng)求中的參數(shù)。
  • $content_length:請(qǐng)求的 Content-Length 頭字段。
  • $content_type:請(qǐng)求的 Content-Type 頭字段。
  • $document_root:當(dāng)前請(qǐng)求的根目錄或 alias 指定的路徑。
  • $host:請(qǐng)求的主機(jī)頭字段,如果主機(jī)頭字段不可用,則等于服務(wù)器名稱。
  • $http_user_agent:客戶端的 User-Agent 頭字段。
  • $http_cookie:客戶端的 Cookie 頭字段。
  • $limit_rate:用于限制連接速率。
  • $request_method:請(qǐng)求方法(GET、POST 等)。
  • $remote_addr:客戶端 IP 地址。
  • $remote_port:客戶端端口。
  • $request_uri:完整的原始請(qǐng)求 URI,包括參數(shù)。
  • $scheme:請(qǐng)求使用的協(xié)議(http 或 https)。
  • $server_protocol:請(qǐng)求使用的協(xié)議版本。
  • $server_addr:服務(wù)器的地址。
  • $server_name:服務(wù)器名稱。
  • $server_port:服務(wù)器端口。
  • $uri:不包含請(qǐng)求參數(shù)的請(qǐng)求 URI。

3. 自定義變量

除了內(nèi)置變量,Nginx 還允許用戶自定義變量。自定義變量可以在 set 指令中定義。以下是一個(gè)示例:

server {
    listen 80;
    server_name example.com;

    set $my_variable "Hello, Nginx!";
    
    location / {
        return 200 "$my_variable\n";
    }
}

在這個(gè)例子中,定義了一個(gè)自定義變量 $my_variable,其值為 "Hello, Nginx!",并在響應(yīng)中返回這個(gè)值。

4. 使用變量進(jìn)行條件控制

Nginx 的 if 指令可以根據(jù)變量的值進(jìn)行條件控制。例如:

server {
    listen 80;
    server_name example.com;
    
    location / {
        if ($request_method = POST) {
            return 405 "Method Not Allowed\n";
        }
        
        return 200 "Hello, Nginx!\n";
    }
}

在這個(gè)例子中,如果請(qǐng)求方法是 POST,服務(wù)器會(huì)返回 405 狀態(tài)碼和 "Method Not Allowed" 信息,否則返回 200 狀態(tài)碼和 "Hello, Nginx!" 信息。

5. 變量的應(yīng)用場(chǎng)景

變量在 Nginx 中有許多實(shí)際應(yīng)用場(chǎng)景:

  • 日志記錄:可以在日志格式中使用變量記錄詳細(xì)的請(qǐng)求信息。
  • URL 重寫:使用變量來實(shí)現(xiàn)復(fù)雜的 URL 重寫規(guī)則。
  • 負(fù)載均衡:在負(fù)載均衡配置中使用變量進(jìn)行復(fù)雜的請(qǐng)求路由。
  • 限速限流:使用變量動(dòng)態(tài)控制請(qǐng)求的限速限流策略。

示例:動(dòng)態(tài)生成響應(yīng)

下面是一個(gè)結(jié)合多個(gè)變量的示例,用于動(dòng)態(tài)生成響應(yīng)內(nèi)容:

server {
    listen 80;
    server_name example.com;
    
    location / {
        set $custom_message "Your IP is $remote_addr and you are using $http_user_agent";
        return 200 "$custom_message\n";
    }
}

在這個(gè)示例中,服務(wù)器會(huì)返回一個(gè)包含客戶端 IP 地址和 User-Agent 的消息。

Nginx 的占位符功能強(qiáng)大且靈活,通過合理地使用這些變量,可以實(shí)現(xiàn)許多復(fù)雜的功能和動(dòng)態(tài)配置。

為什么 nginx 要支持占位符呢?

Nginx 支持占位符(變量)的主要原因是為了提供靈活性和動(dòng)態(tài)性,使其配置能夠適應(yīng)各種復(fù)雜的應(yīng)用場(chǎng)景。以下是 Nginx 支持占位符的一些關(guān)鍵原因和優(yōu)勢(shì):

1. 動(dòng)態(tài)配置

占位符使得 Nginx 配置文件能夠根據(jù)實(shí)際請(qǐng)求動(dòng)態(tài)生成響應(yīng)或調(diào)整行為。例如,可以根據(jù)請(qǐng)求的 URI、方法或頭信息來動(dòng)態(tài)地路由請(qǐng)求、返回不同的內(nèi)容或者做其他處理。

示例:動(dòng)態(tài)內(nèi)容返回

server {
    listen 80;
    server_name example.com;

    location / {
        return 200 "Requested URI: $uri\n";
    }
}

這個(gè)示例會(huì)根據(jù)請(qǐng)求的 URI 返回相應(yīng)的消息,使得響應(yīng)內(nèi)容是動(dòng)態(tài)生成的。

2. 細(xì)粒度控制

通過占位符,Nginx 可以對(duì)請(qǐng)求和響應(yīng)進(jìn)行細(xì)粒度控制。例如,基于客戶端 IP 地址、User-Agent 或請(qǐng)求參數(shù)進(jìn)行不同的處理。這種細(xì)粒度控制有助于實(shí)現(xiàn)精細(xì)的訪問控制、安全檢查、個(gè)性化服務(wù)等。

示例:基于 IP 地址的訪問控制

server {
    listen 80;
    server_name example.com;

    location / {
        if ($remote_addr = "192.168.1.1") {
            return 403 "Access denied\n";
        }
        
        return 200 "Welcome\n";
    }
}

這個(gè)示例會(huì)根據(jù)客戶端的 IP 地址進(jìn)行訪問控制。

3. 簡(jiǎn)化配置管理

占位符可以減少重復(fù)配置,提高配置文件的可讀性和可維護(hù)性。通過定義變量和復(fù)用這些變量,可以使得配置文件更簡(jiǎn)潔、直觀。

示例:復(fù)用變量簡(jiǎn)化配置

server {
    listen 80;
    server_name example.com;

    set $root_path /var/www/html;

    location / {
        root $root_path;
    }

    location /images {
        root $root_path;
    }
}

在這個(gè)示例中,通過定義變量 $root_path,避免了重復(fù)配置根目錄路徑。

4. 支持復(fù)雜應(yīng)用場(chǎng)景

Nginx 的占位符使其能夠支持復(fù)雜的應(yīng)用場(chǎng)景,例如負(fù)載均衡、日志記錄、限速限流等。通過使用變量,可以實(shí)現(xiàn)更靈活的負(fù)載均衡策略、詳細(xì)的日志記錄格式、動(dòng)態(tài)的限速策略等。

示例:自定義日志格式

log_format custom '$remote_addr - $remote_user [$time_local] "$request" '
                   '$status $body_bytes_sent "$http_referer" '
                   '"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log custom;

這個(gè)示例通過占位符定義了自定義的日志格式,以記錄詳細(xì)的請(qǐng)求信息。

5. 安全與優(yōu)化

通過使用占位符,可以實(shí)現(xiàn)動(dòng)態(tài)的安全檢查和優(yōu)化策略。例如,根據(jù)請(qǐng)求頭信息或者參數(shù)來啟用或禁用某些功能,從而增強(qiáng)安全性和性能。

示例:根據(jù) User-Agent 進(jìn)行優(yōu)化

server {
    listen 80;
    server_name example.com;

    location / {
        if ($http_user_agent ~* "Mobile") {
            set $mobile 1;
        }

        if ($mobile) {
            return 200 "Mobile optimization enabled\n";
        }

        return 200 "Standard optimization\n";
    }
}

這個(gè)示例展示了如何根據(jù) User-Agent 實(shí)現(xiàn)移動(dòng)設(shè)備優(yōu)化。

總結(jié)

Nginx 支持占位符的主要目的是提供更高的靈活性和動(dòng)態(tài)性,使其能夠適應(yīng)各種復(fù)雜的應(yīng)用場(chǎng)景和需求。

通過占位符,Nginx 的配置能夠變得更加簡(jiǎn)潔、可讀、可維護(hù),并且能夠?qū)崿F(xiàn)復(fù)雜的控制邏輯,從而提供更強(qiáng)大的功能和更高的性能。

java 如何設(shè)計(jì)實(shí)現(xiàn)?

系統(tǒng)內(nèi)置的 placeholder 變量

我們首先實(shí)現(xiàn)內(nèi)置的 placeholder 占位符操作。

定義抽象的接口

/**
 * 占位符處理類
 * @since 0.17.0
 *
 * @author 老馬嘯西風(fēng)
 */
public abstract class AbstractNginxPlaceholder implements INginxPlaceholder {

    private static final Log logger = LogFactory.getLog(AbstractNginxPlaceholder.class);

    @Override
    public void placeholder(NginxRequestDispatchContext context) {
        // 上下文存儲(chǔ)的內(nèi)容
        Map<String, Object> placeholderMap = context.getPlaceholderMap();

        // 請(qǐng)求頭
        FullHttpRequest request = context.getRequest();

        String key = getKey(request, context);
        Object value = extract(request, context);

        placeholderMap.put(key, value);

        logger.info("placeholder put key={},value={}", key, value);
    }

    /**
     * 提取值
     * @param request 請(qǐng)求頭
     * @param context 上下文
     * @return 結(jié)果
     */
    protected abstract Object extract(FullHttpRequest request, NginxRequestDispatchContext context);

    /**
     * 唯一標(biāo)識(shí)
     * @param request 請(qǐng)求頭
     * @param context 上下文
     * @return 結(jié)果
     */
    protected abstract String getKey(FullHttpRequest request, NginxRequestDispatchContext context);

}

常見內(nèi)置的實(shí)現(xiàn)

  • $args:請(qǐng)求中的參數(shù)。
  • $content_length:請(qǐng)求的 Content-Length 頭字段。
  • $content_type:請(qǐng)求的 Content-Type 頭字段。
  • $document_root:當(dāng)前請(qǐng)求的根目錄或 alias 指定的路徑。
  • $host:請(qǐng)求的主機(jī)頭字段,如果主機(jī)頭字段不可用,則等于服務(wù)器名稱。
  • $http_user_agent:客戶端的 User-Agent 頭字段。
  • $http_cookie:客戶端的 Cookie 頭字段。
  • $limit_rate:用于限制連接速率。
  • $request_method:請(qǐng)求方法(GET、POST 等)。
  • $remote_addr:客戶端 IP 地址。
  • $remote_port:客戶端端口。
  • $request_uri:完整的原始請(qǐng)求 URI,包括參數(shù)。
  • $scheme:請(qǐng)求使用的協(xié)議(http 或 https)。
  • $server_protocol:請(qǐng)求使用的協(xié)議版本。
  • $server_addr:服務(wù)器的地址。
  • $server_name:服務(wù)器名稱。
  • $server_port:服務(wù)器端口。
  • $uri:不包含請(qǐng)求參數(shù)的請(qǐng)求 URI。

以 args 為例,其他的實(shí)現(xiàn)類似:

/**
 * 占位符處理類
 * @since 0.17.0
 *
 * @author 老馬嘯西風(fēng)
 */
public class NginxPlaceholderArgs extends AbstractNginxPlaceholder {

    private static final Log logger = LogFactory.getLog(NginxPlaceholderArgs.class);


    @Override
    protected Object extract(FullHttpRequest request, NginxRequestDispatchContext context) {
        QueryStringDecoder decoder = new QueryStringDecoder(request.uri());
        StringBuilder args = new StringBuilder();
        for (Map.Entry<String, List<String>> entry : decoder.parameters().entrySet()) {
            for (String value : entry.getValue()) {
                if (args.length() > 0) {
                    args.append("&");
                }
                args.append(entry.getKey()).append("=").append(value);
            }
        }
        return args.toString();
    }

    @Override
    protected String getKey(FullHttpRequest request, NginxRequestDispatchContext context) {
        return "$args";
    }

}

set 的支持

可以看到 nginx 默認(rèn)支持了 set 操作符,可以設(shè)置一個(gè)變量。

這個(gè)屬于操作指令,我們?cè)谏弦黄诘闹噶钪羞M(jìn)行拓展:

/**
 * SET 符號(hào),設(shè)置一個(gè) $ 變量
 *
 * @since 0.17.0
 * @author 老馬嘯西風(fēng)
 */
public class NginxParamHandleSet extends AbstractNginxParamHandle {

    private static final Log logger = LogFactory.getLog(NginxParamHandleSet.class);

    /**
     * # 設(shè)置一個(gè)占位符的值
     *
     * set $mobile 1;
     *
     * @param configParam 參數(shù)
     * @param context     上下文
     */
    @Override
    public void doBeforeDispatch(NginxUserConfigParam configParam, NginxRequestDispatchContext context) {
        Map<String, Object> placeholderMap = context.getPlaceholderMap();

        // 處理
        List<String> values = configParam.getValues();
        String headerName = values.get(0);
        String headerValue = values.get(1);

        // 變量名必須以 $ 開始
        if(!headerName.startsWith(NginxConst.PLACEHOLDER_PREFIX)) {
            throw new Nginx4jException("SET 指令對(duì)應(yīng)的變量名必須以 $ 開始");
        }

        placeholderMap.put(headerName, headerValue);
    }

    //...

    @Override
    public boolean doMatch(NginxUserConfigParam configParam, NginxRequestDispatchContext context) {
        return "set".equalsIgnoreCase(configParam.getName());
    }

}

我們把 set 對(duì)應(yīng)的指令值,放入到 placeholderMap 占位符中。

set指令 + 占位符的處理的時(shí)機(jī)

我們放在 request 分發(fā)處理前,統(tǒng)一處理:

    /**
     * 請(qǐng)求頭的統(tǒng)一處理
     * @param context 上下文
     * @author 老馬嘯西風(fēng)
     */
    protected void beforeDispatch(final NginxRequestDispatchContext context) {
        // 參數(shù)管理類
        final INginxParamManager paramManager = context.getNginxConfig().getNginxParamManager();

        // v0.17.0 占位符管理類
        final INginxPlaceholderManager placeholderManager = context.getNginxConfig().getNginxPlaceholderManager();
        // 提前處理內(nèi)置的各種參數(shù)
        placeholderManager.init(context);


        //1. 當(dāng)前的配置
        NginxUserServerLocationConfig locationConfig = context.getCurrentUserServerLocationConfig();
        if(locationConfig == null) {
            return;
        }

        List<NginxUserConfigParam> directives = locationConfig.getDirectives();
        if(CollectionUtil.isEmpty(directives)) {
            return;
        }

        // 處理
        for(NginxUserConfigParam configParam : directives) {
            // 占位符處理
            placeholderHandle(configParam, placeholderManager, context);

            List<INginxParamHandle> handleList = paramManager.paramHandleList(configParam, context);
            if(CollectionUtil.isNotEmpty(handleList)) {
                for(INginxParamHandle paramHandle : handleList) {
                    paramHandle.beforeDispatch(configParam, context);
                }
            }
        }
    }

    /**
     * 占位符處理
     *
     * SET 問題,這個(gè)是按順序處理的,所以暫時(shí)不用特別考慮
     *
     * @param configParam 配置指令
     * @param placeholderManager 占位符管理類
     * @param context 上下文
     * @since 0.17.0
     */
    protected void placeholderHandle(NginxUserConfigParam configParam,
                                     final INginxPlaceholderManager placeholderManager,
                                     final NginxRequestDispatchContext context) {
        String name = configParam.getName();
        if(name.equals("set")) {
            logger.warn("暫時(shí)不處理 set 指令對(duì)應(yīng)的操作符替換,后續(xù)可考慮改進(jìn)。");
            return;
        }

        // name 暫時(shí)不添加 $ 處理

        // value
        String value = configParam.getValue();
        String actualValue = getPlaceholderStr(value, placeholderManager, context);
        configParam.setValue(actualValue);

        // list
        List<String> valueList = configParam.getValues();
        List<String> newValueList = new ArrayList<>();
        if(CollectionUtil.isNotEmpty(valueList)) {
            for(String valueItem : valueList) {
                String actualValueItem = getPlaceholderStr(valueItem, placeholderManager, context);
                newValueList.add(actualValueItem);
            }

            configParam.setValues(newValueList);
        }

        // 結(jié)束
    }

    /**
     * 獲取占位符對(duì)應(yīng)的值
     * @param value 原始值
     * @param placeholderManager 管理類
     * @param context 上下文
     * @return 結(jié)果
     */
    protected String getPlaceholderStr(String value,
                                       final INginxPlaceholderManager placeholderManager,
                                       final NginxRequestDispatchContext context) {
        // value
        if(value.startsWith(NginxConst.PLACEHOLDER_PREFIX)) {
            Object actualValue = placeholderManager.getValue(context, value);
            if(actualValue == null) {
                logger.error("占位符未初始化 value={}", value);
                throw new Nginx4jException("占位符未初始化" + value);
            }

            // 設(shè)置值
            String actualValueStr = actualValue.toString();
            logger.info("占位符替換 value={}, actualValueStr={}", value, actualValueStr);
            return actualValueStr;
        }

        // 原始值
        return value;
    }

首先初始化所有的占位符策略;

然后依次執(zhí)行以前的 param 用戶指令,這里 set 會(huì)按照順序執(zhí)行。

我們?cè)谡嘉环呗蕴幚頃r(shí)特意跳過了 set,其實(shí)可以細(xì)化一點(diǎn),比如支持 value 值使用 $ 占位符。

測(cè)試

完成了上面的實(shí)現(xiàn),本地啟動(dòng)驗(yàn)證一下:

基本訪問:http://192.168.1.12:8080/

信息: [Nginx] channelRead writeAndFlush start request=HttpObjectAggregator$AggregatedFullHttpRequest(decodeResult: success, version: HTTP/1.1, content: CompositeByteBuf(ridx: 0, widx: 0, cap: 0, components=0))
GET /favicon.ico HTTP/1.1
Host: 192.168.1.12:8080
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
Referer: http://192.168.1.12:8080/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
content-length: 0, id=40a5effffe257be0-00002a80-00000004-f834a6fd4eed4fe9-527bc66f
六月 09, 2024 8:51:12 下午 com.github.houbb.log.integration.adaptors.commons.JakartaCommonsLoggingImpl info
信息: 命中普通前綴配置 requestUri=/favicon.ico, value=/
六月 09, 2024 8:51:12 下午 com.github.houbb.log.integration.adaptors.commons.JakartaCommonsLoggingImpl info
信息: placeholder put key=$args,value=
六月 09, 2024 8:51:12 下午 com.github.houbb.log.integration.adaptors.commons.JakartaCommonsLoggingImpl info
信息: placeholder put key=$content_length,value=0
六月 09, 2024 8:51:12 下午 com.github.houbb.log.integration.adaptors.commons.JakartaCommonsLoggingImpl info
信息: placeholder put key=$content_type,value=null
六月 09, 2024 8:51:12 下午 com.github.houbb.log.integration.adaptors.commons.JakartaCommonsLoggingImpl info
信息: placeholder put key=$document_root,value=/D:/github/nginx4j/target/classes/
六月 09, 2024 8:51:12 下午 com.github.houbb.log.integration.adaptors.commons.JakartaCommonsLoggingImpl info
信息: placeholder put key=$host,value=192.168.1.12:8080
六月 09, 2024 8:51:12 下午 com.github.houbb.log.integration.adaptors.commons.JakartaCommonsLoggingImpl info
信息: placeholder put key=$http_cookie,value=
六月 09, 2024 8:51:12 下午 com.github.houbb.log.integration.adaptors.commons.JakartaCommonsLoggingImpl info
信息: placeholder put key=$remote_addr,value=192.168.1.12
六月 09, 2024 8:51:12 下午 com.github.houbb.log.integration.adaptors.commons.JakartaCommonsLoggingImpl info
信息: placeholder put key=$remote_port,value=54511
六月 09, 2024 8:51:12 下午 com.github.houbb.log.integration.adaptors.commons.JakartaCommonsLoggingImpl info
信息: placeholder put key=$request_method,value=GET
六月 09, 2024 8:51:12 下午 com.github.houbb.log.integration.adaptors.commons.JakartaCommonsLoggingImpl info
信息: placeholder put key=$request_uri,value=/favicon.ico
六月 09, 2024 8:51:12 下午 com.github.houbb.log.integration.adaptors.commons.JakartaCommonsLoggingImpl info
信息: placeholder put key=$schema,value=http
六月 09, 2024 8:51:12 下午 com.github.houbb.log.integration.adaptors.commons.JakartaCommonsLoggingImpl info
信息: placeholder put key=$server_addr,value=192.168.1.12
六月 09, 2024 8:51:12 下午 com.github.houbb.log.integration.adaptors.commons.JakartaCommonsLoggingImpl info
信息: placeholder put key=$server_name,value=192.168.1.12:8080
六月 09, 2024 8:51:12 下午 com.github.houbb.log.integration.adaptors.commons.JakartaCommonsLoggingImpl info
信息: placeholder put key=$server_port,value=192.168.1.12:8080
六月 09, 2024 8:51:12 下午 com.github.houbb.log.integration.adaptors.commons.JakartaCommonsLoggingImpl info
信息: placeholder put key=$server_protocol,value=HTTP/1.1
六月 09, 2024 8:51:12 下午 com.github.houbb.log.integration.adaptors.commons.JakartaCommonsLoggingImpl info
信息: placeholder put key=$uri,value=/favicon.ico
六月 09, 2024 8:51:12 下午 com.github.houbb.log.integration.adaptors.commons.JakartaCommonsLoggingImpl info
信息: placeholder put key=$user_agent,value=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36
六月 09, 2024 8:51:12 下午 com.github.houbb.log.integration.adaptors.commons.JakartaCommonsLoggingImpl warn
警告: 暫時(shí)不處理 set 指令對(duì)應(yīng)的操作符替換,后續(xù)可考慮改進(jìn)。
...

這里的日志量還是比較多的,我們把級(jí)別還是從 INFO 調(diào)整為 debug 比較合理。

小結(jié)

占位符為 nginx 的配置提供了非常強(qiáng)大靈活的能力。

我們目前實(shí)現(xiàn)的指令比較少,后續(xù)考慮花一段時(shí)間,將 nginx 的常見指令都支持一下。

這樣的 nginx 才是強(qiáng)大易用的。

我是老馬,期待與你的下次重逢。

開源地址

為了便于大家學(xué)習(xí),已經(jīng)將 nginx 開源

https://github.com/houbb/nginx4j

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容