「服務器」Nginx詳解

本文主要介紹Nginx的原理和服務器部署Node.js項目。

一、Nginx原理

Nginx是一個高性能的HTTP服務器和反向代理服務器,它以高穩定性、豐富的功能集、簡單的配置和低資源消耗而聞名。以下是對Nginx的一些詳解:

1. Nginx是什么?

Nginx(發音為“engine x”)是一個輕量級的Web服務器,由俄羅斯人Igor Sysoev開發。它不僅能夠處理大量的并發連接,而且非常穩定,占有內存少,同時具備強大的并發處理能力。

2. Nginx的反向代理

Nginx可以作為一個反向代理服務器,允許你將客戶端的請求轉發到一個或多個后端服務器。這意味著Nginx可以作為客戶端和服務器之間的中介,提供負載均衡和緩存功能。

3. Nginx的負載均衡

Nginx支持多種負載均衡方法,包括輪詢法、權重模式和ip_hash。輪詢法是默認方法,將請求均勻分配給后端服務器。權重模式允許你根據服務器的性能分配不同的處理權重。ip_hash可以保持用戶的會話持久性,將同一用戶的請求始終定向到同一個后端服務器。

4. Nginx的動靜分離

動靜分離是一種優化手段,將靜態內容和動態內容分開處理。Nginx可以高效地處理靜態內容,而動態內容則可以交由后端應用服務器處理,比如PHP-FPM或Apache。

5. Nginx的安裝

Nginx支持跨平臺運行,可以在Windows和Linux系統中安裝。Windows版本的安裝較為簡單,只需下載、解壓并啟動Nginx即可。Linux版本則需要通過命令行進行安裝和配置。

6. Nginx常用命令

Nginx提供了一系列的命令來控制其運行,包括啟動、停止、重新加載配置文件等。例如:

  • 啟動:nginx
  • 停止:nginx -s stop
  • 重新加載配置:nginx -s reload
  • 查看進程:ps aux | grep nginx

7. Nginx配置文件結構

Nginx的配置文件通常名為nginx.conf,它包含了主配置塊和多個子配置塊。配置文件決定了Nginx及其模塊的工作方式,并且可以通過修改配置文件來實現不同的功能和優化。

8. Nginx的高可用性

Nginx可以通過與Keepalived等工具結合使用來實現高可用性。Keepalived可以監控Nginx的狀態,并在主服務器故障時自動切換到備用服務器,從而保證服務的持續性。

9. Nginx的原理解析

Nginx啟動后會生成一個master進程和多個worker進程。master進程負責分配任務,而worker進程則負責處理請求。每個worker進程都是獨立的,如果一個worker進程出現問題,其他進程仍能繼續工作,這有助于提高服務的穩定性和可用性。

二、舉個栗子

通過Nginx部署上述Node.js項目到服務器。

要通過Nginx部署上述Node.js項目到服務器,你需要執行以下步驟:

  1. 安裝Nginx:如果你的服務器上還沒有安裝Nginx,你需要先安裝它。在大多數Linux發行版中,你可以使用包管理器來安裝Nginx。

  2. 配置Nginx:為了讓Nginx作為反向代理服務器來轉發請求到你的Node.js應用,你需要配置Nginx以處理特定的路由。

    假設你的Node.js應用運行在http://localhost:3000,下面是一個基本的Nginx配置示例,該配置將流量從http://your_server_ip/read-link轉發到你的Node.js應用:

    server {listen 80; # 監聽80端口,你可以根據需要更改為其他端口server_name your_server_ip_or_domain; # 使用你的服務器IP或域名location / {proxy_pass http://localhost:3000; # 轉發請求到Node.js應用proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection 'upgrade';proxy_set_header Host $host;proxy_cache_bypass $http_upgrade;}
    }
    

    將上述配置保存到Nginx的配置文件中,通常是/etc/nginx/sites-available/default(這可能會根據你的服務器和Nginx版本有所不同)。

  3. 重啟Nginx服務:為了使配置生效,需要重啟Nginx服務。你可以使用以下命令來重啟Nginx:

    sudo nginx -s reload
    
  4. 確保Node.js服務運行:確保你的Node.js應用已經在服務器上運行。如果還沒有運行,可以使用node命令啟動它:

    node your_app.js
    

    其中your_app.js是你的Node.js應用的入口文件。

  5. 設置Node.js應用開機自啟:為了確保Node.js應用在服務器重啟后能夠自動啟動,你可以使用如systemdsupervisord等工具來管理Node.js進程。

  6. 安全性和性能優化(可選):你可能還需要對Nginx進行一些額外的配置,比如啟用SSL/TLS加密,設置HTTP/2,或者調整一些性能相關的指令,比如緩存設置。

  7. 監控和日志記錄:確保你有適當的監控和日志記錄機制,以便跟蹤Node.js應用和Nginx服務的狀態。

