「jiacrontab」- 简单可信赖的任务管理工具(Crontab)

架构简介
采用 Server / Node 架构,由 jiacrontab_admin(Server),jiacrontabd(Node) 两部分构成
jiacrontab_admin(Server):提供管理界面(Web GUI),负责管理多个 jiacrontabd(Node)节点。
jiacrontabd(Node):负责存储定时任务,并进行任务调度(执行)
项目地址:https://github.com/iwannay/jiacrontab 使用文档:没有找到官方文档,只能参考配置文件中的说明
参考文献
GitHub/iwannay/jiacrontab/README.md[……]

READ MORE

「MICROSERVICES」- 服务发现(Service Discovery)

服务发现有三个角色:「服务提供者」、「服务消费者」、「服务中介」。「服务中介」是联系「服务提供者」和「服务消费者」的桥梁。「服务提供者」将自己提供的服务地址注册到「服务中介」,「服务消费者」从「服务中介」那里查找自己想要的服务的地址,然后享受这个服务。「服务中介」提供多个服务,每个服务对应多个「服务提供者」。
参考文献
服务发现的基本原理[……]

READ MORE

「Consul」- 啥玩意儿啊?

Consul是目前较为流行的一个「服务发现」以及「配置工具」。
Consul能够承担包括服务注册与发现、健康检查(health check)以及键值对存储等,同时还支持多个数据中心。

