• 如何正确配置CDN高速缓存,避免越用越慢的尴尬

    如何正确配置CDN高速缓存,避免越用越慢的尴尬

  • CCKiller:Linux轻量级CC攻击防御工具,秒级检查、自动拉黑和释放

    CCKiller:Linux轻量级CC攻击防御工具,秒级检查、自动拉黑和释放

  • 分享张戈博客的WordPress优化方案,缓解国内云服务器配置低下的问题

    分享张戈博客的WordPress优化方案,缓解国内云服务器配置低下的问题

  • WordPress集成SendCloud邮件代发,规避SMTP泄漏网站主机真实IP的风险

    WordPress集成SendCloud邮件代发,规避SMTP泄漏网站主机真实IP的风险

  • 浅谈个人博客网站or屌丝vps服务器暴露真实IP的危险性

    浅谈个人博客网站or屌丝vps服务器暴露真实IP的危险性

操作系统

Linux运维基础技能: 接入层与网络基础

本系列文章一共三篇,分别为《脚本编程与 Linux 命令》、《接入层与网络基础》和《 MySQL 与 SQL 优化》,由腾讯高级工程师 luaruan(阮永顺) 原创、张戈博客整理分享,如有勘误请在博客留言。 希望对需要学习、面试 Linux 运维的同学有所帮助。 MSS与MTU的区别,默认大小各是多少? 标准以太网接口缺省的MTU(最大传输单元)为1500 字节,是最大帧1518减去源宿的MAC、FCS后最大的IP packet大小; MTU减去20字节IP包头减去20字节TCP包头 ,即是MSS,1460字节 一台交换机要保证接口MTU的一致性。如果在一个VLAN上、或整个交换机都采用同样的MTU,避免一些奇怪的问题 参考:https://www.zhihu.com/question/21524257 TIME_WAIT 与CLOSE_WAIT 的区别 主动关闭连接的一方进入TIME_WAIT ,若客户端高并发访问HTTP接口又没有使用会话或者线程池机制,可能会导致本地端口耗尽。 CLOSE_WAIT 出现在被动断开连接。可能常见在Server端,例如在Netty的I/O线程里做DB读写、日志记录这种不可控的阻塞行为,可能会引发客户端超时。 如何查看机器上所有的tcp连接? natstat -ant netstat -antp 如何统计time_wait 状态的连接? IP 包头大小? 20 字节 url.cn 是几级域名? -- 二级 www.qq.com 是几级域名? -- 三级 url.cn 可以CNAME到 demo.te.isc.demo-cloud.net 吗? 不建议这么操作,实际上很多场合是不可以这么操作的。 https://serverfault.com/questions/613829/why-cant-a-cname-record-be-used-at-the-apex-aka-root-of-a-domain 递归解析与迭代解析的区别? 先理解13组根DNS服务器、顶级域DNS服务器(各解析.com .net .gov 等)、权威DNS服务器、本地DNS服务器。 考虑浏览器客户端访问www.qq.com ,会向小区宽带的本地DNS查询域名解析IP ,而本地DNS会向根DNS、顶级域DNS、权威DNS逐个查询。 从客户端到本地DNS的查询是递归的;而其余的查询是迭代的。(参考《自顶向下理解计算机网络》89页) x-forwarded-for 与 remote_addr 的区别? X-Forwarded-For: client1, proxy1, proxy2 <proxy1>, <proxy2>如果一个请求经过了多个代理服务器,那么每一个代理服务器的IP地址都会被依次记录在内。也就是说,最右端的IP地址表示最近通过的代理服务器,而最左端的IP地址表示最初发起请求的客户端的IP地址。 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/X-Forwarded-For 鉴于伪造这一字段非常容易,应该谨慎使用X-Forwarded-For字段。正常情况下XFF中最后一个IP地址是最后一个代理服务器的IP地址 remote_addr 是通讯客户端与服务器实际进行TCP通信的IP IPv4地址分类 (IPv4地址32位) A 类 0.0.0.0/8 127.255.255.255 结束 B 类 128.0.0.0/16 191.255.255.255 结束 C 类 192.0.0.0/24 D 类 224.0.0.0~239.255.255.255 192.168.2.47/26 这个子网的开始IP 和结束IP是? (32-26)=6 , 2^6 = 64...
阅读全文
操作系统

Linux运维基础技能: 脚本编程与Linux命令

