您当前的位置:首页 > 电脑百科 > 站长技术 > 服务器

Nginx秘籍之开发人员篇

时间:2021-06-29 09:52:20  来源:今日头条  作者:虫虫安全

要问目前哪个Web服务器最流行,可能大家都会说是Nginx。这个老毛子开发的神器凭借高性能了、友好的配置、优秀的模块机制,反向代理支持迅速占领市场并走上Web服务器市场的No1. 本文我们就来谈谈对于开发人员来说Nginx的一些妙用方法。

Nginx秘籍之开发人员篇

 

从这个简单的配置,我们可以开始构建必要的复杂性。

主动/被动代理配置

如果服务需要以一台服务器为主的主动/被动配置 对于请求处理,将一个后端服务器做备份,配置方法如下:

...
upstream backend {
server job:10000;
server backup:10000 backup;
}
...

Backup选项指示,表示nginx将使用该服务器为备用服务器,只有当主服务器(job:10000)不可用时候,才会代理到backup:10000。

默认情况下,服务器在1次连接错误或超时后标记为不可用。但是该阈值可以通过max_fails来配置:

...
upstream backend {
# 主服务器失败尝试3次
server job:10000 max_fails=3;
# 备用服务器尝试失败次数10
server backup:10000 backup max_fails=10;
}
...

除了连接错误和超时,还可以使用HTTP 状态码,比如500,502等来定义不可用状态。该配置,由proxy_next_upstream语句定义。

...
upstream backend {
server job:10000;
server backup:10000 backup;
}
server {
server_name proxy;
listen 8000;
# 在连接错误,超时或者http 429(请求超出)的时候时候,跳转到下一个pstream。
proxy_next_upstream error timeout http_429;
location / {
proxy_pass http://backend;
}
}
...

代理K8s服务

如果要代理K8s集群服务,由于其自带负载均衡配置中应该设置max_fails=0,以免踢掉正常的服务器:

...
upstream backend {
server cck8s.svc max_fails=0;
}
...

这样nginx就不会将 K8s服务标记为不可用。即不会去尝试做被动健康检查,直接利用的K8s集群的主动健康检查。

灵活的路由 map

有时需要根据某些HTTP标头值路由请求。比如查询范围、cookie值或、主机名或者他们的任意组合。这是Nginx最强大的地方,其他同类的代理基本上都做不到这一点。Nginx请求路由的关键是ngx_http_map_module。该模块允许从组合中定义变量带有正则表达式的变量。假设微服务架构中有3个后端服务来处理不同类型的数据:

返回刚刚收集的最新数据的实时数据服务。

返回旧数据的历史数据服务。

返回预先计算的数据的聚合数据服务。

这些服务通过相同的接口提供用户服务,接口形式如下

<date>.cc.api/?report=<report>

现在有几个用户用例:

2021-04-01.cc.api/?report=list_records 应该提供历史数据服务。
cc.api/?report=list_records 应该提供实时数据服务。
cc.api/?report=counters提供聚合数据服务。
2018-11-01.cc.api/?report=counters 提供历史聚合数据服务。

如果自己在程序中自己写路由则非常复杂,而用Nginx可以帮你通过很少配置就搞定:

首先,定义3个后端服务器:

upstream live {
server live1:8000;
server live2:8000;
server live3:8000;
}
upstream hist {
server hist1:9999;
server hist2:9999;
}
upstream agg {
server agg1:7100;
server agg2:7100;
server agg3:7100;
}

接下来,定义将侦听所有请求并以某种方式路由提供服务:

server {
server_name *.cc.api "";
listen 80;
location / {
proxy_pass http://???;
}
}

问题是我们应该写什么proxy_pass指示?

由于nginx配置是声明性的,可以编写 proxy_pass http://$destination/并使用map构建目标变量。

示例服务中,根据report请求变量和日期子域名,提取到变量中的内容为:

map $host $date {
"~^((?<subdomain>d{4}-d{2}-d{2}).)?cc.api$" $subdomain;
default "";
}

Map会通过正则解析$host变量,并将解析结果设置$date。

此处主要使用了有2条map规则 :主要的规则是正则表达式,另一个是后备表示为default关键词。

正则表示式子,我们不在详细介绍,如果有兴趣可以搜索虫虫以前的文章。此处规则为^开头,提取时间子域名:

d{4}-d{2}-d{2}解析日期格式 2021-06-28。

?<subdomain>被称为捕获组,它只是为匹配的部分命名正则表达式。然后在映射规则的右侧使用捕获组来分配。$date多变,而且子域是可选的,因此需要 用圆括号括起来(子域分隔符)并在整个组前添加?。

要提取report,无需使用map,nginx的arg_<param>查询参数的是预定义变量。 可以直接用$arg_report。

