nginx 工作原理和配置文件讲解

1、nginx 介绍

Nginx (engine x) 是一个高性能的HTTP反向代理服务,也是一个IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统

资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。

Nginx是一款轻量级Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,

事实上nginx的并发能力确实在同类型的网页服务器中表现较好

2、nginx 的特点

Nginx 做为 HTTP 服务器,有以下几项基本特性:

? 处理静态文件,索引文件以及自动索引;打开文件描述符缓冲.

? 无缓存的反向代理加速,简单的负载均衡和容错.

? FastCGI,简单的负载均衡和容错.

? 模块化的结构。包括 gzipping, byte ranges, chunked responses,以及 SSI-filter 等 filter。如果由 FastCGI 或其它代理服务器处理单页中存在的多个 SSI,

则这项处理可以并行运行,而不需要相互等待。

? 支持 SSL 和 TLSSNI.

3、nginx 工作原理

3.1 nginx架构:

nginx在启动后,在unix系统中会以daemon的方式在后台运行,后台进程包含一个master进程和多个worker进程。

我们也可以手动地关掉后台模式,让nginx在前台运行,并且通过配置让nginx取消master进程,从而可以使nginx以单进程方式运行。

生产环境下我们肯定不会这么做,所以关闭后台模式,一般是用来调试,nginx是以多进程的方式来工作的,当然nginx也是支持多线程的方式的,

只是我们主流的方式还是多进程的方式,也是nginx的默认方式。nginx采用多进程的方式有诸多好处,nginx的进程模型可以由下图来表示:

master与worker

nginx在启动后,会有一个master进程和多个worker进程。master进程主要用来管理worker进程,

包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。

而基本的网络事件,则是放在worker进程中来处理了。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。

一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致。

master与处理请求

那么我们该怎么操作ngnix呢?其实我们只需要通过与master进行通信(命令)就可以操作ngnix,master进程会接收来自外界发来的信号,再根据信号做不同的事情。

比如kill -HUP pid,我们一般用这个信号来重启nginx,或重新加载配置,因为是从容地重启,因此服务是不中断的。首先master进程在接到信号后,会先重新加载配置文件,然后再启动新的worker进程,并向所有老的worker进程发送信号,告诉他们可以退出了。新的worker在启动后,就开始接收新的请求,而老的worker在收到来自master的信号后,就不再接收新的请求,并且在当前进程中的所有未处理完的请求处理完成后,再退出。

当然,直接给master进程发送信号,这是比较老的操作方式,nginx在0.8版本之后,引入了一系列命令行参数,来方便我们管理。

比如,./nginx -s reload,就是来重启nginx,./nginx -s stop,就是来停止nginx的运行。如何做到的呢?我们还是拿reload来说,我们看到,执行命令时,我们是启动一个新的nginx进程,而新的nginx进程在解析到reload参数后,就知道我们的目的是控制nginx来重新加载配置文件了,它会向master进程发送信号,然后接下来的动作,就和我们直接向master进程发送信号一样了。

worker与处理请求

前面有提到,worker进程之间是平等的,每个进程,处理请求的机会也是一样的。当我们提供80端口的http服务时,一个连接请求过来,每个进程都有可能处理这个连接。怎么做到的呢?

首先,每个worker进程都是从master进程fork过来,在master进程里面,先建立好需要listen的socket(listenfd)之后,然后再fork出多个worker进程。所有worker进程的listenfd会在新连接到来时变得可读。为保证只有一个进程处理该连接,所有worker进程在注册listenfd读事件前抢accept_mutex,抢到互斥锁的那个进程注册listenfd读事件,在读事件里调用accept接受该连接。

当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了

nginx进程模型的好处

首先,对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。

其次,采用独立的进程,可以让worker互相之间不会影响,一个worker退出后,其它worker还在工作,服务不会中断,master进程则很快启动新的worker进程。

当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险。

好处是很多的,只能在使用中慢慢体会了。

nginx处理高并发(网络事件)

nginx如何处理高并发呢?按理说nginx采用多worker的方式来处理请求,每个worker里面只有一个主线程,那能够处理的并发数很有限啊,多少个worker就能处理多少个并发,何来高并发呢?

其实这就是nginx的高明之处,nginx采用了异步非阻塞的方式来处理请求,也就是说,nginx是可以同时处理成千上万个请求的。

