企业场景常用的 Nginx HTTP 功能模块汇总:nginx documentation
Nginx HTTP 功能模块 | 模块说明 |
---|---|
ngx_http_core_module | 包括一些核心的 HTTP 参数配置,对应 Nginx 的配置为 HTTP 区块部分 |
ngx_http_access_module | 访问控制模块,用来控制网站用户对 Nginx 的访问 |
ngx_http_gzip_module | 压缩模块,对 Nginx 返回的数据压缩,属于性能优化模块 |
ngx_http_fastcgi_module | FastCGI 模块,和动态应用相关,如 PHP |
ngx_http_proxy_module | proxy 代理模块 |
ngx_http_upstream_module | 负载均衡模块,可以实现网站的负载均衡功能及节点的健康检查 |
ngx_http_rewrite_module | URL 地址重写模块(伪静态) |
ngx_http_limit_conn_module | 限制用户并发连接数及请求数模块 |
ngx_http_limit_req_module | 根据定义的 key 限制 Nginx 请求过程的速率 |
ngx_http_log_module | 访问日志模块,以指定的格式记录 Nginx 客户访问日志等信息 |
ngx_http_auth_basic_module | web 认证模块,设置 Web 用户通过账号索码访问 Nginx |
ngx_http_ssl_module | ssl模块,用于加密的 HTTP 连接,如 https |
ngx_http_stub_status_module | 记录 Nginx 基本访问状态信息等的模块 |
在生产环境中,配置、调整及优化 Nginx 软件,主要就是根据这此模块的功能修改相应的参数来实现的。
以上都是标准的 HTTP 功能模块,虽然不是 Nginx 软件所必需的,但都是很常用的,因此绝大部分默认情况都会自动安装到 Nginx 软件中。
拓展:nginx第三方模块
nginx -V
查看Nginx集成的模块
实现Nginx站点目录浏览功能的模块:
ngx_http_autoindex_module
模块Nginx默认是不允许列出整个目录的,如需客户端能够访问整个站点目录,可以打开要启用的站点目录的虚拟主机的配置文件,在server或者location区段中添加autoindex on;
,这样就可以启用目录浏览功能。
这样当Nginx找不到默认索引文件(index.html)的时候,就会将请求传递给 ngx_http_autoindex_module
模块,来处理以斜杠(”/“)结尾的请求,生成目录列表。
1 | # autoindex on; # 也可以在http区段配置,表示所有虚拟主机站点都采用此配置 |
实现Nginx主要有两个模块:
ngx_http_access_module
模块ngx_http_auth_basic_module
模块1 | # allow 192.168.110.0/24; # 也可以在http区段配置,表示所有虚拟主机站点都采用此配置 |
基于来源IP的访问控制有一个缺陷,就是当使用了网站中间代理的时候,Nginx获取到的是中间代理的IP地址,那么就无法对来源IP进行访问控制。
解决办法:采用http头信息控制访问,比如:x_forwarded_for
字段,同时获取源IP和代理IP
1 | # 可以在http区段配置,表示所有虚拟主机站点都采用此配置 |
关于认证文件的生成
1 | yum install httpd-tools -y # 安装生成认证文件的工具 |
基于用户名密码身份认证的局限性是
解决方式:
限制某客户端在单位时间内同时访问的http请求数
ngx_http_limit_req_module
模块实现限制同一时间的并发连接数
ngx_http_limit_conn_module
模块实现限制客户端下载资源的速度
ngx_http_core_module
模块实现1 | # 在http区段进行定义,添加语句 |
1 | # 在http区段定义之后,可以在http区段、server区段、location区段使用,添加语句 |
1 | # 在http区段进行定义,添加语句((nginx 1.18以后用 limit_conn_zone 取代了 limit_conn)) |
1 | # 在http区段定义之后,可以在http区段、server区段、location区段使用,添加语句 |
1 | # 限制下载速度有两个指令,可以同时用在http区段、server区段、location区段使用,添加语句 |
1 | # 上面的两个模块都有声明 $binary_remote_addr 远端ip地址进行操作的,而 limit_rate 什么都没规定,所以该限制只是针对一个连接的设定,也就是说,如果同时有2个连接,那么它的速度将会是该指令设置的两倍。 |
监控Nginx的基本状态信息
ngx_http_stub_status_module
模块实现默认情况下不集成该模块,需要使用--with-http_stub_status_module
集成
1 | # 可以在server、lacation区段配置 |
显示结果
1 | Active connections: 1 # Active为并发连接数 |
Nginx软件把每个用户访问网站的 日志信息记录到指定文件里,可以用拉力分析用户浏览行为等
ngx_http_log_module
模块实现1 | # 定义了一种日志格式,名称为main,写在http区段内 |
另外除了访问日志access_log
,还有错误日志error_log
,并不属于这个模块,但是一并在这里做一下说明
1 | # error_log的格式无需定义,因为错误输出信息有固定级别:debug|info|notice|warn|error|crit|alert|emerg |
注意:
错误日志级别不能开error以下级别,否则会导致大量磁盘I/O,性能降低,访问速度变慢。
使用Nginx负载均衡,不能开软件防火墙,否则过滤数据包,也会导致访问变慢,可以使用硬件防火墙或者将防火墙开在web主机上。
1 | # 通用格式 |
nginx会将访问日志写入到access.log日志文件中,错误日志写入到error.log日志文件中。长时间之后,access.log文件的体积就会变得非常大,对于运维工作来说,这是不利的,首先,当我们打开一个非常大的日志文件时,就会比较慢,而且,从一个非常大的日志中找到某个时间段的日志也会比较慢,所以,我们最好将日志按天分割,比如,每天晚上0点5分生成一个新的日志文件,0点5分之后(新的一天)的日志写入到新的日志文件中,之前的日志则保留在老的文件中,这样每天就会生成一个日志文件,而不是将所有日志都写入到同一个日志文件中。
同样地,yum安装和源码安装的nginx实现日志切割的方式不同,yum安装的nginx默认就有日志滚动的功能,这是因为通过yum源安装nginx后,默认会安装一个日志滚动的配置文件,这个配置文件就是”/etc/logrotate.d/nginx”,可以看出,这是一个logrotate配置文件,通常情况下,Centos系统默认自带logrotate,logrotate是一个日志管理工具。也就是说,nginx借助这个配置文件,使用logrotate完成了日志分割的操作。
查看切割方法
1 | cat /etc/logrotate.d/nginx # 查看nginx的logrotate配置文件 |
查看执行时间
1 | cat /var/lib/logrotate/logrotate.status # 查看上一次的 logrotate执行时间 |
创建shell脚本
1 | vim /server/scripts/cut_nginx_log.sh # 创建shell脚本 |
创建定时任务
1 | crontab -e # 创建定时任务,每天23:59分执行 |