文章

nginx研究记录(一)

0.前言

之前我只在Windows上做开发,Linux一直认为很难(从本科的课程中感受到的),但在学习C++开源项目时,发现很多是布置在Linux环境中,再加上知乎互关的大佬做过C++岗位需求记录,Linux稳居第一,所以学习Linux便是今年我的一项重点任务。

自己最近两周在看nginx,为什么选择它呢,当然是手中刚好有它的资料,所以寻思有现成的资料,既可以学习Linux,又可以研究开源项目,何乐而不为呢?

博客不会面面俱到,只会简单过下流程,重点的会详细说明,本文把所有Nginx都用小写的nginx。

我的学习步骤目前是:搭建Linux环境、下载及编译源码、运行nginx、初步了解master和worker。

1.搭建Linux环境

按照顺序依次是

  • 虚拟机的安装
  • Linux操作系统安装
  • 配置固定IP地址:服务器IP固定了,客户端才能访问到它
  • 配置远程连接:通过Windows连接到Linux服务器,从而达到远程操作服务器
  • 安装编译工具gcc,g++等:gcc编译C语言,g++编译C++,一些软件包需要他们来做编译生成
  • 共享一个操作目录:Windows和Linux共享一个文件,在Windows修改此文件,Linux也会更改,方便操作

2.下载及编译源码

在官网找到nginx的安装包,右键复制安装包下载路径后,Linux下用wget下载

需要注意的是,复制的这个下载路径,观察是https还是http,这会影响到wget下载

下载后可以大概看看源码目录,里面有挺多,知道src是最核心的目录即可,也就是源代码目录

src目录包括以下几个子目录

  • core 核心代码
  • event 内有event(事件)模块相关代码
  • http 内有http(Web)模块相关代码
  • mail 邮件相关代码
  • os 操作系统相关代码
  • stream 流处理相关代码

也就是当你把源码下载好后,假如是在/home/kuangxiang/nginxsourcecode/nginx-1.16.1目录下,应该是下面这种层次结构

image-20240117000846893

这时候可以编译安装nginx了,需要先去configure进行编译前的配置,之后再make命令编译,最后sudo make install完成nginx的安装

安装好后有以下目录

  • sbin nginx的可执行文件
  • conf 配置文件,其中最主要的配置文件是nginx.conf
  • logs 各种日志文件

3.运行nginx

查找包含nginx字样的进程

1
ps -ef | grep nginx

在可执行目录:/usr/local/nginx/sbin中输入sudo ./nginx即可启动nginx

此时再运行上面的查找包含nginx字样的进程命令,便可以看到有一个是root,一个是nobody,前者是master,后者是worker

这是你在Windows浏览器输入你上面配的IP地址,便可以看到nginx的访问页,代表运行成功

image-20240117002017991

这有端口号的,默认为80,IP地址类似于你想找人的地址,端口号则是他的名字,有了这两个你才能找到你想要找的人,在这里也就是正确的服务器

4.初步了解master和worker

master和worker在我的理解中,即master是个管理者,worker是小弟,master并不实际干活,都分给了worker,其实讲到这里有点类似于本科学的hadoop相关知识

那当然是worker越多越好了,所以你可以查看你电脑处理器是几核的,可以根据核心来配置虚拟机你此时操作系统的核心,我这里是用了4核

也就是说,一个master,4个worker

image-20240117002518157

每一列的意思是:进程所属用户ID列,进程ID,父进程ID(哪个进程产生了子进程)

这个是数据走向图

image-20240117002754469

因为worker是小弟,实际干活的人,所以他的负担最大,最容易出事,当其中一个worker出事停止时,master就会快速创建一个新的worker,保持整个worker小弟们的数量稳定

正常情况下,当nginx时作为服务器对外提供服务时,如果它的配置文件(nginx.conf)发生更改,或者有了新的nginx版本要升级,传统做法是把服务器给关了,但这就会影响到用户的使用,用户正在浏览界面,服务器一停,客户端停止响应,浏览的页面就会卡在那里

而用了mater,worker后,可以实现在不中断与用户连接下,可以重新配置,自动升级,这比直接关了nginx服务要好多了

4.1配置文件更改的情况

比如配置文件(nginx.conf)发生更改,希望配置文件立即起效,这时用下面的命令即可

1
sudo ./nginx -s reload

你会发现所有进程ID发生了变化,这就是说明之前的进程被关掉了,这是用新的配置文件启动的,这样就不停止对外服务还能使用,下面的图片

执行命令前

image-20240117003711279

执行命令后

image-20240117003724250

另外如果你杀掉一个进程(模拟进程异常停止),会发现程序会立马新创建一个

杀掉909进程,如图,新创建一个917进程

image-20240117003911026

4.2nginx关闭

如果把master进程杀了,那所有worker也没了,也就是nginx停止运行

但这太粗暴了,所以关闭nginx一般用命令行

分两种,一个是./nginx -s stop 另一个是./nginx -s quit

前者更粗暴一点,直接把服务器关了,不考虑用户的感受,用户如果正在访问,那就卡了

后者更优雅,站好最后一班岗,也就是继续服务正在连接服务器的用户,但不再接受新的连接了,只有当前用户退出后,才关闭nginx

这是用stop关闭后

image-20240117004452657

这是用quit关闭,worker process is shutting down代表有用户正在访问,当用户不访问时,会发现被关闭

image-20240117004540128

这是多进程,会让我想起来Windows有多线程,多线程是共享内存,一个线程挂了,内存出错,可能影响其他的线程,从而影响整个服务器

而nginx这种多进程不用担心,一个小弟死了,不影响其他的小弟,并且master会有监控机制,发现死了,立马新增一个小弟,保持进程数量一致

本文由作者按照 CC BY 4.0 进行授权