• Nginx使用proxy_redirect替换proxy_pass Response 301/302的Location字段

    nginx

    Nginx通过proxy_pass反向代理请求到任意一个地址,并将Response返回给用户,多数情况下这是没什么问题的,但有一种情况下需要额外处理301/302的Location字段,假设

    • Server: 192.168.1.2: 是内网中的一台服务,在内网环境中大家都直接访问它
    • Nginx: 192.168.1.3: 是一台外网入口的Nginx服务,访问外网IP将直接访问到它,它会反向代理到192.168.1.2

    ...

    READ ALL

  • tar打包改变目录路径

    full change directory path when packing with tar

    tar是一个非常好用的Linux下打包命令,tar默认打包是全路径,也就是你在打包时指定的路径是什么样打包后是什么样,下面看看例子

    假设要打包的目录是/home/nicholas/website

    nicholas@nicholas-B85-D3V:~/website$ ll /home/nicholas/website
    total 8
    drwxrwxr-x  2 nicholas nicholas 4096 11月 25 09:07 ./
    drwxr-xr-x 76 nicholas nicholas 4096 11月 25 09:06 ../
    -rw-rw-r--  1 nicholas nicholas    0 11月 25 09:06 index.html
    -rw-rw-r--  1 nicholas nicholas    0 11月 25 09:07 logo.png
    

    ...

    READ ALL

  • 升级etcd失误导致整个Kubernetes集群瘫痪

    Bad day

    Kubernetes依赖KV数据库管理配置数据,默认推荐使用Etcd,当然你不喜欢还有很多其它的选择。由于升级Kubernetes之后没有升级Etcd版本导致集群总有一些小问题,最明显的一个问题就是CronJob遗留的Pods不会自动清理掉,之前的文章我也说过这个问题,后来我意识到这可能是升级Kubernetes之后没有升级相应的Etcd版本导致的。之前在构建集群的时候使用的是外部自建Etcd集群,直接使用Etcd Docker镜像启动的,我的Kubernetes集群一共三台Master,为了方便我直接三台Master上分别运行Etcd程序组成高可用的Etcd集群。

    ...

    READ ALL

  • Kubernetes如何升级

    kubernetes

    Kubernetes集群升级非常简单,但如果你要升级的版本是一个末位数为0的请慎重,比如你要从v1.15.5升级到v1.16.0。我之前盲目升级导致目前一直有两个坑一个没有填好

    • 升级后CronJob的Pod不会自动清理,升级之前自动保留最后三个,即使设置了successfulJobsHistoryLimit: 3也无效,发现跟我入坑的还有不少人
    • 升级后跑Gitlab-Runner时容器总是经常command terminated with exit code 137,升级之前从来没有这个问题,开issue Gitlab团队的人回复目前这个问题无解,尝试给足够多的Resources来减少这种问题的出现,但仍然还是不能完全避免

    ...

    READ ALL

  • Crontab默认编辑器修改

    在新系统中初次使用crontab时会询问默认打开编辑器选项,不小心就选了默认的nano,由于要修改的内容也简单所以就想简单使用nano完成任务就好。结果实在是不习惯,使用了多年的vi之后很难适应别的editor,没办法只好想办法把默认的editor改回vim。

    有两种方式可以改

    通过环境变量

    环境变量可以设置VISUALEDITOR,两个任何一个都可以,如我想在编辑crontab时使用vim打开可以这么做

    VISUAL=vim crontab -e  
    

    或者也可以这样

    EDITOR=vim crontab -e  
    

    ...

    READ ALL

  • vim粘贴代码缩进问题

    vim

    原因

    很长时间以来,我以vim做为我的主要编辑器在Linux下写程序,但vim设置了smartindent之后通过终端SecureCRT连接Linux使用vim时每次粘贴代码缩进都会出现下一行代码的起始位置在上一行代码的末尾处,依此类推,你粘贴的行数越多,就越明显,如:

    源片段:

    resources:
      limits:
        memory: 4096Mi
        cpu: 300m
      requests:
        memory: 128Mi
        cpu: 100m
    

    ...

    READ ALL

  • NodeJS请求431 Request Header Fields Too Large 错误

    nodejs

    公司使用verdaccio-gitlab搭建了私有的NPM Registry,并使用Gitlab服务做授权,一直运行稳定。

    直到最近升级了NodeJS版本之后,陆续发现有一些问题:

    • 固定一部分用户在请求packages接口时总是400错误
    • 部分用户不受影响

    从问题上分析,大概判断是跟用户数据相关引发的错误,但verdaccio-gitlab这个包只给出了400错误,很不好确定具体错误。于是直接在测试环境启动了一个Verdaccio然后发现其实有问题的那一部分用户状态码其实是431 Request Header Fields Too Large,意思就是请求头太大。

    ...

    READ ALL

  • 修复Docker错误 no space left on device

    docker

    我使用的是Mac电脑,我习惯在我电脑上Build镜像之后在推送到私有Registry。

    然而,今天我正要构建一个镜像时出现了错误

    no space left on device

    提示空间不够了。Docker使用分层存储技术很大程度上避免了空间浪费,但日积月累的也会有爆满的时候,就像垃圾桶一样,堆满了自然无法容纳更多的垃圾。Mac上安装了Docker程序之后默认占用磁盘空间为64GB,所以要解决空间不够的问题可以从两方面下手

    ...

    READ ALL

  • Debian9 UFW防火墙

    ufw

    之前一直都在使用iptables好多年,因为它是系统基础的一部分,很多Linux发行版本都适用它。可每次需要添加端口删除端口的时候都需要重新查询手册,虽然功能很强大,但太复杂了。

    今天我们要介绍的是一款非常简单容易上手的防火墙UFW,英文名: Uncomplicated Firewall,中文名应该叫简单防火墙。它其实底层还是使用了iptables,它基于iptables封装了一些非常日常易用的命令。

    安装

    使用Debian自带的包管理工具apt就可以安装

    ...

    READ ALL

  • 一切从简 - 新改版

    废了很多精力终于改版结束,上一次Python改版至今已有六年,本次改版有很多想法都是基于这些年的对个人博客系统的逐渐深入认识,最后得出本次改版的目的一切从简

    无数据库

    之前一直使用关系型数据库MySQL做为数据存储引擎,由于个人文章数量不太多所以没有遇到性能瓶颈问题,虽然在设计表的时候做了很多查询优化。使用数据库会有以下几个问题:

    • 在线编辑器: 通常需要搭建一个HTML在线编辑工具编写内容,然后通过程序往数据库读写,但这种在线编辑器经常在贴代码的时候不太好处理,浏览器的性能还是有限的,页面卡死崩溃内容丢失就有发生过
    • 需要部署: 虽然现在部署一个MySQL有很多方式可以非常容易做到,但我认为能不用就不用
    • 更好维护: 不用担心数据库挂了影响使用,也不需要总是关心MySQL日志异常或者慢查询

    ...

    READ ALL