清水

最小的善行胜过最大善念

今天是个好日子

2017年7月4日,是个好日子!

首先,家里的书架终于腾出空间,可以再买些来囤了哈;其次,换了纯 SSD 的 iMac 27 寸今天到;最后,运行将近 5 年的平台终于搬迁至阿里云,如释重负!

平台之所以决定选择阿里云,是不想再承担服务器软硬件故障的风险了,近半年来平台断网的次数确实很多,软件硬件因素都有,至于迟迟没转到阿里云,一是数据量太大,数据迁移是个问题,二是客户多线路互联互通的问题,在身处异地又再次出现服务器故障的那刻起,毅然决定,刻不容缓的将平台移至阿里云!

将亿级别、压缩后将近90G的数据库备份做公网迁移确实从来没尝试过,在协调好出入网带宽都调升后,传输完成依然花费了将近8个钟,在不超过9个小时的维护时间内完成各服务的迁移是肯定不够的,备份还原就花费将近2个小时,这次迁移在最后由于数据版本的不一致没能一次性完成数据恢复,只能第二晚做个差异备份,完美还原。今天第一天运行,各指标无出现异常,心里的石头暂时得以放下!后面的路依然任重道远。

哦对了还有,快四个月没跑步了,可以重新开跑了哈!

斐讯K2刷机Padavan固件RT-AC54U-GPIO-1-PSG1218-64M_3.4.3.9-099

原版管理地址为:192.168.2.1
Padavan 默认管理地址:192.168.123.1,用户名密码则均是admin

之前刷好过一个,今天同事拿去用了。又得刷一次,刷机方法网上很多,这里仅记录自己亲测的一个方法(不适合小白)。

刷之前要先确定当前机子固件的版本,有的版本不能直接进入Breed(是什么鬼目前还没搞懂),要经过降级才可以。

我手头就有两个不一样版本的机子,刷的方法也不一样,其中一个22.4.5.42可以直接降至22.4.2.9然后进入Breed;而22.4.6.3则降不了!网上有介绍通过修改页面HTML直刷Breed,但亲测失败,最后发现当前最新版本为22.5.9.163,网上有介绍这个可以降至22.4.2.8,亲测成功,流程如下:

0、首先去官网下载最新版22.5.9.163,然后手动更新该固件。
1、下载一个定制版固件(k2_163_v11_breed.bin)和老版本的官方固件(22.4.2.8,SW_K2_703004657_V22.4.2.8.bin)。
2、进入路由手动升级(实为降级)至定制版固件。
3、按住复位键,插上电源,按住等待7秒钟,浏览上输入:192.168.1.1,进入Breed Web设置页面,在Breed“环境变量设置”中改为“禁用”。
4、点击“固件更新”里刷回老版本的官方固件。

接下来就是刷入Breed了,这里用网友tianbaoha原创的恢复配置文件(tianbaoha_breed_ssh.dat)方法:

1、进入路由器后台,点击:高级设置 -> 系统设置 -> 备份恢复,完成恢复。
2、重启后,使用新的密码“tianbaoha”登录。
3、先拔掉电源,在断电状态下,按住路由器后面的重置按钮不放,插上电源,持续按住10秒左右,再松开按钮,等待1分钟。

如果顺利,这时访问192.168.1.1就能进入到Breed Web控制台界面了。只要成功进入Breed Web恢复控制台,就可以刷各种固件了。

这时,我有一个疑问,为啥既然在降至定制版固件后可以进入Breed了,怎么不直接就刷Padavan固件呢!?(各种设备已收拾完毕,下次再试吧哈哈。)

4、点击「恢复固件」-> 固件 -> 浏览,选中下载好的Padavan固件,比如我是「RT-AC54U-GPIO-1-PSG1218-64M_3.4.3.9-099.trx」,点击「上传」即可。

总结

首先要进入路由的Breed模式(相当于安全模式吧),新版本的已经关闭这个模式了,需恢复大神们做好的配置文件,方能进入Breed模式。而这个文件也是有版本要求的,22.4.2.9或以下(不一定准确)就可以了,所以新版本的需求先降级,只要成功进入Breed模式,就可以刷各种固件了。

文件下载链接

http://pan.baidu.com/s/1eSmrPFs 密码: br92

参考连接

