山地人

Nginx基本配置

山地人
山地人
2021-07-24

启动Nginx

安装好nginx后,直接输入nginx就可以启动nginx服务。

nginx

启动终端,使用nginx命令来开启Nginx服务。

发信号

nginx一旦完成启动,之后就需要通过发送信号的方式来控制它。给nginx发送信号的格式如下:

nginx -s signal

其中的signal可以是下面的值:

信号含义
stop快速停止nginx(不等待worker进程完成当前请求直接停止nginx服务)
quit优雅停止nginx(会等待worker进程完成当前请求服务后才停止)
reload重新加载配置文件
reopen重新打开日志文件

stop:Nginx收到stop信号后,不会等待worker进程完成当前请求服务,立即停止nginx服务。

nginx -s stop

quit:Nginx收到quit型号后,不会立即终止nginx服务,而是等待所有worker进程完成当前正在处理的请求服务之后,才停止整个nginx服务。

nginx -s quit

reload:Nginx收到reload信号后,会先检查配置文件的语法是否正确,如果配置文件语法中有错误,Nginx会报告语法错误旧的工作进程继续工作,如果语法正确Nginx会使用新的配置文件创建一组新的Worker进程,等新Worker进程准备就绪后,旧的工作进程会收到关闭命令,旧工作进程不再接收新的请求,直到处理完当前请求,旧工作进程退出。

nginx -s reload

配置文件

Nginx默认的主配置文件是nginx.conf,对于我们的虚拟机,你可以在/etc/nginx/目录中找到这个文件。

指令

Nginx中的所有的模块通过一系列的配置文件来控制。这些配置文件中的内容是由指令构成,在Nginx中指令分为:简单指令和块指令。 简单指令: 是由指令名+指令内容,每条简单指令需要以;结尾。

user nobody;
error_log logs/error.log notice;
worker_processes 1;

是由模块名+一对{}构成,块中可以包含多条简单指令和多个块。 下面的httpserver都是块,serverhttp的子块。

http {
server {
...
}
}

上下文(context)

在上面一节我们已经看到了嵌套的块,对于nginx.conf中的一级指令,或者说最外层的指令被称为顶级指令。也被称为context上下文。下面看看Nginx中有哪些顶级指令

顶级指令说明
event连接处理
httpHTTP流量
mail邮件流量
stream哟经与定义TCP和UDP流量

虚拟服务器(server)

对于上面的这些context上下文,都可以在他们内部包含一个或多个server,这些server就是虚拟服务器。

http {
server {
...
}
server {
...
}
}
stream {
server {
...
}
}

继承

刚才说的context上下文是可以嵌套的,一旦嵌套,子上下文可以获得父上下文中设置过的指令,也可以在子上下文中重新定义此指令来重写之前继承过来的定义。

配置文件分析

下面是一份nginx.conf的默认配置,下面会详细解读这份配置中涉及到的各种指令。

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
...
}
http {
...
}
...

Nginx主进程(master)会以root用户身份启动,之后会读取nginx.conf配置文件,按照配置文件里的情况启动对应数量的工作进程worker process

启动终端,观察Nginx进程状况

运行终端后,你会看到如下的进程信息:

root@41d040d3033b:/home# ps aux | grep nginx
root 69 0.0 0.0 55272 1456 ? Ss 11:10 0:00 nginx: master process nginx
root 71 0.0 0.0 9180 980 pts/0 S+ 11:10 0:00 grep --color=auto nginx
www-data 72 0.0 0.0 55840 2820 ? S 11:10 0:00 nginx: worker process
www-data 73 0.0 0.0 55840 2820 ? S 11:10 0:00 nginx: worker process

第一行的nginx: master process表明这是nginx主进程,第一列是启动的用户,是root用户。 最后两行是nginx:worker process表明两个进程是nginx工作进程,都是以www-data用户身份运行。 工作进程的用户身份是由nginx.conf中定义的user指令决定的。

user指令

指定运行工作进程的用户

语法默认值上下文(Context)
user user [group];user nobody nobody;main
  • 第一个user是表明这是一条user指令。
  • 第二个user是指定使用哪个user,默认值是nobody。
  • 第三个[group]是一个可选参数,是指定用户组,默认值也是nobody。 我们在配置中看到的这一句user www-data;意思就是指定user为www-data

worker_processes 指令

设置工作进程的启动数量

语法默认值上下文(Context)
worker_processes number | auto;worker_processes 1;main
  • worker_processes的参数接受粮种值:auto或者数字。
  • 设置auto值后,nginx会根据cpu的核心数量,启动对应数量的工作进程
  • 如果设置的是数字,nginx会启动number数字所对应数量的工作进程

对应前面的nginx.conf中配置的值,因为我们的沙盒运行的机器是一个双核CPU,所以启动的工作进程 worker process是两个也就好理解了。

worker_processes auto;

pid指令

设置存储nginx主进程pid的文件路径

语法默认值上下文(Context)
pid file;pid logs/nginx.pid;main

nginx.conf中配置的值表明,Nginx主进程的pid存放在/run/nginx.pid文件。

pid /run/nginx.pid;

启动终端,查看/run/nginx.pid文件。

仔细观察,上面沙盒结果中,用ps命令过滤出的nginx: master进程的第二列是进程的pid值,这个值和/run/nginx.pid中写入的值是否一直?

include指令

使用include指定可以导入其他文件中的指令或者块到当前上下文。

语法默认值上下文(Context)
include file | mask;-any
  • file | mask 这条导入指令接收两种参数,分别是指定具体文件路径或匹配指定类型的一系列路径。
  • 使用的Context是any,意味着可以在任何Context上下文中使用这条include指令。

结合nginx.conf中的例子:include /etc/nginx/modules-enabled/*.conf;,这条指令出现在main上下文。意思是将所有/etc/nginx/modules-enabled目录下所有的以.conf结尾的配置都导入进来。

events 块

events块对应的是Nginx中的事件模块的设定,用于处理所有连接的设定。

语法默认值上下文(Context)
events { … }-main

具体的events中的设置会在后续的案例中再详细说明。

http 块

用于定义HTTP服务器的块。

语法默认值上下文(Context)
http { … }-main

具体的http中的设置会在后续的案例中再详细说明。

上面讲到的绝大多数指令和块的说明,可以在下面的官方文档中找到。

参考: Nginx Core functionality 点击前往

小结

有了这些Nginx基本配置的概念后,我们再来讲解具体的每个上下文中的具体指令和块的配置就方便多了。

至此,本篇教程也到了该和你说再见的时候了,我们下期再见。

学完本篇互动教程,如果你觉得体验不错,可以把网页链接发送给你的小伙伴,让他/她也来感受一下。当然,你也可以继续看看网站上其他的的互动教程,希望`idev365`能够给你带来收获。

学习教程的过程中碰到了问题,或者对idev365有什么改进意见和想法,欢迎加入idev365微信内测群,和山地人交流你的想法。