好的,有了日期report告。接着构建 $destination变量,用另一个map,诀窍是在后面map中可以利用上面的变量(包括自定义的)创建新变量的变量组合:

map "$arg_report:$date" $destination {
"~counters:.*" agg;
"~.*:.+" hist;
default live;
}

这里的组合是一个字符串,其中2个变量用冒号连接。冒号是个人选择,用于方便。实际上可以使用任何符号,只要确保正则表达式是明确的。

在map,有3个规则。

首先是设置$destination到gg时report查询参数是 counters。

二是设置 $destination到 hist时,$date变量不为空。

当没有其他匹配时设置的默认值是设置$destination至 live。

map中的正则表达式按顺序进行评估。

注意 $destinationvalue 是代理后端的名称。

完整的配置如下:

events {}
http {
upstream live {
server live1:8000;
server live2:8000;
server live3:8000;
}
upstream hist {
server hist1:9999;
server hist2:9999;
}
upstream agg {
server agg1:7100;
server agg2:7100;
server agg3:7100;
}
map $host $date {
"~^((?<subdomain>d{4}-d{2}-d{2}).)?cc.api$" $subdomain;
default "";
}
map "$arg_report:$date" $destination {
"~counters:.*" agg;
"~.*:.+" hist;
default live;
}
server {
server_name *.cc.api "";
listen 80;
location / {
proxy_pass http://$destination/;
}
}
}

转发请求给Consul服务

如果使用Consul进行服务发现,则可以通过以下方式访DNS。 简单的

curl myApp.service.consul

非常方便,但没有人知道如何解析名称 .consul zone。

无论如何,要通过 Consul DNS 在 nginx 中路由请求很一件。nginx有一个 resolver模块nginx 中用于使用自定义 DNS 服务器的指令(注意就是最近爆严重漏洞的那个高危写入漏洞的CVE-2021-23017的模块,记得升级哦)。

以下下面是配置Nginx转发DNS请求给Consul配置:

...
server {
server_name *.cc.api "";
listen 80;
# 解析使用Consul DNS. 递归请求到114和谷歌DNS.
resolver 10.0.0.1:8600 10.0.0.2:8600 10.0.0.3:8600 114.114.114.114 8.8.8.8
location /v1/api {
proxy_pass http://prod.cc.api.consul/;
}
location /v1/rpc {
proxy_pass http://prod.rpc.service.consul/;
}
}
...

结论

Nginx 是一个非常通用的工具。 它有丰富的配置语言为开发人员提供不错的功能。比如具有配置故障转移的主动/被动负载平衡、灵活的请求路由与Consul DNS 轻松集成等。虽然有些配置比较丑,甚至使用了可怕的正则,但是这也许就是他的魅力所在吧。



