從零手寫實現 nginx-33-http_proxy 代理驗證測試

老马啸西风發表於2024-07-27

前言

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

我們為 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 的操作處理

從零手寫實現 nginx-24-nginx IF 指令

從零手寫實現 nginx-25-nginx map 指令

從零手寫實現 nginx-26-nginx rewrite 指令

從零手寫實現 nginx-27-nginx return 指令

從零手寫實現 nginx-28-nginx error_pages 指令

從零手寫實現 nginx-29-nginx try_files 指令

從零手寫實現 nginx-30-nginx proxy_pass upstream 指令

從零手寫實現 nginx-31-nginx load-balance 負載均衡

從零手寫實現 nginx-32-nginx load-balance 演算法 java 實現

從零手寫實現 nginx-33-nginx http proxy_pass 測試驗證

從零手寫實現 nginx-34-proxy_pass 配置載入處理

從零手寫實現 nginx-35-proxy_pass netty 如何實現?

http 服務準備

簡單起見,我們用 nodejs 實現一個簡單的:

  • server.js
// 引入http模組
const http = require('http');

// 建立一個伺服器物件
const server = http.createServer((req, res) => {
  // 設定響應頭
  res.writeHead(200, {'Content-Type': 'text/plain'});
  
  // 傳送響應資料
  res.end('Hello, World!\n');
});

// 伺服器監聽埠
const PORT = 3000;
server.listen(PORT, () => {
  console.log(`Server is running on http://localhost:${PORT}`);
});

啟動

node server.js

測試配置檔案

  • nginx-proxy-pass.conf
# nginx.conf

# 定義執行Nginx的使用者和組
user nginx;

# 主程序的PID檔案存放位置
pid /var/run/nginx.pid;

# 事件模組配置
events {
    worker_connections 1024;  # 每個工作程序的最大連線數
}

# HTTP模組配置
http {
    upstream backend {
        server 127.0.0.1:3000 weight=5;
    }

    # 定義伺服器塊
    server {
        listen 8080;
        server_name 127.0.0.1:8080;  # 伺服器域名

        # 靜態檔案的根目錄
        root D:\data\nginx4j;  # 靜態檔案存放的根目錄
        index index.html index.htm;  # 預設首頁

        # = 精準匹配
        location / {
        }

        # = 精準匹配
        location /p {
            proxy_pass http://backend;
        }
    }

}

測試用例

public static void main(String[] args) {
    final String configPath = "~/nginx-proxy-pass.conf";
    NginxUserConfig nginxUserConfig = NginxUserConfigLoaders.configComponentFile(configPath).load();
    Nginx4jBs.newInstance()
            .nginxUserConfig(nginxUserConfig)
            .init()
            .start();
}

測試效果

此時如果訪問 http://127.0.0.1:8080/p

頁面返回:

Hello, World!

相關文章