nginx 培训文档

什么是 nginx

Nginx 是高性能的 HTTP 和反向代理的服务器,处理高并发能力是十分强大的,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数。

详细介绍

正向代理

需要在客户端配置代理服务器进行指定网站访问
如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访 问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。

反向代理

暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。
反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。

负载均衡

增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡

动静分离

为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。

Nginx 模块

整体采用模块化设计是 Nginx 的一个重大特点,甚至 http 服务器核心功能也是一个模块。旧版本的 Nginx 的模块是静态的,添加和删除模块都要对 Nginx 进行重新编译,1.9.11 以及更新的版本已经支持动态模块加载。

高度模块化的设计是 Nginx 的架构基础。Nginx 服务器被分解为多个模块,每个模块就是一个功能模块,只负责自身的功能,模块之间严格遵循“高内聚,低耦合”的原则。

1、核心模块

  • 核心模块是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录、配置文件解析、事件驱动机制、进程管理等核心功能。

2、标准 HTTP 模块

  • 标准 HTTP 模块提供 HTTP 协议解析相关的功能,如:端口配置、网页编码设置、HTTP 响应头设置等。

3、可选 HTTP 模块

  • 可选 HTTP 模块主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,如:Flash 多媒体传输、解析 GeoIP 请求、SSL 支持等。

4、邮件服务模块

  • 邮件服务模块主要用于支持 Nginx 的邮件服务,包括对 POP3 协议、IMAP 协议和 SMTP 协议的支持。

5、第三方模块

  • 第三方模块是为了扩展 Nginx 服务器应用,完成开发者自定义功能,如:Json 支持、Lua 支持等。
    ————————————————

安装nginx

一,yum安装

访问nginx的官方网站:http://www.nginx.org/

Nginx版本类型

Mainline version: 主线版,即开发版

Stable version: 最新稳定版,生产环境上建议使用的版本

Legacy versions: 遗留的老版本的稳定版

yum配置的官网:http://nginx.org/en/linux_packages.html

配置nginx的yum源

[nginx-stable]

name=nginx stable repo

baseurl=http://nginx.org/packages/centos/releasever/releasever/releasever/basearch/

gpgcheck=1

enabled=1

gpgkey=https://nginx.org/keys/nginx_signing.key

module_hotfixes=true

[root@wenmao ~]# yum -y install nginx

-V查看版本及配置

[root@wenmao ~]# nginx -V

-v查看版本

[root@wenmao ~]# nginx -v

关闭防火墙和selinux

[root@wenmao ~]# getenforce

Enforcing

[root@wenmao ~]# setenforce 0

[root@wenmao ~]# systemctl stop firewalld

[root@wenmao ~]# systemctl disable firewalld

启动并设置开机启动

[root@wenmao ~]# systemctl start nginx

[root@wenmao ~]# systemctl enable nginx

二、编译安装nginx

1、安装编译环境

[root@wenmao ~]# yum -y install gcc gcc-c++

2、安装pcre软件包(使nginx支持http rewrite模块)

[root@wenmao ~]# yum install -y pcre pcre-devel

3、安装openssl-devel(使nginx支持ssl)

[root@wenmao ~]# yum install -y openssl openssl-devel

4、安装zlib

[root@wenmao ~]# yum install -y zlib zlib-devel

5、创建用户nginx

[root@wenmao ~]# useradd nginx

[root@wenmao ~]# passwd nginx

6、安装nginx

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

[root@wenmao ~]# tar xzf nginx-1.16.0.tar.gz -C /usr/local/ ### 可自定义安装路径

[root@wenmao ~]# cd /usr/local/nginx-1.16.0/

[root@wenmao ~]# ./configure --prefix=/usr/local/nginx --group=nginx --user=nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/tmp/nginx/client_body --http-proxy-temp-path=/tmp/nginx/proxy --http-fastcgi-temp-path=/tmp/nginx/fastcgi --pid-path=/var/run/nginx.pid --lock-path=/var/lock/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-pcre --with-http_realip_module --with-stream

[root@wenmao ~]# make && make install

**7、Nginx 编译参数 **

查看 nginx 安装的模块

[root@wenmao ~]# /usr/local/nginx/sbin/nginx -V

模块参数具体功能

–with-cc-opt=‘-g -O2 -fPIE -fstack-protector //设置额外的参数将被添加到CFLAGS变量。(FreeBSD或者ubuntu使用) --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2’ --with-ld-opt=‘-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now’ --prefix=/usr/local/nginx //指向安装目录 --conf-path=/etc/nginx/nginx.conf //指定配置文件 --http-log-path=/var/log/nginx/access.log //指定访问日志 --error-log-path=/var/log/nginx/error.log //指定错误日志 --lock-path=/var/lock/nginx.lock //指定lock文件 --pid-path=/run/nginx.pid //指定pid文件 --http-client-body-temp-path=/var/lib/nginx/body //设定http客户端请求临时文件路径 --http-fastcgi-temp-path=/var/lib/nginx/fastcgi //设定http fastcgi临时文件路径 --http-proxy-temp-path=/var/lib/nginx/proxy //设定http代理临时文件路径 --http-scgi-temp-path=/var/lib/nginx/scgi //设定http scgi临时文件路径 --http-uwsgi-temp-path=/var/lib/nginx/uwsgi //设定http uwsgi临时文件路径 --with-debug //启用debug日志 --with-pcre-jit //编译PCRE包含“just-in-time compilation” --with-ipv6 //启用ipv6支持 --with-http_ssl_module //启用ssl支持 --with-http_stub_status_module //获取nginx自上次启动以来的状态 --with-http_realip_module //允许从请求标头更改客户端的IP地址值,默认为关 --with-http_auth_request_module //实现基于一个子请求的结果的客户端授权。如果该子请求返回的2xx响应代码,所述接入是允许的。如果它返回401或403中,访问被拒绝与相应的错误代码。由子请求返回的任何其他响应代码被认为是一个错误。 --with-http_addition_module //作为一个输出过滤器,支持不完全缓冲,分部分响应请求 --with-http_dav_module //增加PUT,DELETE,MKCOL:创建集合,COPY和MOVE方法 默认关闭,需编译开启 --with-http_geoip_module //使用预编译的MaxMind数据库解析客户端IP地址,得到变量值 --with-http_gunzip_module //它为不支持“gzip”编码方法的客户端解压具有“Content-Encoding: gzip”头的响应。 --with-http_gzip_static_module //在线实时压缩输出数据流 --with-http_image_filter_module //传输JPEG/GIF/PNG 图片的一个过滤器)(默认为不启用。gd库要用到) --with-http_spdy_module //SPDY可以缩短网页的加载时间 --with-http_sub_module //允许用一些其他文本替换nginx响应中的一些文本 --with-http_xslt_module //过滤转换XML请求 --with-mail //启用POP3/IMAP4/SMTP代理模块支持 --with-mail_ssl_module //启用ngx_mail_ssl_module支持启用外部模块支持

