2018年6月29日
为什么需要定时拨号? 先来看一组数据
从命令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.sh
通过task-scheduler设置定时任务
configure set system task-scheduler task redial crontab-spec '0 3 * * *' //每天凌晨3点执行,设置格式参考crontab set system task-scheduler task redial executable path /config/scripts/pppoe-redial.……
阅读全文
2018年1月5日
拿到一台服务器之后,不管是用一键包还是正常软件包管理安装,一些简单的安全配置还是必要的。
验证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 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.……
阅读全文
2017年10月30日
本文围绕端口讲解网络流量流向中可能出现的各种问题,水平有限,仅当入门篇。
访问端:怎么确认目标设备对应端口已经开启 常规方法:
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
访问端再次使用tcpping发起请求,可以在被访问端tcpdump看到请求,但无法成功建立tcp连接 访问端看到的请求结果 -> timeout,network packet只进不出,被DROP了 弄完之后我把iptables删掉啦,不然网站都开不动啦- -# sudo iptables -D INPUT -p tcp --dport 80 -j DROP……
阅读全文
2017年8月31日
大背景 说需求不讲背景就是耍流氓。 ———– 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访问,那么就又来搞事吧,于是改为下面的方式:
仅保留局域网服务器A,全部使用Let’s Encrypt部署HTTPS访问(电信没封443端口),局域网访问可以使用HTTP或者HTTPS,而公网访问就只有HTTPS能通啦- - unbound DNS配置依然保留 路由表在另外一个服务器上面,暂时未变动 ……
阅读全文
2017年8月29日
工具链 编程语言
Java/Kotlin C/C++(NDK方向,源码阅读) SQL(DB) HTML/JS(Hybrid/Web App) 操作系统
Linux/macOS/Windows IDE:
Android Studio为主 Eclipse 网络调试
代理请求劫持与分析、重放:Charles/Wireshark/Fiddler 接口请求:Postman 内存分析
Eclipse MAT Plugin Android Studio Monitors LeakCanary 综合分析(CPU、Network、Memory、GPU):
Android Studio Monitors Android Tools
Method Tracer ui hierarchy viewer ui automator viewer draw9patch 代码管理
版本管理 Git SVN Code Review: Gerrit Git托管系统比如(github/gitlab/oschina/coding)的Pull Request Android Studio VCS git log 团队协作
Teambition Tower git issues 编译工具
Gradle 持续集成、分发
Jenkins Travis CI 早期测试分发
fir.im 蒲公英 App初级入门 基础组件
Activity (launchmode/category) Service Content Provider Broadcast Receiver Intent & Intent Filter Manifest Permission UI……
阅读全文
2017年8月24日
服务器配置 工欲善其事必先利其器,如果都不知道什么时候可能会产生日志,不知道哪里能查到错误日志,那么谈何排查?
启用PHP错误配置[PHP程序运行错误日志]: /etc/php/*/fpm/php.ini (以FPM为例,cli同理) log_errors = On error_log = /tmp/php_errors.log 启用fpm errors[这个是FPM本身的错误日志,不是服务的PHP程序的错误日志]: /etc/php/*/fpm/php-fpm.ini error_log = /var/log/php-fpm.log 启用FPM workers slowlog/errors: /etc/php//fpm/pool.d/.conf ; 因为PHP程序是以fpm worker的形式运行的,所以要获得输出需要启用worker output catch_workers_output = yes ; PHP 程序代码慢查询日志,比如代码中连接了数据库做查询,当超过一定时间则增加一条slowlog slowlog = /var/log/$pool.log.slow ; 此处定义多长时间为慢查询,一般5s已经很丧心病狂了 request_slowlog_timeout = 5s 修改完之后,使用sudo php-fpm -t做测试,一般会有的错误是,错误日志指定的路径不对,或者没权限写入,修改成其他可以写入的路径即可
一些错误示例 FPM Slow log,该优化代码啦!!! PHP Error,该修BUG啦!!! NOTE 看了还不赶紧配置日志、看日志改代码的同学,你懂的。……
阅读全文
2017年5月27日
为什么要用Webhooks来更新代码 服务端的代码,不希望直接在服务器上面做更改,需要有中央仓库做托管管理,也利于协作 某些情况下,不希望给开发人员服务器ssh登录权限 开发时,希望得到更快的上线部署速度,享受git commit & git push & refresh的快感 Webhooks部署时需要考虑的一些因素 现有github,gitlab,oschina等一些托管基本都支持Webhooks,原理都是利用git hooks来做的拓展 什么情况下需要更新代码?根据commit message?根据branch? 更新代码时的执行身份?由什么用户来执行git? 设置Linux服务器 前提:当前已经登录root用户或者具有sudo权限的用户 确认即将用于执行git命令的用户,假定我们新增一个用户名git,专门用于跑git命令,那么执行 sudo adduser git,并设置密码 接下来,将git用户添加到sudo组:sudo adduser git sudo[此步骤非必须] 假定项目代码放在/www下面,且Owner是git,那么执行sudo mkdir /www && sudo chown -R git:git /www 由于我们的Webhooks代码是用Nginx + PHP-FPM部署的,那么确认下PHP脚本的运行用户情况:ps aux | grep php-fpm, 确认www-data为我们的运行用户 将www-data加到git用户组:sudo usermod -aG git www-data 给www-data用户不需要密码就能切换到git用户,并且用git用户的身份执行/usr/bin/git命令,修改sudoers:sudo vim /etc/sudoers,添加一行配置:www-data ALL=(git) NOPASSWD: /usr/bin/git 允许同组用户新增文件时继承原有文件夹权限位:sudo chmod -R g+s /www[此步骤非必须] 由于我们希望无密码自动拉取代码,那么gitlab代码也是使用ssh方式来配置连接方式的,且hooks被触发时是通过www-data切换成git用户来执行/usr/bin/git命令,那么实际上git pull等命令使用的SSH key是git用户的SSH key,确保已经将git用户的/home/git/.ssh/id_rsa.pub文件的内容设置到gitlab项目中 实现Webhooks项目的代码 请参考gitlab-php-webhooks,具体逻辑请看代码注释
设置gitlab的Webhooks
项目文件夹权限设置: 项目生成的日志文件权限情况: nginx配置参考 server { listen 80; root /www/push-gitlab; index index.……
阅读全文
2017年5月25日
准备工作 安装docker、docker-compose 更改docker镜像源地址,加速访问 创建Dockerfile 在用户目录下创建docker项目文件夹 $ mkdir -p ~/docker && cd ~/docker 创建Dockerfile $ vim Dockerfile 由于我们是基于Ubuntu14.04做的镜像,所以定义好官方Ubuntu地址即可,在Dockerfile插入:FROM ubuntu:trusty,保存Dockerfile,然后运行docker build -t ubuntu:14.04-php-nginx .,如果你是第一次运行,需要从上面修改的docker源拉取ubuntu的镜像,会比较久。 我们用docker images来看结果,会有两个镜像,一个是拉下来的ubuntu:trusty,一个是我们定制的镜像: ubuntu:14.04-php-nginx 现在我们已经拥有一个本地image,使用交互模式启动容器准备进行定制 docker run -t -i ubuntu:14.04-php-nginx /bin/bash 把它当成一台装了Ubuntu的虚拟机,该怎么样怎么样,我们准备安装PHP-FPM和Nginx及一些PHP扩展,那么正常命令是这样的:(容器以root用户登录,且默认没有sudo命令,则不需要sudo) apt-get update apt-get install -y nginx nginx php5 php5-fpm php-pear php5-dev php5-redis php5-gd php5-curl php5-mcrypt imagemagick php5-imagick supervisor pecl install mongo echo 'extension=mongo.so' > /etc/php5/mods-available/mongo.ini ln -s /etc/php5/mods-available/mongo.ini /etc/php5/fpm/conf.d/20-mongo.ini 漫长的等待时间之后,安装完了 7. 由于默认的系统是UTC时间,我们将它改为CST
rm /etc/localtime echo "Asia/Shanghai" > /etc/timezone dpkg-reconfigure -f noninteractive tzdata 成功之后会输出当前的local time……
阅读全文