为什么nginx可以采用异步非阻塞的方式来处理呢,或者异步非阻塞到底是怎么回事呢?一个完整过程:请求过来,要建立连接,然后再接收数据,接收数据后,再发送数据,具体到系统底层,就是读写事件,而当读写事件没有准备好时,必然不可操作,如果不用非阻塞的方式来调用,那就得阻塞调用了,事件没有准备好,那就只能等了,等事件准备好了,你再继续吧。阻塞调用会进入内核等待,cpu就会让出去给别人用了,对单线程的worker来说,显然不合适,当网络事件越多时,大家都在等待呢,cpu空闲下来没人用,cpu利用率自然上不去了,更别谈高并发了。

4、配置文件介绍
[[email protected] nginx]# grep -Ev "^$|#" nginx.conf.default
worker_processes  1;  #work 进程的数量
events {              #事件区块开始
    worker_connections  1024; #每个worker 进程支持的最大连接数
}
http {                        #http 区块开始
    include       mime.types;  #nginx 支持的媒体类型库文件
    default_type  application/octet-stream;  #默认的媒体类型
    sendfile        on; #开启高速传输模式
    keepalive_timeout  65; #连接超时
    server {               #第一个server 区
        listen       80;    #提供服务的端口,默认是80 端口
        server_name  localhost; #提供服务的域名主机名
        location / {
            root   html;   #站点的根目录
            index  index.html index.htm; #默认的首页文件,多个用空格分开
        }
        error_page   500 502 503 504  /50x.html; #出现对应的http 状态码,使用50x.html 回应客户
        location = /50x.html {  #访问50x.html
            root   html; #指定对应的站点目录为html
        }
    }
}