**8、修改配置文件/etc/nginx/nginx.conf **

# 全局参数设置

user nginx; #指定用户

worker_processes 4; #设置nginx启动进程的数量,一般设置成与逻辑cpu数量相同

error_log logs/error.log; #指定错误日志

worker_rlimit_nofile 10240; #设置一个nginx进程能打开的最大文件数

pid /var/run/nginx.pid;

events {

worker_connections 1024; #设置一个进程的最大并发连接数

}

# http 服务相关设置

http {

include mime.types;

default_type application/octet-stream;

log_format main 'remote_addr - remote_user [time_local] “request” ’

​ 'status body_bytes_sent “$http_referer” ’

​ ‘“http_user_agent” “http_x_forwarded_for”’;

access_log /var/log/nginx/access.log main; #设置访问日志的位置和格式

sendfile on; #是否调用sendfile函数输出文件,一般设置为on,若nginx是用来进行磁盘IO负载应用时,可以设置为off,降低系统负载

gzip on; #是否开启gzip压缩,将注释去掉开启

keepalive_timeout 65; #设置长连接的超时时间

# 虚拟服务器的相关设置

server {

​ listen 80; #设置监听的端口

​ server_name localhost; #设置绑定的主机名、域名或ip地址

# charset koi8-r; # 设置编码字符

​ charset utf-8;

​ location / {

​ root /var/www/nginx; #设置服务器默认网站的根目录位置,需要手动创建

​ index index.html index.htm; #设置默认打开的文档

​ }

​ error_page 500 502 503 504 /50x.html; #设置错误信息返回页面

​ location = /50x.html {

​ root html; #这里的绝对位置是/usr/local/nginx/html

​ }

}

}

检测nginx配置文件是否正确

[root@wenmao ~]# /usr/local/nginx/sbin/nginx -t

[root@wenmao ~]# mkdir -p /tmp/nginx

[root@wenmao ~]# mkdir /usr/local/nginx/logs

**10、启动nginx服务 **

[root@wenmao ~]# /usr/local/nginx/sbin/nginx

**11、通过 nginx 命令控制 nginx 服务 **

**
**

nginx -c /path/nginx.conf # 以特定目录下的配置文件启动nginx:

nginx -s reload # 修改配置后重新加载生效

nginx -s stop # 快速停止nginx

nginx -t # 测试当前配置文件是否正确

nginx -t -c /path/to/nginx.conf # 测试特定的nginx配置文件是否正确

nginx 搭建高可用集群

1、简介

微服务中,为防止服务提供者宕掉,提供多个服务,nginx 同样,如果只使用一个 nginx ,可能发生单点故障,导致整个微服务不可用 。

2、什么是 nginx 高可用

3、准备工作

  • (1)需要两台 nginx 服务器

  • (2)需要 keepalived

  • (3)需要虚拟 ip

1)需要两台服务器 192.168.1.233 和 192.168.1.234

2)在两台服务器安装 nginx

这里如果不想再去安装一遍 Nginx ,可以直接克隆 CentOs 。

3)在两台服务器安装 keepalived

上面有讲到nginx安装方式,这里就直接从安装keepalived开始。

4、在两台服务器安装 keepalived

4.1)使用 yum 命令进行安装

命令:yum install keepalived –y

4.2)安装之后,在 /etc 里面生成目录 keepalived,有文件 keepalived.conf

5、完成高可用配置(主从配置)

Keepalived + Nginx 配合使用

192.168.1.234主机 Nginx

(1)修改/etc/keepalived/keepalivec.conf 配置文件

! Configuration File for keepalivedglobal_defs { #全局配置router_id 1b01 #路由id号,不能重复
}vrrp_instance VI_1 { #定义一个实例state MASTER #态参数 master/backup 只是说明,具体根据优先级interface ens33 #虚IP地址放置的网卡位置virtual_router_id 51 #同一个集群id一致priority 100 #优先级决定是主还是备    越大越优先advert_int 1 #主备通讯时间间隔authentication {auth_type PASSauth_pass 1111 #认证号,集群中要一致}virtual_ipaddress {192.168.1.236 #使用的虚拟ip,要和网段内ip不冲突}
}

(nginx0002操作)
(2).把nginx0002作为从机器,进行修改配置

! Configuration File for keepalivedglobal_defs { #全局配置router_id lb02 #路由id号,不能重复
}vrrp_instance VI_1 { #定义一个实例state MASTER #态参数 master/backup 只是说明,具体根据优先级interface ens33 #虚IP地址放置的网卡位置virtual_router_id 51 #同一个集群id一致priority 90 #优先级决定是主还是备    越大越优先advert_int 1 #主备通讯时间间隔authentication {auth_type PASSauth_pass 1111 #认证号,集群中要一致}virtual_ipaddress {192.168.1.236 #使用的虚拟ip,要和网段内ip不冲突}
}

(机器均操作)
3.启动服务
systemctl start keepalived'

测试

1.查看主机192.168.1.234并测试是否通
ip addr
ping 192.168.1.236
此时发现Ip里已经多了个ip 192.168.1.236

1)查看从192.168.1.233
ip addr
这里是没有192.168.1.236

2.浏览器访问测试http://192.168.1.236

3.关闭主的keepalived,nginx服务,看效果(模拟服务器宕机)
关闭服务查看
ip addr
可以看到主192.168.1.234上是已经没有 虚拟出来的Ip

4,从上测试
ip addr
此时已经可以看到192.168.1.236自动到了从上

再次在浏览器上访问//http:http://192.168.1.236/ ,主宕机依然可以正常访问

当我们将主服务器上服务启动后,192.168.1.236会自动回到主上,以为我们设置优先级主是:100 从 是90

高可用配置完成

nginx官网配置文件

nginx官网地址 :
https://www.cnginx.com/