如上图所示,基于Consul的微服务一般都是集群。集群由一个个的「Consul Agent」组成。在这些「Consul Agent」里面,分为两种角色:Server、Client。Consul是基于Raft协议实现的,这些Server里包含了Raft中的Leader以及Follower。而Client则只是向这些Server进行键值对的读/写。
服务注册/反注册机制
当我们在本地启动「Consul Agent」之后,我们可以通过Consul的Restful Api(curl -request PUT http://consul/v1/agent/service/register)向Consul Agent注册服务信息,提交服务的端口号、IP地址、健康检查的方式。随后,这个Client就按照配置中的周期以及方式执行健康检查。当健康检查失败的时候,就会像Server Agent发送服务不可用的消息,这个服务就会被Consul标记为不可用了。
我们也能够通过Get方法请求相同的地址来获取当前Agent中注册的所有服务信息。
部署安装
Install with Helm Chart – Kubernetes | Consul by HashiCorp
参考文献
浅谈服务发现[……]

READ MORE

「Zookeeper」- 这东西是干啥的?

ZooKeeper一个最常用的使用场景就是用于担任「服务生产者」和「服务消费者」的注册中心。
「服务生产者」将自己提供的服务注册到 ZooKeeper 中心,「服务消费者」在进行服务调用的时候先到 ZooKeeper 中查找服务,获取到「服务生产者」的详细信息之后,再去调用「服务生产者」的内容与数据。
如下图所示,在 Dubbo 架构中 ZooKeeper 就担任了注册中心这一角色:
参考文献
Apache Dubbo (incubating) Project 这可能是把ZooKeeper概念讲的最清楚的一篇文章[……]

READ MORE

「Search Engine」

章节列表
「搜索引擎软件」 「SEO」- 搜索引擎优化 「Sphinx」- 全文搜索引擎 「MMSEG」- A Word Identification System for Mandarin Chinese Text 「Ads」- 广告联盟及相关知识学习 「Coreseek」 「Google AdSense」- 谷歌广告[……]

READ MORE

「Ads」- 广告联盟及相关知识学习

问题描述
我们总要吃饭吧,所以我们尝试在站点中接入广告。因此我们需要进行一些简单的了解与调研。
该笔记将记录:与网站广告相关的内容,比如形势、盈利、广告联盟的对比、介入方法等等。
计费模式
CPM(Cost Per Mille):弹窗形式广告
按照展示次数盈利。每千人成本,网上广告收费。
根据独立IP用户访问广告联盟旗下合作媒体的网站时,弹出广告商的目标页面来计费,相同IP用户24小时内反复弹出只计费一次,如果弹窗被浏览器拦截,将不会计费。 优势:这种广告形式对于用户群较大的广告商来说是一种性价比很高的推广形式,在迅速提升了网站访问量的同时,会沉淀下很多用户,对于初创的网站来说无疑是很好的推广选择。 展现形式:直接全屏弹出要宣传的页面
CPC(Cost Per Click):点击形式广告
按照点击次数盈利。每点击成本,以每点击一次计费。
据用户访问广告联盟旗下合作媒体的网站时,点击页面上用户所感兴趣的广告商广告条根,到达相应的广告页面来计费,相同IP用户24小时内反复点击相同广告商广告条只计费一次。 优势:这种广告形式可以比较精准的获取对广告主广告内容感兴趣的用户,对宣传效果非常有帮助,一般对于做品牌宣传的广告主非常适用。 展现形式:网页固定或漂浮广告条以及文字链
CPA(Cost Per Acion):注册形式广告
按照客户的注册数盈利。按广告投放实际效果,即按回应的有效问卷或订单来计费,不限广告投放量。
据用户访问广告联盟旗下合作媒体的网站时,点击页面用户所感兴趣的广告商广告条根,到达相应的广告页面后并完成相应的注册或者信息提交要求来计费,相同IP用户24小时内反复注册或提交信息只计费一次。 优势:这种广告形式可以最直接的让广告主获取用户或者想要用户提供的信息,一般适合阶段性的活动或者需要累积注册用户的广告商比较适用。 展现形式:网页固定或漂浮广告条以及文字链
CPL(Cost Per Lead):
按照客户的注册数及活跃程度盈利。可以看作和CPA同一类型的模式,要求用户在注册后具有一定的活跃程度,网站主才能收到广告费用
CPS(Cost Per Sale):销售提成形式广告
按照销售业绩来盈利。
用户访问广告联盟旗下合作媒体的网站时,点击页面上用户所感兴趣的广告商广告条根,到达相应的广告页面后并完成购买行为来计费。 优势:这种广告形式最大限度的保证了客户的推广要求,零风险,一般适合电商类和有充值功能类的客户。 展现形式:网页固定或漂浮广告条以及文字链
CPV:富媒体形式广告
按照展示完毕来盈利。
描述:根据用户访问广告联盟旗下合作媒体的网站时,网站右下角会出现带关闭按钮的浮动图片或者视频窗口,当广告展示完毕,会根据独立IP展[……]

READ MORE

「Google AdSense」- 谷歌广告

按照点击付费
知乎/谷歌推广怎么收费?
谷歌推广按CPC(点击计费),谷歌推广按点击收费,广告被点击一次,即扣一次点击费用。
广告推广也是如此,[……]

READ MORE

「SEO」- 搜索引擎优化

Google:https://search.google.com/search-console
Baidu:https://ziyuan.baidu.com
百度统计:https://tongji.baidu.com[……]

READ MORE

「Coreseek」

CORESEEK是什么?
主页:http://www.coreseek.cn 已经关闭[……]

READ MORE

「Web」- 高可用,High Availability

Corosync Cluster Engine
Corosync by corosync Corosync+Pacemaker+crmsh构建Web高可用集群
The Corosync Cluster Engine is a Group Communication System with additional features for implementing high availability within applications.
Corosync是OpenAIS发展到Wilson版本后衍生出来的开放性集群引擎工程,corosync最初只是用来演示OpenAIS集群框架接口规范的一个应用,可以说corosync是OpenAIS的一部分,但后面的发展明显超越了官方最初的设想,越来越多的厂商尝试使用corosync作为集群解决方案。如RedHat的RHCS集群套件就是基于corosync实现。 corosync只提供了message layer,而没有直接提供CRM,一般使用Pacemaker进行资源管理。
相关链接
# TODO 什么是”HA集群的脑裂“ 如何防止HA集群的脑裂

章节列表
「HAProxy」 「Web」- 阿里云负载均衡,ALB, CLB, SLB 「Web」- IPVS,LVS 「使用iptables的connmark模块进行网卡负载均衡(在linux下)」 「Heartbeat」 「Keepalived」- 负载均衡与高可用性[……]

READ MORE

「Web」- 阿里云负载均衡,ALB, CLB, SLB

使用流程简记(毫无参考价值)
1)创建实例 2)定义虚拟服务器组 3)添加监听 3)修改监听的「配置转发策略」[……]