本系列文章一共三篇,分别为《脚本编程与Linux命令》、《接入层与网络基础》和《 MySQL 与 SQL 优化》,由腾讯高级工程师 luaruan(阮永顺) 原创、张戈博客整理分享,如有勘误请在博客留言。 希望对需要学习、面试Linux运维的同学有所帮助。 $1 入参,空值时默认赋值技巧 $* 和 $@ 区别 $* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含 时,都以"$1" "$2" … "$n" 的形式输出所有参数。 但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体, 以"$1 $2 … $n"的形式输出所有参数;" $@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。 区别在于,分别输出 1 2 3 和 1 2 3 几个 Shell 里的内置变量 Tips: awk 教程 https://coolshell.cn/articles/9070.html sed 教程 https://coolshell.cn/articles/9104.html Shell script 基础问答 https://linux.cn/article-5607-1.html Shell 四则运算方法 函数定义与调用 条件判断 字符串与序列、随机数 name=John && echo 'My name is $name' 输出'My name is $name ,因为单引号里面的$只会当作字面值 字符串截取 a=123456789 ; echo ${a:0:3} 输出 123 echo 替换字符 序列 随机数 使用 cksum 从管道灌进去一些随机文本可生成一些随机数字,需要使用 cut 切 割 字符串截取 提取最后一位 日期 删除空行 Shell script 语法在线检查与建议:https://www.shellcheck.net...
阅读全文
大数据

Nexus3最佳实践系列:搭建Docker私有仓库

