nginx工作原理、配置以及web服务器的资源请求过程

  • 1. nginx简介
  • 2. nginx的特性与优点
    • 2.1 nginx的特性
    • 2.2 nginx的优点
    • 2.3 nginx工作原理
    • 2.4 Nginx的模块从功能上分为如下三类:
  • 3. nginx进程架构
  • 4. web服务器请求资源的过程
  • 5. nginx的配置
  • 6. nginx的安装与配置
    • 6.1 nginx主目录下各个目录的作用
    • 6.2 nginx服务命令
    • 6.3 nginx的配置文件详解
    • 6.4 nginx.conf配置详解
    • 6.5 使用nginx服务控制命令重启并指定配置文件路径
  • 7. nginx用于调试,定位问题的配置参数

1. nginx简介

Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由俄罗斯的伊戈尔·赛索耶夫开发的,第一个公开版本0.1.0于2004年10月10日。

源代码以类BSD许可证的形式发布,因其稳定性、丰富的功能集、简单的功能集、简单的配置文件和低级系统的消耗而闻名。2011年6月1日,nginx1.0.4发布

Nginx是一款轻量级的web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like协议下发行。其特点是内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、腾讯、淘宝、京东等。

2. nginx的特性与优点

2.1 nginx的特性

nginx是一个很牛的高性能Web和反向代理服务器,它具有很多非常优越的特性:

  • 在高连接并发的情况下,nginx是Apache服务器不错的替代品,能够支持高达50000个并发连接数的响应
  • 使用epoll and kqueue作为开发模型
  • nginx作为负载均衡服务器:nginx既可在内部直接支持和PHP程序对外进行服务,也可支持作为HTTP代理服务器对外进行服务
  • nginx采用C进行编写,不论系统资源开销还是CPU使用效率都比Perlbal要好很多

2.2 nginx的优点

  • 高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到2-3万并发连接数

  • 内存消耗少:在3万并发连接下,开启的10个nginx进程才消耗150M内存(15M*10=150M)

  • 配置文件非常简单:风格跟程序一样通俗易懂

  • 成本低廉:nginx为开源软件,可以免费使用。而购买F5 BIG-IP、NetScaler等硬件负载均衡交换机则需要十多万至几十万人民币

  • 支持Rewrite重写规则:能够根据域名、URL的不同,将HTTP请求分到不同的后端服务器群组

  • 内置的健康检查功能:如果Nginx Proxy后端的某台Web服务器宕机了,不会影响前端访问

  • 节省带宽:支持GZIP压缩,可以添加浏览器本地缓存的Header头

  • 稳定性高:用于反向代理,宕机的概率微乎其微

  • 模块化设计:模块可以动态编译

  • 外围支持好:文档全,二次开发和模块较多

  • 支持热部署:可以不停机重载配置文件

  • 支持事件驱动、AIO(AsyncIO,异步IO)、mmap(Memory Map,内存映射)等性能优化

2.3 nginx工作原理

Nginx是由内核和模块组成。
Nginx本身做的工作实际很少,当它接受到一个HTTP请求时,它仅仅时通过查找配置文件将此次次请求映射到一个location block,而此location中所配置的各个指令则会启动不同的模块去完成工作,因此模块可以看做Nginx真正的劳动工作者。通常一个location中的指令会涉及一个handler模块和多个filter模块(当然,多个location可以复用同一个模块)。handler模块负责处理请求,完成响应内容的生成,而filter模块对响应内容进行处理。
Nginx的模块从结构上分为核心模块、基础模块和第三方模块

  • 核心模块:HTTP模块、EVENT模块和MAIL模块

  • 基础模块:HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块。

  • 第三方模块:HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块。

2.4 Nginx的模块从功能上分为如下三类:

  • Handlers(处理器模块)。此类模块直接处理请求,并进行输出内容和修改headers信息操作。handlers处理器模块一般只能有一个。

  • Fiters(过滤模块)。此类模块主要对其他处理器模块输出的内容进行修改操作,最后nginx输出。

  • Proxies(代理类模块)。此类模块是nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如FastCGI等进行交互,实现服务代理和负载均衡等功能。

3. nginx进程架构

nginx的进程架构
启动nginx时,会启动一个master进程,这个进程不处理任何客户端的请求,主要用来产生worker线程,一个worker线程用来处理n个request。
而worker线程的线程数可以根据自己的需求来进行配置