READ MORE

「HAProxy」

查看HAProxy状态
How to collect HAProxy metrics
参考文献
HAProxy – The Reliable, High Performance TCP/HTTP Load Balancer 烂泥:高负载均衡学习haproxy之安装与配置[……]

READ MORE

「Heartbeat」

相关链接
HeartBeat简单介绍和基本作用[……]

READ MORE

「Web」- IPVS,LVS

问题描述
在 Kubernetes Cluster 中,组件 kube-proxy 使用 ipvs 路由。
因此我们需要了解 LVS 相关内容,以排查问题。至少要能读懂 LVS 原理、规则、配置等等内容。
解决方案
LVS,Linux Virtual Server
IPVS 已并入 LVS 组件
TODO ! IPVS 学习
相关链接
Wikipedia/IP Virtual Server The Linux Virtual Server Project/IPVS[……]

READ MORE

「Keepalived」- 负载均衡与高可用性

What is it ?
它是用C语言开发的路由软件,目的是为了向Linux系统及基于Linux的基础设施提供用于负载均衡与高可用的简单且强大的设备。
问题解决方案
提供(1)负载均衡与(2)高可用性。
功能及其特性
负载均衡
基于LVS内核模块,提供第四层负载均衡。它实现多种检查器,根据负载均衡服务器的健康状态,动态、自适应地维护和管理负载均衡服务器池。
高可用性
1)基于VRRP协议。 2)它还实现几种到VRRP FSM的钩子,用于提供低层且告诉的协议互动。 3)为提供告诉网络故障检测,它实现BFD协议。 4)进行VRRP状态转换时,它会顾及BFD提示以进行快速状态转换。
# 灵活性
负载均衡与高可用性可以单独使用,也可以共同使用以提供可靠基础设施。
实际应用场景
在Kubercluster Cluster中,作为集群的负载均衡器及高可用性组件。由于HAProxy不支持虚拟IP地址,因此单纯使用HAProxy不能够实现高可用性,需要更多主机。使用Keepalived可以兼顾高可用性与负载均衡,减少集群搭建所需要主机数及管理成本。
相关链接
官方主页:http://keepalived.org Keepalived 配置实例 Keepalive介绍及工作原理
服务部署

yum install -y keepalived.x86_64
systemctl start keepalived.service
systemctl enable keepalived.service

配置文件内容参考 ./keepalived.conf 页面;[……]

READ MORE

「使用iptables的connmark模块进行网卡负载均衡(在linux下)」

关于connmark负载均衡(About connmark load-balancing)
本文介绍了在linux-2.6的路由器上,使用netfilter及iptables的connmark模块进行网络负载均衡。
目的:演示如何使用多个互联网连接为局域网中的所有主机提供更快的互联网访问速度。我们希望所有的传出连接都分布在所有可用的网络链接上。所有的路由必须在一台路由器上实现,不需要改变本地网络的机器配置。
它应该适用于所有linux-2.6内核及以上的linux,同时还需要安装iproute2软件包及基本的网络工具。
网络环境示例(Example of networking environment)
为了解释如何使用connmark模块进行负载均衡,我们将使用以下网络环境:

本地网络(192.168.157.0/24)由运行各种操作系统(如Windows和Linux)的3台桌面机组成。这些PC被命名为Saturn,Desktop2,Desktop3。所有的例子将基于Saturn,其他PC将以相同的方式行事。所有这些机器都使用Jupiter(192.168.157.253)作为默认网关。在这些PC上没有高级路由工作要做。
网络的路由器是Jupiter。它有三个以太网接口。第一个是eth0(192.168.157.253),它连接到本地网络。其他接口是eth1(10.37.1.253)和eth2(10.37.2.253)。他们连接到两个以太网调制解调器,分别连接到两个ADSL链接。所有的防火墙和路由都是在Jupiter上完成的。
别的地方有一台名叫Neptune的服务器连接到互联网。本地网络和Neptune之间没有直接的联系。Neptune只是作为一个普通的服务器,没有特定的路由配置。它只是用作本文中的一个远程服务器。例如,它可以是运行Apache的Web服务器,响应在端口tcp/80上发出的请求。它也可以在任何端口上监听任何其他服务。
本文的目的是展示如何均衡Jupiter上的连接,以便利用两条ADSL链路提供的全部可用带宽。所有的连接都是由连接到本地网络的PC发起的,所有的连接都是通过Neptune进行的。当然,它可以访问任何远程服务器,但是我们只需要一台机器作为测试的远程服务器。
在图中,我们使用内部IP地址(192.168.157.a,10.37.b.c,172.16.1.d)。在真实环境中,所有连接到互联网的接口都可能具有公共IP地址。如果调制解调器工作在NAT模式下,它们也可以是专用地址。在这种情况下,每个调制解调器都有两个IP地址:以太网接口上的专用内部地址和WAN接口上的公共IP地址。
本文介绍了如何在两个链接之间执行负载均衡,但显然您可以根据需要使用尽可能多的链接执[……]

READ MORE

「Nginx」- 安装(CentOS、Ubuntu、Debian)

Nginx 1.8 on CentOS 7.6
按照道理将应该不会有什么问题,但是在阿里云的 CentOS 系统里找不到这个包。
可以直接从官方的源中安装:

# http://nginx.org/packages/centos/7/x86_64/RPMS/
rpm -ivh http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.8.1-1.el7.ngx.x86_64.rpm

on RHEL/CentOS

# 配置源
cat << ‘EOF’ > /etc/yum.repos.d/cstm-nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
EOF

# 启用mainline版本(此时需要安装yum-utils包)
# yum install -y yum-utils
# yum-config-manager –enable nginx-mainline

# 更新缓存
yum makecache

# 安装
yum install -y nginx.x86_64

参考文献
Nginx/RHEL/CentOS[……]

READ MORE

「Nginx」- 4.Security and Permission

yandex/gixy: Nginx configuration static analyzer 配置文件安全分析工具

章节列表
「Nginx」- 配置基本认证(Basic Authentication) 「Nginx」- 屏蔽 IP 地址、屏蔽国家地区 「Nginx」- 屏蔽 IP 地址、屏蔽国家地区 「Nginx」- 屏蔽通过 IP 地址访问的请求 「Nginx」- 屏蔽所有搜索引擎[……]

READ MORE

「Nginx」- 配置基本认证(Basic Authentication)

问题描述
部分系统由于没有认证模块或者认证功能,因此所有人都能够访问。但是,我们并不希望被所有人访问,我们希望特定的有权限的用户才能访问。
因此,我们使用 Nginx 基础认证(Basic Authentication),实现在访问站点时提示用户进行基础认证。
该笔记将记录:在 Nginx 中,如何使用基本认证(Basic Auth)来进行访问控制,以及常见问题处理,还有一些高级的用法。
解决方法
第一步、添加用户

// 创建新的 .htpasswd 文件

# htpasswd -c /etc/apache2/.htpasswd “tom”
New password:
Re-type new password:
Adding password for user tom

// 追加用户到 .htpasswd 文件

# htpasswd /etc/apache2/.htpasswd “cat”
New password:
Re-type new password:
Adding password for user cat

// 验证添加成功

