• 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;
  • 相关阅读:
    [Castle]Asp.Net中获取Castle容器中的服务的另一方法
    IBatis.Net如何支持多个数据库
    [Castle]Castle.Model被Castle.Core代替了
    [Castle]Castle也范型
    Since NHibernate 1.2.0, objects are lazy by default
    [django]newforms两种方式示例
    [django]the story about Django and TurboGears
    在docker中运行ElasticSearch时报错:docker: invalid reference format: repository name must be lowercase.
    连接Kibana报错:Kibana server is not ready yet
    Win10系统开启虚拟机屏幕蓝屏自动重启
  • 原文地址:https://www.cnblogs.com/gengsc/p/6866114.html
Copyright © 2020-2023  润新知