Nginx 源码安装成服务

一、环境准备

  • 一台装有 CentOS 7.9 的虚拟机(IP: 192.168.40.81)
  • nginx-1.21.6.tar.gz 安装包一个(版本随意)

二、安装

 1)解压 nginx-1.21.6.tar.gz

tar -xzvf nginx-1.21.6.tar.gz
  • -tar:这是一个在 Linux 系统中常用的归档工具,能够对多个文件或目录进行打包操作。
  • -xzvf:此为命令的选项参数,是由多个选项组合而成的。
  • -x:代表 extract,也就是解包的意思,表明要对归档文件进行解压操作。 
  • -z:意味着使用 gzip 算法对归档文件进行压缩或解压。 
  • -v:即 verbose,它的作用是在操作过程中显示详细的进度信息。 
  • -f:表示 file,此选项后面需要紧跟要操作的归档文件名称。

这条命令的主要功能是对名为 nginx-1.21.6.tar.gz 的压缩包进行解压操作。具体来讲,它会先运用 gzip 算法对压缩包进行解压缩,得到一个 tar 包,接着再对这个 tar 包进行解包处理,最终将其中包含的 Nginx 1.21.6 版本的源代码文件释放出来。解压操作会在当前目录下生成一个名为 nginx-1.21.6 的目录,解压出来的所有文件都存放在这个目录中。

 2)配置编译选项

cd nginx-1.21.6
./configure --prefix=/usr/local/nginx
  • ./configure:
  • 这是源码编译软件时的标准第一步,其作用是检查系统环境是否满足编译要求,像依赖库、编译器等是否齐全。 该命令会依据系统环境生成 Makefile 文件,而这个文件正是后续 make 和 make install 命令执行的依据。

  • --prefix=/usr/local/nginx:
  • 此为 configure 命令的一个参数,用于指定软件的安装路径。在这个例子中,Nginx 会被安装到 /usr/local/nginx 目录下。
  • 安装完成后,Nginx 的二进制文件会存放在 /usr/local/nginx/sbin/ 目录,配置文件则位于 /usr/local/nginx/conf/ 目录。

 出现下面的提示就是配置成功。

  • 中途如果有报错,根据报错提示,yum install -y 安装依赖的软件即可。 

 3)编译安装

make && make install

 最终会在 /usr/local 下安装了 nginx:

 

 4)安装成服务

  •  创建服务脚本
vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - web server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true[Install]
WantedBy=multi-user.target
  • 重新加载系统服务
systemctl daemon-reload
  •  启动服务并设置为开机启动
systemctl enable nginx.service --now
  •  重启虚拟机
reboot
  • 查看 nginx 服务状态
systemctl status nginx

 5)手工启动

nginx 也可以手工启动。安装成服务以后就不需要手工启动。服务启动跟手工启动二选一。

# 进入安装好的目录 /usr/local/nginx/sbin
./nginx 启动
./nginx -s stop 快速停止
./nginx -s quit 优雅关闭,在退出前完成已经接受的连接请求
./nginx -s reload 重新加载配置
在 Nginx 命令中, -s 是一个选项(option),用于向正在运行的 Nginx 主进程发送信号(signal),从而控制 Nginx 的行为(如停止、重启、重新加载配置等)。 -s 后面需要跟具体的信号指令,常见的有:
信号指令作用
stop快速停止 Nginx(强制终止,不等待现有连接处理完毕)
quit优雅停止 Nginx(等待所有请求处理完毕后再停止)
reload重新加载配置文件(无需重启服务,平滑应用新配置)
reopen重新打开日志文件(常用于日志切割,避免日志文件过大)

 6)访问 Nginx

  • 在浏览器输入虚拟机IP

  • 如果虚拟机防火墙关闭的话,应该能看到如下:

三、工作原理

Nginx 采用主进程 + 工作进程的多进程模型:

