Nginx 實戰-02-nginx proxy_pass 服務代理訪問 使用筆記 ubuntu nodejs

老马啸西风發表於2024-05-31

前言

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

我們為 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 連線複用

準備工作-HTTP 服務

我們簡單起見,使用 node.js 啟動一個簡單的前端服務。

ubuntu 如何安裝 node.js

  1. 更新包索引
    更新你的包索引列表以確保你安裝的是最新版本的軟體包。

    sudo apt update
    
  2. 安裝 Node.js
    使用 apt 安裝 Node.js 和 npm(Node.js 的包管理器)。

    sudo apt install -y nodejs npm
    

    這將安裝最新的 Node.js 和 npm 版本。

  3. 驗證安裝
    安裝完成後,你可以透過檢查 Node.js 和 npm 的版本來驗證安裝是否成功。

    node -v
    npm -v
    

安裝版本如下:

$ node -v
v12.22.9

$ npm -v
8.5.1

nodejs 建立一個 http 服務

Node.js 最簡單的入門例子是一個基礎的 Web 伺服器,它使用 Node.js 內建的 http 模組來響應 HTTP 請求。

以下是建立這樣一個伺服器的步驟:

  1. 安裝 Node.js:確保你已經在系統上安裝了 Node.js。你可以透過在終端執行以下命令來檢查 Node.js 是否已安裝以及其版本號:

    node -v
    
  2. 建立一個新的 JavaScript 檔案:在你的文字編輯器中,建立一個名為 app.js 的新檔案。

  3. 編寫程式碼:在 app.js 檔案中,輸入以下程式碼:

    const http = require('http'); // 引入 http 模組
    
    // 建立一個 HTTP 伺服器
    const server = http.createServer((req, res) => {
      res.writeHead(200, {'Content-Type': 'text/plain'});
      res.end('Hello, World!\n'); // 響應請求併傳送一個字串
    });
    
    // 伺服器監聽 3000 埠
    server.listen(3000, '127.0.0.1', () => {
      console.log('Server running at http://127.0.0.1:3000/');
    });
    
  4. 執行你的伺服器:在終端中,導航到 app.js 檔案所在的目錄,然後執行以下命令:

    node app.js
    
  5. 訪問伺服器

$ curl http://127.0.0.1:3000/
Hello, World!

想透過 nginx 來代理訪問這個 http 服務,應該如何配置實現?

要透過 Nginx 代理訪問你的 Node.js HTTP 服務,你需要在 Nginx 的配置檔案中設定一個代理伺服器。

以下是配置 Nginx 以代理 Node.js 服務的步驟:

先看一下 nginx 的配置

預設的配置如下:

cat /etc/nginx/nginx.conf

如下:

$ cat /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
        # multi_accept on;
}

http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        types_hash_max_size 2048;
        # server_tokens off;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # SSL Settings
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        ##
        # Logging Settings
        ##

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        ##
        # Gzip Settings
        ##

        gzip on;

        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}


#mail {
#       # See sample authentication script at:
#       # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
#       # auth_http localhost/auth.php;
#       # pop3_capabilities "TOP" "USER";
#       # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
#       server {
#               listen     localhost:110;
#               protocol   pop3;
#               proxy      on;
#       }
#
#       server {
#               listen     localhost:143;
#               protocol   imap;
#               proxy      on;
#       }
#}

簡單解釋

這是一個 Nginx 的主配置檔案,它包含了用於定義 Nginx 伺服器行為的多種設定。

以下是配置檔案中每一行的解釋,其中註釋行以 # 開頭:

# 指定執行 Nginx 的使用者和使用者組
user www-data;

# 設定工作程序的數量,'auto' 會讓 Nginx 根據 CPU 核心數自動設定
worker_processes auto;

# 指定 Nginx 程序的 PID 檔案存放位置
pid /run/nginx.pid;

# 包含所有在 /etc/nginx/modules-enabled/ 目錄下啟用的模組配置檔案
include /etc/nginx/modules-enabled/*.conf;

events {
    # 設定每個工作程序的最大連線數
    worker_connections 768;
    # 以下注釋掉的選項可以啟用或禁用多請求接受
    # multi_accept on;
}

http {
    ### 基礎設定 ###

    # 開啟高效檔案傳輸模式
    sendfile on;
    # 開啟 TCP 無推送選項,可以提高效能
    tcp_nopush on;
    # 設定型別hash桶的最大大小
    types_hash_max_size 2048;
    # 以下注釋掉的選項可以關閉伺服器版本號在錯誤頁面和HTTP頭部的顯示
    # server_tokens off;

    # 設定伺服器名稱的hash桶大小
    # server_names_hash_bucket_size 64;
    # 禁止在重定向響應中出現伺服器名稱
    # server_name_in_redirect off;

    # 包含 MIME 型別配置檔案
    include /etc/nginx/mime.types;
    # 預設的 MIME 型別
    default_type application/octet-stream;

    ### SSL 設定 ###

    # 設定 SSL/TLS 協議版本
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # 不支援 SSLv3,參考 POODLE 漏洞
    # 優先使用伺服器端的加密套件
    ssl_prefer_server_ciphers on;

    ### 日誌設定 ###

    # 定義訪問日誌的存放路徑
    access_log /var/log/nginx/access.log;
    # 定義錯誤日誌的存放路徑
    error_log /var/log/nginx/error.log;

    ### Gzip 設定 ###

    # 開啟 Gzip 壓縮
    gzip on;
    # 以下注釋掉的選項可以進一步配置 Gzip 壓縮行為
    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    ### 虛擬主機配置 ###

    # 包含 /etc/nginx/conf.d/ 目錄下的所有配置檔案
    include /etc/nginx/conf.d/*.conf;
    # 包含 /etc/nginx/sites-enabled/ 目錄下的所有配置檔案
    include /etc/nginx/sites-enabled/*;
}

#mail {
    # 下面的註釋掉的連結提供了一個 Nginx 與 Apache/PHP 指令碼進行 IMAP 認證的示例
    # 詳見:http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
    #
    # auth_http localhost/auth.php;
    # pop3_capabilities "TOP" "USER";
    # imap_capabilities "IMAP4rev1" "UIDPLUS";
    #
    # server {
    #     listen     localhost:110;
    #     protocol   pop3;
    #     proxy      on;
    # }
    #
    # server {
    #     listen     localhost:143;
    #     protocol   imap;
    #     proxy      on;
    # }
#}

這個配置檔案定義了 Nginx 伺服器的基本執行引數,如使用者、工作程序、PID 檔案位置,以及事件處理、HTTP、SSL、日誌、Gzip 壓縮和虛擬主機包含的設定。被註釋的部分可以透過去掉前面的 # 符號來啟用。

相關文章