当前位置:首页 > 教程 > 正文内容

nginx实践格式(nginx最佳实践)

2023-05-19 14:30:03教程1

nginx最佳实践

1,快速响应:nginx的单次请求会得到更快的响应,另一方面,在高峰期(如有数以万计的并发请求),Nginx可以比其他Web服务器更快地响应请求(官方说nginx可以支持五万并发),尤其是对静态资源的返回,更为迅速。

2,跨平台性,高扩展性:nginx的设计极具扩展性,它是由多个不同功能,不同层次,不同类型且耦合度极低的模块组成,比如HTTP模块中,还设计了HTTP过滤模块,一个正常的HTTP模块处理完请求后,会有一连串的HTTP过滤模块再对其进行过滤,我们开发一个新的HTTP模块时,可以使用HTTP核心模块 events模块 log模块等 还可以自由的复用各种过滤器模块。因此,当对某一个模块修复Bug或进行升级时,可以专注于模块自身,无须在意其他。这种低耦合度的优秀设计,造就了Nginx庞大的第三方模块,当然,公开的第三方模块也如官方发布的模块一样容易使用。

Nginx的模块都是嵌入到二进制文件中执行的,无论官方发布的模块还是第三方模块都是如此。这使得第三方模块一样具备极其优秀的性能,充分利用Nginx的高并发特性,因此,许多高流量的网站都倾向于开发符合自己业务特性的定制模块。

3,高可靠性:经过了实践的检验,功能丰富且稳定。nginx每个worker子进程相对独立,master进程在一个worker子进程出错时可以快速拉起新的worker子进程继续提供服务

4,低内存消耗

一般情况下,10 000个非活跃的HTTP Keep-Alive连接在Nginx中仅消耗2.5MB的内存,这是Nginx支持高并发连接的基础。

5,高并发处理

nginx支持的并发连接上限取决于内存,单机上万的并发量解决起来轻轻松松

6,热部署

master管理进程与worker工作进程的分离设计,使得nginx在不间断提供服务的情况下支持更新配置,更换日志文件,升级nginx可执行文件等

7,支持BSD许可协议

BSD开源协议是一个给予使用者很大自由的协议。基本上使用者可以"为所欲为",可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布

nginx的模式

日志对于统计排错来说非常有利的。本文总结了nginx日志相关的配置如access_log、log_format、open_log_file_cache、log_not_found、log_subrequest、rewrite_log、error_log。

nginx有一个非常灵活的日志记录模式。每个级别的配置可以有各自独立的访问日志。日志格式通过log_format命令来定义。ngx_http_log_module是用来定义请求日志格式的。

1. access_log指令

语法: access_log path [format [buffer=size [flush=time]]];

access_log path format gzip[=level] [buffer=size] [flush=time];

access_log syslog:server=address[,parameter=value] [format];

access_log off;

默认值: access_log logs/access.log combined;

配置段: http, server, location, if in location, limit_except

gzip压缩等级。

buffer设置内存缓存区大小。

flush保存在缓存区中的最长时间。

不记录日志:access_log off;

使用默认combined格式记录日志:access_log logs/access.log 或 access_log logs/access.log combined;

2. log_format指令

语法: log_format name string …;

默认值: log_format combined “…”;

配置段: http

name表示格式名称,string表示等义的格式。log_format有一个默认的无需设置的combined日志格式,相当于apache的combined日志格式,如下所示:

log_format combined '$remote_addr - $remote_user [$time_local] '

' "$request" $status $body_bytes_sent '

' "$http_referer" "$http_user_agent" ';

log_formatcombined'$remote_addr - $remote_user [$time_local] '

' "$request" $status $body_bytes_sent '

' "$http_referer" "$http_user_agent" ';

如果nginx位于负载均衡器,squid,nginx反向代理之后,web服务器无法直接获取到客户端真实的IP地址了。 $remote_addr获取反向代理的IP地址。反向代理服务器在转发请求的http头信息中,可以增加X-Forwarded-For信息,用来记录 客户端IP地址和客户端请求的服务器地址。PS: 获取用户真实IP 参见http://www.ttlsa.com/html/2235.html如下所示:

log_format porxy '$http_x_forwarded_for - $remote_user [$time_local] '

' "$request" $status $body_bytes_sent '

' "$http_referer" "$http_user_agent" ';

log_formatporxy'$http_x_forwarded_for - $remote_user [$time_local] '