# cat /etc/apache2/.htpasswd
tom:$apr1$jf5bsAhN$/5nLq.A726iSqNWiAqdZ5/
cat:$apr1$qUV52OEi$vz0mUy6kXLrWcMh1aI3nD/

除了上述方法,还有种创建方法,虽然该方法会降低安全性,但也减少维护成本。Nginx 实现 RFC 2307 描述的语法,可以使用明文密码:

cat > /etc/apache2/.htpasswd <<EOF
username:{PLAIN}your-password
EOF

第二步、修改 Nginx 配置

server {

auth_basic “Administrator’s Area”;
auth_basic_user_file /etc/apache2/.htpasswd;

location /public/ {
auth_basic off; # 在该地址下,关闭认证
}

}

第三步、配置生效并验证

# systemctl reload nginx.service
# curl –user username:password http://example.com

常见问题汇总
在修改 Basic Auth 信息后,是否需要重启?
Does auth_basic changes require a service[……]

READ MORE

「Nginx」- 屏蔽所有搜索引擎

问题描述
我们有些服务仅供内部使用,但是又需要通过公网访问。这带来的一个问题就是,服务会被搜索引擎爬取,被其他人从搜索引擎中搜索到。
因此,我们希望可以屏蔽所有的搜索引擎,不希望站点被爬取到。
该笔记将记录:如何调整 Nginx 配置,以屏蔽所有的搜索引擎机器人。
解决方案
操作系统:Ubuntu 18.04.2 LTS(各种发行版的目录结构存在差异,请根据场景进行调整)
配置 robots.txt 文件:

# 创建配置文件
mkdir /etc/nginx/conf.d/common/
echo ‘location = /robots.txt { return 200 “User-agent: *\nDisallow: /\n”; }’ \
> /etc/nginx/conf.d/common/block-all-robots.conf

# 引用配置
server {

include /etc/nginx/conf.d/common/block-all-robots.conf;

}

参考文献
The Web Robots Pages Robots.txt File [2021 Examples] – Moz How to set robots.txt globally in nginx for all virtual hosts – Server Fault[……]

READ MORE

「Nginx」- 屏蔽 IP 地址、屏蔽国家地区

问题描述
该笔记将记录:在 Nginx 中,如何屏蔽某些 IP 地址对站点的访问,以及相关问题解决方法。
解决方案
这里我们还是会记录如何通过 IP 地址进行屏蔽:

server {
server blog.example.com;

deny 45.43.23.21;
deny 45.43.23.0/24;
allow all;

# 针对地址进行屏蔽
location /accounts/login {
deny 45.43.23.21;
}
}

参考文献
GeoIP Legacy Databases geoip – How to Convert a Maxmind .MMDB to .DAT? – Stack Overflow nginx: How To Block Visitors By Country With The GeoIP Module (Debian/Ubuntu) Module ngx_http_geoip_module Installing Nginx with GeoIP2 on Ubuntu | Ivan Dokov – Software architect and strategist[……]

READ MORE

「Nginx」- 屏蔽 IP 地址、屏蔽国家地区