nginx官网所有模块及作用
生成是使用该命令配置的。它定义了系统的各个方面,包括nginx可用于连接处理的方法。最后,它会创建一个 .configureMakefile该命令支持以下参数:configure--help
打印帮助消息。
--prefix=path
定义将保存服务器文件的目录。同一目录还将用于 由 (库源的路径除外) 和配置文件中设置的所有相对路径。默认情况下,它设置为目录。configurenginx.conf/usr/local/nginx
--sbin-path=path
设置 nginx 可执行文件的名称。此名称仅在安装过程中使用。默认情况下,该文件名为 。prefix/sbin/nginx
--modules-path=path
定义了将安装nginx动态模块的目录。默认情况下,使用该目录。prefix/modules
--conf-path=path
设置配置文件的名称。如果需要,nginx总是可以通过命令行参数-c文件中指定它来启动不同的配置文件。默认情况下,该文件名为 。nginx.confprefix/conf/nginx.conf
--error-log-path=path
设置主错误、警告和诊断文件的名称。安装后,始终可以使用 error_log 指令在配置文件中更改文件名。默认情况下,该文件名为 。nginx.confprefix/logs/error.log
--pid-path=path
设置将存储主进程的进程 ID 的文件的名称。安装后,始终可以使用 pid 指令在配置文件中更改文件名。默认情况下,该文件名为 。nginx.pidnginx.confprefix/logs/nginx.pid
--lock-path=path
为锁定文件的名称设置前缀。安装后,始终可以使用 lock_file 指令在配置文件中更改该值。默认情况下,该值为 。nginx.confprefix/logs/nginx.lock
--user=name
设置非特权用户的名称,其凭据将由工作进程使用。安装后,始终可以使用 user 指令在配置文件中更改名称。默认用户名为 nobody。nginx.conf
--group=name
设置其凭据将由工作进程使用的组的名称。安装后,始终可以使用 user 指令在配置文件中更改名称。默认情况下,组名设置为非特权用户的名称。nginx.conf
--build=name
设置一个可选的nginx构建名称。
--builddir=path
设置生成目录。
--with-select_module
--without-select_module
启用或禁用构建允许服务器使用该方法的模块。如果平台似乎不支持更合适的方法(如 kqueue、epoll 或 /dev/poll),则会自动构建此模块。select()
--with-poll_module
--without-poll_module
启用或禁用构建允许服务器使用该方法的模块。如果平台似乎不支持更合适的方法(如 kqueue、epoll 或 /dev/poll),则会自动构建此模块。poll()
--with-threads
允许使用线程池。
--with-file-aio
允许在 FreeBSD 和 Linux 上使用异步文件 I/O (AIO)。
--with-http_ssl_module
允许构建将 HTTPS 协议支持添加到 HTTP 服务器的模块。默认情况下不构建此模块。构建和运行此模块需要 OpenSSL 库。
--with-http_v2_module
允许构建一个支持 HTTP/2 的模块。默认情况下不构建此模块。
--with-http_realip_module
允许构建ngx_http_realip_module模块,该模块将客户端地址更改为指定标头字段中发送的地址。默认情况下不构建此模块。
--with-http_addition_module
允许构建在响应之前和之后添加文本的ngx_http_addition_module模块。默认情况下不构建此模块。
--with-http_xslt_module
--with-http_xslt_module=dynamic
支持构建使用一个或多个 XSLT 样式表转换 XML 响应的ngx_http_xslt_module模块。默认情况下不构建此模块。构建和运行此模块需要 libxml2 和 libxslt 库。
--with-http_image_filter_module
--with-http_image_filter_module=dynamic
支持构建ngx_http_image_filter_module模块,用于转换 JPEG、GIF、PNG 和 WebP 格式的图像。默认情况下不构建此模块。
--with-http_geoip_module
--with-http_geoip_module=dynamic
支持构建ngx_http_geoip_module模块,该模块根据客户端 IP 地址和预编译的 MaxMind 数据库创建变量。默认情况下不构建此模块。
--with-http_sub_module
允许构建ngx_http_sub_module模块,该模块通过将一个指定的字符串替换为另一个字符串来修改响应。默认情况下不构建此模块。
--with-http_dav_module
支持构建通过 WebDAV 协议提供文件管理自动化的ngx_http_dav_module模块。默认情况下不构建此模块。
--with-http_flv_module
支持构建ngx_http_flv_module模块,该模块为 Flash 视频 (FLV) 文件提供伪流式服务器端支持。默认情况下不构建此模块。
--with-http_mp4_module
支持构建为 MP4 文件提供伪流式处理服务器端支持的ngx_http_mp4_module模块。默认情况下不构建此模块。
--with-http_gunzip_module
允许构建ngx_http_gunzip_module模块,该模块为不支持“gzip”编码方法的客户端解压缩带有“”的响应。默认情况下不构建此模块。Content-Encoding: gzip
--with-http_gzip_static_module
允许构建ngx_http_gzip_static_module模块,该模块允许发送文件扩展名为“”的预压缩文件,而不是常规文件。默认情况下不构建此模块。.gz
--with-http_auth_request_module
允许构建基于子请求结果实现客户端授权的ngx_http_auth_request_module模块。默认情况下不构建此模块。
--with-http_random_index_module
允许构建ngx_http_random_index_module模块,该模块处理以斜杠字符 ('') 结尾的请求,并在目录中选取一个随机文件作为索引文件。默认情况下不构建此模块。/
--with-http_secure_link_module
支持构建ngx_http_secure_link_module模块。默认情况下不构建此模块。
--with-http_degradation_module
启用构建模块。默认情况下不构建此模块。ngx_http_degradation_module
--with-http_slice_module
允许构建ngx_http_slice_module模块,该模块将请求拆分为子请求,每个子请求返回一定范围的响应。该模块提供了对大型响应的更有效缓存。默认情况下不构建此模块。
--with-http_stub_status_module
允许构建提供对基本状态信息的访问的ngx_http_stub_status_module模块。默认情况下不构建此模块。
--without-http_charset_module
禁止生成ngx_http_charset_module模块,该模块将指定的字符集添加到“Content-Type”响应标头字段,并且可以另外将数据从一个字符集转换为另一个字符集。
--without-http_gzip_module
禁止构建压缩 HTTP 服务器响应的模块。构建和运行此模块需要 zlib 库。
--without-http_ssi_module
禁止构建在传递 SSI 的响应中处理 SSI(服务器端包含)命令的ngx_http_ssi_module模块。
--without-http_userid_module
禁止构建设置适合客户端标识的 cookie 的ngx_http_userid_module模块。
--without-http_access_module
禁止构建允许限制对某些客户端地址的访问的ngx_http_access_module模块。
--without-http_auth_basic_module
禁止构建ngx_http_auth_basic_module模块,该模块允许通过使用“HTTP 基本身份验证”协议验证用户名和密码来限制对资源的访问。
--without-http_mirror_module
禁止构建通过创建后台镜像子请求来实现原始请求镜像的ngx_http_mirror_module模块。
--without-http_autoindex_module
禁止构建处理斜杠字符 ('') 结尾的请求的 ngx_http_autoindex_module 模块,并在ngx_http_index_module模块找不到索引文件时生成目录列表。/
--without-http_geo_module
禁止构建ngx_http_geo_module模块,该模块创建具有基于客户端 IP 地址的值的变量。
--without-http_map_module
禁止构建ngx_http_map_module模块,该模块使用基于其他变量的值创建变量。
--without-http_split_clients_module
禁止构建用于创建用于 A/B 测试变量的ngx_http_split_clients_module模块。
--without-http_referer_module
禁止构建ngx_http_referer_module模块,该模块可以阻止“Referer”标头字段中具有无效值的请求访问站点。
--without-http_rewrite_module
禁止构建允许 HTTP 服务器重定向请求和更改请求 URI 的模块。构建和运行此模块需要 PCRE 库。
--without-http_proxy_module
禁用构建 HTTP 服务器代理模块。
--without-http_fastcgi_module
禁止构建将请求传递到 FastCGI 服务器的ngx_http_fastcgi_module模块。
--without-http_uwsgi_module
禁止构建将请求传递到 uwsgi 服务器的ngx_http_uwsgi_module模块。
--without-http_scgi_module
禁止构建将请求传递到 SCGI 服务器的ngx_http_scgi_module模块。
--without-http_grpc_module
禁止构建将请求传递到 gRPC 服务器的ngx_http_grpc_module模块。
--without-http_memcached_module
禁止构建从 memcached 服务器获取响应的 ngx_http_memcached_module 模块。
--without-http_limit_conn_module
禁止构建限制每个密钥的连接数(例如,来自单个 IP 地址的连接数)的ngx_http_limit_conn_module模块。
--without-http_limit_req_module
禁止构建限制每个键的请求处理速率(例如,来自单个 IP 地址的请求的处理速率)的 ngx_http_limit_req_module 模块。
--without-http_empty_gif_module
禁止构建发出单像素透明 GIF 的模块。
--without-http_browser_module
禁止构建ngx_http_browser_module模块,该模块创建变量的值取决于“用户代理”请求标头字段的值。
--without-http_upstream_hash_module
禁止构建实现哈希负载平衡方法的模块。
--without-http_upstream_ip_hash_module
禁止构建实现ip_hash负载平衡方法的模块。
--without-http_upstream_least_conn_module
禁止构建实现least_conn负载平衡方法的模块。
--without-http_upstream_random_module
禁止构建实现随机负载平衡方法的模块。
--without-http_upstream_keepalive_module
禁止构建提供与上游服务器的连接缓存的模块。
--without-http_upstream_zone_module
禁止构建模块,以便能够在共享内存区域中存储上游组的运行时状态。
--with-http_perl_module
--with-http_perl_module=dynamic
支持构建嵌入式 Perl 模块。默认情况下不构建此模块。
--with-perl_modules_path=path
定义了一个将保留 Perl 模块的目录。
--with-perl=path
设置 Perl 二进制文件的名称。
--http-log-path=path
设置 HTTP 服务器的主请求日志文件的名称。安装后,始终可以使用 access_log 指令在配置文件中更改文件名。默认情况下,该文件名为 。nginx.confprefix/logs/access.log
--http-client-body-temp-path=path
定义用于存储保存客户端请求正文的临时文件的目录。安装后,始终可以使用 client_body_temp_path 指令在配置文件中更改目录。默认情况下,该目录名为 。nginx.confprefix/client_body_temp
--http-proxy-temp-path=path
定义一个目录,用于存储包含从代理服务器接收的数据的临时文件。安装后,始终可以使用 proxy_temp_path 指令在配置文件中更改目录。默认情况下,该目录名为 。nginx.confprefix/proxy_temp
--http-fastcgi-temp-path=path
定义了一个目录,用于存储包含从 FastCGI 服务器接收的数据的临时文件。安装后,始终可以使用 fastcgi_temp_path 指令在配置文件中更改目录。默认情况下,该目录名为 。nginx.confprefix/fastcgi_temp
--http-uwsgi-temp-path=path
定义了一个目录,用于存储包含从 uwsgi 服务器接收的数据的临时文件。安装后,始终可以使用 uwsgi_temp_path 指令在配置文件中更改目录。默认情况下,该目录名为 。nginx.confprefix/uwsgi_temp
--http-scgi-temp-path=path
定义了一个目录,用于存储包含从 SCGI 服务器接收的数据的临时文件。安装后,始终可以使用 scgi_temp_path 指令在配置文件中更改目录。默认情况下,该目录名为 。nginx.confprefix/scgi_temp
--without-http
禁用 HTTP 服务器。
--without-http-cache
禁用 HTTP 缓存。
--with-mail
--with-mail=dynamic
启用 POP3/IMAP4/SMTP 邮件代理服务器。
--with-mail_ssl_module
允许构建一个模块,该模块将 SSL/TLS 协议支持添加到邮件代理服务器。默认情况下不构建此模块。构建和运行此模块需要 OpenSSL 库。
--without-mail_pop3_module
禁用邮件代理服务器中的 POP3 协议。
--without-mail_imap_module
禁用邮件代理服务器中的 IMAP 协议。
--without-mail_smtp_module
禁用邮件代理服务器中的 SMTP 协议。
--with-stream
--with-stream=dynamic
支持为通用 TCP/UDP 代理和负载平衡构建流模块。默认情况下不构建此模块。
--with-stream_ssl_module
允许构建将 SSL/TLS 协议支持添加到流模块的模块。默认情况下不构建此模块。构建和运行此模块需要 OpenSSL 库。
--with-stream_realip_module
允许构建ngx_stream_realip_module模块,该模块将客户端地址更改为 PROXY 协议标头中发送的地址。默认情况下不构建此模块。
--with-stream_geoip_module
--with-stream_geoip_module=dynamic
支持构建ngx_stream_geoip_module模块,该模块根据客户端IP地址和预编译的MaxMind数据库创建变量。默认情况下不构建此模块。
--with-stream_ssl_preread_module
允许构建ngx_stream_ssl_preread_module模块,该模块允许在不终止 SSL/TLS 的情况下从 ClientHello 消息中提取信息。默认情况下不构建此模块。
--without-stream_limit_conn_module
禁止构建限制每个密钥的连接数(例如,来自单个 IP 地址的连接数)的ngx_stream_limit_conn_module模块。
--without-stream_access_module
禁止构建允许限制对某些客户端地址的访问的ngx_stream_access_module模块。
--without-stream_geo_module
禁止构建ngx_stream_geo_module模块,该模块创建具有基于客户端 IP 地址的值的变量。
--without-stream_map_module
禁止构建ngx_stream_map_module模块,该模块使用基于其他变量的值创建变量。
--without-stream_split_clients_module
禁止构建用于创建用于 A/B 测试变量的ngx_stream_split_clients_module模块。
--without-stream_return_module
禁止生成ngx_stream_return_module模块,该模块将某些指定的值发送到客户端,然后关闭连接。
--without-stream_set_module
禁止生成为变量设置值的ngx_stream_set_module模块。
--without-stream_upstream_hash_module
禁止构建实现哈希负载平衡方法的模块。
--without-stream_upstream_least_conn_module
禁止构建实现least_conn负载平衡方法的模块。
--without-stream_upstream_random_module
禁止构建实现随机负载平衡方法的模块。
--without-stream_upstream_zone_module
禁止构建模块,以便能够在共享内存区域中存储上游组的运行时状态。
--with-google_perftools_module
支持构建ngx_google_perftools_module模块,该模块可以使用Google Performance Tools分析nginx工作进程。该模块适用于nginx开发人员,默认情况下不是构建的。
--with-cpp_test_module
启用构建模块。ngx_cpp_test_module
--add-module=path
启用外部模块。
--add-dynamic-module=path
启用外部动态模块。
--with-compat
实现动态模块兼容性。
--with-cc=path
设置 C 编译器的名称。
--with-cpp=path
设置 C 预处理器的名称。
--with-cc-opt=parameters
设置将添加到 CFLAGS 变量的其他参数。在 FreeBSD 下使用系统 PCRE 库时,应指定。如果需要增加 支持的文件数,也可以在此处指定,如下所示:。--with-cc-opt="-I /usr/local/include"select()--with-cc-opt="-D FD_SETSIZE=2048"
--with-ld-opt=parameters
设置将在链接期间使用的其他参数。在 FreeBSD 下使用系统 PCRE 库时,应指定。--with-ld-opt="-L /usr/local/lib"
--with-cpu-opt=cpu
启用按指定 CPU 进行构建:、、、。pentiumpentiumpropentium3pentium4athlonopteronsparc32sparc64ppc64
--without-pcre
禁用 PCRE 库的使用。
--with-pcre
强制使用 PCRE 库。
--with-pcre=path
设置 PCRE 库源的路径。需要从 PCRE 站点下载库分发并提取。其余的由nginx和完成。位置指令中的正则表达式支持和ngx_http_rewrite_module模块需要该库。./configuremake
--with-pcre-opt=parameters
为 PCRE 设置其他构建选项。
--with-pcre-jit
构建具有“实时编译”支持的 PCRE 库(1.1.12,pcre_jit指令)。
--without-pcre2
禁止使用 PCRE2 库而不是原始 PCRE 库 (1.21.5)。
--with-zlib=path
设置 zlib 库源的路径。库发行版(版本1.1.3 — 1.2.11)需要从zlib站点下载并提取。其余的由nginx和完成。ngx_http_gzip_module模块需要该库。./configuremake
--with-zlib-opt=parameters
为 zlib 设置其他构建选项。
--with-zlib-asm=cpu
允许使用针对指定 CPU 之一优化的 zlib 汇编器源:、 。pentiumpentiumpro
--with-libatomic
强制libatomic_ops库使用。
--with-libatomic=path
设置libatomic_ops库源的路径。
--with-openssl=path
设置 OpenSSL 库源的路径。
--with-openssl-opt=parameters
为 OpenSSL 设置其他构建选项。
--with-debug
启用调试日志。
参数用法示例(所有这些都需要在一行中键入):./configure--sbin-path=/usr/local/nginx/nginx--conf-path=/usr/local/nginx/nginx.conf--pid-path=/usr/local/nginx/nginx.pid--with-http_ssl_module--with-pcre=../pcre2-10.39--with-zlib=../zlib-1.2.11
配置完成后,使用 编译并安装 nginx。make