/sbin/nginx 启动主进程。

  • 主进程启动时读取并解析配置文件(如 /etc/nginx/nginx.conf)。
  • 配置信息被解析为内存中的数据结构(如结构体、哈希表等)。
  • 主进程会创建监听套接字(如监听 80/443 端口)。

主进程通过 fork() 系统调用创建多个工作进程。

  • fork() 会复制主进程的内存空间,包括已解析的配置数据结构。因此,每个工作进程都获得了主进程配置信息的副本。
  • 每个工作进程都会继承主进程监听套接字。
  • 所有工作进程并行监听相同的端口,客户端连接到达时,由操作系统内核决定哪个工作进程接收连接(通常采用负载均衡算法)。

客户端请求 inde.html。

  • 工作进程通过事件循环(Event Loop)监听多个连接的读写事件。
  • 当某个连接有数据可读时,工作进程读取请求、解析 HTTP 头,并根据配置文件决定如何处理请求(如转发到后端服务器、返回静态文件等)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/80565.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

L51.【LeetCode题解】438. 找到字符串中所有字母异位词(四种方法)

目录 1.题目 2.分析 暴力解法 方法1:排序(超时) 方法2:哈希表(险过) ★判断两个哈希表是否相同算法(通用方法,必须掌握) 能相等的前提:两个哈希表的大小相等 哈希表有迭代器,可以使用范围for从头到尾遍历 提交结果 优化方法:定长滑动窗口 提交结果 使用哈希数组更快…

Qt模块化架构设计教程 -- 轻松上手插件开发

概述 在软件开发领域,随着项目的增长和需求的变化,保持代码的可维护性和扩展性变得尤为重要。一个有效的解决方案是采用模块化架构,尤其是利用插件系统来增强应用的功能性和灵活性。Qt框架提供了一套强大的插件机制,可以帮助开发者轻松实现这种架构。 模块化与插件系统 模…

深入理解 HashMap 的索引计算:右移与异或的作用

在 Java 中,HashMap 是一种高效的数据结构,它通过将键映射到数组中的索引位置来实现快速的插入和查找。但之前看源码总是理解到它要hash之后散列到数组中某一个位置,但却从未深究它究竟怎么散列的,如果不够散那就意味着hash冲突增…

overleaf较高级的细节指令

换行命令 原来代码是将三个矩阵表达式在同一行显示,使用aligned环境(需引入amsmath宏包,一般文档导言区默认会引入),把三个矩阵的定义分别放在不同行,可通过\\换行。 对齐命令 &放在等号前&#xff0…

LiteLLM:统一API接口,让多种LLM模型调用如臂使指

在人工智能迅猛发展的今天,各种大语言模型(LLM)层出不穷。对开发者而言,如何高效集成和管理这些模型成为一个棘手问题。LiteLLM应运而生,它提供了一个统一的API接口,让开发者可以轻松调用包括OpenAI、Anthropic、Cohere等在内的多种LLM模型。本文将深入介绍LiteLLM的特性、…

Google语法整理

以下是从整理出的 Google 语法: site:指定域名,如 “apache site:bbs.xuegod.cn”,可查询网站的收录情况 。 inurl:限定在 url 中搜索,如 “inurl:qq.txt”,可搜索 url 中包含特定内容的页面&a…

python 写一个工作 简单 番茄钟

1、图 2、需求 番茄钟(Pomodoro Technique)是一种时间管理方法,由弗朗西斯科西里洛(Francesco Cirillo)在 20 世纪 80 年代创立。“Pomodoro”在意大利语中意为“番茄”,这个名字来源于西里洛最初使用的一个…

Compose Multiplatform iOS 稳定版发布:可用于生产环境,并支持 hotload

随着 Compose Multiplatform 1.8.0 的发布,iOS 版本也引来的第一个稳定版本,按照官方的原话:「iOS Is Stable and Production-Ready」 ,而 1.8.0 版本,也让 Kotlin 和 Compose 在移动端有了完整的支持。 在 2023 年 4 …

