「服务器」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}`);
});

相关推荐

  1. 服务器Nginx详解

    2024-05-16 13:26:13       37 阅读
  2. nginx 详解

    2024-05-16 13:26:13       34 阅读
  3. nginx详解

    2024-05-16 13:26:13       22 阅读
  4. nginx 详解

    2024-05-16 13:26:13       30 阅读
  5. Nginx(十六) 配置文件详解 - server stream服务

    2024-05-16 13:26:13       57 阅读
  6. 服务器上配置nginx

    2024-05-16 13:26:13       52 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-16 13:26:13       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-16 13:26:13       101 阅读
  3. 在Django里面运行非项目文件

    2024-05-16 13:26:13       82 阅读
  4. Python语言-面向对象

    2024-05-16 13:26:13       91 阅读

热门阅读

  1. android设计模式-原型设计(深、浅拷贝)

    2024-05-16 13:26:13       39 阅读
  2. 设计模式--组合模式

    2024-05-16 13:26:13       30 阅读
  3. 线程崩溃了,进程也会崩溃吗?

    2024-05-16 13:26:13       25 阅读
  4. zookeeper基础入门·

    2024-05-16 13:26:13       34 阅读
  5. 清华conda源

    2024-05-16 13:26:13       26 阅读
  6. Response对象的学习

    2024-05-16 13:26:13       30 阅读
  7. 服务器docker启动

    2024-05-16 13:26:13       35 阅读
  8. 时政|政务大厅拒收现金

    2024-05-16 13:26:13       35 阅读
  9. 鸿蒙应用开发之调用C++开发代码库2

    2024-05-16 13:26:13       29 阅读
  10. 【kali工具】NMAP 高级使用技巧

    2024-05-16 13:26:13       61 阅读
  11. 一步步教您轻松搭建YOLO训练环境(视频教程)

    2024-05-16 13:26:13       27 阅读
  12. git命令使用

    2024-05-16 13:26:13       34 阅读