问题描述
我们需要屏蔽来自国外的站点访问,不单纯是屏蔽某个地址,而是屏蔽所有来自国外的访问。
该笔记将记录:在 Nginx 中,如何屏蔽来自某个国家的访问,以及常见问题的解决方法。
解决方案
通过 GeoIP 数据库,以及 Nginx GeoIP Module,能够屏蔽或限制国家或地区的访问:
原理简述
1)GeoIP 数据库文件由 MAXMIND 提供,该数据库文件包含 IP 地址及其所属地域; 2)Nginx GeoIP Module 通过读取该数据库文件,Nginx 将获得访客 IP 转化得到地域信息; 3)最后,我们再配置 if {} 等等判断,来限制访问;
GeoIP Module vs. GeoIP2 Module
早期 GeoIP 数据库文件为 .dat 格式,Nginx GeoIP Module 能够读取该格式的文件,这也是 Nginx 内置模块(无需单独安装)。
现在(06/02/2021)官方已不提供 .dat 格式的数据文件,仅提供 .mmdb 和 CSV 格式的数据文件(参考 Retirement of GeoIP Legacy Downloadable Databases in May 2022 | MaxMind Blog 文章,以获取相关原因及说明),需要使用 Nginx GeoIP2 Module 来读取该格式的数据库文件,但是 Nginx GeoIP2 Module 需要编译安装(在 Ubuntu 20 中,能够 APT 安装)。
或者,需要使用 sherpya/geolite2legacy: MaxMind GeoLite2 (CSV) to Legacy format converter 进行文件的转化(.mmdb ⇒ .dat)。不过已有人完成这项工作,访问 GeoIP Legacy Databases 下载 Maxmind – Country/IPv4 和 Maxmind – City/IPv4 的 .dat 数据文件,然后解压即可使用。
Nginx + GeoIP Module(废弃)
第一步、启用 GeoIP 模块
安装 GeoIP 模块:

# Ubuntu 20.04
apt-get install libnginx-mod-http-geoip libnginx-mod-stream-geoip

# Ubuntu 18.04
apt-get install libnginx-mod-http-geoip

检查模块已启用:

# nginx -V 2>&1 | grep –only-matching –color — –with-http_geoip_module[……]

READ MORE

「Nginx」- 允许跨域访问

最简单,但最不安全的配置

add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods *;
add_header Access-Control-Allow-Headers *;

使用 always 参数
在某些情况下,Nginx 没有返回我们设置的头部。比如在 404 时,就不会返回我们自定义的头部。
这是因为只有当响应码为 200, 201 (1.3.10), 204, 206, 301, 302, 303, 304, 307 (1.1.16, 1.0.13), or 308 (1.13.0) 时才会响应特定头部。
如果要解决这个问题,需要使用 always 关键字:

add_header Access-Control-Allow-Origin * always;
add_header Access-Control-Allow-Methods * always;
add_header Access-Control-Allow-Headers * always;

参考文献
Module ngx_http_headers_module/add_header Allowing cross origin requests (CORS) on Nginx for 404 responses[……]

READ MORE

「Nginx」- 屏蔽通过 IP 地址访问的请求

问题描述
我们的一些站点可以通过 IP 地址直接访问,虽然没有安全问题,但是通过 IP 地址直接访问,却会带来其他问题。比如,在 SEO 中,开启 IP 访问,如果有其他域名解析到我们的主机上,那对方的域名也是可以打开的,这样百度上就会出现两个一模一样的网站,就会被认为是垃圾站,一起被降权。
因此,我们希望禁止禁止这种形式的访问,并且“禁止”的含义为不做任何响应,就好像我们并不存在。
该笔记将记录:在 Nginx 中,如何禁止通过 IP 地址访问的请求,以及常见问题的处理。
解决方法
方法一、返回 404 或者重定向
在多数情况下,我们可以返回 404 或者重定向到我们的主域名:

server {
listen 80 default_server;
server_name “”; # 不重要
return 404;
}

server {
listen 80;
server_name IP_ADDRESS;
return 301 http://YOUR.DOMAIN;
}

default_server:表示该 server 为默认 server(用于处理通过 IP 地址访问的请求,以及那些没有绑定的域名)。如果没有 server {} 使用 default_server 指令,则使用首个 server 配置。
方法二、完全不响应请求

server {
listen 80 default_server;
server_name _; # 不重要
return 444;
}

return 444:该响应码表示不响应请求,并立即关闭连接。
通过 curl 测试,将返回 curl: (52) Empty reply from server 信息。
参考文献
Module ngx_http_core_module / listen Nginx / Server names Blocking IPs with Nginx – DreamHost Knowledge Base How to block access using the Server IP in NGINX? | DigitalOcean nginx – how to disable direct access to a web site by ip address – Stack Overflow[……]

READ MORE

「Nginx」- 日志

