呕心沥血整理,Nginx看这个就够了
Posted 果子哥丶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了呕心沥血整理,Nginx看这个就够了相关的知识,希望对你有一定的参考价值。
nginx
Nginx官方文档
OpenResty官方文档
一、Nginx概述
Nginx是免费,开源,高性能的HTTP和反向代理服务器,邮件代理服务器,通用TCP/UDP代理服务器
官方文档:https://www.nginx.cn/doc/
特性
- 模块化设计,较好的扩展性
- 高可靠性
- 支持热部署:不停机更新配置文件,升级版本,更换日志文件
- 低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
- event-driven,aio,mmap,sendfile
基本功能
- 静态资源的web服务器
- http协议反向代理服务器
- pop3/imap4协议反向代理服务器
- FastCGI(LNMP),uWSGI(python)等协议
- 模块化(非DSO),如zip,SSL模块
web服务相关的功能
- 虚拟主机(server)
- 支持keep-alive 和 管道连接
- 访问日志(支持基于日志缓冲提高其性能)
- url rewrrite
- 路径别名
- 基于IP及用户的访问控制
- 支持速率限制及并发数限制
- 重新配置和在线升级而无须中断客户的工作进程
- Memcached的GET接口
正向代理和反向代理
正向代理,代理客户端。
反向代理,代理服务器。
Nginx在做反向代理时,提供性能稳定,并且能够提供配置灵活的转发功能。Nginx可以根据不同的正则匹配,采取不同的转发策略,比如图片文件结尾的走文件服务器,动态页面走web服务器,只要你正则写的没问题,又有相对应的服务器解决方案,你就可以随心所欲的玩。并且Nginx对返回结果进行错误页跳转,异常判断等。如果被分发的服务器存在异常,他可以将请求重新转发给另外一台服务器,然后自动去除异常服务器。
负载均衡
Nginx提供的负载均衡策略有2种:内置策略和扩展策略。内置策略为轮询,加权轮询,Ip hash。扩展策略很多。
如Ip hash算法
,对客户端请求的ip进行hash操作,然后根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处理,可以解决session不共享的问题。
二、Nginx结构
Nginx 的高并发得益于其采用了 epoll 模型,与传统的服务器程序架构不同,epoll 是Linux 内核 2.6 以后才出现的,Nginx 采用 epoll 模型,异步非阻塞,而 apache 采用的是select 模型
Nginx 默认以 80 端口监听在服务器上,并且启动一个 master 进程,同时有 master 进程生成多个工作进程,当浏览器发起一个 HTTP 连接请求,每个进程都有可能处理这个连接。
Nginx有两种工作模式:master-worker模式和单进程模式(方便调试)。在master-worker模式下,有一个master进程和至少一个的worker进程,单进程模式顾名思义只有一个进程。
Nginx的程序架构:master/worker架构
-
一个master架构:负载加载和分析配置文件、管理worker进程(启动,杀死,监控,发送消息/信号等)、平滑升级。不负责业务执行
-
一个或多个worker进程:处理并响应用户请求。真正提供服务的是worker进程,通过worker进程来实现重启服务,平滑升级,更换日志文件,配置文件生效等功能。
-
缓存相关的进程:
- cache loader:载入缓存对象
- cache manager:管理缓存对象
首先每个 worker 进程都是从 Master 进程 fork 出来,在 Master 进程里面,建立好需要listen 的 socket(listenfd)之后,会 fork 出多个 worker 进程。
所有 worker 进程的 listenfd 会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有 worker 进程在注册 listenfd 读事件前抢 accept_mutex,抢到互斥锁的那个进程注册 listenfd 读事件,在读事件里调用 accept 接受该连接。
当一个 worker 进程在 accept 这个连接之后,就开始读取请求、解析请求、处理请求,产生数据后,再返回给客户端,最后才断开连接,这样形成一个完整的请求流程。如图
master-worker这种模式:
- 稳定性高,只要还有worker进程存活,就能够提供服务,并且一个worker进程挂掉master进程会立即启动一个新的worker进程,保证worker进程数量不变,降低服务中断的概率。
- 配合linux的cpu亲和性配置,可以充分利用多核cpu的优势,提升性能
- 处理信号/配置重新加载/升级时可以做到尽可能少或者不中断服务
⭐️Nginx配置文件结构
默认的 nginx 配置文件 nginx.conf 内容结构如下:
... #全局块
events { #events块
...
}
http #http块
{
... #http全局块
server #server块
{
... #server全局块
location [PATTERN] #location块
{
...
}
location [PATTERN]
{
...
}
}
server #每个server用于定义一个虚拟主机
{
...
server_name 虚拟主机名
root 主目录
alias 路径别名
location [PATTERN]
{
...
if CONDITION {
}
}
}
... #http全局块
}
mail{
... #mail协议相关配置段
}
stream{
... #stream服务器相关配置段
}
- 1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
- 2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
- 3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
- 4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。
- 5、location块:配置请求的路由,以及各种页面的处理情况。
如下:
########### 每个指令必须有分号结束。#################
#user administrator administrators; #配置用户或者组,默认为nobody nobody。
#worker_processes 2; #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
error_log log/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_processes 1; # nginx进程数,一般设置成和CPU个数一样
worker_connections 1024; #最大连接数,默认为512
}
http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain
#access_log off; #取消服务日志
# 日志格式
log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
access_log log/access.log myFormat; #combined为日志格式的默认值
sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #热备
}
error_page 404 https://www.baidu.com; #错误页
# 服务器配置
server {
keepalive_requests 120; #单连接请求上限次数。
listen 4545; #监听端口
server_name 127.0.0.1; #监听地址
location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
#root path; #根目录
#index vv.txt; #设置默认页
proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
deny 127.0.0.1; #拒绝的ip
allow 172.18.5.54; #允许的ip
}
}
}
上面是nginx的基本配置,需要注意的有以下几点:
1、几个常见配置项:
- 1.$remote_addr 与 $http_x_forwarded_for 用以记录客户端的ip地址;
- 2.$remote_user :用来记录客户端用户名称;
- 3.$time_local : 用来记录访问时间与时区;
- 4.$request : 用来记录请求的url与http协议;
- 5.$status : 用来记录请求状态;成功是200;
- 6.$body_bytes_s ent :记录发送给客户端文件主体内容大小;
- 7.$http_referer :用来记录从那个页面链接访问过来的;
- 8.$http_user_agent :记录客户端浏览器的相关信息;
remote_addr #客户端 IP 地址
remote_port #客户端端口
server_addr #服务端 IP 地址
server_port #服务端端口
server_protocol #服务端协议
binary_remote_addr #二进制格式的客户端 IP 地址
connection #TCP 连接的序号,递增
connection_request #TCP 连接当前的请求数量
uri #请求的URL,不包含参数
request_uri #请求的URL,包含参数
scheme #协议名, http 或 https
request_method #请求方法
request_length #全部请求的长度,包含请求行、请求头、请求体
args #全部参数字符串
arg_参数名 #获取特定参数值
is_args #URL 中是否有参数,有的话返回 ? ,否则返回空
query_string #与 args 相同
host #请求信息中的 Host ,如果请求中没有 Host 行,则在请求头中找,最后使用 nginx 中设置的 server_name 。
http_user_agent #用户浏览器
http_referer #从哪些链接过来的请求
http_via #每经过一层代理服务器,都会添加相应的信息
http_cookie #获取用户 cookie
request_time #处理请求已消耗的时间
https #是否开启了 https ,是则返回 on ,否则返回空
request_filename #磁盘文件系统待访问文件的完整路径
document_root #由 URI 和 root/alias 规则生成的文件夹路径
limit_rate #返回响应时的速度上限值
2、惊群现象:一个网路连接到来,多个睡眠的进程被同时叫醒,但只有一个进程能获得链接,这样会影响系统性能。
3、每个指令必须有分号结束。
4、log_format只能出现在http指令块中,而access_log则可以出现在http和server,location这些指令块中。
在nginx中存储值得指令继承规则是向上覆盖。当子配置存在时,直接覆盖父配置块, 子配置不存在时,直接使用父配置块。
三、Nginx模块
从结构上分为如下三类:
核心模块: HTTP模块、EVENT模块和MAIL模块
标准模块:
- HTTP模块:ngx_http_* ,HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块、HTTP Rewrite模块;
HTTP Core modules 默认功能
HTTP Optional modules 需编译时指定 - Mail模块:ngx_mail_*
- Stream模块:ngx_stream_*
第三方模块:HTTP Upstream Request Hash模块、Notice模块 和 HTTP Access Key模块、Limit_req模块等;
从功能上分为如下三类:
- Handlers(处理器模块):此类模块直接处理请求,并进行输出内容和修改headers信息等操作,Handlers处理器模块一般只能有一个;
- Filters(过滤器模块):此类模块主要对其他处理器模块输出的内容进行修改操作,最后由Nginx输出;
- Proxies(代理类模块):此类模块是Nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如FastCGl等进行交互,实现服务代理和负载均衡等功能。(upstream的模块提供数据转发功能,upstream使nginx跨越单机的限制,完成网络数据的接收、处理和转发)
-
http_ssl_module:实现服务器加密传输的模块,部署完成后可使用https://协议进行数据传输,保证数据传输过程的安全。
worker_processes 1; http { server { listen 443; ssl on; ssl_certificate /usr/local/nginx/conf/cert.pem; ssl_certificate_key /usr/local/nginx/conf/cert.key; keepalive_timeout 70; } }
-
http_image_filter_module:通过该模块可以实现图片裁剪,将过大的图片裁剪为指定大小的图片,生成缩略图,保证传输速率,该选项默认不开启,需要人为指定 image_filter resize $h $w;
编译安装参数配置:--with-http_image_filter_module location /img/ { proxy_pass http://backend; image_filter resize 150 100; error_page 415 = /empty; } location = /empty { empty_gif; }
-
http_rewrite_module
Nginx的地址重写模块,功能同Apache的一样,可以实现通过正则匹配来完成条件判断,然后进行域名或url的重写。例如:多域名、http ——》https- nginx rewrite 规则中 last、break、redirect、permanent 的含义。
答:不写last和break - 那么流程就是依次执行这些rewrite
1.rewrite break - url重写后,直接使用当前资源,不再执行location里余下的语句,完成本次请求,地址栏url不变
2.rewrite last - url重写后,马上发起一个新的请求,再次进入server块,重试location匹配,超过10次匹配不到报500错误,地址栏url不变
3.rewrite redirect – 返回302临时重定向,地址栏显示重定向后的url,爬虫不会更新url(因为是临时)
4.rewrite permanent – 返回301永久重定向, 地址栏显示重定向后的url,爬虫更新url
301 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
break
作用域: server, location, if
if ($slow) {
limit_rate 10k;
break;
}
if
作用域: server, location
匹配符:=,!=,~*,~,!~,!~*
使用-f以及!-f检测一个文件是否存在
使用-d以及!-d检测一个目录是否存在
使用-e以及!-e检测是否存在一个文件,一个目录或者一个符号链接
return
作用域: server, location, if
这个指令根据规则的执行情况,返回一个状态值给客户端。可使用值包括:204,400,402-406,408,410,411,413,416以及500-504。也可以发送非标准的444代码-未发送任何头信息下结束连接。
rewrite
作用域: server, location, if
permanent 和 redirect关键字的区别
rewrite … permanent 永久性重定向,请求日志中的状态码为301
rewrite … redirect 临时重定向,请求日志中的状态码为302
我们常用的80端口转443,即http转https的一种配置方案为:
server {
listen 80;
server_name demo.com;
rewrite ^(.*)$ https://${server_name}$1 permanent;
}
server {
listen 443;
server_name demo.com;
charset utf-8;
location / {
alias /data/web;
index index.html index.htm;
}
}
会返回301永久重定向到对应的https
-
nginx配置文件,rewrite和proxy_pass区别 (两种常见的资源定向)
-
区别 https://www.jianshu.com/p/10ecc107b5ee https://blog.51cto.com/853056088/2126498
-
rewrite 通过使用flag可以终止定向后进一步的处理
-
是否影响浏览器地址栏,proxy_pass不影响浏览器地址栏的url
-
proxy_pass配合upstream实现负载均衡
- - proxy_set_header Host $host; 作用web服务器上有多个站点时,用该参数header来区分反向代理哪个域名。比如下边的示例。
- proxy_set_header X-Forwarded-For $remote_addr; 作用是后端服务器上的程序获取访客真实IP,从该header头获取。部分程序需要该功能。
- - proxy_set_header Host $host; 作用web服务器上有多个站点时,用该参数header来区分反向代理哪个域名。比如下边的示例。
-
-
http_proxy_module
Nginx反向代理功能,由于Nginx的高并发特性,很多时候我们都选择使用Nginx为网站的前置服务器,一般会和upstream模块一起使用,完成压力分摊工作。location / { proxy_pass http://localhost:8000; proxy_set_header X-Real-IP $remote_addr; } 如果想将/a的请求,直接转到80/a路径下 location /a/ { proxy_pass http://120.76.x.x:80/; } http://127.0.0.1:8000/a/ 访问就会跳到80/a 作用域:http,server,location
搭建一台Nginx方向代理服务器,让后端服务器还能够获取到用户的IP地址
1.反向代理NGINX端设置记录转发请求的HTTP头信息,记录原有的客户端IP和原有客户端请求的服务器地址
2.后台服务端利用log_format指令设置日志格式,记录代理端返回来的日志信息一、配置反向代理端的nginx服务器
在server后面增加如下这三个参数用于记录IP:proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
二、在后端服务器配置如下
在后端服务器的nginx_http处配置如下:
配置log_format信息, 后续的日志后面也需要加上main这个参数log_format main '$remote_addr $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '$http_user_agent $http_x_forwarded_for $request_time $upstream_response_time $upstream_addr $upstream_status';
-
http_upstream_module
Nginx的负载均衡模块,一般和http_proxy模块一起使用,用来对后台服务器的任务调度及分配,分配原则可以通过算法进行控制。常见模式:Nginx+Apache、Nginx+Tomcatupstream backend { server backend1.example.com weight=5; server backend2.example.com:8080; server unix:/tmp/backend3; } server { location / { proxy_pass http://backend; } } Ip hash算法,对客户端请求的ip进行hash操作,然后根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处理,可以解决session不共享的问题。
upstream group1{ server 192.168.0.1:80 weight=1; server 192.168.0.1:81 weight=1; } server { listen 8000; server_name localhost; default_type text/html location /{ echo "hello"; } location /a/ { proxy_pass http://group1/; } }
-
http_gzip_module
网络传输压缩模块,这个模块支持在线实时压缩输出数据流: gzip on; 开启gzip模块 : gzip_min_length 1000; : gzip_proxied expired no-cache no-store private auth; : gzip_types text/plain application/xml; 内置变量 $gzip_ratio 可以获取到gzip的压缩比率
-
cache_purge
实现缓存清除功能
ngx_http_core_module(location、rewrite)
ngx_http_core_module
与套接字相关的配置:
1、server{...} 在http块
配置一个虚拟主机
server{
listen address[:PORT]|PORT;
server_name SERVER_NAME;
root /PATH/TO/DUCUMENT_ROOT;
}
include /etc/nginx/conf.d/vhosts/*.conf;
server{
listen 8080;
//加上default就是默认,不加就按vhosts目录下的文件顺序找。
//listen 80 default_server; listen IP地址:80 default_server
server_name www.b.com;
root /data/siteb;
}
2、listen PORT|address[:port]|unix:/PATH/TO/SOCKET_FILE
listen address[:port][default_server][ssl][http2|spdy][backlog=number][rcvbuf=size][sndbuf=size]
default_server 设定为默认虚拟主机
ssl 限制仅能够通过ssl连接提供服务
backlog=number 超过并发连接数后,新请求进入后援队列的长度
rcvbuf=size 接收缓冲区大小
sndbuf=size 发送缓冲区大小
注意:
(1)基于port;
listen PORT; 指令监听在不同的端口
(2)基于ip的虚拟主机
listen IP:PORT; IP地址不同
(3)基于hostname
server_name fqdn; 指令指向不同的主机名
3、server_name name...;
虚拟主机的主机名称后可跟多个由空白字符分隔的字符串
支持*通配任意长度的任意字符
server_name *.abc.com www.abc.*
支持~起始的字符做正则表达式模式匹配,性能原因慎用(要计算匹配,最好精确)
server_name ~^www\\d+\\.abc\\.com$
说明:\\d 表示[0-9]
匹配优先级机制从高到低:
(1)首先是字符串精确匹配 如:www.abc.com
(2)右侧*通配符 如:*.abc.com
(3)右侧*通配符 如:www.abc.*
(4)正则表达式 如:~^.*\\.abc\\.com$
(5)default_server
4.tcp_nodelay on|off;
在keepalived模式下的连接是否启用TCP_NODELAY选项
当为off时,延迟发送,合并多个请求后再发送
默认On时,不延迟发送
可用于:http,server,location
5、sendfile on|off
是否启用sendfile功能,在内核中封装报文直接发送
默认off
6、server_tokens on|off|build|string
是否在相应报文的Server首部显示nginx版本
匹配,root、location、alias
7、root
设置web资源的路径映射;用于指明请求的URL所对应的文档的目录路径,可用于http,server,location,if in location
server{
...
root /data/www/vhosts;
}
示例:http://www.abc.com/images/logo.jpg
-->/data/www/vhosts/images/logo.jpg
访问/images/logo.jpg 相当于访问 /data/www/vhosts/images/logo.jpg
8、location [=|~|~*|^~]uri{..}
location @name{..}
放在server块和location块
在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;nginx会根据用户请求的URI来检查定义的所有location,并找出一个最佳匹配,而后应用其配置
示例:
server{...
server_name www.abc.com;
location /images/{
root /data/imgs/;
}
}
http://www.abc.com/images/logo.jpg
--> /data/imgs/images/logo.jpg
访问images的时候,实际访问的是/data/imgs下的 images
精确匹配:
=:对URI做精确匹配;
location = /{
...
}
http://www.abc.com/ 匹配
http://www.abc.com/index.html 不匹配
正则匹配
^~:对URI的最左边部分做匹配检查,不区分字符大小写,一般用来匹配目录
~:对URI做正则表达式模式匹配,区分字符大小写
~*:对URI做正则表达式模式匹配,不区分字符大小写
内部location
@
不带符号:匹配起始于此uri的所有uri
匹配优先级从高到低: =,^~,~/~*,不带符号(相当于直接一个杠/)
匹配顺序:精确匹配、记录最长前缀匹配、使用第一个正则匹配、使用前面记录的最长前缀匹配
示例1:匹配http://www.abc.com/
location = / {
...
}
示例2:匹配http://www.abc.com/index.html
location / {
...
}
示例3:匹配http://www.abc.com/documents/linux.txt
location /documents/{
...
}
示例4:匹配http://www.abc.com/documents/logo.jpg
location ~* \\.(gif|jpg|jpeg)${
...
}
示例5:匹配以/images/开头
location ^~ /images/
示例6:匹配数字,字母和下划线
location ~ /\\w
nginx中location匹配顺序
首先先检查使用前缀字符定义的location,选择最长匹配的项并记录下来。
如果找到了精确匹配的location,也就是使用了=修饰符的location,结束查找,使用它的配置。
然后按顺序查找使用正则定义的location,如果匹配则停止查找,使用它定义的配置。
如果没有匹配的正则location,则使用前面记录的最长匹配前缀字符location。
location匹配规则小结:
1 =|^~|~| 普通文本 四个优先级较高的先匹配
(2,4都是匹配开头,优先级不一样)
2 同优先级的,匹配程度较高的先匹配
3 匹配程度也一样,则写在前面的先匹配
9.alias
路径别名,文档映射的另一种机制;仅能用于location上下文
示例:
访问 http://www.abc.com/bbs/index.php
location /bbs/{
alias /web/forum/;
} --> /web/forum/index.html 实际访问
location /bbs/{
root /web/forum/;
} --> /web/forum/bbs/index.html 实际访问
注意:location中使用root指令和alias指令的意义不同
(a)root,给定的路径对应于location中的/uri/左侧的/
(b)alias,给定的路径对应location中的/uri/右侧的/
10.index file ...;
指定默认网页文件,注意:ngx_http_index_module模块
11、error_page code .. [=[response]] uri; 在server块
模块:ngx_http_core_module
定义错误页,以指定的响应状态码进行响应
可用位置:http,server,location,if in location
error_page 404 /404.html
error_page 404 = 200 /404.html 访问其实是404,强行把状态改为200
示例:
server{
error_page 404 /404.html;
location /404.html{
root /data/sitea/error/;
}
}
#mkdir /data/sirea/error/
vim /data/sitea/error/404.html
12、try_files file ... uri;
try_files file ... = code;
按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有的文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一个内部重定向,之前的参数只设置内部URI的指向。最后一个参数是回退URI且必须存在,否则会出现内部500错误
location /images/{
//假设找/images/a.jpg,如果没有a.jpg就返回default.gif
try_files $uri /images/default.gif;
}
location /{
try_files $uri $uri/index.html $uri.html = 404;
}
定义客户端请求的相关配置
13、keepalive_timeout timeout [header_timeout];
设定保持连接超时时长,0表示禁止长连接,默认为75s
14、keepalive_requests number;
在一次长连接上锁允许请求的资源的最大数量,默认为100
15、keepalive_disable none|broswer...
对哪种浏览器禁用长连接
16、send_timeout time;
向客户端发送响应报文的超时时长,此处是指两次写操作之间的间隔时长,而非整个响应过程的传输时长
17、client_body_buffer_size size;
用于接收每个客户端请求报文的body部分的缓冲区大小;默认为16k;超出此大小时,其将被暂存到磁盘上的由下面client_body_temp_path指令所定义的位置
18、client_body_temp_path path [level1 [level2 [level3]]];
设定存储客户端请求报文的body部分的临时存储路径及子目录结构和数量
目录名为16进制的数字;
client_body_temp_path /var/tmp/client_body 1 2 2
1 1级目录占1位16进制,即2^4=16个目录 0-f
2 2级目录占2位16进制,即2^8=256个目录 00-ff
2 3级目录占2位16进制,即2^8=256个目录 00-ff
对客户端进行限制的相关配置
19、limit_rate rate;
限制响应给客户端的传输速率,单位是bytes/second
默认值0表示无限制
20、limit_except method ... {...},仅用于location
限制客户端使用除了指定的请求方法之外的其他方法
method:GET,HEAD,POST,PUT,DELETE
MKCOL,COPY,MOVE,OPTIONS,PROPFIND,
PROPPATCH,LOCK,UNLOCK,PATCH
limit_except GET{
allow 192.168.1.0/24;
deny all;
}除了GET和HEAD之外其他方法仅允许192.168.1.0/24网段主机使用
文件操作优化的配置
21、aio on|off|threads|[=pool];
是否启用aio功能,默认不启动
22、directio size|off;
当文件大于等于给定大小时,例如directio 4m,同步(直接)写磁盘,而非写缓存
23、open_file_cache off;
open_file_cache max=N [inactive=time];
nginx可以缓存以下三种信息:
(1)文件元数据:文件的描述符、文件大小和最近一次的修改时间
(2)打开的目录结构
(3)没有找到的或者没有权限访问的文件的相关信息
max=N:可缓存的缓存项上限;达到上限后会使用LRU(最近最少)算法实现管理
inactive=time:缓存项的非活动时长,在此处指定的时长内未被命中的活命中的次数少于open_file_cache_min_uses指令所指定的次数的缓存项即非活动项,将被删除
24、open_file_cache_errors on|off;
是否缓存查找时发生错误的文件一类的信息
默认值为off
25、open_file_cache_min_uses number;
open_file_cache指令的inactive参数指定的时长内,至少被命中此处指定的次数方可被归类为活动项
默认值为1
26、open_file_cache_valid time;
缓存项有效性的检查频率
默认值为60s
ngx_http_access_module
实现基于ip的访问控制功能
1、allow address|CIDR|unix:|all;
2、deny address|CIDR|unix:|all;
http,server,location,limit_except
自上而下检查,一旦匹配,将生效,条件严格的置前
示例:
location /{
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all
}
实现基于用户的访问控制
使用basic机制进行用户认证
1、auth_basic string|off;
2、auth_basic_user_file file;
location /admin/{
auth_basic "Admin Area"; # 提示信息
auth_basic_user_file /etc/nginx/conf.d/vhosts/nginxuser; # 其实也可以创建隐藏文件 .nginxuser
}
用户口令文件:
1、明文文本:格式name:password:comment
2、加密文本:由htpasswd命令实现 (通过httpd-tools。 #rpm -ivh httpd-tools)
#htpasswd -cm nginxuser httpuser1 第一次创建要加参数c
#htpasswd -m nginxuser httpuser2
ngx_http_stub_status_module
用于输出nginx的基本状态信息
Active connections:291
server accepts handled requests
16630948 16630948 31070465
上面三个数字分别对应accepts,handled,requests三个值
Reading:6 Writing:179 Waiting:106
Activeconnections:当前状态,活动状态的连接数
accepts:统计总值,已经接受的客户端请求的总数
handled:统计总值,已经处理完成的客户端请求的总数
requests:统计总值,客户端发来的总的请求数
Reading:当前状态,正在读取客户端请求报文首部的连接的连接数 (请求头)
Writing:当前状态,正在向客户端发关响应报文过程中的连接数 (响应头)
Waiting:当前状态,正在等待客户端发出请求的空闲连接数 (等待的请求数)
1、stub_status;
示例:
location /status{
stub_status;
#allow 172.16.0.0/16;
#deny all;
}
作用域:server,location
ngx_http_log_module
指定日志格式记录请求。搭配access_log
只能在http的作用域下
#vim /etc/nginx/nginx.conf
1、log_format name string ...;
string可以使用nginx核心模块及其它模块内嵌的变量
2、access_log path [format[buffer=size][gzip[=level]][flush=以上是关于呕心沥血整理,Nginx看这个就够了的主要内容,如果未能解决你的问题,请参考以下文章
整理了一份 Docker系统知识,从安装到熟练操作看这篇就够了 | 原力计划