Nginx常用基础模块
1、Nginx软件功能模块说明
模块名称 | 解释说明 |
---|---|
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的第三方模块:https://www.nginx.com/resources/wiki/modules/index.html
2、Nginx 站点目录浏览功能
需要在server或location段里添加上autoindex on 来启用浏览功能。
https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/ #结尾/斜线不要丢
server{
listen 80;
server_name mirrors.shnne.com;
charset utf-8;
autoindex on; #红花
#autoindex_exact_size off; #绿叶,默认on
#autoindex_localtime on; #绿叶,默认off
location / {
root /data/;
}
}
403三个原因:
1)没有首页,并且禁止目录浏览功能
2)站点目录没有访问权限
3)通过访问控制限制了访问
类似阿里云配置
server{
listen 80;
server_name mirrors.shnne.com;
charset utf-8;
root html;
location / {
index index.html;
}
#yum仓库目录
location /centos/ {
autoindex on;
}
}
3、Nginx访问控制功能
ngx_http_access_module 访问控制模块,用来控制网站用户对Nginx的访问
Syntax: allow address | CIDR | unix: | all;
Default: —
Context: http, server, location, limit_except
Allows access for the specified network or address. If the special value unix: is specified (1.5.1), allows access for all UNIX-domain sockets.
Syntax: deny address | CIDR | unix: | all;
Default: —
Context: http, server, location, limit_except
Denies access for the specified network or address. If the special value unix: is specified (1.5.1), denies access for all UNIX-domain sockets.
#先允许后拒绝,生产场景常用
server{
listen 80;
server_name mirrors.shnne.com;
charset utf-8;
root html;
location / {
index index.html;
}
#yum仓库目录,限制/centos目录
location /centos/ {
autoindex on;
allow 10.0.0.7; #允许单个IP地址
allow 10.0.0.0/24; #允许网段地址
deny all; #拒绝所有
}
}
#拒绝测试
server{
listen 80;
server_name mirrors.shnne.com;
charset utf-8;
root html;
location / {
index index.html;
}
#yum仓库目录,限制/centos目录
location /centos/ {
autoindex on;
deny 10.0.0.7; #拒绝单个IP地址
deny 10.0.0.0/24; #拒绝网段地址
allow all; #允许所有
}
}
在nginx反向代理后面的节点机器,如何获取最终网站用户的客户端机器IP?
解答:X_FORWARD_FOR
ngx_http_auth_basic_module Web认证模块,设置Web用户通过账号密码访问Nginx
yum -y install httpd-tools
[root@web01 ~]$rpm -ql httpd-tools
/usr/bin/ab #压测工具
/usr/bin/htpasswd #生成密码工具
[root@web01 ~]$htpasswd -b -c /etc/nginx/auth_pass oldboy 123456
Adding password for user oldboy
#改下权限
[root@web01 ~]$chown www.www /etc/nginx/auth_pass
[root@web01 ~]$chmod 600 /etc/nginx/auth_pass
[root@web01 ~]$ll /etc/nginx/auth_pass
-rw------- 1 www www 45 Dec 8 23:35 /etc/nginx/auth_pass
server{
listen 80;
server_name mirrors.shnne.com;
charset utf-8;
autoindex on;
#autoindex_exact_size off;
#autoindex_localtime on;
root /data
location / {
index index.html
}
location /admin {
#用户名密码验证
auth_basic "Auth access"; #这是一个提示
auth_basic_user_file /etc/nginx/auth_pass; #指定帐号密码文件
#来源IP限制
#allow 10.0.0.7;
#deny all;
}
}
4、Nginx请求限制、并发限制、限速三个模块
- 请求数限制:ngx_http_limit_req_module 限制某个客户端在单位时间内同时访问的Http请求数
- 并发连接频率限制:ngx_http_limit_conn_module 限制同一时间的并发数
- 下载限速:ngx_http_core_module 限制客户端下载资源速度
ngx_http_limit_req_module 模块
漏桶算法
Syntax: limit_req zone=name [burst=number] [nodelay | delay=number];
Default: —
Context: http, server, location
# http标签段定义请求限制,rate限制速率,限制一秒钟最多一个IP请求
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; #这个定义只能放在http模块下
server {
listen 80;
server_name mirrors.shnne.com;
#请求超过1r/s,剩下的将被延迟处理,请求数查过burst定义的数量,则返回503
location /search/ {
limit_req zone=one burst=5 nodelay;
}
# nodelay 表示允许请求队列在排队的时候立即被处理
ngx_http_limit_conn_module
Syntax: limit_conn zone number;
Default: —
Context: http, server, location
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
...
server {
...
location /download/ {
limit_conn addr 1;
}
limit_conn 配置,通过ab测试不生效的问题。
ab -c 4 -n 100 http://mirrors.shnne.com/centos/index.html
可能是因为模拟环境的问题,可能是文件小,可以通过dd建立大文件试试。
下载速度限制ngx_http_core_module
limit_rate_after 50m; #下载打到50m,开始限速
limit_rate 200k; #限制速度为200k
#用法
location /flv/ {
flv;
limit_rate_after 500k;
limit_rate 50k;
}
5、Nginx状态监控
ngx_http_stub_status_module 记录Nginx基本访问状态信息等模块
server {
listen 127.0.0.1;
location /status {
stub_status;
}
}
状态信息
Active connections | 当前活跃连接数,包括Waiting等待连接数。 |
---|---|
accepts | 已接收的总TCP连接数量。 |
handled | 已处理的TCP连接数量。 |
requests | 当前总http请求数量。 |
Reading | 当前读取的请求头数量。 |
Writing | 当前响应的请求头数量。 |
Waiting | 当前等待请求的空闲客户端连接数 |
Zabbix监控Nginx 状态信息 | |
https://www.cnblogs.com/bixiaoyu/p/9169319.html |
6、Nginx Location
Location用来控制访问网站的uri路径
#location作用
location指令作用是可以根据用户请求URI来执行不同的应用,URI的知识前面章节已经讲解过,其实就是根据用户请求的网站的地址URL匹配,匹配成功即进行相关的操作。
#location语法
location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
# 匹配符 匹配规则 优先级
# = 精确匹配 1
# ^~ 以某个字符串开头 2
# ~ 区分大小写的正则匹配 3
# ~* 不区分大小写的正则匹配 4
# / 通用匹配,任何请求都会匹配到 5
#location优先级示例
[root@web01 conf.d]# cat location01.etiantian.org.conf
server {
listen 80;
server_name location01.etiantian.org;
location = / {
default_type text/html;
return 200 'location = /';
}
location / {
default_type text/html;
return 200 'location /';
}
location /documents/ {
default_type text/html;
return 200 'location /documents/';
}
location ^~ /images/ {
default_type text/html;
return 200 'location ^~ /images/';
}
location ~* \.(gif|jpg|jpeg)$ {
default_type text/html;
return 200 'location ~* \.(gif|jpg|jpeg)';
}
}
匹配顺序实践:
[root@web01 conf.d]$nginx -t && systemctl reload nginx
#(1)等号精确匹配优先,no.1
[root@web01 conf.d]# curl http://location01.etiantian.org/
location = /
#(2)# ^~ ,以某个字符串开头no.2
[root@web01 conf.d]# curl http://location01.etiantian.org/images/1.gif
location ^~ /images/
#(3)~* 不区分大小写的正则匹配
[root@web01 conf.d]# curl http://location01.etiantian.org/documents/1.jpg
location ~* \.(gif|jpg|jpeg)
#(4)#目录匹配
[root@web01 conf.d]# curl http://location01.etiantian.org/documents/1.html
location /documents/ #目录匹配
#(5) / 通用匹配,任何请求都会匹配到no.5
[root@web01 conf.d]# curl http://location01.etiantian.org/index.html
location / #默认匹配最后。
#location02 @name,这样的location02不用于常规请求处理,而是用于重定向。
[root@web01 conf.d]# cat location02.etiantian.org.conf
server {
listen 80;
server_name location02.etiantian.org;
root /data;
#如果出现如下状态码,则重新从定向到@error_status
error_page 404 403 502 @error_status;
location @error_status {
default_type text/html;
return 200 '你的访问出了问题,我是oldboy.';
}
}
[root@web01 conf.d]# curl -H "host:location02.etiantian.org" http://10.0.0.7/oldboy
你的访问出了问题,我是oldboy.
7、Nginx日志
ngx_http_log_module
log_format定义日志格式语法
#配置语法: 包括: error.log access.log
Syntax: log_format name [escape=default|json] string ...;
Default: log_format combined "...";
Context: http
默认Nginx定义语法格式如下
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
Nginx日志格式中常用的变量
$remote_addr # 记录客户端IP地址
$remote_user # 记录客户端用户名
$time_local # 记录通用的本地时间
$time_iso8601 # 记录ISO8601标准格式下的本地时间
$request # 记录请求的方法以及请求的http协议
$status # 记录请求状态码(用于定位错误信息)
$body_bytes_sent # 发送给客户端的资源字节数,不包括响应头的大小
$bytes_sent # 发送给客户端的总字节数
$msec # 日志写入时间。单位为秒,精度是毫秒。
$http_referer # 记录从哪个页面链接访问过来的
$http_user_agent # 记录客户端浏览器相关信息
$http_x_forwarded_for #记录客户端IP地址
$request_length # 请求的长度(包括请求行, 请求头和请求正文)。
$request_time # 请求花费的时间,单位为秒,精度毫秒
# 注:如果Nginx位于负载均衡器,nginx反向代理之后, web服务器无法直接获取到客 户端真实的IP地址。
# $remote_addr获取的是反向代理的IP地址。 反向代理服务器在转发请求的http头信息中,
# 增加X-Forwarded-For信息,用来记录客户端IP地址和客户端请求的服务器地址。
#### 真实的日志内容为:
10.0.0.1- - [05/Apr/2015:12:16:00 +0800] "GET / HTTP/1.1" 200 25 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36" "-"
对应说明:
$remote_addr对应的真实日志里的10.0.0.100,即客户端的IP。
$remote_user对应的是第二个中杠“-”,没有远程用户,所以用“-”填充。
[$time_local]对应的是[05/Apr/2015:12:16:00 +0800]。
"$request"对应的是"GET / HTTP/1.1"。
$status对应的是200状态码,200是正常访问。
$body_bytes_sent对应的是25字节,响应body的大小。
"$http_referer"对应的是"-",直接打开的域名浏览,因此,referer没有值。
"$http_user_agent"对应的是"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36"。
"$http_x_forwarded_for"对应的是"-",因为Web服务没有使用代理,因此此处为"-"。
Nginx访问日志
#web服务器的访问日志是非常重要的,我们可以通过访问日志来分析用户的访问情况,也可以通过访问日志发现一些异常访问。
access_log日志配置语法。*
Syntax: access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
Default: access_log logs/access.log combined;
Context: http, server, location, if in location, limit_except
#Nginx访问日志配置例
server {
listen 80;
server_name mirrors.etiantian.org;
#将当前的server网站的访问日志记录至对应的目录,使用main格式
access_log /var/log/nginx/mirrors.etiantian.org.log main;
location / {
root /data;
index index.html;
}
}
# 日志压缩
server {
listen 80;
server_name mirrors.etiantian.org;
#将当前的server网站的访问日志记录至对应的目录,使用main格式
#access_log /var/log/nginx/mirrors.etiantian.org.log main;
access_log /var/log/nginx/mirrors.etiantian.org.access.log.gz main gzip=9 buffer=32k flush=5s;
location / {
root /data;
index index.html;
}
}
8、Nginx日志切割
#Nginx访问日志轮询切割
为什么Nginx访问日志轮询切割?
1.按天好进行相关分析。
2.单个日志过大。
#方法1:00点
mv access.log $(date +%F -d '-1d').accss.log
systemctl reload nginx
=============================================
[root@web01 scripts]# cat cut_nginx_log.sh
#!/bin/sh
Dateformat=`date +%Y%m%d -d -1day`
Nginxlogdir="/var/log/nginx/"
Logname="mirrors.etiantian.org.access.log.gz"
#第一关
[ -d $Nginxlogdir ] && cd $Nginxlogdir||exit 1
#第二关
[ -f $Logname ]||exit 1
#第三关
/bin/mv $Logname ${Dateformat}_$Logname
#第四关
systemctl reload nginx
每天00点00分进行日志滚动
#####
00 00 * * * /bin/sh /server/scripts/cut_nginx_log.sh &>/dev/null
#方法2:logrotate工具切割
/etc/logrotate.d/nginx
[root@web01 scripts]# cat /etc/logrotate.d/nginx
/var/log/nginx/*.log.gz {
daily #按天数切割
dateext #归档旧日志文件时,文件名添加YYYYMMDD形式日期
missingok
rotate 52 #切割日志保留多少份
#compress #通过gzip压缩转储以后的日志
delaycompress
notifempty #如果是空文件,不转储
create 640 nginx adm
sharedscripts #表示postrotate只执行一次
postrotate #在转储医院后需要执行的命令
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
每天00点00分进行日志滚动
#crontab -e
00 00 * * * /usr/sbin/logrotate -f /etc/logrotate.d/nginx &>/dev/null
9、Nginx日志过滤
*一个网站会包含很多元素,尤其是有大量的图片、js、css等静态资源。这样的请求其实可以不用记录日志。*
#访问静态资源gif、png等时,将日志丢入空
location ~* .*\.(gif|jpg|png|css|js)$
{
access_log /dev/null;
}
10、Nginx错误日志
Nginx错误日志
#Nginx错误日志级别
常见的错误日志级别有debug | info | notice | warn | **error** | crit | alert | emerg
级别越高记录的信息越少,如果不定义,默认级别为error.
它可以配置在main、http、server、location段里
日志可以用json格式
#Nginx错误日志示例
error_log /var/log/nginx/error.log crit;
#如果要想彻底关闭error_log,需要这样配置error_log /dev/null;
负载均衡日志不能开比error更低的级别
不能开iptables及firewalld防火墙(用硬件防火墙,或者开在web主机上)
nginx错误码原因以及解决方案
http://www.laoseng.net/articles/2014/12/18/1418884520679.html
#400 bad request错误的原因和解决办法**
配置nginx.conf相关设置如下.
client_header_buffer_size 16k;
large_client_header_buffers 4 64k;
根据具体情况调整,一般适当调整值就可以。
#Nginx 502 Bad Gateway错误**
proxy_next_upstream error timeout invalid_header http_500 http_503;
或者尝试设置:
large_client_header_buffers 4 32k;
#Nginx出现的413 Request Entity Too Large错误**
这个错误一般在上传文件的时候会出现,
编辑Nginx主配置文件Nginx.conf,找到http{}段,添加
client_max_body_size 10m; //设置多大根据自己的需求作调整.
如果运行php的话这个大小client_max_body_size要和php.ini中的如下值的最大值一致或者稍大,这样就不会因为提交数据大小不一致出现的错误。
post_max_size = 10M
upload_max_filesize = 2M
#解决504 Gateway Time-out(nginx)**
遇到这个问题是在升级discuz论坛的时候遇到的
一般看来, 这种情况可能是由于nginx默认的fastcgi进程响应的缓冲区太小造成的, 这将导致fastcgi进程被挂起, 如果你的fastcgi服务对这个挂起处理的不好, 那么最后就极有可能导致504 Gateway Time-out
现在的网站, 尤其某些论坛有大量的回复和很多内容的, 一个页面甚至有几百K。
默认的fastcgi进程响应的缓冲区是8K, 我们可以设置大点
在nginx.conf里, 加入: fastcgi_buffers 8 128k
这表示设置fastcgi缓冲区为8×128k
当然如果您在进行某一项即时的操作, 可能需要nginx的超时参数调大点,例如设置成60秒:send_timeout 60;
只是调整了这两个参数, 结果就是没有再显示那个超时, 可以说效果不错, 但是也可能是由于其他的原因, 目前关于nginx的资料不是很多, 很多事情都需要长期的经验累计才有结果.