Nginx的日志功能能是由ngx_http_log_module模块提供。
参考文献
Nginx/Configuring Logging Nginx/Module ngx_http_log_module

章节列表
「Nginx」- 自定义日志格式 「Nginx」- 在日志路径中,使用变量 「Nginx」- 记录 HTTP 请求头到日志[……]

READ MORE

「Nginx」- 记录 HTTP 请求头到日志

问题描述
我们希望在日志中记录 HTTP 请求头信息,以查看请求信息、进行请求调试等等。
该笔记将记录:在 Nginx 中,如何在日志中记录 HTTP 请求头信息。
解决方案
简单说:目前(01/11/2021),没有直接的方案(变量),需要变通处理。
方案一、枚举变量
我们自定义日志格式,并在日志中打印这些变量。如下示例,输出部分与客户端网络地址有关的变量:

log_format client_ip_address ‘[$time_local] Host=”$http_host”, ‘
‘Forwarded=”$http_forwarded”, ‘
‘X-Forwarded-For=”$http_x_forwarded_for”, ‘
‘X-Forwarded-Host=”$http_x_forwarded_host”, ‘
‘X-Forwarded-Proto=”$http_x_forwarded_proto”, ‘
‘X-REAL-IP=”$http_x_real_ip”, ‘
‘realip_remote_addr=”$realip_remote_addr”, ‘
‘remote_addr=”$remote_addr”, ‘
‘server_addr=”$server_addr”, ‘
‘upstream_addr=”$upstream_addr”, ‘ ;

server {

access_log /var/log/nginx/client-ip-address.log client_ip_address;

}

方案二、使用 Lua 模块
1)安装 lua-nginx-module 模块:

# Debian GNU/Linux 10 (buster)
apt-get install libnginx-mod-http-lua

# 通常开箱即用,无需使用 load_module /path/to/module.so 引入模块

2)使用如下代码进行头部记录:

# 该示例,将头部信息写入日志
he[……]

READ MORE

「Nginx」- 在日志路径中,使用变量

access_log (ngx_http_log_module)
在 access_log 中,使用变量:

access_log /home/me/sites/${server_name}.access.log;

但是,需要从(0.7.6+)以后,并且存在限制(参考「access_log」手册): 1)日志文件用“工作进程”创建,所以需要在日志目录有创建文件的权限。 2)无法使用写入缓冲。 3)由于经常使用的文件描述符会被缓存,在指令 open_log_file_cache 的参数 valid 指定的时间内,还会写入旧文件中。 4)每次写入日志时,会检查 root 目录是否存在。不存在,则不会创建日志。
error_log (ngx_core_module)
对于 error_log 属性,官方手册的「error_log」上没提可以使用变量。
# 07/10/2019 Nginx error log won’t read variable – 不支持 # 07/10/2019 #562 closed enhancement (invalid) – 不支持
根据官方的说法: 1)这是故意这个设计的。变量只在 HTTP 请求中可用,而 error_log 不限于HTTP请求。 2)错误日志是非常重要的。必须保证可用。例如,当解析 /path/$var/error.log 的 $var 变量出错(比如内存分配)时,应该在哪里记录错误日志呢? 3)可以考虑在非 main 块以外的上下文中支持变量。
我们的方案
对于这两个日志文件,我们直接进行硬编码(因为,一个不好,一个不行)。在 Nginx variable expansion in error_log for virtual hosts/servers 中,作者也解释了,这没什么必要。
如果想要使用这种方式,建议进行性能测试,评估没有写入缓存及经常打开和关闭文件等等这些限制对性能的影响。
参考文献
Module ngx_http_log_module/access_log Module ngx_http_log_module/open_log_file_cache Variables in log name – nginx Core functionality/error_log Nginx error log won’t read variable #562 closed enhancement (invalid) Nginx variable expansion in error_log for virtual hosts/servers[……]

READ MORE

「Nginx」- 常见问题处理

