参考地址:

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 blockupstream blockserver 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";
}

Njinx配置的更多相关文章

  1. 配置android sdk 环境

    1:下载adnroid sdk安装包 官方下载地址无法打开,没有vpn,使用下面这个地址下载,地址:http://www.android-studio.org/

  2. Android Studio配置 AndroidAnnotations——Hi_博客 Android App 开发笔记

    以前用Eclicps 用习惯了现在 想学学 用Android Studio 两天的钻研终于 在我电脑上装了一个Android Studio 并完成了AndroidAnnotations 的配置. An ...

  3. react-router 组件式配置与对象式配置小区别

    1. react-router 对象式配置 和 组件式配置    组件式配置(Redirect) ----对应---- 对象式配置(onEnter钩子) IndexRedirect -----对应-- ...

  4. 总结:Mac前端开发环境的搭建(配置)

    新年新气象,在2016年的第一天,我入手了人生中第一台自己的电脑(大一时好友赠送的电脑在一次无意中烧坏了主板,此后便不断借用别人的或者网站的).macbook air,身上已无分文...接下来半年的房 ...

  5. Android Studio 多个编译环境配置 多渠道打包 APK输出配置

    看完这篇你学到什么: 熟悉gradle的构建配置 熟悉代码构建环境的目录结构,你知道的不仅仅是只有src/main 开发.生成环境等等环境可以任意切换打包 多渠道打包 APK输出文件配置 需求 一般我 ...

  6. Virtual Box配置CentOS7网络(图文教程)

    之前很多次安装CentOS7虚拟机,每次配置网络在网上找教程,今天总结一下,全图文配置,方便以后查看. Virtual Box可选的网络接入方式包括: NAT 网络地址转换模式(NAT,Network ...

  7. [linux]阿里云主机的免登陆安全SSH配置与思考

    公司服务器使用的第三方云端服务,即阿里云,而本地需要经常去登录到服务器做相应的配置工作,鉴于此,每次登录都要使用密码是比较烦躁的,本着极速思想,我们需要配置我们的免登陆. 一 理论概述 SSH介绍 S ...

  8. nginx配置反向代理或跳转出现400问题处理记录

    午休完上班后,同事说测试站点访问接口出现400 Bad Request  Request Header Or Cookie Too Large提示,心想还好是测试服务器出现问题,影响不大,不过也赶紧上 ...

  9. Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)

    本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...

随机推荐

  1. opencv 替换图像中的一部分

    首先选取图像中的Roi区域,然后对Roi区域进行赋值,那么原图像相应的区域也跟着变化了: dst = src.clone(); cv::Mat Roi(dst, cv::Rect(x, y, cut_ ...

  2. es手动创建索引,修改索引,删除索引

    1.创建索引 创建索引的语法PUT /my_index{ "settings": { ... any settings ... }, "mappings": { ...

  3. oracle常见的执行计划

    访问表的执行计划: 全表扫描:TABLE ACCESS FULL ROWID扫描:TABLE ACCESS BY USER ROWID (ROWID来源于用户在where条件中的指定)或 TABLE ...

  4. 【托业】【新托业TOEIC新题型真题】学习笔记5-题库二->P7

    --------------------------------------单词-------------------------------------- amenity 适意:休闲设施 onsit ...

  5. 使用shell脚本监控用户登陆服务器并发送提示信息给微信

    1.需要在/etc/ssh/目录下面创建一个名为sshrc的文件,执行权限可给可不给,那么在有人通过ssh远程登录这台服务器的时候,这段脚本就会被执行 #!/bin/bash ###V1---### ...

  6. visual tudio 2017--发布

  7. Observer(__ob__: Observer) 对象添加属性

    重点通过这句话给对象添加属性: this.$set(r,'upshow',false); 在data中定义laws来装从接口中请求到数据 data(){ return{ laws:[],//法律依据 ...

  8. python的join用法

    1.使用方式: 字符串.join(序列) date = "".join(["2018-12-28", "00:00:00"])

  9. vue接口地址配一个全局的

    main.js加 if (process.env.NODE_ENV !== 'development') { Vue.prototype.URL_PREFIX = 'http://139.196.7. ...

  10. Spark算子之aggregateByKey详解

    一.基本介绍 rdd.aggregateByKey(3, seqFunc, combFunc) 其中第一个函数是初始值 3代表每次分完组之后的每个组的初始值. seqFunc代表combine的聚合逻 ...