中间件技术栈

中间件技术栈

Mac中编译Nginx 1.17

背景

使用Mac的开发者大多数的时候通过 brew 命令安装各类软件,比如 PHP、Python、Nodejs,Nginx 也不例外。

默认情况下Nginx安装在/usr/local/Cellar/nginx,通过brew link nginx加软连接到/usr/local/bin/nginx,虽然这样完全满足开发且符合 Mac 软件的管理,但是却不方便移植(比如想给不懂开发的用户一键部署部署的应用包,做私有化部署的同学应该对此不陌生)。

从源码编译NGINX程序比安装预编译的安装包要灵活很多,可以添加特定的模块(来自NGINX官方或者第三方的,比如给 Fastdfs 提供 HTTP 访问文件能力的 fastdfs-nginx 模块),当然自己编译源码拉取的可以是已修复 bug 和新增特性的最新分支。

编译

依赖

  • PCRE——支持正则表达式。 是 Nginx 的核心和重写模块的所需依赖库。
1
2
wget https://ftp.pcre.org/pub/pcre/pcre-8.43.tar.bz2
tar zxf pcre-8.43.tar.bz2

阅读剩下更多

默认配图
中间件技术栈

浅谈分布式锁

为什么要有分布式锁

随着架构系统的演进,由纯真的单机架构到容器化编排的分布式架构,可以说是一个大型互联网企业发展的必然走向。在网站初创时,应用数量和用户较少,可以把 Tomcat 和Mysql 部署在同一台机器上。随着用户数量增多,访问量增大,并发升高,Tomcat 和 MySQL 竞争资源,此时,单机已经扛不住了,需要把 Tomcat 和 MySQL 分离在不同的机器上,用于提升单台机器的处理能力。业务从来没有减少,产品越做越大。应用也越来越复杂,原来的大应用,拆分成多个小应用,加入各级缓存,做了反向代理负责均衡,最后坠入分库分表的深渊。

微服务渐渐代替了庞大冗杂的服务,每个小服务,各司其职。这时候是不是就不存在资源竞争的问题了呢?答案毋庸置疑,在架构的演进过程中,无时无刻都存在着资源竞争的问题。

说起资源竞争的问题,是不是想起了在计算机科学中的一个经典问题——哲学家就餐,也就是在并行计算中多线程同步( Synchronization )时产生的问题?哲学家就餐问题用来解释死锁和资源耗尽的问题,我们不做详细的讨论,感兴趣的同学可以搜索资料了解。既然存在资源竞争的问题,解决的方案必然是对资源加锁,对于锁大家肯定不陌生,在 Java 中synchronized 关键字和 ReentrantLock 可重入锁在我们的代码或者一些开源代码中随处可见的,一般用于在本地多线程环境中控制对资源的并发访问。但是随着微服务架构的蓬勃兴起,分布式的快速发展,本地加锁已经不能满足我们的业务需求,如果还通过本地加锁的方式锁定资源,在分布式环境中是无用的。于是人们为了在分布式环境中也能实现本地锁的效果,也是纷纷各出其招。

阅读剩下更多

默认配图
中间件技术栈

Wordpress站点的Nginx服务配置https

生成证书

参考《SSL证书生成》,生成适合于自己的免费证书。也可购买商业SSL证书。

如果只想生成CSR,用CSR在CA机构换取CRT证书,可以执行下面命令即可:

1
openssl req -new -nodes -newkey rsa:2048 -keyout server.key -out server.csr

配置Nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# 配置80端口跳转到443端口
server {
listen 80;
server_name www.abc.zyx;
# rewrite ^ https://$server_name$request_uri permanent;
rewrite ^(.*)$ https://$host$1 permanent;
}
# 配置WordPress的https服务
server {
#listen 80;
#listen [::]:80;
listen 443 ssl;
server_name www.abc.zyx;
charset utf-8;

ssl_certificate ssl/server.crt;
ssl_certificate_key ssl/server.key;
ssl_ciphers "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:CAMELLIA256-SHA:CAMELLIA128-SHA256";
ssl_session_cache shared:SSL:20m;
ssl_session_timeout 10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;

location / {
root /var/www/html/abc;
index index.html index.htm index.php;
if (-f $request_filename/index.html){
rewrite (.*) $1/index.html break;
}
if (-f $request_filename/index.php){
rewrite (.*) $1/index.php;
}
if (!-f $request_filename){
rewrite (.*) /index.php;
}
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
try_files $uri $uri/ /index.php?$args;
}
#rewrite /wp-admin$ $scheme://$host$uri/ permanent;
#try_files $uri $uri/ /index.php?q=$uri&$args;
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;

location = /50x.html {
root /var/www/html;
}

location ~ \.php$ {
root /var/www/html/abc;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
include fastcgi.conf;
try_files $uri =404;
}

location ~ /\.ht {
deny all;
}
}

注意:ssl_protocols配置项,不添加TLSv1会导致部分IE浏览器打不开,如果加上TLSv1用站长工具检测会提示PCI DSS 不合规。