Tags:Nginx   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
项目中,遇到了一个问题,就是PDF等文档不能够在线预览,预览时会报错。错误描述浏览器的console中,显示如下错误:nginx代理服务报Mixed Content: The page at ******** was loaded...【详细内容】
2021-12-17  Tags: Nginx  点击:(7)  评论:(0)  加入收藏
前言Nginx是前后端开发工程师必须掌握的神器。该神器有很多使用场景,比如反向代理、负载均衡、动静分离、跨域等等。把 Nginx下载下来,打开conf文件夹的nginx.conf文件,Nginx服...【详细内容】
2021-12-08  Tags: Nginx  点击:(18)  评论:(0)  加入收藏
最近客户有个新需求,就是想查看网站的访问情况,由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的页...【详细内容】
2021-10-09  Tags: Nginx  点击:(48)  评论:(0)  加入收藏
安全服务器是只允许所需数量的服务器。理想情况下,我们将通过单独启用其他功能来基于最小系统构建服务器。进行最少的配置也有助于调试。如果该错误在最小系统中不可用,则分别...【详细内容】
2021-09-26  Tags: Nginx  点击:(60)  评论:(0)  加入收藏
在今年的NGINX Sprint 2.0虚拟大会上,NGINX(来自流行的开源web服务器/负载均衡器和反向代理背后的公司F5),发布了NGINX现代应用参考架构(MARA)。该公司在一篇博客文章中说,这将帮...【详细内容】
2021-09-26  Tags: Nginx  点击:(60)  评论:(0)  加入收藏
Ubuntu下安装Nginx一、系统基本信息查看1、查看Ubuntu版本信息:使用命令:cat /proc/version 查看~$ cat /proc/versionLinux version 4.15.0-106-generic (buildd@lcy01-amd6...【详细内容】
2021-09-16  Tags: Nginx  点击:(60)  评论:(0)  加入收藏
出于安全审查或者对于系统安全性的要求,都要求我们生产环境部署的系统需要做一定的权限控制。那么如何简单快速地部署满足安全要求的权限系统呢?其实可以通过nginx的相关功能...【详细内容】
2021-09-07  Tags: Nginx  点击:(69)  评论:(0)  加入收藏
什么是NginxNginx(engine x)是一个高性能的HTTP和反向代理服务器,具有内存少,高并发特点强。1、处理静态文件,索引文件以及自动检索打开文件描述符缓冲2、无缓冲的反向代理加速...【详细内容】
2021-09-02  Tags: Nginx  点击:(70)  评论:(0)  加入收藏
本文适用于 php7.4+NGINX环境,适用于运行 wordpress 环境一、更新服务器sudo apt update二、命令快捷缩写设置通过ssh登录服务器,在用户目录下执行以下命令sudo nano .bashrca...【详细内容】
2021-08-31  Tags: Nginx  点击:(87)  评论:(0)  加入收藏
一、nginx正向代理介绍及配置(需要在客户端配置代理服务器进行指定网站访问)#模块 ngx_http_proxy_module: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy...【详细内容】
2021-08-16  Tags: Nginx  点击:(75)  评论:(0)  加入收藏
▌简易百科推荐
阿里云镜像源地址及安装网站地址https://developer.aliyun.com/mirror/centos?spm=a2c6h.13651102.0.0.3e221b111kK44P更新源之前把之前的国外的镜像先备份一下 切换到yumcd...【详细内容】
2021-12-27  干程序那些事    Tags:CentOS7镜像   点击:(1)  评论:(0)  加入收藏
前言在实现TCP长连接功能中,客户端断线重连是一个很常见的问题,当我们使用netty实现断线重连时,是否考虑过如下几个问题: 如何监听到客户端和服务端连接断开 ? 如何实现断线后重...【详细内容】
2021-12-24  程序猿阿嘴  CSDN  Tags:Netty   点击:(12)  评论:(0)  加入收藏
一. 配置yum源在目录 /etc/yum.repos.d/ 下新建文件 google-chrome.repovim /etc/yum.repos.d/google-chrome.repo按i进入编辑模式写入如下内容:[google-chrome]name=googl...【详细内容】
2021-12-23  有云转晴    Tags:chrome   点击:(7)  评论:(0)  加入收藏
一. HTTP gzip压缩,概述 request header中声明Accept-Encoding : gzip,告知服务器客户端接受gzip的数据 response body,同时加入以下header:Content-Encoding: gzip:表明bo...【详细内容】
2021-12-22  java乐园    Tags:gzip压缩   点击:(8)  评论:(0)  加入收藏
yum -y install gcc automake autoconf libtool makeadduser testpasswd testmkdir /tmp/exploitln -s /usr/bin/ping /tmp/exploit/targetexec 3< /tmp/exploit/targetls -...【详细内容】
2021-12-22  SofM    Tags:Centos7   点击:(7)  评论:(0)  加入收藏
Windows操作系统和Linux操作系统有何区别?Windows操作系统:需支付版权费用,(华为云已购买正版版权,在华为云购买云服务器的用户安装系统时无需额外付费),界面化的操作系统对用户使...【详细内容】
2021-12-21  卷毛琴姨    Tags:云服务器   点击:(6)  评论:(0)  加入收藏
参考资料:Hive3.1.2安装指南_厦大数据库实验室博客Hive学习(一) 安装 环境:CentOS 7 + Hadoop3.2 + Hive3.1 - 一个人、一座城 - 博客园1.安装hive1.1下载地址hive镜像路径 ht...【详细内容】
2021-12-20  zebra-08    Tags:Hive   点击:(9)  评论:(0)  加入收藏
以下是服务器安全加固的步骤,本文以腾讯云的CentOS7.7版本为例来介绍,如果你使用的是秘钥登录服务器1-5步骤可以跳过。1、设置复杂密码服务器设置大写、小写、特殊字符、数字...【详细内容】
2021-12-20  网安人    Tags:服务器   点击:(7)  评论:(0)  加入收藏
项目中,遇到了一个问题,就是PDF等文档不能够在线预览,预览时会报错。错误描述浏览器的console中,显示如下错误:nginx代理服务报Mixed Content: The page at ******** was loaded...【详细内容】
2021-12-17  mdong    Tags:Nginx   点击:(7)  评论:(0)  加入收藏
转自: https://kermsite.com/p/wt-ssh/由于格式问题,部分链接、表格可能会失效,若失效请访问原文密码登录 以及 通过密钥实现免密码登录Dec 15, 2021阅读时长: 6 分钟简介Windo...【详细内容】
2021-12-17  LaLiLi    Tags:SSH连接   点击:(16)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条