[root@localhost conf]# pwd
/usr/local/nginx/conf
[root@localhost conf]# vim nginx.conf
3 worker_processes  1;  //这个地方就是用来设置worker进程个数的
[root@localhost conf]# vim nginx.conf
3 worker_processes  3;[root@localhost conf]# systemctl restart nginx.service
[root@localhost conf]# ps -ef | grep nginx
root     119118      1  0 18:29 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx    119120 119118  0 18:29 ?        00:00:00 nginx: worker process
nginx    119121 119118  0 18:29 ?        00:00:00 nginx: worker process
nginx    119122 119118  0 18:29 ?        00:00:00 nginx: worker process

图解:首先用户通过http/https协议访问nginx的主机,这时nginx会启动一个master进程,这个进程,不处理客户端的请求,而是生成worker线程(这里是一个负载均衡集群),通过worker线程来处理客户端的请求,若用户请求网站服务,worker就会到web server这个服务集群提取对应的资源给客户端,同理,这个Application server可以用来访问应用服务器,Memcached缓存服务器,backup是后端的意思。

4. web服务器请求资源的过程

1.客户端发起请求,然后与服务端建立tcp连接
2.服务器接收请求
3.进行反向代理,然后服务器处理请求
4.查看访问资源的类型(可能是本地的资源,也可能是通过NFS挂载的资源)
5.构建响应报文
6.通过网络接口返回响应报文给客户端
7.服务端将本次的操作记录到日志中

图解:首先客户端要与服务端建立连接(没有连接就无法从服务端获取想要的资源)我们访问的时候都是通过域名去访问服务端的,而域名是可以通过DNS将IP解析成域名去访问的,所以实际上是访问的服务器的IP。
接收客户端请求报文中记录了对某资源的一次请求的过程;服务器对请求报文进行解析,并获取请求的资源及请求方法等相关信息,根据方法,资源,首部和可选的主体部分对请求进行处理;处理完成个之后就去对象存储里去取相应的资源,取到之后构建一个响应报文;然后将客户请求的资源进行封装,并通过网络接口发送响应报文,客户端收到对应的资源之后,web服务器会在日志文件中添加一个条目,来描述已执行的事务。


单进程I/O模型:启动一个进程处理用户请求,而且一次只处理一个,多个请求被串行响应;
多进程I/O模型:并行启动多个进程,每个进程响应一个连接请求;
复用I/O结构:启动一个进程,同时响应N个连接请求
复用的多进程I/O模型:启动x个进程,每个进程响应y个连接请求,同时接收x*y个请求。

5. nginx的配置

nginx的编译分为两种:

  • 静态编译:静态编译就是编译器在编译可执行文件的时候,将可执行文件需要调用的对应动态链接库(so)中的部分提取出来,链接到可执行文件中去,使可执行文件在运行的时候不依赖于动态链接库,所以其优缺点与动态编译的可执行文件正好互补
  • 动态编译:动态编译的可执行文件需要附带一个的动态链接库,在执行时,需要调用其对应动态链接库中的命令。

所以其优点一方面是缩小了执行文件本身的体积,另一方面是加快了编译速度,节省了系统资源。

缺点是:哪怕是很简单的程序,只用到了链接库中的一两条命令,也需要附带一个相对庞大的链接库;二是如果其他计算机上没有安装对应的运行库,则用动态编译的可执行文件就不能运行。

6. nginx的安装与配置

下载nginx的源码包
想要安装不同的版本可以取官网下载:https://nginx.org/en/download.html

[root@localhost ~]# wget http://nginx.org/download/nginx-1.20.1.tar.gz

解决nginx的依赖

[root@localhost ~]# yum -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++ zlib make

解压nginx的tar包

[root@localhost ~]# tar -xzf nginx-1.20.1.tar.gz -C /usr/local

创建系统用户

[root@localhost ~]# useradd -r -M -s /sbin/nologin nginx

创建日志存放目录

[root@localhost ~]# mkdir -p /var/log/nginx
[root@localhost ~]# chown -R nginx.nginx /var/log/nginx

编译安装nginx

[root@localhost nginx-1.20.1]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-debug \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_image_filter_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--http-log-path=/var/log/nginx/access.log \
--error-log-path=/var/log/nginx/error.log[root@localhost nginx-1.20.1]# make && make install

配置nginx环境变量

[root@localhost ~]# echo 'export PATH=/usr/local/nginx/sbin:$PATH' > /etc/profile.d/nginx.sh[root@localhost ~]# source /etc/profile.d/nginx.sh

配置nginx的service文件使用systemctl控制nginx