重新加载配置文件:nginx -s reload

如果是阿里云ECS服务器,需要在控制台的安全组中增加入网的443端口,具体配置可以参照其他的配置。

如果这时候https还不能访问,则需要查看Ubuntu服务器是否开启了443端口,如果无,则需要开启。

查看443端口是否开启:

1
iptables -L -n | grep 443

开启443端口,并让其生效:

1
2
iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
iptables-save

WordPress后台改成https访问

主题支持改动

如果主题中有修改网站URL的入口,则直接在admin管理后台修改即可。

如果使用的 WP Editor.md 插件,也需要修改思维导图库资源路径,一般情况下可以使用//替换http://,这样资源就可以根据站点的scheme自动切换了。

SQL UPDATE

1
2
3
4
5
6
7
update scat_posts
set post_content = replace(post_content, 'http://www.abc.xyz', '//www.abc.xyz')
where post_content like '%http://www.abc.xyz%';

update scat_posts
set guid = replace(guid, 'http://www.abc.xyz', 'https://www.abc.xyz')
where guid like '%http://www.abc.xyz%';

通过找到当前主题下的 function.php 文件

1
2
3
4
5
6
7
function replacehttp($content){
if( is_ssl() ){
$content = str_replace('http://www.abc.xyz', 'http://www.abc.xyz', $content);
}
return $content;
}
add_filter('the_content', 'replacehttp');

wp-config.php文件中添加

1
2
define('FORCE_SSL_ADMIN', true);
define('FORCE_SSL_LOGIN', true);

阅读剩下更多

默认配图
中间件技术栈

zookeeper客户端zkCli.sh命令使用

Usage

连接命令

1
zkCli.sh [-timeout 100] [-r] -server server-1:2181,server-2:2181,server-3:2181

-r :即使ZooKeeper服务器集群一半以上的服务器 down,也给客户端提供读服务。

客户端命令

命令 usage 示例
h 显示所有命令 ·
ls path 查看某个节点下的所有子节点信息 · ls / 列出根节点下所有的子节点信息
· ls /brokers/topics 列出 /brokers/topics 下的所有子节点信息
stat path 获取指定节点的状态信息 · stat /brokers/ids 查看 /brokers/ids 节点状态
get path 获取${path}节点的数据内容 get /controller 获取 /controller 节点的数据内容
ls2 path 是ls 和 stat两个命令的结合
create [-s] [-e] path data acl 创建节点,
-s 表示是顺序节点
-e 标识是临时节点
path 节点路径
data 节点数据
acl 节点权限
create /test_node testdata
create -e /test_node ‘test ephemera data’ 临时节点在客户端结束与服务器的会话后,自动消失
set path data [version] 修改当前节点的数据内容 如果指定版本,需要和当前节点的数据版本一致
delete path [version] 删除指定路径的节点 如果有子节点要先删除子节点
rmr path 删除当前路径节点及其所有子节点
setquota -n|-b val path 设置节点配额(比如限制节点数据长度,限制节点中子节点个数)
-n 是限制子节点个数 -b是限制节点数据长度
超出配额后,ZooKeeper不会报错,而是在日志信息中记录
listquota path 查看路径节点的配额信息
delquota [-n|-b] path 删除节点路径的配额信息
connect host:port 在当前连接中连接其他的ZooKeeper服务器
close 在当前连接中关闭正在连接的其他ZooKeeper服务器
history 查看客户端这次会话所执行的所有命令
redo cmdno 执行指定历史命令 redo 22

阅读剩下更多

默认配图
中间件技术栈

FastDFS之Tracker-Leader和Trunk-Server的选择

Tracker-Leader的选择

Tracker-Leader的概述

在 FastDFS 中可以配置多个 tracker,每个 tracker 是对等的,但是在运行过程中针对某些操作会选择其中一个 tracker 作为 Leader,由 Leader 执行这些特殊的操作。

既然 Tracker 是对等的,为什么还需要选举 Leader,选出来的 Leader 能干什么?这个问题,余庆(fishhappy100)在 chinaunix bbs 中做了回答,他是如此解释的:

tracker server之间是对等的。客户端可以访问任意一台tracker server。

引入tracker leader是为了解决如下问题:

  1. 新加入一台storage server时,由leader指定向其同步的源storage server

  2. 使用了合并存储特性时,leader为每个group选举和维护唯一的一个trunk server
    以上分配如果不由leader来完成的话,可能会出现混乱情况,尤其是第2条。

阅读剩下更多

默认配图
中间件技术栈

部署分布式HA FastDFS集群

FastDFS

FastDFS的作者余庆在其 GitHub 上是这样描述的:“FastDFS is an open source high performance distributed file system. It’s major functions include: file storing, file syncing and file accessing (file uploading and file downloading), and it can resolve the high capacity and load balancing problem. FastDFS should meet the requirement of the website whose service based on files such as photo sharing site and video sharing site” ,意思说,FastDFS是一个开源的高性能分布式文件系统。其主要功能包括:文件存储、文件同步和文件访问(文件上传和文件下载),它可以解决高容量和负载平衡问题。FastDFS应满足基于照片共享站点和视频共享站点等文件的网站的服务要求。