' "$request" $status $body_bytes_sent '

' "$http_referer" "$http_user_agent" ';

日志格式允许包含的变量注释如下:

$remote_addr, $http_x_forwarded_for 记录客户端IP地址

$remote_user 记录客户端用户名称

$request 记录请求的URL和HTTP协议

$status 记录请求状态

$body_bytes_sent 发送给客户端的字节数,不包括响应头的大小; 该变量与Apache模块mod_log_config里的“%B”参数兼容。

$bytes_sent 发送给客户端的总字节数。

$connection 连接的序列号。

$connection_requests 当前通过一个连接获得的请求数量。

$msec 日志写入时间。单位为秒,精度是毫秒。

$pipe 如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否则为“.”。

$http_referer 记录从哪个页面链接访问过来的

$http_user_agent 记录客户端浏览器相关信息

$request_length 请求的长度(包括请求行,请求头和请求正文)。

$request_time 请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。

$time_iso8601 ISO8601标准格式下的本地时间。

$time_local 通用日志格式下的本地时间。

$remote_addr,$http_x_forwarded_for记录客户端IP地址

$remote_user记录客户端用户名称

$request记录请求的URL和HTTP协议

$status记录请求状态

$body_bytes_sent发送给客户端的字节数,不包括响应头的大小;该变量与Apache模块mod_log_config里的“%B”参数兼容。

$bytes_sent发送给客户端的总字节数。

$connection连接的序列号。

$connection_requests当前通过一个连接获得的请求数量。

$msec日志写入时间。单位为秒,精度是毫秒。

$pipe如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否则为“.”。

$http_referer记录从哪个页面链接访问过来的

$http_user_agent记录客户端浏览器相关信息

$request_length请求的长度(包括请求行,请求头和请求正文)。

$request_time请求处理时间,单位为秒,精度毫秒;从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。

$time_iso8601ISO8601标准格式下的本地时间。

$time_local通用日志格式下的本地时间。

[warning]发送给客户端的响应头拥有“sent_http_”前缀。 比如$sent_http_content_range。[/warning]

实例如下:

http {

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

'"$status" $body_bytes_sent "$http_referer" '

'"$http_user_agent" "$http_x_forwarded_for" '

'"$gzip_ratio" $request_time $bytes_sent $request_length';

log_format srcache_log '$remote_addr - $remote_user [$time_local] "$request" '

'"$status" $body_bytes_sent $request_time $bytes_sent $request_length '

'[$upstream_response_time] [$srcache_fetch_status] [$srcache_store_status] [$srcache_expire]';

open_log_file_cache max=1000 inactive=60s;

server {

server_name ~^(www\.)?(.+)$;

access_log logs/$2-access.log main;

error_log logs/$2-error.log;

location /srcache {

access_log logs/access-srcache.log srcache_log;

}

}

}

http{

log_formatmain'$remote_addr - $remote_user [$time_local] "$request" '

'"$status" $body_bytes_sent "$http_referer" '

'"$http_user_agent" "$http_x_forwarded_for" '

'"$gzip_ratio" $request_time $bytes_sent $request_length';

log_formatsrcache_log'$remote_addr - $remote_user [$time_local] "$request" '

'"$status" $body_bytes_sent $request_time $bytes_sent $request_length '

'[$upstream_response_time] [$srcache_fetch_status] [$srcache_store_status] [$srcache_expire]';

open_log_file_cachemax=1000inactive=60s;

server{

server_name~^(www\.)?(.+)$;

access_loglogs/$2-access.logmain;

error_loglogs/$2-error.log;

location/srcache{

access_loglogs/access-srcache.logsrcache_log;

}

}

}

3. open_log_file_cache指令

语法: open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];

open_log_file_cache off;

默认值: open_log_file_cache off;

配置段: http, server, location

对于每一条日志记录,都将是先打开文件,再写入日志,然后关闭。可以使用open_log_file_cache来设置日志文件缓存(默认是off),格式如下:

参数注释如下:

max:设置缓存中的最大文件描述符数量,如果缓存被占满,采用LRU算法将描述符关闭。

inactive:设置存活时间,默认是10s

min_uses:设置在inactive时间段内,日志文件最少使用多少次后,该日志文件描述符记入缓存中,默认是1次

valid:设置检查频率,默认60s

off:禁用缓存

实例如下:

open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;

1

