從零手寫實現 nginx-17-nginx.conf 全域性的預設配置

老马啸西风發表於2024-06-11

前言

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

我們為 java 開發者實現了 java 版本的 nginx

https://github.com/houbb/nginx4j

如果你想知道 servlet 如何處理的,可以參考我的另一個專案:

手寫從零實現簡易版 tomcat minicat

手寫 nginx 系列

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

從零手寫實現 nginx-01-為什麼不能有 java 版本的 nginx?

從零手寫實現 nginx-02-nginx 的核心能力

從零手寫實現 nginx-03-nginx 基於 Netty 實現

從零手寫實現 nginx-04-基於 netty http 出入參最佳化處理

從零手寫實現 nginx-05-MIME型別(Multipurpose Internet Mail Extensions,多用途網際網路郵件擴充套件型別)

從零手寫實現 nginx-06-資料夾自動索引

從零手寫實現 nginx-07-大檔案下載

從零手寫實現 nginx-08-範圍查詢

從零手寫實現 nginx-09-檔案壓縮

從零手寫實現 nginx-10-sendfile 零複製

從零手寫實現 nginx-11-file+range 合併

從零手寫實現 nginx-12-keep-alive 連線複用

從零手寫實現 nginx-13-nginx.conf 配置檔案介紹

從零手寫實現 nginx-14-nginx.conf 和 hocon 格式有關係嗎?

從零手寫實現 nginx-15-nginx.conf 如何透過 java 解析處理?

從零手寫實現 nginx-16-nginx 支援配置多個 server

從零手寫實現 nginx-17-nginx 預設配置最佳化

從零手寫實現 nginx-18-nginx 請求頭+響應頭操作

從零手寫實現 nginx-19-nginx cors

從零手寫實現 nginx-20-nginx 佔位符 placeholder

從零手寫實現 nginx-21-nginx modules 模組資訊概覽

從零手寫實現 nginx-22-nginx modules 分模組載入最佳化

從零手寫實現 nginx-23-nginx cookie 的操作處理

目標

這一節我們對 server 中的配置進一步最佳化,讓使用者使用起來更加方便。

配置的獲取方式流程圖:

獲取方式

1)首先從當前 server 配置獲取

2)不存在,則從全域性的配置中獲取

3)全域性配置屬性不存在,則直接從預設配置中獲取。

核心程式碼調整

我們節選 2 個例子,配置的獲取邏輯就變成下面的樣子:

private List<String> getHttpServerGzipTypes(final NgxConfig conf, final NgxBlock serverBlock) {
    // value
    NgxParam param = serverBlock.findParam("gzip_types");
    if(param != null) {
        return StringUtil.splitToList(param.getValue(), " ");
    }
    // http 預設
    NgxParam httpParam = conf.findParam("gzip_types");
    if(httpParam != null) {
        return StringUtil.splitToList(httpParam.getValue(), " ");
    }
    return NginxUserServerConfigDefaultConst.gzipTypes;
}

private long getHttpServerGzipMinLen(final NgxConfig conf, final NgxBlock serverBlock) {
    // value
    NgxParam param = serverBlock.findParam("gzip_min_len");
    if(param != null) {
        return Long.parseLong(param.getValue());
    }
    // http 預設
    NgxParam httpParam = conf.findParam("gzip_min_len");
    if(httpParam != null) {
        return Long.parseLong(httpParam.getValue());
    }
    return NginxUserServerConfigDefaultConst.gzipMinLength;
}

private String getHttpServerGzip(final NgxConfig conf, final NgxBlock serverBlock) {
    // value
    NgxParam param = serverBlock.findParam("gzip");
    if(param != null) {
        return param.getValue();
    }
    // http 預設
    NgxParam httpParam = conf.findParam("gzip");
    if(httpParam != null) {
        return httpParam.getValue();
    }
    return NginxUserServerConfigDefaultConst.gzip;
}

小結

這種配置的預設獲取,在技術的實現上難度一般。

這個實現後續可以考慮統一最佳化,因為存在重複性實現。

但是出發點是站在使用者的使用角度,讓使用者的使用更加便捷。

相關文章