通過以上步驟,你的Node.js應用現在應該已經通過Nginx在服務器上運行了。用戶可以通過服務器的IP地址或域名訪問你的應用,而Nginx將負責將請求轉發到運行在特定端口上的Node.js應用。

源碼demo

Node.js項目

// url識別html內容/pdf在線文件
const express = require("express");
const axios = require("axios");
const ytSearch = require("yt-search");
const cheerio = require("cheerio");const { PDFDocument } = require("pdf-lib");
const pdfParser = require("pdf-parse");const app = express();
const port = 3000;app.get("/read-link", async (req, res) => {const url = req.query.url;if (!url) {return res.status(400).send("URL is required");}try {const response = await axios.get(url, { responseType: "arraybuffer" });const contentType = response.headers["content-type"];let data, title;if (contentType.includes("text/html")) {const $ = cheerio.load(response.data.toString());title = $("title").text();data = $("html").html(); // 這里可以根據需要提取更具體的部分 - 通用型 需要定制化} else if (contentType.includes("application/pdf")) {// PDF處理邏輯,使用pdf-parse解析PDF文件const pdf = await pdfParser(response.data);const content = pdf.text;const title = extractTitleFromContent(content); // 需要自定義的函數來提取標題const data = extractContentFromContent(content); // 需要自定義的函數來提取內容res.send({ title, data });} else {res.status(415).send("Unsupported media type");return;}res.send({ title, data });} catch (error) {res.status(500).send(error.message);}
});// 示例:從PDF內容中提取標題
// 這可能需要根據PDF的實際內容進行調整
let extractTitleFromContent = (content, index = 0) => {// 假設標題是第一行const lines = content.trim().split("\n");return lines[0].trim();
};// 示例:從PDF內容中提取內容
// 這同樣可能需要根據PDF的實際內容進行調整
function extractContentFromContent(content) {// 假設內容是除了標題之外的所有行const lines = content.split("\n");// 移除標題行lines.shift();return lines.join("\n").trim();
}app.listen(port, () => {console.log(`Server running at http://localhost:${port}`);
});

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/13480.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/13480.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/13480.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

鑷子蠟燭如何設置止盈止損?Anzo Capital昂首資本盈利收場

通過上一篇文章各位聰明的投資者,都已經知道了什么是鑷子蠟燭圖以及如何抓住反轉進行交易,同時也有很多投資者不知道如何設置止盈止損?今天Anzo Capital昂首資本就和各位投資者一起探討如何盈利收場。 看跌的鑷子模式如何交易?首…

【數據結構】樹(Tree)

???專欄:數據結構 🧑?🎓個人主頁:SWsunlight 目錄 一、基本概念: 1、定義: ?編輯 ?編輯 2、樹的成分: 3、樹的性質: 二、存儲方式: ?編輯 雙親表示法…

C++-float與double

float和double是兩種不同的數據類型,用于存儲浮點數(小數)。 1.精度: float是單精度浮點數,占用4個字節,通常精度為6-9位小數。 double是雙精度浮點數,占用8個字節,通常精度為15-…

Open3D 點云多平面探測(Python)

文章目錄 一、簡介二、實現代碼三、實現效果參考資料一、簡介 Open3D為我們提供了一種點云多平面探測的算法,該算法使用基于魯棒統計的方法進行平面補丁檢測。該算法具體過程:首先將點云細分為更小的塊(使用八叉樹),然后嘗試為每個塊匹配一個平面。如果平面通過了魯棒平面性…

【C語言每日題解】用函數來模擬實現strlen()、strcpy()、strcmp()、strcat()

🥰歡迎關注 輕松拿捏C語言系列,來和 小哇 一起進步!? 學習了函數后,老師讓我們用函數來實現上面這四個字符串函數。 我們首先來了解一下這四個字符串函數: 1.strlen函數 用于獲取字符串長度(不包括末尾…

【源碼】相親交友系統全新UI/情感測試/婚慶中介/交友系統

【交友】相親交友系統全新UI/情感測試/婚慶中介/交友系統 帶商城,情感測試。 https://www.52codes.cc/codes/qt

從開發板導出根文件系統并修改(Ubuntu)

前面提到過基于ubuntu-base去構建根文件系統基于Ubuntu-base構建根文件系統-CSDN博客,但是有時候我們并不需要重頭開始,可以基于現有的根文件系統做調整。又或者我們直接在出廠的系統上去搭建好自己的運行環境并且編譯出自己想要的程序,現在要…

醫學科技查新中對查新點的撰寫方法!附案例講解!

我國的科技查新工作最早是從醫學領域開始的,始于1985年中國科學院醫學情報所,后來逐步發展到工、農等其 他各個領域。醫學科技查新包括立項查新和成果查新兩個部分,其中醫學立項查新,它是指在醫學科研項目申報開題之前&#xff0c…

Linux上diff命令

diff 是一個 Linux 下的命令行工具,用于比較文本文件或目錄之間的差異。它會逐行比較兩個文件的內容,并輸出它們之間的不同之處。diff 命令通常用于查找文件間的差異,特別是用于比較文件的修改,合并文件或者檢查文件的一致性。 基…

按值傳遞還是按引用傳遞

使用std::ref和std::cref 從 C11 開始&#xff0c;可以讓調用者自行決定向函數模板傳遞參數的方式。如果模板參數被聲明成 按值傳遞的&#xff0c;調用者可以使用定義在頭文件<functional>中的 std::ref()和std::cref()將參數按引用傳遞給函數模板&#xff0c;比如&#…

上海初中生古詩文大會倒計時4個月:單選題真題示例和獨家解析

現在距離2024年初中生古詩文大會還有4個多月時間&#xff0c;備考要趁早&#xff0c;因為知識點還是相對比較多的。這些知識點對于初中語文的學習也是很有幫助的。 今天我們繼續來看10道選擇題真題和詳細解析&#xff0c;以下題目截取自我獨家制作的在線真題集&#xff0c;都是…

取名時,要考慮生肖的影響

親愛的寶寶們&#xff0c;又是一年五一小長假&#xff0c;峰民想大家都在休假吧&#xff01;真幸福&#xff01;峰民每天都在工作&#xff0c;幾乎沒有休過假&#xff0c;因為每天全國各地找我們取名改名客戶是絡繹不絕&#xff0c;峰民雖然也很辛勞&#xff0c;但也很有成就感…

Redis:hash數據類型

文章目錄 hash常用命令hsethgethexistshdelhkeyshvalshmget 壓縮hash和string 本篇總結的是&#xff0c;在Redis中的哈希數據類型 hash 在Redis內部本身&#xff0c;其實就是一種鍵值對的結構&#xff0c;而在key-value的value本身&#xff0c;其實也可以是一種哈希結構 而在…

【c++算法篇】滑動窗口

&#x1f525;個人主頁&#xff1a;Quitecoder &#x1f525;專欄&#xff1a;算法筆記倉 目錄 1.長度最小的子數組2.無重復字符的最長子串3.最大連續1的個數 III4.將 x 減到 0 的最小操作數5.水果成籃6.找到字符串中所有字母異位詞7.串聯所有單詞的子串8.最小覆蓋子串 滑動窗…

李宏毅-Self-attention機制詳解

原視頻鏈接&#xff1a;attention 一. 基本問題分析 1. 模型的input 無論是預測視頻觀看人數還是圖像處理&#xff0c;輸入都可以看作是一個向量&#xff0c;輸出是一個數值或類別。然而&#xff0c;若輸入是一系列向量&#xff0c;長度可能會不同&#xff0c;例如把句子里的…

C 深入指針(4)

目錄 一、字符指針變量 1 初始化 2 與字符串數組的區別 二、數組指針變量 1 初始化 2 二維數組傳參本質 三、函數指針變量 1 初始化 2 用法 四、typedef關鍵字 五、函數指針數組 一、字符指針變量 1 初始化 //VS2022 x64 #include <stdio.h> int main() {…

機器人非線性阻抗控制系統

機器人非線性控制系統本質上是一個復雜的控制系統&#xff0c;其狀態變量和輸出變量相對于輸入變量的運動特性不能用線性關系來描述。這種系統的形成基于兩類原因&#xff1a;一是被控系統中包含有不能忽略的非線性因素&#xff0c;二是為提高控制性能或簡化控制系統結構而人為…

人形機器人場景應用全解析,2024睿抗 AI ROBOT創新挑戰賽火熱報名中!

人工智能&#xff08;AI&#xff09;已成為推動科技革命和產業變革的關鍵力量。隨著大模型等AIGC技術的迅猛發展&#xff0c;AI正深刻改變我們的生活并重新定義生產方式。越來越多人期望將AI技術從純粹的思維和計算擴展到與物理世界的互動中&#xff0c;即發展具身智能。 為了推…

探索中國文本到視頻AI模型——Vidu

引言 隨著人工智能技術的不斷進步&#xff0c;我們見證了從文本到視頻內容生成的革命。最近&#xff0c;一個名為Vidu的中國文本到視頻AI模型引起了全球的關注。由清華大學和中國AI初創公司聲書科技聯合開發的Vidu&#xff0c;于2024年4月27日宣布&#xff0c;它聲稱能夠生成高…

測試周期記錄

測試周期是軟件開發生命周期中的一個重要環節&#xff0c;它包括單元測試、集成測試、系統測試和驗收測試等階段。本文將詳細介紹測試周期的各個階段及其重要性&#xff0c;幫助讀者更好地理解測試周期在軟件開發過程中的作用。 一、單元測試 單元測試是測試周期中的第一個階段…