清水

最小的善行胜过最大善念

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

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

免费Shadowsocks账号

做技术的,没有不用 google 的,免费的翻墙账号太折腾,收费也用了两款,有一个还买了一年,基本没怎么用。后来用了 Shadowsocks,其操作真的很方便,也不用设置浏览器,打开绿色的客户端填写 IP、端口和密码就可以用了。今天收到 Shadowsocks 账号到期的邮件,索性搜了一下国外 VPS,也不贵,还有的有优惠码,最低配的(512M/1CPU/20G)首月折后才 20 元,就买个来试玩一下,有了国外 VPS 就自己搭一个 Shadowsocks 服务器,也挺简单,网上有教程。

由于对 Shadowsocks 服务不是很了解,也不知多用户下速度有多大影响,所以公开出来给大家用用看,反正也只有一个月的时间,到 2016-3-26 到期,到时视情况再看看要不要续。

节点:德克萨斯州 达拉斯(Dallas, TX)
IP:45.35.42.135
端口:8388
密码:pcvc.net
加密:aes-256-cfb
失效:2016-03-26(已失效!勿试!

送福利了,今天在 Linode 又申请多一个 VPS,据说 Linode 是口碑好速度快,Sahdowsocks 配置如下:

节点:加利福尼亚州 弗里蒙特(Fremont, CA)
IP:23.92.26.37
端口:8388
密码:pcvc.net
加密:aes-256-cfb
失效:2016-02-28 付了5美元,一个月过去了,账户还有$4.62,奇怪!目前还可以用,且用且珍惜。(已失效!勿试!

新增一个VPS,节点为于日本,老说日本离我朝比较近,速度会快,于是试试:

节点:日本
IP:45.32.59.89
端口:8388
密码:pcvc.net
加密:aes-256-cfb
失效:4月1日账户里还剩$45.97,估计半年内均可使用!(已失效!勿试!

手痒,又试了一个新加坡节点:

节点:新加坡
IP:128.199.140.35
端口:8388
密码:pcvc.net
加密:aes-256-cfb
失效:4月1日账户里还剩$6.23,估计还可以再用一个月。(已失效!勿试!

有兴趣就拿去玩玩,如果愿意的话,麻烦留言一下使用情况。

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环境下搭建这个博客的一些知识和备忘。

  未开始…

Linux常用命令汇总

Linux操作系统用于服务器居多,所以一般都少安装图形界面,管理服务器都通过命令行操作,要在一篇文章里讲述所有命令也不现实,这篇文章只记录本人常用到的命令,备忘为主。