open_log_file_cachemax=1000inactive=20svalid=1mmin_uses=2;

4. log_not_found指令

语法: log_not_found on | off;

默认值: log_not_found on;

配置段: http, server, location

是否在error_log中记录不存在的错误。默认是。

5. log_subrequest指令

语法: log_subrequest on | off;

默认值: log_subrequest off;

配置段: http, server, location

是否在access_log中记录子请求的访问日志。默认不记录。

6. rewrite_log指令

由ngx_http_rewrite_module模块提供的。用来记录重写日志的。对于调试重写规则建议开启。 Nginx重写规则指南

语法: rewrite_log on | off;

默认值: rewrite_log off;

配置段: http, server, location, if

启用时将在error log中记录notice级别的重写日志。

7. error_log指令

语法: error_log file | stderr | syslog:server=address[,parameter=value] [debug | info | notice | warn | error | crit | alert | emerg];

默认值: error_log logs/error.log error;

配置段: main, http, server, location

配置错误日志。

nginx模式

Flask ,Django 自带的web server的目的就是用于开发,而不是生产环境。他们俩本身是web framework而不是web server. 他们自带的server应该都只能开单进程。

而像gunicorn是 prefork模式,从nginx每发过来一个请求,它就fork一个进程去处理这个请求,并buffer相关的数据。

wsgi服务器都是专门为生产环境 开发的,能配置更多从而处理更复杂的请求状况,从性能和稳定性来说,都更好。

nginx的实现

keepalived中有一个虚拟ip(VIP),正常情况下VIP是在master机器上,backup机器备用,主机宕机后backup接管VIP,这样来说同一时间只有一台机器工作,另一台备用,就浪费一台机器,就出现双主,就是把master上再配一个backup,backup机器上配一个master,互为主备两个VIP,这样两台机器都能提供服务。降低单机负载。

nginx总结

一、吞吐量

量级不一样,单台nginx吞吐量在10WQPS 一个 java 网关撑死了1000 QPS

二、 负载策略

nginx自带多种策略 可以通过轮询 随机 权重 url等管理和剔除服务 网关没有功能

三、网关主要作用

第三网关最主要是 鉴权,限流和 根据url正则 转发到具体服务, 他的限流也更切合业务 比如某个活动秒杀 他可以网关直接取模返回运气不好 抢不到 …

四、总结

nginx是抗连接+负载均衡的, 网关用于业务出口服务

nginx项目实战

刚安装的时候就是没有,其实在启动 nginx 时自动生成的 里面存放的是 当前 nginx 住进程的 ID 号;

所以在配置文件中指定pid

pid /usr/local/webserver/nginx/nginx.pid;

哇这个事情 搞了我好长时间,我以为我装的用问题;

nginx的结束重启一般是通过下面命令来实现的:

kill -QUIT 26000

其中26000是nginx的主进程号。

每次都需要通过ps命令来查询nginx的主进程号,非常麻烦。 在《实战nginx:取代Apache的高性能Web服务器》一书中提到了使用pid文件的方法,不巧的是给的命令漏了些东西,这里给出完整的指令。

pid文件就是一个纯文本文件,里面记录的是进程的pid号。

下面是一个pid文件的内容::26032

nginx的默认pid文件

nginx使用了pid文件来记录master process的pid号,如果编译时没有指定,那它的路径就是:

<prefix/logs/nginx.pid

其中<prefix是nginx的安装路径。

如果你想修改默认的pid文件路径,可以在编译时加入配置。参数如下::

./configure –-pid-path=/data/test/ngx.pid

指定后,默认的pid文件路径就更改为::

/data/test/ngx.pid

如果指定只是路径,没有pid的文件名,那么pid的文件名还是nginx.pid

通过配置文件修改pid

除了使用默认值和通过编译时修改外,还可以通过在nginx的配置文件中修改。如下:

pid /data/test/nginx.pid;

这里修改的值只对使用该配置文件的nginx有效。

用PID文件停止Nginx

假设pid文件路径为/data/logs/nginx.pid

kill –QUIT `cat /data/logs/nginx.pid`

用pid文件重新加载配置文件

本网站文章仅供交流学习 ,不作为商用, 版权归属原作者,部分文章推送时未能及时与原作者取得联系,若来源标注错误或侵犯到您的权益烦请告知,我们将立即删除.

本文链接:https://www.xibujisuan.cn/98850690.html