5、配置虚拟主机
5.1 基于多域名配置虚拟主机
[[email protected] html]# cat /etc/nginx/nginx.conf
user root;
error_log /var/log/nginx/error.log;
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  aaa.gd.com;
        location / {
            root   /root/aaa;
            index  index.html index.htm;
       }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    server {
        listen       80;
        server_name  bbb.gd.com;
        location / {
            root   /root/bbb;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

}
[[email protected] html]# /etc/init.d/nginx restart
[[email protected] html]# cat /root/aaa/index.html
aaa
[[email protected] html]# cat /root/bbb/index.html
Bbb

#访问
[[email protected] ~]# curl aaa.gd.com
aaa
[[email protected] ~]# curl bbb.gd.com
bbb

5.2 基于多端口配置虚拟主机
[[email protected] html]# cat /etc/nginx/nginx.conf
user root;
error_log /var/log/nginx/error.log;
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  aaa.gd.com;
        location / {
            root   /root/aaa;
            index  index.html index.htm;
       }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    server {
        listen       81;
        server_name  bbb.gd.com;
        location / {
            root   /root/bbb;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

}
[[email protected] ~]# curl aaa.gd.com
aaa
[[email protected] ~]# curl bbb.gd.com:81
Bbb

6.nginx 状态信息功能实战
[[email protected] html]# cat /etc/nginx/nginx.conf
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  aaa.gd.com;
        location / {
            root   /root/aaa;
            stub_status on; #开启状态信息
            index  index.html index.htm;
       }
[[email protected] ~]# curl aaa.gd.com
Active connections: 1
server accepts handled requests
 6 6 6
Reading: 0 Writing: 1 Waiting: 0
# Active connections: 1 (正处理的活动连接数有1个)
Server 表示nginx 启动到现在共处理了6个连接
Accepts 成功创建了多少次握手
Handled requests 表示总共处理了多少次请求
#这些信息不能给用户看到,可以通过其他测试工具获取

7、配置错误日志
[[email protected] html]# cat /etc/nginx/nginx.conf
user root;
error_log /var/log/nginx/error.log;
[[email protected] ~]# head -n5 /var/log/nginx/error.log
2018/08/26 23:43:45 [error] 2540#0: *1 "/root/aaa/index.html" is forbidden (13: Permission denied), client: 192.168.1.232, server: aaa.gd.com, request: "GET / HTTP/1.1", host: "aaa.gd.com"

# 日志级别warn/error/crit 默认使用error

8、access.log访问日志分析
[[email protected] ~]# cat /var/log/nginx/access.log |head -n2
192.168.1.232 - - [26/Aug/2018:23:43:45 +0800] "GET / HTTP/1.1" 403 169 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
#192.168.1.232 客户端的ip
 403 表示状态码
 169 响应的大小

#可以在日志中加入buffer和flush 参数,提高访问性能

9、访问日志轮询切割
[[email protected] ~]# cat log.sh
#!/bin/bash
DATE=`date +%F`
BASEDIR="/var/log/nginx/"
LOGNAME="access"
cd $BASEDIR
/bin/mv ${LOGNAME}.log ${LOGNAME}_${DATE}.log
/etc/init.d/nginx -s reload
[[email protected] ~]# crontab -l
0 0 * * * /bin/sh /root/log.sh >/dev/null 2>&1

原文地址:https://www.cnblogs.com/derrickrose/p/9538959.html

时间: 2024-08-27 10:11:50

nginx 工作原理和配置文件讲解的相关文章

keepalived 工作原理与配置文件讲解

1.简介 Keepalived:高可用或热备软件,用来防止单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构不可用)的发生,keepalived就是VRRP协议的实现. 2.原理 keepalived采用是模块化设计,不同模块实现不同的功能,keepalived主要有三个模块,分别是core.check和vrrp. core:是keepalived的核心,负责主进程的 启动和维护,全局配置文件的加载解析等 check: 负责healthchecker(健康检查),包括了各种健康检查方式

Nginx工作原理和优化

Nginx工作原理和优化 分类: Linux webserver2013-05-16 11:04 4975人阅读 评论(0) 收藏 举报 目录(?)[+] 1.  Nginx的模块与工作原理 Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个location block(location是Nginx配置中的一个指令,用于URL匹配),而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作. Nginx

Nginx 工作原理

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

Nginx 工作原理和优化、漏洞

1.  Nginx的模块与工作原理 Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个location block(location是Nginx配置中的一个指令,用于URL匹配),而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作. Nginx的模块从结构上分为核心模块.基础模块和第三方模块: 核心模块:HTTP模块.EVENT模块和MAIL模块 基础模块:HTTP Access模块.HTTP F

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

查看安装了哪些模块命令: [[email protected] xcache]# nginx/sbin/nginx -Vnginx version: nginx/1.2.3built by gcc 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC) TLS SNI support enabledconfigure arguments: --prefix=/opt/xcache/nginx --with-ipv6 --with-http_ssl_module --with

Nginx工作原理和优化、漏洞

1.  Nginx的模块与工作原理 第三方模块:HTTP Upstream Request Hash模块.Notice模块和HTTP Access Key模块. 图1-1展示了Nginx模块常规的HTTP请求和响应的过程. Nginx 本身做的工作实际很少,当它接到一个HTTP请求时,它仅仅是通过查找配置文件将此次请求映射到一个location block,而此location中所配置的各个指令则会启动不同的模块去完成工作,因此模块可以看做Nginx真正的劳动工作者.通常一个 location中

nginx 工作原理总结

1.  Nginx的模块与工作原理 Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个location block(location是Nginx配置中的一个指令,用于URL匹配),而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作. Nginx的模块从结构上分为核心模块.基础模块和第三方模块: 核心模块:HTTP模块.EVENT模块和MAIL模块 基础模块:HTTP Access模块.HTTP F

Nginx工作原理

Nginx的模块 Nginx由内核和模块组成. Nginx的模块从结构上分为核心模块.基础模块和第三方模块: 核心模块:HTTP模块.EVENT模块和MAIL模块 基础模块:HTTP Access模块.HTTP FastCGI模块.HTTP Proxy模块和HTTP Rewrite模块, 第三方模块:HTTP Upstream Request Hash模块.Notice模块和HTTP Access Key模块. 用户根据自己的需要开发的模块都属于第三方模块.正是有了这么多模块的支撑,Nginx的

LNMP环境下nginx、php-fpm的配置文件讲解

一.nginx配置文件 user nobody nobody; worker_processes 2; error_log /usr/local/nginx/logs/nginx_error.log crit; pid /usr/local/nginx/logs/nginx.pid; worker_rlimit_nofile 51200; events {     use epoll;     worker_connections 6000; } http {     include mime.