FastDFS 有两个角色:跟踪器(Tracker)和存储器(Storage)。Tracker 负责文件访问的调度和负载平衡。Storage 存储文件及其功能是文件管理,包括:文件存储、文件同步、提供文件访问接口。它还管理元数据,这些元数据是表示为文件的键值对的属性。TrackerStorage 节点都可以由一台或多台服务器构成。这些服务器均可以随时增加或下线而不会影响线上服务,当然各个节点集群至少需要一台服务 Running。注意,其中 Tracker 集群中的所有服务器都是对等的(P2P),可以根据服务器的压力情况随时增加或减少。

阅读剩下更多

默认配图
中间件技术栈

MySQL开发规范.md

一. 命名规范

库名、表名、字段名必须使用小写字母,并采用下划线分割
为了统一规范, 库名、表名、字段名使用小写字母,禁用关键字(index,order等)。

前缀命令规范
视图以view_开头,事件以event_开头,触发器以trig_开头,存储过程以proc_开头,函数以func_开头,应用上面禁用

普通索引以idx_各个列名简称,唯一索引以uk_各个列名简称命名,中间用_隔开。如 idx_col1_col2_col3(col1,col2,col3),如果列过长,用简写

临时表以tmp_实体表名,线上禁用,备份表以bak_日期_实体表名,尽可能备份至HDFS

库名、表名、字段名禁止超过32个字符,需见名知意
库名、表名、字段名支持最多32个字符,但为了统一规范、易于辨识以及减少传输量,禁止超过32个字符,例:业务名称/实体_表作用

按日期时间分表须符合_YYYYMMDD格式
按月或日生成的表,以_YYYYMM[DD]方式命名。

阅读剩下更多

默认配图
中间件技术栈

mysql事务排查

当我们跑MySQL服务器查看日志的时候,如果发现如下类似日志:

171013 2:04:25 [ERROR] /usr/local/mysql/bin/mysqld: Sort aborted: Lock wait timeout exceeded; try restarting transaction
171013 2:06:26 [ERROR] /usr/local/mysql/bin/mysqld: Lock wait timeout exceeded; try restarting transaction
171013 2:06:26 [ERROR] /usr/local/mysql/bin/mysqld: Sort aborted: Lock wait timeout exceeded; try restarting transaction
171013 2:07:33 [ERROR] /usr/local/mysql/bin/mysqld: Lock wait timeout exceeded; try restarting transaction
…..

出现这些日志主要原因往往是,有些事务执行过dml操作,然后一直没commit/rollback,新事务一直等待旧事务释放锁资源,出现锁等待超时,即新事务等待时间超过了mysql设置的lock_wait_timeout(指的是事务等待获取资源等待的最长时间,超过这个时间还未分配到资源则会返回应用失败,参数的时间单位是秒,最小可设置为1s)该参数设定的值后,mysql又尝试重新执行此事务。

阅读剩下更多

默认配图
中间件技术栈

nginx的proxy_cache_lock研究

proxy_cache_lock官方解释

Nginx.org 官方的 Maxim Dounin 对于proxy_cache_lock的答复

Hello!

On Mon, Jun 30, 2014 at 11:10:52PM -0400, Paul Schlie wrote:

being seemingly why proxy_cache_lock was introduced, as you initially suggested.
Again: responses are not guaranteed to be the same, and unless
you are using cache (and hence proxy_cache_key and various header
checks to ensure responses are at least interchangeable), the only
thing you can do is to proxy requests one by one.

If you are using cache, then there is proxy_cache_key to identify
a resource requested, and proxy_cache_lock to prevent multiple
parallel requests to populate the same cache node (and
“proxy_cache_use_stale updating” to prevent multiple requests when
updating a cache node).

In theory, cache code can be improved (compared to what we
currently have) to introduce sending of a response being loaded
into a cache to multiple clients. I.e., stop waiting for a cache
lock once we’ve got the response headers, and stream the response
body being load to all clients waited for it. This should/can
help when loading large files into a cache, when waiting with
proxy_cache_lock for a complete response isn’t cheap. In
practice, introducing such a code isn’t cheap either, and it’s not
about using other names for temporary files.


Maxim Dounin
http://nginx.org/

阅读剩下更多

默认配图
中间件技术栈

Hadoop系列:HDFS交互操作接口(三)

Hadoop是由java编写的,所以HDFS提供了完整的java程序应用接口,其他的访问都是建立在这些应用接口之上。要能访问HDFS,则HDFS客户端必须有一份hdfs的配置文件hdfs-site.xml,以获取NameNode的相关信息,每个应用程序也必须能访问Hadoop的程序库JAR文件,也就是前面说的配置环境变量。

阅读剩下更多

默认配图
返回顶部