运行中nginx进程间的关系

Posted 叶落之秋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了运行中nginx进程间的关系相关的知识,希望对你有一定的参考价值。

运行中nginx进程间的关系

在正式提供产品的环境下,部署nginx都是使用master进程来管理多个worker进程.

一般情况下,worker进程都与服务器上的核数相等,每一个worker进程都是繁忙的,它们真正的提供互联网服务.

而master进程则很清闲,只负责监控管理worker进程.

worker进程之间通过共享内存,原子操作等一系列进程之间的通讯来实现负载均衡

共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。

部署后nginx进程之间的关系,如下图所示:

那么为什么要按照master-worker方式配置多个进程:有两点

1.master进程可以是唯一的,只专注于管理真正提供服务的worker进程

2.多个worker进程提高了服务的健壮性,还充分利用现有的smp架构(堆成多处理架构),从而实现真正的多核并发处理

那么为什么worker进程设计的与cpu核数一致吶,先要看看apache与nginx有什么不同之处:

apache一个进程处理一个请求,在大并发量的情况下,只能加大进程或者线程数,通常一台服务器几百个进程,大量进程切换带来无谓的系统资源消耗

nginx一个worker进程可处理的请求数只限制在内存的大小,不同的worker进程处理并发请求没有同步锁限制,worker进程不会睡眠,故设置worker进程与cpu核数一致,进程间切换代价是最小的.(即cpu是8核,worker进程设置为8个.)(补充知识:进程与CPU调度的关系,单个核心处理多个进程的时候,是排队处理的,所以将Worker进程数量设置超过核心数是没有太大意义的,会导致进程间切换额外开销)

Nginx配置的通用语法

nginx的配置文件其实是普通的文本文件,例:

user  nobody;
worker_processes  8;
error_log  varlog/nginx/error.log error;
#pid           logs/nginx.pid;
events {
    use epoll;
    worker_connections  50000;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  \'$remote_addr [$time_local] "$request" \'
                      \'$status $bytes_sent "$http_referer" \'
                      \'"$http_user_agent" "$http_x_forwarded_for"\';
    access_log  logs/access.log  main buffer=32k;
    …
}

块配置项

块配置项由一个块配置项名和一对大括号组成。

events {…
}
http {
    upstream backend {
           server 127.0.0.1:8080;
    }
    gzip on;
    server {
           …           location /webstatic {
                        gzip off;
           }
    }
}

块配置项可以嵌套。内层块直接继承外层块,例如,上例中,server块里的任意配置都是基于http块里的已有配置的。

当内外层块中的配置发生冲突时,究竟是以内层块还是外层块的配置为准,取决于解析这个配置项的模块,例如,上例

在http模块中已经打开了“gzip on;”,但其下的location/webstatic又把gzip关闭

了:gzip off;,最终,在/webstatic的处理模块中,gzip模块是按照gzip off来处理请求的。

配置项的语法格式

配置项名
 配置项值
1 配置项值
2 …
 ;

配置项名后面用空格隔开---多项配置项值之间亦用空格隔开

注意:如果配置项值中包括语法符号,比如空格符,那么需要使用单引号或双引号
括住配置项值,否则Nginx会报语法错误。例如:

log_format main \'$remote_addr - $remote_user [$time_local] "$request" \';

配置项的注释

如果有一个配置项暂时需要注释掉,那么可以加“#”注释掉这一行配置。例如:

#pid logs/nginx.pid;

配置项的单位

空间大小表示:

K或者k千字节(KiloByte,KB)。
M或者m兆字节(MegaByte,MB)。
例如:

gzip_buffers 4 8k;
client_max_body_size 64M;

当指定时间时,可以使用的单位包括:
·ms(毫秒),s(秒),m(分钟),h(小时),d(天),w(周,包含7天),
M(月,包含30天),y(年,包含365天)。
例如:

expires 10y;
proxy_read_timeout 600;
client_body_timeout 2m;

 

以上是关于运行中nginx进程间的关系的主要内容,如果未能解决你的问题,请参考以下文章

Nginx进程间的关系

进程间通信

Nginx学习——Nginx进程间的通信

在 Python 多处理进程中运行较慢的 OpenCV 代码片段

进程和线程和协程之间的关系

死磕内存篇 --- JAVA进程和linux内存间的大小关系