容器仓库是容器化管理中非常重要的一环,相当于SVN在程序研发、运维发布中的地位。因此,一个稳定、可靠的容器仓库尤为重要。 目前我知道的的数据仓库有: Docker官方的Registry原生仓库 SuSE团队推出的出的Portus:https://github.com/SUSE/Portus VMWare中国团队推出的企业级仓库—Harbor 大家熟知的Maven私服:Sonatype Nexus3 本文主要介绍下Sonatype Nexus 3这个功能强大的产品,它不仅能够用于创建Maven私服,还可以用来创建yum、pypi、npm、nuget、rubygems等各种私有仓库。而且,Nexus从3.0版本也开始支持创建Docker镜像仓库了! 因此,在上述几个产品里面我毫不犹豫的选择了Nexus3作为部门的公共数据仓库,一举多得。 一、部署 这里依然使用最简单的Docker化部署,过程非常之简单!在一台有外网的机器上安装好docker之后,执行如下启动脚本即可: 大概2分钟左右可以完成启动,此时可以通过浏览器访问 http://IP地址:8081 即可出现nexus的web界面: 二、配置 1、配置Blob存储 点击右上角的Sign in,输入默认账号密码:admin/admin123 登录到管理员身份。 打开控制页面的按钮,默认进入了仓库配置界面,选择Blob Stores开始创建存储空间: 我这边创建了如下Blob,以备后用: 2、创建Docker仓库 回到前面的repository界面,点击repositories打开页面后点击【create repository】打开仓库类型选择界面(真的非常丰富!): 可以看到Docker有三种类型,分别是docker(group),docker(hosted),docker(proxy)。其含义解释如下: hosted : 本地存储,即同docker官方仓库一样提供本地私服功能 proxy : 提供代理其他仓库的类型,如docker中央仓库 group : 组类型,实质作用是组合多个仓库为一个地址 下面开始创建Docker仓库: 首先,我们创建一个docker代理仓库,点击docker(proxy),如图填写信息: 往下翻页,勾上 “Allow clients to use the V1 API to interact with this Repository”,允许Docker V1 API请求。 至于代理的对象,我可以选择官方的镜像地址:https://registry-1.docker.io,但是官方的比较慢,所以这里我们可以填写国内的Docker镜像加速器地址,比如阿里云或DaoCloud的容器加速: 我这里选择了DaoCloud的镜像加速,这里为了确保能够拉取DockerHub最新的镜像,我选择了Use DockerHub 这个Index。 接着,再创建一个本地仓库,这里比较简单,只需要填写本地仓库的名称,比如 docker-hosted,然后填写HTTP端口即可,比如8083: 保存之后,最后创建一个聚合仓库(group),将代理仓库和本地仓库聚合到一起使用,这里我命名为docker,然后端口选择8082: 这里成员仓库的顺序可以稍微规划下,一般来说将本地的放前面,代理第三方的放后面,好处就是优先使用本地或小众的镜像仓库。我这边是用了多个第三方仓库,所有有多个: 至此,nexus在docker这一块是部署已经完成了,但是这样并不能很好的使用。因为group仓库并不能推送镜像,因为你推送自己制作的镜像到仓库还得通过本地仓库的端口去推送,很不方便! 下面分享一下我这边原创的解决方法:通过Nginx来判断推镜像还是拉镜像,然后代理到不同端口,解决这个问题,还是非常巧妙的。 3、配置Nginx 在部署Nginx部分,我们先需要生成自签名SSL证书,因为后面不想在docker pull的时候还要带一个端口!这里我们需要2个域名,一个用来展示nexus前台,另一个用做docker仓库,比如: nexus前台:repo.xxx.com docker仓库:idocker.io 生成自签名SSL证书的方法网上很多,这里推荐一个一键生成工具,大家可以尝试使用:https://github.com/Fishdrowned/ssl ,使用方法请参考作者说明。 Ps:如果你打算做外网仓库服务,那也可以去申请一个免费SSL证书,我这边是内部oa域名使用,所以只能用自签名证书了。 Nginx的规则如下: Nginx部署完成之后,我们还需要将自签名的根证书(ca.crt)导入到客户端才可以正常使用,否则会报不信任错误。 在上文介绍的一键生成自签名工具中,会生成一个根证书,名称为ca.crt,我们将这个文件上传到客户端服务器的 /etc/docker/certs.d/idocker.io 目录即可(注意目录需要创建,最后的文件夹名称和仓库域名保持一致:idocker.io)。 为了方便后面的人使用,我将上述部署证书的过程弄成一个在线脚本,实现快速部署: 脚本保存为 docker_init.sh,上传到nginx服务器的 /data/wwwroot/repo.xxx.com/download/cert 目录即可。 最终,我们可以使用如下命令行一键部署docker证书: 是不是非常方便? 4、关于高可用 相信用心的同学已经注意到了,Nexus3存在一个单点问题。在看完官方文档后,发现Nexus3的免费版本仅支持单点,只有收费版才支持集群模式: 在高可用方面,我前后做了2个尝试: ①、将数据保存到ceph分布式存储:能用,但是push的速度实在不敢恭维!layer文件越小越慢。 ②、折中方案:另外部署一个节点,每隔一段时间将主节点数据同步过去,然后备份节点每隔一段时间重启一次(不重启的话数据不会更新),并且数据再同步一份到ceph确保安全。在Nginx中,将备份节点加入到backup,当主节点宕机的时候,备机可以顶上来继续使用。 当然, 觉得这样做还不够的同学也可以参考官方的备份文档进一步优化:https://help.sonatype.com/repomanager3/high-availability/designing-your-cluster-backup-restore-process 三、小结 docker仓库的使用我就不再赘述了,nexus我们使用的是group这个聚合仓库,本地没有的镜像会去外网搜索,如果存在则拉取并缓存到本地,下次再拉取则直接使用缓存数据。所以,在拉取外网的镜像时,第一次会比较慢,第二次就和本地基本一致了。 上文提到,Nexus还有其他很多实用仓库,比如yum、python、npm、maven等等。我所在的部门也全部用到了,非常好用!感兴趣的同学可以自己去尝试配置,都非常直观简单!当然,后面有空我也会整理一下各个种类仓库的最佳实践,比如各种仓库一键初始化的经验,敬请期待!          
阅读全文
数据库

MySQL主从报错解决:Table ‘mysql.gtid_slave_pos’ doesn’t exist

给内部一个数据库做异地热备,热备部分采用了MariaDB的galera集群模式。然后挑选其中一台作为Slave和深圳主集群做主从同步。 主集群是老环境,用的版本还是是MySQL 5.5.13。用常规办法创建主从同步 结果有如下报错: 错误信息为:Last_SQL_Error: Unable to load replication GTID slave state from mysql.gtid_slave_pos: Table 'mysql.gtid_slave_pos' doesn't exist 搜了下资料,大部分说是没有执行mysql_upgrade导致的,不过我们这边的MariaDB是Docker跑的,而且用了很长时间了,理论上应该是没问题的才对。 既然提示没有这个表:Table 'mysql.gtid_slave_pos' doesn't exist,那我就创建一个吧! 从网上找到这个建表语句: 在作为Slave的MariaDB上执行,然后重启slave后问题解决,过程如下:
阅读全文