Jenkins 服务器上安装 Git

安装 Git # 更新包列表 sudo apt update# 安装 Git sudo apt install git 验证安装 # 检查 Git 版本 git --version 查看所有全局配置 git config --global --list 查看特定配置项 # 查看用户名配置 git config --global user.name# 查看邮箱配置 git config --global u…

OpenHarmony SystemUI开发——实现全局导航栏和状态栏关闭

在实际生产中,进场遇到需要关闭导航栏和状态栏的需求,现分享解决办法: 开发环境 OpenHarmony 5.0.0r 代码分析 思路: launcher本身可以关闭 导航栏(实际是 公共事件,发送消息给systemUI来实控制&#x…

大模型微调终极方案:LoRA、QLoRA原理详解与LLaMA-Factory、Xtuner实战对比

文章目录 一、微调概述1.1 微调步骤1.2 微调场景 二、微调方法2.1 三种方法2.2 方法对比2.3 关键结论 三、微调技术3.1 微调依据3.2 LoRA3.2.1 原理3.2.2 示例 3.3 QLoRA3.4 适用场景 四、微调框架4.1 LLaMA-Factory4.2 Xtuner4.3 对比 一、微调概述 微调(Fine-tun…

单片机-STM32部分:10-2、逻辑分析仪

飞书文档https://x509p6c8to.feishu.cn/wiki/VrdkwVzOnifH8xktu3Bcuc4Enie 安装包如下:根据自己的系统选择,目前这个工具只有window版本哦 安装方法比较简单,都按默认下一步即可,注意不要安装到中文路径哦。 其余部分参考飞书文档…

uniapp-商城-48-后台 分类数据添加修改弹窗bug

在第47章的操作中,涉及到分类的添加、删除和更新功能,但发现uni-popup组件存在bug。该组件的函数接口错误导致在小程序中出现以下问题:1. 点击修改肉类名称时,回调显示为空,并报错“setVal is not defined”&#xff0…

STM32-ADC模数转换器(7)

目录 一、ADC简介 二、逐次逼近型ADC 三、ADC基本结构图 四、规则组的四种转换模式 五、转换时间 对GPIO来说,它只能读取引脚的高低电平,使用了ADC模数转化器之后,就可以对高电平和低电平之间的任意电压进行量化,最终用一个变…

智能商品推荐系统技术路线图

智能商品推荐系统技术路线图 系统架构图 --------------------------------------------------------------------------------------------------------------- | 用户交互层 (Presentation Layer) …

【Docker系列】docker inspect查看容器部署位置

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

标量/向量/矩阵/张量/范数详解及其在机器学习中的应用

标量(Scalar)、向量(Vector)、矩阵(Matrix)、张量(Tensor)与范数(Norm)详解及其在机器学习中的应用 1. 标量(Scalar) 定义&#xff1…

【2025年】基于电脑的jdk1.8通过idea创建springboot2.x版本(非常简洁快速)

【2025年】基于电脑的jdk1.8通过idea创建springboot2.x版本 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是springboot的使用。前后每一小节的内容是存在的有:学习and理解的关联性。【帮帮志系列文章】&…

SierraNet协议分析使用指导[RDMA]| 如何设置 NVMe QP 端口以进行正确解码

在解码RoCEv2数据包(包括TCP RDMA和RoCE RDMA)时,若捕获的跟踪数据无法正确解码,通常需要执行特定的解码步骤。对于RoCE RDMA跟踪数据的处理,分析器主要采用两种方式获取必要信息以实现数据包解码: 首先&am…

JavaScript基础-局部作用域

在JavaScript中,理解不同种类的作用域是掌握这门语言的关键之一。作用域决定了变量和函数的可访问性(即可见性和生命周期)。与全局作用域相对应的是局部作用域,它限制了变量和函数只能在其定义的特定范围内被访问。本文将深入探讨…