Migrate to Hugo

2017年搭建的hexo博客,因腾讯云学生机即将过期,这几年用下来也觉得:似乎没什么必要续费云服务器 另外,人老了对npm这种一大坨恶心东西没什么好感,因此决定换用hugo,以此记录。 hexo迁移到hugo 腾讯云迁移到github pages 启用disqus评论 UPDATE 2020-09-10 由于实在忍受不了github pages速度。。。。 于是: 又迁移到了腾讯云对象存储+CDN+免费HTTPS证书,按访问量收费,估计就。。。几块钱一个月吧,可以忽略不计- -# 使用腾讯云对象存储coscmd工具上传public文件夹,和之前github pages上传到github一样,也问题不大。。 ……

阅读全文

Vue项目使用Nginx部署并发布到子目录

Vue项目使用Nginx部署并发布到子目录 默认Vue项目是以根目录来发布的,但是我们要有时候希望以子目录来做发布,那么就需要做一些修改,Vue项目本身的配置,包括Nginx也需要做一些配置修改。 对Vue项目源码的修改 以下路径以vue-cli常见项目的文件结构来说明。 修改路由:router/index.js,添加base部分的代码。 1 2 3 4 5 6 7 8 9 10 function getAbsolutePath () { let path = location.pathname return path.substring(0, path.lastIndexOf('/') + 1) } export default new Router({ mode: 'hash', base: getAbsolutePath(), routes: [...] }) 修改配置:config/index.js 文件,对于打包路径的定义,只处理build,将assetsPublicPath: '/'修改为assetsPublicPath: './' 1 2 3 4 5 6 7 8 9 10 11 12 13 module.exports = { build: { // Template for index.……

阅读全文

记一次celery worker hang debug

记一次celery worker hang debug 【写在前面】: 本文最终并没有debug出为什么卡住,虽然换了种方案解决了问题。 引入celery是为了调用京东api来做发货行为,以便提供给电商业务下快递单,然而在这个过程中,踩了一些坑(此文大概是2018年底的记录) 最初的配置,使用supervisor来管理celery进程,并且在代码更新之后,使用supervisorctl restart {$APP_NAME}来更新代码(celery并不支持gracefully reload,也暂时没有用其他更优雅的方案,待更深入的测试) 发现问题 线上的celery总是一段时间之后,就没有接受新的请求,celery beat还在发消息,python代码也在发消息存到broker(redis)里面,但消息一直没被消费 debug过程 找出celery worker的pid, www-data 6329 0.0 0.6 157228 50640 ? S 2018 0:03 /home/ubuntu/.pyenv/versions/3.7.1/envs/ems-admin-api/bin/python /home/ubuntu/.pyenv/versions/ems-admin-api/bin/celery -A settings beat -s /tmp/celerybeat-schedule --pidfile= -l info www-data 10004 0.1 0.6 162456 53804 ? S Jan02 4:12 /home/ubuntu/.pyenv/versions/3.7.1/envs/ems-admin-api/bin/python /home/ubuntu/.pyenv/versions/ems-admin-api/bin/celery -A settings worker --autoscale=8,4 -l info www-data 18317 0.0 0.6 173032 56280 ? S Jan03 0:04 /home/ubuntu/.pyenv/versions/3.7.1/envs/ems-admin-api/bin/python /home/ubuntu/.……

阅读全文

pipenv使用指南

pipenv使用指南 厌倦了使用virtualenv pyenv的时候,总是先要创建一个虚拟环境,然后激活虚拟环境再写代码 有时候就单纯想要写点scripts,那么pipenv这个开箱即用的虚拟环境显然更适合 确保当期不在任何虚拟环境中,或者说在系统的解释器中 pip install pipenv 然后其他安装命令,以pipenv代替pip 比如pipenv install -r requirements.txt会将pip的依赖文件requirements.txt转换成pipenv的版本管理格式文件Pipfile和Pipfile.lock 如果是空项目,那么直接pipenv install {third-party-lib} 默认将会为你创建当前目录加随机字母组成的虚拟环境,后续直接管理 位于 ~/.local/share/virtualenvs/{pwd_basename}-{random_stuff} 如果需要在vscode中支持pipenv的话,新增支持pipenv的虚拟目录位置 然后就可以愉快地选择pipenv的虚拟环境了……

阅读全文

pyenv使用指南

背景 之前使用venv,大部分情况下并没有什么不好,配合virtualenvwrapper,用起来倒也顺手,如果没有Python版本切换需求的话。 日常开发机器使用的python是最新版,logging的时候,使用了f’i am a {var}‘这种format语法,而这个特性是Python 3.6之后才有的,于是上线之后凉凉= = (生产环境的机器是Ubuntu 16.04,仅使用apt管理Python版本,于是装的版本实际上是3.5.2) 既然吃了一回亏,那么就赶紧解决问题。。。 题外话:貌似在Python的benchmark中,3.5、3.6、3.7中性能最差也是3.5,于是,抽空将生产机器改成用pyenv来管理版本 食用步骤 参考pyenv-installer进行安装和配置 直接装需要的Python版本啦,比如pyenv install 3.7.1 如果安装过程中有任何问题,参考common build problems 如果安装也成功了,那么希望更改当前shell环境的Python版本来替换掉系统的版本,可以使用pyenv global 3.7.1 virtualenv使用 使用指定的Python版本创建虚拟环境pyenv virtualenv 3.7.1 myenv 启用虚拟环境 pyenv activate myenv 退出虚拟环境 source deactivate 进入项目目录自动启用虚拟环境,离开项目目录退出虚拟环境,需要在项目目录内 pyenv local myenv,会创建一个.python-version的文件,内容为虚拟环境的名字,则为myenv done, 希望食用快乐~……

阅读全文

Python日期相关知识及处理

Python的日期实现/Linux发行版一般使用(tz database/Olson database)1 Python中的日期 一般使用pytz库来操作日期 django中的时区使用问题 https://docs.djangoproject.com/en/2.1/topics/i18n/timezones/ Time zone support is disabled by default. To enable it, set USE_TZ = True in your settings file. Time zone support uses pytz, which is installed when you install Django. When support for time zones is enabled, Django stores datetime information in UTC in the database, uses time-zone-aware datetime objects internally, and translates them to the end user’s time zone in templates and forms.……

阅读全文

Ubnt ER-X pppoe定时重新拨号

为什么需要定时拨号? 先来看一组数据 从命令sudo cat /var/log/messages | grep local的输出结果来看,IP地址基本上每隔一定时间就发生变化。 从命令show interface pppoe pppoe0 log里面可以找出类似的日志,大意是电信给我们的路由器发了terminate命令,让我们断开连接。 结论也就是: 广州电信,每次拨号维持时间为2875分钟/23小时55分钟,每次拨号维持这么长时间会被强行断网。 时间刚好是9点左右,每隔两天会减少5分钟,也就是。。。如果我周末这个时间点在家玩游戏,然后刚好碰上了,给我来个断网,呵呵 解决方案 既然知道电信有这么蛋疼的设定,那么我们完全可以在不使用网络的情况下主动断开并重连来避开这个问题。 具体使用命令主要是下面两个: 断开pppoe disconnect interface pppoe0 连接pppoe进行拨号 connect interface pppoe0 那么如何定时去执行呢? ERX运行的系统基于Linux,那么第一个想到的方案就是使用crontab来跑定时任务,而在相当长的一段时间也是这样干的(路由器固件一般一两个月更新一个版本,除了更新版本,就没重启过路由了。。。) 直到,最近更新了路由器固件,crontab设置被清空了(这是固件设定,需要经过特定的方式做更新才能免于灾难) 所以。。。最后写了个自定义的脚本,再使用系统授权的方式 task-scheduler 来执行这个脚本。 编辑文件: sudo vi /config/scripts/pppoe-redial.sh #!/bin/bash # 由于connect/disconnect命令都是alias,所以需要使用wrapper run=/opt/vyatta/bin/vyatta-op-cmd-wrapper $run disconnect interface pppoe0 sleep 10 $run connect interface pppoe0 保存~ 赋予执行权限 sudo chmod +x /config/scripts/pppoe-redial.……

阅读全文

Nginx配置的一些简单防护

拿到一台服务器之后,不管是用一键包还是正常软件包管理安装,一些简单的安全配置还是必要的。 验证server_name 首先需要验证server_name,因为IP和域名是一对多的关系,除非针对性攻击,否则一般是用IP+端口来尝试扫描服务器上面运行的网站和服务以找出一些通用的漏洞。(脚本小子最爱) 下面以test.sukikaka.com为域名来说明: 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 server { listen 80; server_name test.sukikaka.com; # 假设我的vhost放这个位置 root /data/vhost/test_sukikaka_com; index index.php; gzip on; gzip_types text/plain application/xml; gzip_min_length 1000; gzip_proxied no-cache no-store private expired auth; access_log /var/log/nginx/test.……

阅读全文

网络基础-端口连通测试与排查

本文围绕端口讲解网络流量流向中可能出现的各种问题,水平有限,仅当入门篇。 访问端:怎么确认目标设备对应端口已经开启 常规方法: tcpping 端口open状态 telnet 端口可连接 其他tcp方案 本地端口没有被运营商or其他工具封锁,比如邮件的25端口 如果以上外部方案都发现并不能连接到目标端口,该那么怎么排查问题 SSH登录目标主机 假设我们想了解为什么80端口没连通,先确认80端口是否正在服务 sudo netstat -anp | grep :80 从结果可以看出主机已经开启了80端口,且服务的程序是Nginx 被访问端:如何确认有请求访问 以下假设访问端和被访问端使用公网访问。 ifconfig找出公网流量交换的网卡,比如下图我的是eth0 监听网卡eth0上的80端口的流量 sudo tcpdump -i eth0 port 80 开启监听 另外一台机器使用tcpping来访问tcpping 45.34.167.101 80 观察tcpdump结果 结果是连通的,可以清晰看到tcp3次握手的sequence code 接下来使用sudo service nginx stop关停nginx的80端口,然后再次做tcpping 端口已经关闭了,tcpdump依然可以看到类似上面的tcp握手请求 被访问端:怎么确认端口是可达的(未被封锁) 那么假设防火墙拦截对80端口的请求呢?我们使用iptables对INPUT的流量全部采取DROP处理 sudo iptables -A INPUT -p tcp --dport 80 -j DROP……

阅读全文

一种有趣的测试环境部署方式

大背景 说需求不讲背景就是耍流氓。 ———– by 一个被虐的码农 那么,背景是这样的,公司现有的测试业务情况如实交代: 局域网自建mongo数据库,用于业务的测试环境数据(IP:192.168.2.100,电信公网IP 200.201.202.203,标记为服务器A) 公网阿里云ECS(IP: 100.101.102.103,标记为服务器B),用于外网测试环境代码的运行,通过服务器A的公网IP来连接mongo数据库 阿里云DNS配置A解析记录 dev.xxx.com 100.101.102.103 在脱离公司的公网环境,需要能正常访问dev.xxx.com的服务 问题来了 运营人员抱怨各种测试服务反应很慢。噢?那么我们来研究下网络数据走向和对应的时间消耗咯 运营人员使用测试服务->DNS解析dev.xxx.com->请求服务器B->通过服务器A的公网IP连接到mongo数据库->上传数据回服务器B->返回数据给和服务器A同一个公网出口的App(哇,这链条长的很开心) 通过配置PHP fpm slowlog得知,发现实际上时间消耗都花在了mongo相关的连接上面了,为什么呢??? 分析问题 我们用的电信家用宽带,100M下载带宽,上传也就那么4M,完全不能看啊,稍微查询一个大一点的数据集,传输时间够喝一壶了,而且这么4M带宽,还要服务于公司员工正常的上网需求,那么降低这里的上传带宽使用也是很有必要的。 选定方案 so,找到问题了,光说有什么用,得有解决方案啊 把数据库也扔到外网去,那么对整个公司局域网来说,主要消耗只有对公网服务器B的请求下行数据,然而mongo对硬件消耗有点大,作为一个测试环境来讲,升级硬件配置或者再开一台服务器难免有点资源浪费,退而求其次,合理利用局域网服务器做mongo服务才是正路 服务器A硬件配置是强于ECS好多倍的,不要浪费了,那么就在服务器A上面搞事吧 通过分析上面的请求路径,那么我们可以把服务器A的公网上传拦截掉,怎么拦截呢?从DNS上面动手,于是请求路径会变成:APP->解析dev.xxx.com->请求服务器A(192.168.2.100)->服务器A的程序请求localhost的数据库->返回数据给程序->返回给同一个局域网的运营测试人员 这样一来,速度提升的有点可怕,运营人员再也不腰痛了 解决问题 既然有初步方案了,那么怎么解决? 那么需要使用“提速”的运营人员,可以通过配置HOST来实现 dev.xxx.com 解析成 192.168.2.100,如果只有PC平台的产品,倒也不失为一种选择 移动设备怎么办?Android不root,iOS不root没法玩啊,除非这些测试机器允许以某种方式“模拟配置host”,比如Android读取sd卡某个文件,若定义了解析数据,则以解析结果为准,需要预埋代码,改起来也麻烦,一点也不优雅 移动设备实在没办法改呢?那我配置代理咯,代理设备请求到能改HOST的PC设备,也是麻烦 既然这么蛋疼,那我配置一个DNS服务器好了,一番搜索之后,unbound这个软件上场了,配置一个DNS服务器,使用标准端口53,将局域网所有需要”提速“的设备首选DNS改成192.168.2.100即可 本着优化应该对使用者透明的原则,把上面这个配置DNS的步骤也省了,直接用DHCP服务器返回192.168.2.100作为首选DNS 断一下网,重新连接,刷新页面,一切只如初见,那么美好~ 题外话 有人说,为了性价比,透明解决问题,为何不把所有服务都放在局域网的服务器A上面,连买ECS的钱都省了。。。 骚年,你还是太年轻 电信运营商怎能允许家用宽带用来做服务器提供服务这种行为,那么谁购买他高贵的企业专线带宽呢?于是我们家用宽带的80端口、8080端口默认都是被封了。 就算运营商不搞事,国家要求所有IDC必须只对有域名备案信息的域名才能提供正常的服务,就算配置了解析,在访问到具体的IP的时候,也是一样不能正常访问你的业务,从这个角度来讲,电信运营商封锁这两个端口也算是为了规避备案问题。 改端口也不是不行,然而综合考虑,改端口方案导致各个业务都需要做额外的配置修改,还是买个ECS做外网测试业务简单粗暴 那么其实除了上面的DNS方案,还有没有其他方案?答案是有的,理论上通过配置路由表SNAT,把对服务器B(100.101.102.103)的流量请求转发到服务器A192.168.2.100,然而该方案似乎有点一刀切,不够灵活,还是留着DNS,需要这种访问链路优化的话,配置首选DNS服务器为192.168.2.100,不需要的时候或者想强行访问服务器B的逻辑,那么只需要配置其他公用DNS即可。 UPDATE 2017-09-05 由于在实际使用过程中(大概1个多月的持续时长),发现对于不甚了解原理的小伙伴来讲,有额外的理解成本,业务也准备上HTTPS访问,那么就又来搞事吧,于是改为下面的方式:……

阅读全文