问题描述
该部分笔记将整理:与 Nginx 配置与管理有关的内容。
解决方案
在 Nginx 中,“上游”(Upstream)是指 Nginx 要访问的服务。
重写规则中排除某些URL地址
在Nginx中,进行rewrite跳转,一般的用法是“如果URI匹配表达式,则进行跳转”。
但是,有时也会遇到“如果URI不匹配表达式,则进行跳转”,就是说:大多数URL进行跳转,极个别的URI不进行跳转,可以使用如下的方式:

rewrite ^(?!/(nginx|hadoop|demo)/.+) https://k4nz.com permanent;

这个示例中,除了「/nginx/xxx」「/hadoop/xxx」「/demo/xxx」之外,任何其他的URI都会跳转“https://k4nz.com”%E3%80%82
在Nginx中,当你需要嵌套IF语句,或者IF语句需要多个判断条件时你可能会用到这个。
顺便提一下,解决IF嵌套和多个IF条件的另外一个办法:Nginx how to multiple if statements
配置默认服务器
nginx: how to specify a default server
待完善的部分
「nginx配置url重定向-反向代理」
# nginx serving alternate location on 404 -「nginx serving alternate location on 404」[……]

READ MORE

「Nginx」- 配置文件语法、格式化工具(学习笔记)

使用 if 关键字
Module ngx_http_rewrite_module NGINX not equal to – Stack Overflow

# 判断变量是否匹配字符串

if ($var != CN) {
return 444;
}

if ($var = EN) {
return 200;
}

使用变量
Alphabetical index of variables reverse proxy – nginx – read custom header from upstream server – Stack Overflow
通过 $http_<header-field> 形式,y以此引用请求头的字段。比如: 1)$http_user_agent:获取请求头的 User-Agent 字段; 2)$http_x_real_ip:引用请求头的 X-Real-IP 字段;
在字符串中使用环境变量: 1)set $foobar “${foo}bar”;
配置文件生成工具
digitalocean/nginxconfig.io: ⚙️ NGINX config generator on steroids 💉 演示站点:NGINX Config | DigitalOcean nginx – Merging variable with string in config file – Server Fault[……]

READ MORE

「Nginx」- 配置调试(打印查看、配置验证、Debug)

问题描述
Nginx 文档的部分内容没有详细的说明,我们只能通过调试的方式来查看相关变量的值。
该笔记将记录:在 Linux 中,常用的配置文件调试方法,以及常见问题的处理方法。
解决方案
方法一、通过 add_header/return 调试
添加如下配置:

server {

location / {
add_header debug-geoip_city “$geoip_city_continent_code, $geoip_city_country_name, $geoip_city” always;
# return 200 “$geoip_city_continent_code, $geoip_city_country_name, $geoip_city”
}

}

然后使用 CURL 请求,以查看响应头:

# curl –head https://k4nz.com/
HTTP/1.1 404 Not Found
Server: nginx/1.14.0 (Ubuntu)
Date: Mon, 07 Jun 2021 03:44:25 GMT
Content-Type: text/html
Content-Length: 178
Connection: keep-alive
debug-geoip_city: AS, China, Yuzhong Chengguanzhen

方法二、通过日志文件
在日志文件中写入某些变量的值,以供我们查看,参考 Log Format 笔记。
方法三、通过 Debug 功能
如果 Nginx 在编译时,启用 –with-debug 选项:

nginx -V 2>&1 | grep — ‘–with-debug’

那么能够指定 error_log 配置:

error_log /var/log/nginx/error.log debug;

然后,我们便能够在 error.log 中查看变量值:


2021/03/06 15:14:48 [debug] 2550#2550: *1 fastcgi param: “SCRIPT_FILENAME: /usr/lib/cgit/cgit.cgi/something.git/cgit.cgi”
2021/03/06 15:14:48 [debug] 2550#2550: *1 http script copy: “QUERY_STRING”
2021/03/06 15:14:48 [debug] 2550#[……]

READ MORE