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目录下,应该是下面这种层次结构
这时候可以编译安装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的访问页,代表运行成功
这有端口号的,默认为80,IP地址类似于你想找人的地址,端口号则是他的名字,有了这两个你才能找到你想要找的人,在这里也就是正确的服务器
4.初步了解master和worker
master和worker在我的理解中,即master是个管理者,worker是小弟,master并不实际干活,都分给了worker,其实讲到这里有点类似于本科学的hadoop相关知识
那当然是worker越多越好了,所以你可以查看你电脑处理器是几核的,可以根据核心来配置虚拟机你此时操作系统的核心,我这里是用了4核
也就是说,一个master,4个worker
每一列的意思是:进程所属用户ID列,进程ID,父进程ID(哪个进程产生了子进程)
这个是数据走向图
因为worker是小弟,实际干活的人,所以他的负担最大,最容易出事,当其中一个worker出事停止时,master就会快速创建一个新的worker,保持整个worker小弟们的数量稳定
正常情况下,当nginx时作为服务器对外提供服务时,如果它的配置文件(nginx.conf)发生更改,或者有了新的nginx版本要升级,传统做法是把服务器给关了,但这就会影响到用户的使用,用户正在浏览界面,服务器一停,客户端停止响应,浏览的页面就会卡在那里
而用了mater,worker后,可以实现在不中断与用户连接下,可以重新配置,自动升级,这比直接关了nginx服务要好多了
4.1配置文件更改的情况
比如配置文件(nginx.conf)发生更改,希望配置文件立即起效,这时用下面的命令即可
1
sudo ./nginx -s reload
你会发现所有进程ID发生了变化,这就是说明之前的进程被关掉了,这是用新的配置文件启动的,这样就不停止对外服务还能使用,下面的图片
执行命令前
执行命令后
另外如果你杀掉一个进程(模拟进程异常停止),会发现程序会立马新创建一个
杀掉909进程,如图,新创建一个917进程
4.2nginx关闭
如果把master进程杀了,那所有worker也没了,也就是nginx停止运行
但这太粗暴了,所以关闭nginx一般用命令行
分两种,一个是./nginx -s stop 另一个是./nginx -s quit
前者更粗暴一点,直接把服务器关了,不考虑用户的感受,用户如果正在访问,那就卡了
后者更优雅,站好最后一班岗,也就是继续服务正在连接服务器的用户,但不再接受新的连接了,只有当前用户退出后,才关闭nginx
这是用stop关闭后
这是用quit关闭,worker process is shutting down代表有用户正在访问,当用户不访问时,会发现被关闭
这是多进程,会让我想起来Windows有多线程,多线程是共享内存,一个线程挂了,内存出错,可能影响其他的线程,从而影响整个服务器
而nginx这种多进程不用担心,一个小弟死了,不影响其他的小弟,并且master会有监控机制,发现死了,立马新增一个小弟,保持进程数量一致