Padavan开源网站
rt-n56u 中文站点
斐讯 K2 最简单刷 breed 与第三方固件教程
刷机之斐讯路由器K2尝试华硕Padavan固件
改华硕[N14U N54U]5G 2G的7620老毛子Padavan固件

在树梅派通过GPIO控制风扇开与关

你永远都不知道地球下一秒会发生什么事,就像我也不知道为什么会现在会在玩树莓派、玩 Arduino,且是毫无目的,原本只想打发一下空余的时间,玩玩 Linux、底层、Python,却搞了个 Raspberry Pi 和 Arduino,目前想到最合适自己有用的东西就是装个 OpenELEC 做家庭媒体中心,然后做个自动下载机,用手机控制播放,娱乐心情。在网上下手了最新的 Raspberry Pi 3 B 和一些相关配件,硬件一切就绪,唯一美中不足的就是风扇声音太大。玩树莓派的都难免要自己折腾,所以就想让系统根据温度控制…… 写一半有事,回头再继续吧:(

Centos 7下subversion的简单操作

subversion(简称 svn)是近年来崛起的版本管理软件系统。一直在 Windows 下使用,今天刚好要创建新的版本库,之前忘了怎么配置了,今天重操作一次,这里做个简单备忘。

查看 subversion 软件的版本及安装相关情况

$ rpm -ql subversion

$ yum info subversion

查看 svnserve 运行的版本库目录

$ ps aux|grep svnserve
root      5167  0.0  0.2 166788  1024 ?        Ss   00:04   0:00 svnserve -d -r /var/svn/repos
pcvc      5258  0.0  0.1 112656   976 pts/0    S+   00:39   0:00 grep --color=auto svnserve

进入版本库目录

$ cd /var/svn/repos

创建新目录

$ mkdir newrepos

创建SVN库

$ svnadmin create .

也可以直接 $ svnadmin create /var/svn/repos/newrepos

修改配置

$ vi svnserve.conf

一般设置以下三个配置即可,none 表示无权限,read 表示只读,write 可读写

anon-access = none     # 未登录的不可读写
auth-access = write    # 已登录的可读写

password-db = passwd   # 指定账号文件

编辑 passwd 文件

添加登录名和密码,格式为 登录名 = 密码,一行一个账号

在客户端连接 svn 版本库

$ svn co svn://192.168.0.21/test

co 子命令后面的 PATH 结尾如果为目录名时将自动创建目录。输入本地登录名的密码,然后再输入 svn 的登录名和密码。

$ svn co svn://192.168.0.21/test
Authentication realm: <svn://192.168.0.21:3690> d0d9bfe0-1936-4cc6-9591-db97a5aed664
Password for 'pcvc':
Authentication realm: <svn://192.168.0.21:3690> d0d9bfe0-1936-4cc6-9591-db97a5aed664
Username: test
Password for 'test':
Checked out revision 0.

默认情况下第一次输入账号名和密码后就记住,如果不想记住可用相应参数控制。

下来就可以使用各svn子命令管理版本了,查看各子命令的帮助:

$ svn help

$ svn help <subcommand>

Django对静态文件的处理

本文 Django 版本:1.9.1

正如 Django 官方文档所说的,静态文件,像图片、CSS、JS 等都应该交由专门的服务器(如nginx)来处理,Django 只负责动态逻辑的处理。但在开发阶段也是要使用静态文件来调试页面,为此 Django 提供了一些工具来处理静态文件,作为开发阶段的临时解决方案。所以 Django 对静态文件的处理要分开发环境和生产环境两种情况来说明。

开发环境

Django 提供了 django.contrib.staticfiles 应用来处理静态文件,默认情况下在创建完项目后在 settings.py 里的 INSTALLED_APPS 配置项已包含了这个应用,同时设置了 STATIC_URL = '/static/' 这个配置,启用 staticfiles 应用后必须配置 STATIC_URL,那这配置是什么作用呢?

一般情况下,网页的静态文件是以如 <img src="/static/images/a.jpg" /> 的形式去引用。在 settings.py 里,当 DEBUG = True 时,Django 就利用 staticfiles 处理静态文件,假如 STATIC_URL 设置为 /static/,当收到URL为 /static/ 前缀开头的请求时,将首先通过 STATICFILES_FINDERS 设置的寻找方式去查找,STATICFILES_FINDERS 默认值为:

STATICFILES_FINDERS = [
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
]

第一种方式是 FileSystemFinder,文件系统查找方式,将按 STATICFILES_DIRS 的配置去查找,STATICFILES_DIRS 的默认值为[],STATICFILES_DIRS 的配置值要为绝对路径,如 STATICFILES_DIRS = ['/var/web/pcvc.net/static'],根据需要可直接在 settings.py 文件添加这个配置项。

第二种方式是 AppDirectoriesFinder,应用目录查找方式,也就是在每个应用下的 static 目录下查找,static 这个名称是固定的。

Django 会按照 STATICFILES_FINDERS 配置的顺序去查找,一旦找到资源就直接返回,不会再查找,所以如果存在多个应用且名字相同的资源文件要注意路径名称的问题。

Django 静态文件的查找基本上就是这样,还有另外一种是存储引擎方式,没有深入研究,不做介绍。

这时候就可以在模板文件里引用静态文件了,如 <img src="/static/images/a.jpg" />,当然,在 HTML 里直接用这种硬 URL 未免有点粗暴,一旦碰到文件目录发生改变,所有这样引用的模板文件都要改动到。官方推荐的是使用模板标签 static,如下:

模板文件里生成URL

其它方法可以查阅以下参考部分,这里就不再记录了。

生产环境

生产环境下主要是将静态资源统一收集到固定的路径,然后在 Web 服务器配置访问这个路径去访问所有静态资源,这时 Django 只是使用 collectstatic 将所有静态文件复制到 STATIC_ROOT 指定的绝对路径。

STATIC_ROOT = '/var/web/pcvc.net/collected_static',执行以下命令:

# python manage.py collectstatic

修改 nginx 网站的配置:

location /static {
    alias /var/web/pcvc.net/collected_static;
}

参考

Django对静态文件的处理——部署阶段
理解 django.contrib.staticfiles
Django中对静态文件的支持
Django中静态文件设置方法
Django处理静态文件方法

CentOS 7基于nginx,uwsgi,django搭建web服务器

系统版本:CentOS-7.0-1406-x86_64-Minimal

0、安装完成后检查一下经常使用的工具是否有安装,如:wget、ifconfig、unzip、tree等等。

配置yum源,大家说用163.com的,但 yum info nginx 依然找不到,后来用了阿里云的就可以了。

1、安装wget

# yum install wget

2、安装ifconfig

# yum install net-tools

3、通过yum安装nginx,参考:CentOS 7 YUM 安装 Nginx

关闭防火墙或添加80端口,这时就可以网页了。

4、安装pip

# wget https://bootstrap.pypa.io/get-pip.py --no-check-certificate
# python get-pip.py

5、安装uwsgi和uwsgi-plugin-python插件

# yum install uwsgi uwsgi-plugin-python

6、安装django

pip install Django==1.9.1

7、测试uwsgi

# uwsgi -s 127.0.0.1:9090 --plugin python --wsgi-file /web/index.py 

8、配置nginx.conf,以下为server配置节

server {
    listen       80;
    server_name  localhost;

    location / {
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:9090;
    }
}

9、以ini配置文件方式启动uwsgi,uwsgi myweb_uwsgi.ini,ini文件内容:

[uwsgi]
chdir = /usr/share/nginx/html
module = myweb.wsgi
plugin = python
socket = 127.0.0.1:9090
daemonize = /usr/share/nginx/html/uwsgi.log
chmod-socket = 666 # 将socket文件的权限设为666  

下午搞了好久都无法访问,后来通过查看nginx日志,才知道是权限问题,由于没有加chmod-socket,nginx无权限读取socket文件,这时通过关闭SELINUX 也可以解决,具体详细情况待以后慢慢再研究吧。(后来发现加了chmod-socket没用,一定要关闭SELINUX才可以)

10、使用Supervisor配置开机自动启动uwsgi服务:

Supervisor是由python语言编写、基于Linux操作系统的一款服务器管理工具,用以监控服务器的运行,发现问题能立即自动预警及自动重启等功能。通过yum安装后各配置文件和目录都自动创建好了(通过pip安装的好像没有自动生成,也不能利用systemctl启动服务),只需要在 /etc/supervisord.d/ 创建启动uwsgi的ini配置文件即可:

[program:myweb_uwsgi]
command=uwsgi /var/html/pcvc.net/myweb_uwsgi.ini
stopsignal=QUIT
autostart=true
autorestart=true
stdout_logfile=/var/html/pcvc.net/supervisor.log
redirect_stderr=true

Supervisor参考:
Supervisor官方配置说明
使用Supervisor简化进程管理工作
Supervisor的安装与使用入门
按需讲解之Supervisor

到此,在 CentOS 7 基于 nginx uwsg django 搭建的 web 服务器基本可以访问了。

Mac OSX 开机自动启动 Nginx 服务

  系统:OS X EI Capitan 10.11.3

  本来很简单的一件事,却因强迫症不肯放过任何 error 而折腾了半天。方法是在 /Library/LaunchDaemons/ 目录下创建一个 .plist 配置文件,然后运行 sudo launchctl load /Library/LaunchDaemons/nginx.plist 就 OK 了,完成之后各种访问都 OK,但 error.log 文件却出现大量以下错误:

nginx: [emerg] bind() to 0.0.0.0:80 failed (48: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (48: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (48: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (48: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (48: Address already in use)
nginx: [emerg] still could not bind()

  而且这错误是不断累积的,很明显告诉你 80 端口已被占用,经查并没有其它程序占用此端口,而是 nginx 自己占用了,但为何会出现这错误,至今也搞不明白。后来搜索到 nginx 官网有个配置文件,就按官网重新放置了 .plist 文件,这次居然不报错了。以下是配置文件内容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key><string>nginx</string>
    <key>Program</key><string>/usr/local/bin/nginx</string>
    <key>KeepAlive</key><true/>
    <key>NetworkState</key><true/>
    <key>WorkingDirectory</key><string>/usr/local/etc/nginx</string>
    <key>StandardErrorPath</key><string>/usr/local/etc/nginx/logs/error.log</string>
    <key>StandardOutPath</key><string>/usr/local/etc/nginx/logs/access.log</string>
    <key>LaunchOnlyOnce</key><true/>
  </dict>
</plist>

  还有 nginx.conf 文件里的这句配置 listen 80 default_server;,出错时我是没加 default_server 的,后来和修改配置文件时一起加上的,不知会不会是这个原因,已无心验证。

参考

nginx error_log reports “bind() to 0.0.0.0:80 failed (48: Address already in use)”
nginx官网:OSX Launchd
Mac OSX的开机启动配置
Launchd in MacOS

CentOS 7配置SSH基于密钥对验证登录

  对于SSH一直以来都只是知其名而不知其身,就知道有这么一个东西用于远程登录而已。近来玩Linux和Octopress才用得上它,通过简单学习,将用到的地方做个备忘。

  SSH为Secure Shell的缩写,SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。Linux一般自带的是OpenSSH,可以用 ssh -V 查看当前版本。

[root@localhost ~]# ssh -V
OpenSSH_6.6.1p1, OpenSSL 1.0.1e-fips 11 Feb 2013

  用SSH登录到远程主机,有两种认证方式,一种是基于口令的安全验证,另一种是基于密匙的安全验证。可以通过修改 /etc/ssh/sshd_config 这个文件对ssh服务的一些行为进行配置。

  当第一次使用SSH登录远程主机时,会出现没有找到主机密钥的提示信息。输入"yes"后,系统会将远程主机的密钥加入到你的主目录下的 .ssh/known_hosts 文件里(我用的是Mac OS X),这样你就可以继续操作了。因为远程主机的密钥已经加入到ssh客户端的已知主机列表中,当你第二次登陆远程主机时,只需要你输入远程主机的登录密码即可。如果远程主机的密钥发生改变,将会看到一些警告信息。在输入“yes”之前呢,最佳的选择或许是联系系统管理员来分析为什么会出现主机验证码改变的信息,核对主机验证码是否正确。

CentOS 7安装配置vsftpd做FTP服务

  Linux菜鸟,还没用过FTP服务;在Windows下用的是Filezilla,一开始还在想Linux下也用它,因为知道它是开源的,在Linux下用它更显得理所当然了,后来发现网上介绍大多都vsftpd,所以就用vsftpd做FTP服务了。

Mac环境下安装配置Octopress

  重新通过Octopress在Mac环境下搭建这个博客的一些知识和备忘。

  未开始…