「服务器」Nginx详解

「服务器」Nginx详解

码农世界 2024-05-23 前端 65 次浏览 0个评论

本文主要介绍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应用在服务器重启后能够自动启动,你可以使用如systemd或supervisord等工具来管理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}`);
    });
    

转载请注明来自码农世界,本文标题:《「服务器」Nginx详解》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,65人围观)参与讨论

还没有评论,来说两句吧...

Top