前言
大家好,我是老馬。很高興遇到你。
我們為 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
-
更新包索引:
更新你的包索引列表以確保你安裝的是最新版本的軟體包。sudo apt update
-
安裝 Node.js:
使用apt
安裝 Node.js 和 npm(Node.js 的包管理器)。sudo apt install -y nodejs npm
這將安裝最新的 Node.js 和 npm 版本。
-
驗證安裝:
安裝完成後,你可以透過檢查 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 請求。
以下是建立這樣一個伺服器的步驟:
-
安裝 Node.js:確保你已經在系統上安裝了 Node.js。你可以透過在終端執行以下命令來檢查 Node.js 是否已安裝以及其版本號:
node -v
-
建立一個新的 JavaScript 檔案:在你的文字編輯器中,建立一個名為
app.js
的新檔案。 -
編寫程式碼:在
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/'); });
-
執行你的伺服器:在終端中,導航到
app.js
檔案所在的目錄,然後執行以下命令:node app.js
-
訪問伺服器:
$ 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 壓縮和虛擬主機包含的設定。被註釋的部分可以透過去掉前面的 #
符號來啟用。