核心功能

示例配置
指令accept_mutexaccept_mutex_delay守护进程debug_connectiondebug_pointsenverror_log事件包括load_modulelock_filemaster_processmulti_acceptpcre_jitpidssl_enginethread_pooltimer_resolution使用用户worker_aio_requestsworker_connectionsworker_cpu_affinityworker_priorityworker_processesworker_rlimit_coreworker_rlimit_nofileworker_shutdown_timeoutworking_directory

示例配置

用户 www www;
worker_processes 2;error_log /var/log/nginx-error.log 信息;事件{使用 kqueue;worker_connections 2048;
}...
指令
句法:  accept_mutex on | off;
默认:
接受互斥关闭;
语境:  events
如果accept_mutex启用,工作进程将依次接受新连接。否则,将通知所有工作进程有关新连接的信息,如果新连接量较低,则某些工作进程可能只是浪费系统资源。无需accept_mutex 在支持 EPOLLEXCLUSIVE标志 (1.11.3) 的系统上或在使用reuseport时启用。
在 1.11.3 版本之前,默认值为on.
句法:  accept_mutex_delay time;
默认:
接受互斥延迟 500 毫秒;
语境:  events
如果启用了accept_mutex,则指定如果另一个工作进程当前正在接受新连接,则工作进程将尝试重新启动接受新连接的最长时间。句法: daemon on | off;
默认:
守护进程开启;
语境:  main
确定 nginx 是否应该成为守护进程。主要在开发过程中使用。句法:   debug_connection address | CIDR | unix:;
默认:  —
语境:  events
为选定的客户端连接启用调试日志。其他连接将使用 error_log指令设置的日志记录级别。调试的连接由 IPv4 或 IPv6(1.3.0、1.2.1)地址或网络指定。也可以使用主机名指定连接。对于使用 UNIX 域套接字(1.3.0、1.2.1)的连接,调试日志由“ unix:”参数启用。事件{调试连接 127.0.0.1;调试连接本地主机;调试连接 192.0.2.0/24;调试连接 ::1;调试连接 2001:0db8::/32;调试连接 unix:;...
}
要使该指令起作用,需要使用 构建 nginx --with-debug,请参阅“调试日志”。
句法:  debug_points abort | stop;
默认:  —
语境:  main
该指令用于调试。当检测到内部错误时,例如重新启动工作进程时的套接字泄漏,启用debug_points 会导致创建核心文件 ( abort) 或停止进程 ( stop) 以使用系统调试器进行进一步分析。句法:    env variable[=value];
默认:
环境 TZ;
语境:  main
默认情况下,nginx 会移除所有继承自其父进程的环境变量,除了 TZ 变量。该指令允许保留一些继承的变量、更改它们的值或创建新的环境变量。那么这些变量是:在可执行文件 的实时升级 期间继承;
由 ngx_http_perl_module模块使用;
工作进程使用。应该记住,以这种方式控制系统库并不总是可能的,因为库通常只在初始化期间检查变量,远在使用该指令设置它们之前。一个例外是上面提到 的可执行文件的实时升级 。
TZ 变量总是被继承并可供 ngx_http_perl_module 模块使用,除非它被显式配置。使用示例:```perl
环境 MALLOC_OPTIONS;
环境 PERL5LIB=/数据/站点/模块;
环境 OPENSSL_ALLOW_PROXY_CERTS=1;
NGINX 环境变量由 nginx 内部使用,不应由用户直接设置。
句法:  error_log file [level];
默认:
error_log 日志/error.log 错误;
语境:  main, http, mail, stream, server, location
配置日志记录。可以在同一级别 (1.5.2) 上指定多个日志。如果在main配置级别上未明确定义将日志写入文件,则将使用默认文件。第一个参数定义file将存储日志的。特殊值stderr选择标准错误文件。可以通过指定“ ”前缀来配置日志记录到syslog 。 可以通过指定“ ”前缀和 buffer来配置syslog:记录到 循环内存缓冲区,通常用于调试(1.7.11)。 memory:size第二个参数确定level日志记录的类型,可以是以下之一: debug, info, notice, warn, error, crit, alert, 或emerg。上面的日志级别按严重性增加的顺序列出。设置某个日志级别将导致记录指定和更严重日志级别的所有消息。例如,默认级别error将导致记录error、crit、 alert和emerg消息。如果省略此参数,则error使用。要使debug日志记录工作,需要使用 构建 nginx --with-debug,请参阅“调试日志”。
该指令可以在 stream版本 1.7.11 开始的级别上指定,也可以在mail版本 1.9.0 开始的级别上指定。
句法:  events { ... }
默认:  —
语境:  main
提供配置文件上下文,其中指定了影响连接处理的指令。句法:  include file | mask;
默认:  —
语境:  any
在配置中包含另一个file或与指定 匹配的文件mask。包含的文件应该由语法正确的指令和块组成。使用示例:包括 mime.types;
包括虚拟主机/*.conf;
句法:  load_module file;
默认:  —
语境:  main
该指令出现在 1.9.11 版本中。加载一个动态模块。例子:load_module 模块/ngx_mail_module.so;
句法:  lock_file file;
默认:
lock_file 日志/nginx.lock;
语境:  main
nginx 使用锁定机制来实现accept_mutex 并序列化对共享内存的访问。在大多数系统上,锁是使用原子操作实现的,并且该指令被忽略。在其他系统上使用“锁定文件”机制。该指令指定锁定文件名称的前缀。句法:  master_process on | off;
默认:
master_process 开启;
语境:  main
确定是否启动工作进程。该指令适用于 nginx 开发人员。句法: multi_accept on | off;
默认:
多接受关闭;
语境:  events
如果multi_accept禁用,工作进程将一次接受一个新连接。否则,工作进程将一次接受所有新连接。如果使用kqueue连接处理方法, 则忽略该指令 ,因为它报告等待接受的新连接数。
句法:  pcre_jit on | off;
默认:
pcre_jit 关闭;
语境:  main
该指令出现在版本 1.1.12 中。为配置解析时已知的正则表达式启用或禁用“即时编译”(PCRE JIT)。PCRE JIT 可以显着加快正则表达式的处理速度。从 8.20 版开始,使用--enable-jit配置参数构建的 PCRE 库中提供了 JIT。使用 nginx ( --with-pcre=) 构建 PCRE 库时,通过 --with-pcre-jit配置参数启用 JIT 支持。
句法:  pid file;
默认:
pid 日志/nginx.pid;
语境:  main
定义一个file将存储主进程的进程 ID。句法: ssl_engine device;
默认:  —
语境:  main
定义硬件 SSL 加速器的名称。句法:  thread_pool name threads=number [max_queue=number];
默认:
thread_pool 默认线程=32 max_queue=65536;
语境:  main
该指令出现在版本 1.7.11 中。定义用于多线程读取和发送文件 而不阻塞 工作进程的命名线程池。该threads参数定义池中的线程数。如果池中的所有线程都忙,则新任务将在队列中等待。该max_queue参数限制允许在队列中等待的任务数。默认情况下,队列中最多可以等待 65536 个任务。当队列溢出时,任务完成并出现错误。句法:   timer_resolution interval;
默认:  —
语境:  main
减少工作进程中的计时器分辨率,从而减少gettimeofday()系统调用的数量。默认情况下,gettimeofday()每次收到内核事件时调用。随着分辨率的降低,gettimeofday()每个指定的 仅调用一次interval。例子:timer_resolution 100ms;
间隔的内部实现取决于使用的方法:如果使用了EVFILT_TIMER过滤器kqueue;
timer_create()如果eventport使用;
setitimer()否则。
句法:  use method;
默认:  —
语境:  events
指定要使用的连接处理 method。通常不需要显式指定它,因为默认情况下 nginx 将使用最有效的方法。句法:  user user [group];
默认:
用户没有人;
语境:  main
工作进程使用的 定义user和凭据。group如果group省略,user则使用名称与 of 相同的组。句法:   worker_aio_requests number;
默认:
worker_aio_requests 32;
语境:  events
该指令出现在版本 1.1.4 和 1.0.7 中。使用epoll 连接处理方式的aio 时,设置单个worker进程的最大未完成异步I/O操作。 number句法:    worker_connections number;
默认:
工人连接 512;
语境:  events
设置工作进程可以同时打开的最大连接数。应该记住,这个数字包括所有连接(例如与代理服务器的连接等),而不仅仅是与客户端的连接。另一个考虑是实际同时连接数不能超过当前最大打开文件数限制,可以通过 worker_rlimit_nofile更改。句法:    worker_cpu_affinity cpumask ...;
worker_cpu_affinity auto [cpumask];
默认:  —
语境:  main
将工作进程绑定到 CPU 集。每个 CPU 集由允许的 CPU 的位掩码表示。应该为每个工作进程定义一个单独的集合。默认情况下,工作进程不绑定到任何特定的 CPU。例如,worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
将每个工作进程绑定到一个单独的 CPU,而worker_processes 2;
worker_cpu_affinity 0101 1010;
将第一个工作进程绑定到 CPU0/CPU2,将第二个工作进程绑定到 CPU1/CPU3。第二个例子适用于超线程。特殊值auto(1.9.10) 允许将工作进程自动绑定到可用 CPU:worker_processes 自动;
worker_cpu_affinity 自动;
可选的 mask 参数可用于限制可用于自动绑定的 CPU:worker_cpu_affinity 自动 01010101;
该指令仅在 FreeBSD 和 Linux 上可用。
句法:  worker_priority number;
默认:
worker_priority 0;
语境:  main
定义工作进程的调度优先级,就像通过nice命令完成的那样:负数 number 表示更高的优先级。允许的范围通常在 -20 到 20 之间变化。例子:worker_priority -10;
句法:  worker_processes number | auto;
默认:
worker_processes 1;
语境:  main
定义工作进程的数量。最佳值取决于许多因素,包括(但不限于)CPU 内核数量、存储数据的硬盘驱动器数量和负载模式。如果有疑问,将其设置为可用 CPU 内核的数量将是一个好的开始(值“ auto”将尝试自动检测它)。auto从版本 1.3.8 和 1.2.5 开始支持 该参数。
句法:  worker_rlimit_core size;
默认:  —
语境:  main
RLIMIT_CORE更改工作进程 的核心文件 ( ) 的最大大小限制。用于在不重新启动主进程的情况下增加限制。句法:  worker_rlimit_nofile number;
默认:  —
语境:  main
RLIMIT_NOFILE更改工作进程 的最大打开文件数 ( ) 限制。用于在不重新启动主进程的情况下增加限制。句法:  worker_shutdown_timeout time;
默认:  —
语境:  main
该指令出现在版本 1.11.11 中。为正常关闭工作进程配置超时。当time过期时,nginx 会尝试关闭所有当前打开的连接,以方便关闭。句法:   working_directory directory;
默认:  —
语境:  main
定义工作进程的当前工作目录。它主要用于编写核心文件时,在这种情况下,工作进程应该对指定目录具有写权限。

公司nginx配置简化版

#进程数设置
worker_processes  4;
#为进程数分配cpu内核
worker_cpu_affinity 0001 0010 0100 1000;#打开文件数限制
worker_rlimit_nofile 65535;
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;#pid        logs/nginx.pid;events {#nginx最大连接数限制worker_connections  65536;
}http {include       mime.types;default_type  application/octet-stream;log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';log_format log_json '{"@timestamp":"$time_iso8601",''"time":"$time_iso8601",''"ip":"$remote_addr",''"method":"$request_method",''"url":"$request_uri",''"status":$status,''"bytes":$body_bytes_sent,''"ua":"$http_user_agent",''"ref":"$http_referer",''"forward":"$http_x_forwarded_for",''"up_addr":"$upstream_addr",''"host":"$host",''"resp_time":"$upstream_response_time",''"req_time":"$request_time"''}';access_log  logs/access.log  log_json;#隐藏nginx版本信息server_tokens off;#高效传输文件模式sendfile        on;#tcp_nopush     on;#打开文件执行缓存open_file_cache max=65535 inactive=10m;
#缓存文件最少使用次数open_file_cache_min_uses 5;
#检查缓存有效信息间隔时间open_file_cache_valid 5m;add_header X-Frame-Options SAMEORIGIN;#keepalive_timeout  0;keepalive_timeout  65;proxy_connect_timeout 5;proxy_read_timeout 1800;proxy_send_timeout 5;proxy_buffer_size 16k;proxy_buffers 4 64k;proxy_busy_buffers_size 128k;proxy_temp_file_write_size 128k;proxy_headers_hash_max_size 51200;    proxy_headers_hash_bucket_size 6400;
#客户端头部文件缓冲区大小client_header_buffer_size 4k;client_body_buffer_size 4K;client_max_body_size 500M;#gzip  on;gzip  on;gzip_min_length 1k;gzip_buffers 4 16k;gzip_http_version 1.1;gzip_comp_level 2;gzip_types  text/plain application/x-javascript text/css application/xml application/javascript;gzip_vary on;upstream www.runtianxia.net { server 127.0.0.1:8080; }}upstream busi.runtianxia.net { ip_hash;server 192.168.1.20;server 192.168.1.10; }####################### server  ############################################
###维护页面######禁止ip形式访问####server {listen 80 default;server_name _;return 403;}
############################ http #################server {listen       80;server_name  www.aa.com;location / {proxy_pass   http://www.aa.com;proxy_set_header X-Forwarded-For $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}rewrite ^(.*)$  https://$host$1 permanent;}
################# https #########################server {listen       443;server_name  www.aa.com;ssl on;ssl_certificate   /data/nginx/ssl/public.pem;ssl_certificate_key  /data/nginx/ssl/private.key;ssl_session_timeout 5m;ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_prefer_server_ciphers on;access_log  logs/www.aa.com.log  log_json;proxy_set_header X-Forwarded-For $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;location / {add_header Access-Control-Allow-Origin *;proxy_pass   http://www.aa.com;}}}

nginx常用知识

Nginx 中 reload 流程的真相

今天这篇文章主要来介绍下 Nginx 的 reload 流程。实际上在之前文章中,在更改了 nginx 配置文件时,我们都会执行 nginx -s reload 命令,我们执行这条命令的原因是希望 nginx 不停止服务始终在处理新的请求的同时把 nginx 的配置文件平滑的把旧的 nginx.conf 配置更新为新的 nginx.conf 配置。

这样一个功能对于 nginx 非常有必要,但是有时候我们会发现在执行 nginx -s reload 命令后,worker 子进程的数量会变多了,这是因为老的配置运行的 worker 进程长时间没有退出,当使用 stream 做四层反向代理的时候,可能这种场景会更多。

那么下面我们通过分析 nginx 的 reload 流程,来探究下 nginx 到底做了些什么?所谓优雅的退出和立即退出有什么区别?

reload 流程

第一步在修改好 nginx 的配置文件 nginx.conf 后,向 master 进程发送 HUP 信号,这实际上和我们在命令行执行 nginx -s reload 命令效果是一样的。

那么 master 进程在收到 HUP 信号以后,会在第二步检查我们的配置文件语法是否正确,也就是说我们并不一定非要在 nginx -s reload 前执行 nginx -t 检验下语法是否正确,因为在第二步 nginx 的 master 进程一定会执行这个步骤。

在 nginx 的配置语法全部正确以后,master 进程会打开新的监听端口,为什么要在 master 进程中打开新的监听端口?因为我们可能在 nginx.conf 中会引入新的例如 443 或者之前我们没有打开的的监听端口,而所有 worker 进程是 master 进程 的子进程,子进程会继承父进程所有已经打开的端口,这是 linux 操作系统定义的,所以第三步,我们 master 进程打开了可能引入的新的监听端口。

接下来 mster 进程会用新的 nginx.conf 配置文件来启动新的 worker 子进程,那么老的 worker 子进程会怎么样呢?

我们会在第五步在启动新的 worker 子进程以后,由 master 进程再向老 worker 子进程发送 QUIT 信号,QUIT 信号和 TERM,INT 信号是不一样的,QUIT 信号是请优雅地关闭子进程,这时候需要关注顺序,因为 nginx 需要保证平滑,所以要先启动新的 worker 子进程,再向老的 worker 子进程发送 QUIT 信号。

那么老的 master 子进程收到 QUIT 信号后,首先关闭监听句柄,也就是说这个时候新的连接只会到新的 worker 子进程,所以虽然他们之间有时间差,但是时间是非常快速的,那么关闭监听句柄后,处理完当前连接后就结束进程。

下面看 reload 不停机载入新配置的图示。

reload 不停机载入新配置

master 进程上原先有四个绿色的 worker 子进程,它们使用了老的配置,当我们更改了 nginx.conf 配置文件后,向 master 发送 SIGHUP 信号或者执行 reload 命令, 然后 master 会用新的配置文件启动四个新的黄色 worker 子进程,此时是四个老的绿色 worker 子进程和四个新的黄色的 worker 子进程是并存的。那么老的 worker 子进程在正常的情况下会在处理已经建立好的连接上的请求之后关闭这个连接,哪怕这个连接是 keeplive 请求也会正常关闭。

但是异常情况,如果有一些请求出现问题,客户端长时间无法处理,那么就会导致这个请求长时间停留在这个 worker 子进程当中,那么这个 worker 子进程会长时间存在,因为新的连接已经跑在黄色的 worker 子进程中,所以影响并不会很大,唯一会影响的就是绿色的 worker 子进程会长时间存在,但也只影响已存在的连接,不会影响新的连接。

我们有什么办法处理呢?在新版本中提供了一个新的配置 workershutdowntimeout,也就是说最长等待多长时间,这样 master 进程启动新的黄色 worker 进程之后,如果老的 worker 进程一直没有退出,时间到了之后会强制把老的 worker 进程退出掉。

Nginx的workder进程数为什么要设置成和CPU核数一致

Nginx的workder进程数为什么要设置成和CPU核数一致
答:1)Ngnix一般只做高并发代理,基本没用IO操作,算是CPU密集操作,所以再处理时基本是瞬时完成的,很少出现IO阻塞。

2)进程与CPU调度的关系,单个核心处理多个进程的时候,是排队处理的,所以将Worker进程数量设置超过核心数是没有太大意义的。

核心思想:

每个worker进程都是单线程的进程,多workder进程可以充分利用多核系统架构,但若workder进程的数量多于CPU内核数,那么会增大进程间切换带来的消耗(linux是抢占式内核),一般情况下,用户要配置与CPU内核数相等的workder进程,并且使用下面的workder_cpu_affinity配置来绑定CPU内核,为什么要绑定workder进程到指定的CPU内核呢?假定每一个workder进程都是非常繁忙的,如果多个workder进程都在抢同一个CPU,那么这就会出现同步问题,反之,如果每一个worder进程都独享一个CPU,就在内核的调度策略上实现了完全的并发,例如,如果有四颗CPU内核,就可以进行如下配置:

worker_processes 4;

worker_cpu_affinity 1000 0100 0010 0001;

备注:worker_cpu_affinity配置仅对linux操作系统有效,linux操作系统使用sched_setaffinit()系统调用实现这个功能。
————————————————

nginx的进程模型解析

nginx采用单主进程,多子进程(nginx.conf worker_processes 默认为1)的模型,master管理worker,master接收外部请求或指令,分配给worker去执行,worker关闭时,会等待当前客户连接释放后,才会关闭,多进程虽然会带来额外的内存开销,采用多进程而不采用多线程的原因:

进程之间相互独立,互不影响,某一个worker出问题不会影响其他worker
不需要开发人员去额外关注线程安全性

————————————————

nginx处理Web请求机制解析

Worker抢占机制
master进程fork了多个worker进程,worker进程如何和client连接呢?
多个worker抢一个client的时候,会有一个互斥锁(accept_mutex)和client是对应的

传统服务器事件处理


同步阻塞

nginx事件处理

nginx异步非阻塞,worker use epoll,linux的epoll模型,可以并发6万~8万的网络请求,和cpu相关,cpu越多,内存越大,甚至可以处理几十到几百万的并发,甚至可以到几亿的并发
worker默认并发数是1024,可以自己修改(nginx.conf文件中)

events {# 默认使用epolluse epoll;# 每个worker允许连接客户端的最大连接数worker_connections   1024;
}

————————————————

nginx 培训文档相关推荐

  1. 20165234 [第二届构建之法论坛] 预培训文档(Java版) 学习总结

    [第二届构建之法论坛] 预培训文档(Java版) 学习总结 我通读并学习了此文档,并且动手实践了一遍.以下是我学习过程的记录~ Part1.配置环境 配置JDK 原文中提到了2个容易被混淆的概念 JD ...

  2. [第二届构建之法论坛] 预培训文档(C++版)

    本博客是第二届构建之法论坛暨软件工程培训活动预培训文档中[适用于结对编程部分的C++版本],需要实验者有一部分C++基础. 目录 Part0.背景 Part1.配置环境 Part2.克隆项目 Part ...

  3. 计算机装配调试员培训内容.doc,电子计算机装配调试员理论培训文档.doc

    电子计算机装配调试员理论培训文档 一.综合题 计算机的系统资源划分为哪几类?包括哪些具体内容? 答:计算机系统资源分为硬件资源和软件资源两大类, 硬件资源包括运算器.控制器.存储器和输入设备.输出设备 ...

  4. 花998购买的拍摄技巧和7天起号培训文档,学了一周的总结。

    花998购买的拍摄技巧和7天起号培训文档,学了一周的总结. 为了更加专业的给大家讲讲短视频和自媒体,花了998买了一套培训教材,然后花了一周的时间细细的学习了一下. 学完后,对于拍摄和运营都有了进步, ...

  5. IDS(Informix Dynamic Server)的培训文档[转贴]

    IDS的培训文档!对IDS系统体系结果讲的简洁明了,挺好! -------------------------------------------------------------- 第一章 Inf ...

  6. Minitab软件下载与培训文档

    最近使用六西格玛对毛刺长度进行正太分布分析计算.发现minitab这个软件挺好用,我就写个文章记录一下方便自己以后查找. 1. 下载 软件:http://download.csdn.net/detai ...

  7. 经典的ORACLE培训文档

    经典的ORACLE培训文档1 数据库的安全性.完整性.并发控制和恢复 为了保证数据库数据的安全可靠性和正确有效,DBMS必须提供统一的数据保护功能.数据保护也为数据控制,主要包括数据库的安全性.完整性 ...

  8. linux下单Nginx部署文档

    Linux下单Nginx部署文档 一.常规步骤 1 安装Nginx集群依赖 yum -y install pcre-devel openssl-devel gcc lrzsz openssh-clie ...

  9. 数通畅联综合培训文档

    1. 概述 本文档是数通畅联针对IT人员的工作意识.产品学习及项目管理能力的综合性培训文档,目的在于帮助公司员工统一认知及快速了解数通畅联的产品知识. 2. 预期读者 1.数通畅联内部员工 2.IT工 ...

最新文章

  1. R语言 lightgbm 算法优化:不平衡二分类问题(附代码)
  2. Winrar从命令行查看压缩文件内容
  3. synchronized 和 volatile 关键字的作用
  4. ASP.NET MVC的过滤器笔记
  5. python的开发环境有哪些系统_Win10下配置机器学习python开发环境
  6. 企业级应用与互联网应用的区别
  7. 大数据基础技术和应用
  8. python学习turtle(龟图标状态)
  9. 每天进步一点点——Linux系统时间来处理
  10. CCF 2018-9-2买菜
  11. windows进程间通信
  12. 奥维地图怎么查看历史地图_奥维互动地图使用小技巧
  13. 音乐API(仅测试使用)
  14. 大数据统计分析毕业设计_数据分析毕业设计 大数据可视化毕业设计
  15. 宝塔下 nginx 支持图片放缩
  16. fs.readFileSync 引入路径错误
  17. 数据库设计之冗余、索引以及查询优化
  18. Anaconda的升级、配置及使用
  19. PCF8591模块ad/da转换
  20. setuptools.setup参数说明

热门文章

  1. 不是有效的Win32位应用程序
  2. android手机如何保存长图片大小,快手怎么发长尺寸图片和图集 快手图集现在安卓手机可以使用吗...
  3. 联想一体机电源键不亮_联想爆发 22款新品齐飞!49元-10499元啥都有
  4. 来了,戴口罩解锁 iPhone 的正确姿势来了!
  5. 【Linux云计算架构:第三阶段-Linux高级运维架构】第25章—— 搭建jumperserver管理王者荣耀数万台游戏服务器
  6. 小小输入法的郑码练习
  7. 小小新闻发布会资料_小小新闻发布会作文
  8. 科研热点|多所高校公布2022国家杰青、优青基金获得者(附名单及查询方法)~
  9. 传智高校平台python答案_传智播客高校教辅平台学生端下载-传智播客高校教辅平台app学生版v4.13.0官网最新版_新绿资源网...
  10. TP5+PHPMailer 实现发送邮件功能