参考地址:
NGINX的百度百科:https://baike.baidu.com/item/nginx/3817705?fr=aladdin
NGINX的中文网站:http://www.nginx.cn/doc/
Njinx配置,Njinx作为一款高性能的http和反向代理服务组件,我们组要是学习如何配置和使用即可,以及出现问题如何排查解决;
Nginx的配置文件是以block的形式组织的,一个block通常使用大括号“{}”表示。block分为几个层级:
Nginx General Config
定义一些nginx
使用的全局变量,例如:
-
user nginx;
:指定nginx
工作进程的启动用户,为了安全我们强制指定使用nginx
用户。 -
worker_processes auto;
:nginx
启动的工作进程数,auto
表示自动适配当前服务器的cpu
核数 -
pid /usr/local/nginx/nginx.pid;
:记录nginx
启动后获取到的系统进程号文件位置,千万不要修改,启动脚本等都依赖这个文件
-
error_log logs/error.log;
:记录错误日志文件。
http层级包含server block
和upstream block
,server block
中包含location block。
-
Http General Config
:控制nginx http
处理的所有核心特性 -
upstream block
:定义反向代理服务器upstream
信息 -
server层
:server
是一个host
抽象。 -
location层
:定义需要反向代理的url
。
每一个block
中包含多个指令(例如proxy_connect_timeout 75s;
),指令可以存在于多个层级,在这种情况下,子block会继承父block的配置,同时如果子block配置了与父block不同的指令,则会覆盖掉父block的配置。指令的格式是“指令名 参数1 参数2 … 参数N;”,注意参数间可用任意数量空格分隔,最后要加分号;
Nginx
在处理请求时会按照最准确匹配的
原则将请求转发至对应的upstream
服务器上,例如一下配置
location /aaaa {
proxy_pass http://wmqiangjweb1;
}
location /aaaa/bbbb {
proxy_pass http://wmqiangjweb2;
}
当请求/aaaa/bbbb
时会将请求发送给wmqiangjweb1,对应的服务处理而不是wmqiangjweb2;
默认参数配置说明:
#后端服务器连接的超时时间_发起握手等候响应超时时间
proxy_connect_timeout 75s;
#连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)
proxy_read_timeout 60s;
#后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
proxy_send_timeout 60s;
#请求body中最大的大小,配置为0,不检测大小。
client_max_body_size ;
#转发请求头中请求信息,该配置必须配置,框架中需要读取,否则将出现读取跳转错误
proxy_set_header Host $http_host;
#给客户端分配keep-alive链接超时时间。服务器将在这个超时时间过后关闭链接
keepalive_timeout ;
#worker进程的最大打开文件数限制
worker_rlimit_nofile ;
#页面传输启用gzip压缩
gzip on;
#性能监控插件
vhost_traffic_status_zone;
#定义性能请求监控页面访问的地址
location /epoint_base_status {
auth_basic "epointsafe";
auth_basic_user_file /usr/local/nginx/conf/htpasswd;
vhost_traffic_status_display;
vhost_traffic_status_display_format html;
}
#指定记录访问日志,且记录的位置为安装目录下logs目录中
access_log logs/access.log main;
##########ip请求地理位置插件的查询数据库##########
geoip2 /usr/local/nginx/conf/GeoLite2-Country.mmdb {
$geoip2_data_country_code default=US country iso_code;
$geoip2_data_country_name country names en;
} geoip2 /usr/local/nginx/conf/GeoLite2-City.mmdb {
$geoip2_data_city_name default=Private city names en;
$geoip2_data_subdivisions_name default=JiangSu subdivisions names en;
}
#每个请求最大body的大小,注意是每一次请求,所以对于post请求上传文件应该是足够大的
client_max_body_size 64M;
proxy_set_header X-Forwarded-Proto $scheme; # 该配置项在server中,该配置项用于将https访问时可以把请求协议透传过去
Nginx日志有关:
#nginx日志定义格式
log_format main '$time_local ^A $remote_addr ^A $request_method '
^A '$request_uri ^A $uri ^A $request_time '
^A '$status ^A $body_bytes_sent '
^A '$geoip2_data_country_name ^A $geoip2_data_subdivisions_name ^A $geoip2_data_city_name '
^A '$http_referer ^A $upstream_addr ^A $upstream_response_time '
^A '$http_user_agent ^A $http_x_forwarded_for';
如上的日志格式在查看access.log
时,您将看到如下图所示的信息
每一个[]
为特殊的分割符,由格式字符串中^A
定义,大家不可修改该字符,因为后续我们的一体化运营监控平台将解析此特殊字符作为系统处理数据,如果您想加入特殊的日志字段,请后面追加您打印的变量。针对默认的日志格式说明如下:
-
$time_local
:本地时间 -
$remote_addr
:请求客户端IP
地址 -
$request_method
:请求方法 -
$request_uri
:请求的URL
,不带有请求的参数 -
$uri
:请求的URL
,带有请求的参数 -
$request_time
:请求处理时间,即响应时间 -
$status
:返回状态 -
$body_bytes_sent
:发送body
大小 -
$geoip2_data_country_name
:请求所属的国家 -
$geoip2_data_subdivisions_name
:请求所属的省份或地区 -
$geoip2_data_city_name
:请求所属的城市 -
$http_referer
:请求来自于何处,例如从百度跳转过来 -
$upstream_addr
:请求转发的后端服务器地址 -
$upstream_response_time
:后端服务器响应的时间 -
$http_user_agent
:访问客户端信息,可以获取到请求浏览器版本信息等 -
$http_x_forwarded_for
:请求经过的代理信息
修改当前NGINX日志保留的天数
#!/bin/bash
HISTORY_DAY=$
if [[ ${HISTORY_DAY} == "" ]];then
HISTORY_DAY= # 修改此处为180即可
fi
NGX_PIDS="-1"
YEAR=$(date +%Y)
MONTH=$(date +%m)
DAY=$(date +%d)
..........省略部分输出.........
最佳实践
所以实际使用中,三个常用匹配规则
定义:
直接匹配跟网站:
# 直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理。
# 这里是直接转发给后端应用服务器了,也可以是一个静态首页
# 第一个必选规则
location = / { # 注意,这里是 =/ 优先级最高
proxy_pass http://tomcat:8080/index
}
静态文件处理:
# 第二个必选规则是处理静态文件请求,这是 nginx 作为 http 服务器的强项
# 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ {
root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}
通用默认处理:
# 第三个规则就是通用规则,用来转发动态请求到后端应用服务器
# 非静态文件请求就默认是动态请求,自己根据实际把握
# 毕竟目前的一些框架的流行,带.php、.jsp后缀的情况很少了
location / {
proxy_pass http://tomcat:8080/
}
Location匹配测试技巧:
要测试访问某个URL,到底会命中哪条Location,则可以使用下面的方式进行测试(不需要后端有Tomcat支持)
location ~ .*\.jpg {
return "" "A"; # return HTTP_STATUS_CODE String
# 这个意思为 返回 HTTP状态为200 内容为字符串A 的响应
} location ~ /dbabook/.*\.jpg {
return "" "B";
}