- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章写给运维的Nginx秘籍由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
要说Web服务器、代理服务器和调度服务器层面,目前使用最大的要数Nginx。对于一个运维工程师日常不可避免要和Nginx打交道。为了更好地使用和管理Nginx,本文就给大家介绍几个虫虫日常常用的秘籍.
当Nginx开放到公网上以后,就会有大量的非正常访问,这不光耗费服务器资源,而且有可能是某种信息探索,然后攻击的前奏,有对针对性的限制这些访问很有必要。在Nginx中可以通过一些内置的变量来进行限制访问.
在nginx可以使用$http_user_agent变量匹配客户类型,然后对对匹配的访问return 4.3来限制器访问.
在Nginx配置的server部分,直接用if语句实现:
但是如果要匹配的客户端代理比较多时候,直接这样拼写就比较繁琐也不好管理。这种情况下给大家一个技巧就是用Map函数.
Map函数在Nginx ngx_http_map_module中实现的。利用Map函数可以创建一个变量,并将其与其他变量(比如内置的$http_user_agent)关联起来,可以同时关联多个值到多个不同值并储存到一个变量。其基本语法为:
其作用于为http模块,这样可以在开头映射后,然后在具体的server部分进行封禁.
对应本例子中:
这样在后续if封禁语句中就可以使用新建的$ban变量进行封禁了.
有时候对一些恶意来源的IP封禁则更为直接简单有效。Nginx进行IP封禁的方法也很简单,直接用deny语句,他是Nginx内置模块ngx_http_access_module,支持allow和deny两个语句,基本语法为:
可以在http或者server块直接使用:
如果要封闭的IP很多,可以直接在nginx配置文件中include一个封禁文件专管理封禁的IP.
在banip.conf文件中用:
这样语句即可,当然也可以用allow和deny all搞成实时上的白名单限制模式:
这样除了本机、18位的内网段和110.242.68.66外其他IP都会禁止访问.
除了直接限制访问外很多时候,不能直接限制其访问,但是需要针对特定请求限制访问的速率(频率)。在Nginx速率限制通过limit_req_zone和limit_req两个指令实现.
limit_req_zone用来定义请求限制区域。区域包含有关如何分类的配置请求速率限制和实际限制.
limit_req将区域应用于特定http上下文对于全局限制,server每个虚拟服务器,以及location对于虚拟中的特定位置服务器.
为了说明这一点,假设要实现速率限制配置:
要对请求进行分类,需要提供索引到 limit_req_zone。键通常是一些变量,要么由nginx预定义,要么由通过map定义.
要通过IP设置全局速率限制,需要以IP作为键.
现在,通过以下方式限制搜索蜘蛛的User-Agent,此处我们使用map函数:
上面配置中通过map设置$crawler变量作为limit_req_zone的键。limit_req_zone对于不同的客户端必须有不同的值才能正确计算请求计数。如果请求不是来自crawler,使用一个空字符串来禁用速率限制.
对API令牌限制请求,使用map创建一个多个键,对应其速率限制区域:
下面我们来看看 AuthorizationAPI 令牌的标头,如 Authorization: Bearer 1234567890. 如果我们匹配一些已知的标记,我们使用该值$eclients为了变量,然后其作为键引入到limit_req_zone.
请注意,配置中必须添加globa区域作为后备,非匹配的情况.
最后总结一下速率限制的流程:
除了速率限制,Nginx也有一个请求频率限制方法limit_conn_zone和对应的 limit_conn用来限制请求的频次。其使用方法,具体和limit_req_zone以及limit_req的方法也类似,下面是一个例子:
Nginx 最大的用途是作为代理缓存服务器。假设请求代理到某个后端应用服务器,后端服务器返回请求数据的成本很高。则可以通过缓存它来减少后端的负载.
在此示例中,通过添加 $http_customer_token保存值的变Customer-Token HTTP 标题。然后,与速率限制一样,定义缓存区域应用于服务器、位置或全局使用 proxy_cache指示。另外还要配置缓存失效。 默认情况下,仅对200、301 和 302 HTTP状态码响应缓存,超过10分钟更新一次缓存内容。另外对于后端服务器Nginx会遵守其指示性的Http头,例如Cache-Control标头。如果标头包含类似no-store,must-revalidate,nginx则不会对其缓存响应。可以在Nginx配置 。
来覆盖该行为.
因此,要配置 nginx 缓存失效,请执行以下操作:
从Nginx访问日志是个大宝藏,我们可以通过其挖掘当前Web服务的在线状态,使用状态和用户信息。但是其默认访问日志有点太简陋,需要对其进行配置增加必须的字段,调整其位置,使其更加格式化。Nginx日志的配置需要用 log_format语句。一个典型的配置如下:
上述配置中,除了常见的各种字段外,另外增加了$ssl_client_s_dn $ssl_client_serial和$ssl_client_verify,用于在https双向认证时候客户的端用CA签发dn信息,用户证书序列号用来记录合法认证的用户信息.
另外为了和ELK或者其他日志系统的集成使用json格式的结构化日志很有必要,可以使用graylog将文本日志转化,也可以直接在Nginx配置生成:
escape=json选项将替换不可打印的字符,如换行符和转义值,例如\n. 引号和反斜杠也将被转义.
如果是K8S容器云节点的服务可以,直接用filter用来指定:
运维部门为了保证服务升级,往往会采用灰度发布的方式,逐步将用户切换到新的版本中.
在Nginx 可以用split_client模块实现提供逐步升级的功能。他有点类似像map函数,但不是通过某种模式设置变量,而是创建来自源变量分布的变量。下面一个例子:
在此示例中,app_switch和split_clients cookie 值结合生成调度键。如果 cookie设置为设置$destination调度到上游的new为1。 否则,从 split_clients调度。这是在生产一种用于测试新系统的功能标志:拥有cookie集用户都将始终请求到new.
键的分布是一致的。如果已将API键用于split_clients那么具有相同API键的用户将始终被放入同一组.
使用此配置,可以将流量分流到新系统,从小百分比开始并逐渐增加。当然修改百分比参数后,不需要reload才能生效.
本文我们介绍一些日常运维中Nginx的管理秘籍,当然密不密不是绝对只是个人看法,希望以此抛砖引玉,如果你有任何建议和建议补充,可以回复说明.
原文地址:https://www.toutiao.com/a7029620648167145996/ 。
最后此篇关于写给运维的Nginx秘籍的文章就讲到这里了,如果你想了解更多关于写给运维的Nginx秘籍的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
很感谢夜莺提供如此优质的平台能和行业内顶尖技术大佬做面对面的交流,在这个会议中又学习到了很多有趣有深度的内容,给我在未来探索的道路上提供了一些新的指引方向。同时感谢夜莺社区的邀请,在此再做一次关于
一、前言 在一次生产环境发布后,运维对我说,你这个日志打印了两遍,你看一下,我很好奇,打印了两遍,本地和测试都没有这个问题啊,然后运维就发了下面两个文件给我,一看还真是,日志怎么打印了两遍 启动也是日
我是一名优秀的程序员,十分优秀!