「服务器」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.mzph.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;帮助读者更好地理解测试周期在软件开发过程中的作用。 一、单元测试 单元测试是测试周期中的第一个阶段…