[root@localhost system]# pwd
/usr/lib/systemd/system[root@localhost system]# cat > nginx.service << EOF
[Unit]
Description=Nginx server daemon
After=network.target [Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecStop=/usr/local/nginx/sbin/nginx -s quit
ExecReload=/bin/kill -HUP \$MAINPID[Install]
WantedBy=multi-user.target
EOF设置开机自启
[root@localhost system]# systemctl daemon-reload
[root@localhost system]# systemctl enable --now nginx

6.1 nginx主目录下各个目录的作用

/usr/local/nginx/         #为服务安装目录,若你安装在/opt目录下则是/opt/nginx,根据你安装的不同目录也不同
/usr/local/nginx/sbin  #为服务主程序目录
/usr/local/nginx/sbin/nginx  #为服务程序文件
/usr/local/nginx/modules/  #为模块目录
/usr/local/nginx/conf/  #为服务的配置文件目录
/usr/local/nginx/html/  # 为服务网页根目录
/usr/local/nginx/conf/nginx.conf  #为服务配置文件
/usr/local/nginx/logs/  #为服务日志文件目录
/usr/local/nginx/logs/nginx.pid  #服务pid文件
/usr/local/nginx/logs/error.log  #服务错误日志文件
/usr/local/nginx/logs/access.log  #服务访问日志文件

6.2 nginx服务命令

/usr/local/nginx/sbin/nginx 启动nginx
/usr/local/nginx/sbin/nginx -v  #查看nginx版本
/usr/local/nginx/sbin/nginx -V  #显示除版本信息意外的其他配置参数信息
/usr/local/nginx/sbin/nginx -t  #检查nginx配置文件是否正确
/usr/local/nginx/sbin/nginx -s reload  #重新加载nginx
/usr/local/nginx/sbin/nginx -s quit #正常关闭nginx,建议使用这种方式关闭nginx,这个是优雅的关闭nginx
/usr/local/nginx/sbin/nginx -s stop  #快速关闭nginx
/usr/local/nginx/sbin/nginx -c //用来指定配置文件的路径

6.3 nginx的配置文件详解

主配置文件默认位置:/usr/local/nginx/conf/nginx.conf //在不指定安装路径的情况下

  • 默认启动nginx时,使用的配置文件是:安装路径/conf/nginx.conf文件
  • 可以在启动nginx时通过-c选项来指定要读取的配置文件

nginx常见的配置文件及其作用

配置文件 作用
nginx.conf nginx的基本配置文件
mime.types MIME类型关联的扩展文件
fastcgi.conf 与fastcgi相关的配置
proxy.conf 与proxy相关的配置
sites.conf 配置nginx提供的网站,包括虚拟主机

6.4 nginx.conf配置详解

nginx.conf的内容分为以下几段:

  • main配置段:全局配置段。其中main配置段中可能包含event配置段
  • event {}:定义event模型工作特性
  • http {}:定义http协议相关的配置

配置指令的语法格式

derective value1 [value2 ...];

支持使用变量:

  • 内置变量:模块会提供内建变量定义
  • 自定义变量:set var_name value

检查nginx配置文件的语法cuowu

[root@localhost conf]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

查看nginx的版本信息

[root@localhost conf]# nginx -v
nginx version: nginx/1.20.1[root@localhost conf]# nginx -V   //-V不仅能看到nginx的版本信息,还能看到编译nginx时编译了那些功能等信息
nginx version: nginx/1.20.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-debug --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_stub_status_module --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log

6.5 使用nginx服务控制命令重启并指定配置文件路径

[root@localhost conf]# pwd
/usr/local/nginx/conf[root@localhost conf]# cp nginx.conf mime.types /opt/
[root@localhost conf]# cd /opt/
[root@localhost opt]# ls
mime.types  nginx.conf  nginx.sh  packages[root@localhost opt]# head -3 nginx.conf #user  nobody;
worker_processes  1;[root@localhost opt]# nginx -s quit ; nginx -c /usr/local/nginx/conf/nginx.conf[root@localhost opt]# head -3 /usr/local/nginx/conf/nginx.conf#user  nobody;
worker_processes  3;[root@localhost opt]# ps -ef | grep nginx
root      42776      1  0 11:00 ?        00:00:00 nginx: master process nginx -c /usr/local/nginx/conf/nginx.conf
nginx     42777  42776  0 11:00 ?        00:00:00 nginx: worker process
nginx     42778  42776  0 11:00 ?        00:00:00 nginx: worker process
nginx     42779  42776  0 11:00 ?        00:00:00 nginx: worker process
root      43003   1358  0 11:00 pts/0    00:00:00 grep --color=auto nginx[root@localhost opt]# nginx -s quit ; nginx -c /opt/nginx.conf
[root@localhost opt]# ps -ef | grep nginx
root      45058      1  0 11:02 ?        00:00:00 nginx: master process nginx -c /opt/nginx.conf
nginx     45059  45058  0 11:02 ?        00:00:00 nginx: worker process
root      45134   1358  0 11:02 pts/0    00:00:00 grep --color=auto nginx

7. nginx用于调试,定位问题的配置参数

是否以守护进程方式运行Nginx
守护进程(daemon)是脱离终端并且在后台运行的进程。它脱离终端是为了避免进程执行过程中的信息在任何终端上显示,这样一来,进程也不会被任何终端所产生的信息所打断。Nginx毫无疑问是一个需要以守护进程方式运行的服务,因此,默认都是以这种方式运行的。

不过Nginx还是提供了关闭守护进程的模式,之所以提供这种模式,是为了方便跟踪调试Nginx,毕竟用gdb调试进程时最烦琐的就是如何继续跟进fork出的子进程了。

daemon {on|off};    //是否以守护进程方式运行nginx,调试时应设置为off
master_process {on|off};    //是否以master/worker模型来运行nginx,调试时可以设置为off
error_log 位置 级别;    //配置错误日志用法:
Syntax: daemon on | off;   //语法
Default: daemon on;        //默认值
Context:    main           //可以配置在那个字段中
[root@localhost conf]# head -4 nginx.conf#user  nobody;
worker_processes  3;
daemon off[root@localhost conf]# systemctl restart nginx.service
// 此时nginx将不会以守护进程的方式运行,会一直占据着前台屏幕

master_process {on|off}; //是否以master/worker模型来运行nginx,调试时可以设置为off

//用法
Syntax: master_process on | off;
Default:  master_process on;
Context:  main// nginx默认是以master/worker模型来运行
[root@localhost opt]# head -4 nginx.conf #user  nobody;
worker_processes  1;
master_process off;//重新读取nginx配置文件
[root@localhost opt]# systemctl stop nginx.service ; nginx -c /opt/nginx.conf
[root@localhost opt]# ps -ef | grep nginx
root      13256      1  0 11:47 ?        00:00:00 nginx -c /opt/nginx.conf
root      13466   1358  0 11:47 pts/0    00:00:00 grep --color=auto nginx

error_log 位置 级别; //配置错误日志

//用法,在不同的字段有不同的含义,比如在main字段写就会对整个nginx产生影响,在http字段写就会对某个网站产生影响Syntax:   error_log file [level];
Default: error_log logs/error.log error;
Context:  main, http, mail, stream, server, location[root@localhost opt]# head -4 nginx.conf #user  nobody;
worker_processes  1;
error_log  logs/error.log;重启nginx服务让配置文件生效
[root@localhost opt]# systemctl stop nginx; nginx -c /opt/nginx.conf[root@localhost opt]# ls /usr/local/nginx/logs/
error.log  nginx.pid[root@localhost opt]# ls /usr/local/nginx/logs/
error.log  nginx.pid
[root@localhost opt]# curl http://192.168.182.131/sx.txt
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>[root@localhost opt]# cat /var/log/nginx/error.log
2021/10/25 17:18:19 [error] 10117#0: *1 open() "/usr/local/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.182.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.182.131", referrer: "http://192.168.182.131/"
2021/10/25 18:29:13 [notice] 119113#0: signal process started
2021/10/25 18:33:46 [notice] 124307#0: signal process started
2021/10/25 19:29:31 [notice] 56895#0: signal process started
2021/10/26 10:53:47 [notice] 35176#0: signal process started
2021/10/26 10:53:47 [notice] 35188#0: signal process started
2021/10/26 10:57:44 [notice] 39890#0: signal process started
2021/10/26 10:57:44 [notice] 39893#0: signal process started

error_log里的位置和级别能有以下可选项:
位置 | 级别
file | 记录到某个文件中
stdree | 记录到标准错误中(不推荐)
syslog:server=address[,parameter=value] | 记录到某台日志服务器中
memory:size | 记录到内存中(不推荐)

日志级别 含义
debug 若要使用debug级别,需要在编译nginx时使用–with-debug选项
info 一般信息
notice 不影响正常功能,需要注意的消息
warn 可能影响系统功能,需要提醒用户的重要事件
error 错误信息(常用的)
cuit 紧急,比较严重的
alert 必须马上处理的
emerg 会导致系统不可用的

正常运行必备的配置参数

user USERNAME [GROUPNAME];    //指定运行worker进程的用户和组
pid /path/to/pid_file;    //指定nginx守护进程的pid文件
worker_rlimit_nofile number;    //设置所有worker进程最大可以打开的文件数,默认为1024
worker_rlimit_core size;    //指明所有worker进程所能够使用的总体的最大核心文件大小,保持默认即可

nginx工作原理、配置以及web服务器的资源请求过程相关推荐

  1. 将NGINX Plus配置为Web服务器

    将NGINX Plus配置为Web服务器 本文介绍了如何将NGINX Plus配置为Web服务器,并包括以下部分: 设置虚拟服务器 配置位置 位置优先 使用变量 返回特定状态码 重写请求中的URI 重 ...

  2. Nginx工作原理及相关介绍

    Nginx工作原理及相关介绍 一.Nginx工作原理与模块介绍 1.Nginx基本工作原理 NGINX以高性能的负载均衡器,缓存,和web服务器闻名.Nginx由内核和模块组成,其中,内核的设计非常微 ...

  3. NGINX工作原理解析

    1 反向代理 1.1 概念 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给intern ...

  4. Nginx工作原理和优化、漏洞(转)

    查看安装了哪些模块命令: [root@RG-PowerCache-X xcache]# nginx/sbin/nginx -V nginx version: nginx/1.2.3 built by  ...

  5. nginx工作原理和实现高并发请求的原因

    一.进程.线程? 进程是具有一定独立功能的,在计算机中已经运行的程序的实体.在早期系统中(如linux 2.4以前),进程是基本运作单位,在支持线程的系统中(如windows,linux2.6)中,线 ...

  6. Nginx工作原理和优化总结。

    NGINX以高性能的负载均衡器,缓存,和web服务器闻名,驱动了全球超过 40% 最繁忙的网站.在大多数场景下,默认的 NGINX 和 Linux 设置可以很好的工作,但要达到最佳性能,有些时候必须做 ...

  7. Nginx系列1: 正向代理和反向代理、Nginx工作原理、Nginx常用命令和升级、搭建Nginx负载均衡

    一.什么是正向代理.什么是反向代理 1. 正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器 ...

  8. linux安装web服务器httpd,Linux_linux构建动态WEB服务器安装篇,基本配置 安装web服务器:httpd-2. - phpStudy...

    linux构建动态WEB服务器安装篇 基本配置 安装web服务器:httpd-2.X.X 先优化吧 根据CPU设置变量 #export CFLAGS="-O2 -march=pentium4 ...

  9. python django mysql安装_Django+Nginx+uWSGI+Mysql搭建Python Web服务器

    原标题:Django+Nginx+uWSGI+Mysql搭建Python Web服务器 安装的时候全部选择英文,记得以前选择中文的时候安装时出了问题,服务器组件一个不选,Ubuntu安装做的很贴心,基 ...

  10. Ubuntu+Django+Nginx+uWSGI+Mysql搭建Python Web服务器

    Ubuntu+Django+Nginx+uWSGI+Mysql搭建Python Web服务器 闲着无聊的时候部署了一个Django项目玩,用vm虚拟机部署的. 准备工作 我使用的系统是Ubuntu16 ...

最新文章

  1. 关于自注意力机制的思考
  2. Linux命令行下关机【Ubuntu】
  3. 再说 Spring AOP
  4. Spring MVC讲解
  5. copyof java_JDK10——copyOf方法
  6. Redis哨兵模式(sentinel)学习总结及部署记录(主从复制、读写分离、主从切换)
  7. ueditor chrome bug
  8. 苹果屏蔽更新_iOS 屏蔽更新的最新方法,完美支持 iOS13 系统
  9. poj 1504 Adding Reversed Numbers
  10. Android手机修改wifi图标,安卓手机怎么改wifi密码?
  11. Matlab图像练习程序:imrotate功能实现
  12. 故障:笔记本电脑部分按键失效
  13. 八大算法实现(Java)
  14. Sketch Learning - SVG 是什么?
  15. 如何制作淘宝主图视频
  16. 记录一次微信卡包模板消息踩坑问题
  17. 在Echarts的barChart中,xAxis的标签如何不重叠显示?
  18. Fiddler Classic
  19. SpringCloud07_消息总线(Bus)
  20. centOS 下yum安装Python3教程

热门文章

  1. 溯源:通过qq电话获取对方位置
  2. 扫描二维码,下载Android安装包
  3. 搭建RoacketChat(v4.5.1)聊天服务。有生之年,我也能使用上自己搭建的聊天服务器
  4. 前端性能优化的几种方案
  5. 中国环境统计年鉴(2000到2018年)
  6. GitHub客户端使用
  7. python制作通讯录
  8. java中的缓存详解,一篇就够了
  9. 机器学习实战 利用sklearn库预测科比生涯数据
  10. Linux安装docker-ce教程 centos依赖包安装