如果网站仍然使用HTTP协议,会感觉网站处于全裸状态,这实在是不利于身心健康。而Let’s encrypt网站免费为大家签发证书让我们不用花钱则获得可信任的SSL私KEY用于网站的HTTPS服务,实在是太方便各网站站长了。然后使用Let’s encrypt的开源项目Certbot,可以很方便的申请网站证书以及下载证书。Certbot的网站为https://certbot.eff.org/,访问这个网站然后按照上面的说明来安装Certbot并且申请证书,然后修改你的Web服务器配置,将SSL证书配置好即可,第一次配置整个过程不会超过半小时。

首先我用的系统是Debian 8.7 (jessie),所以说明文档在https://certbot.eff.org/#debianjessie-nginx,按照文档上的步骤:

  • 需要先安装Certbot:sudo apt-get install certbot -t jessie-backports
  • 然后申请证书:certbot certonly --webroot -w /var/www/example -d example.com

    注:之所以需要网站根目录作为参数,是因为在申请证书的时候需要验证网站所有权,证书机构会往该域名的网站目录下写一些验证文件,然后通过http访问以确定你拥有该网站。

  • 然后修改nginx服务器侦听端口成为443(apache服务器请自行查阅相关文档):
    listen 443;
    listen [::]:443;
    
  • 添加ssl相关的选项:
    ssl on;
    ssl_certificate /etc/letsencrypt/live/example.com/cert.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    
  • 添加服务器配置将http的访问自动导向https:
    server {
      listen 80;
      listen [::]:80;
      server_name example.com www.example.com;
      return 301 https://$host$request_uri;
    }
    
  • 添加Renew的代码到contab服务中,每天定时Renew一下证书,虽然证书有效期是三个月,但是Renew的时候若证书没有超时则不会重新下载新的证书下来,所以每天定时Renew一下是非常有必要的,Renew的代码为:certbot renew --dry-run

以上步骤完成后,使用命令nginx -s reload把nginx服务器的配置重新载入一遍,打开Chrome浏览器访问配置好的网站则可以看到地址栏左边有绿色的Secure字样,若没有看到Secure字样,有可能是因为该页面中仍然包含了非加密和浏览链接。想要找出这些非加密的浏览链接,可以按快捷键CTRL+SHIFT+J打开命令控制台看Console页面中的日志,Chrome会告诉你哪些地方加载了未加密的内容。

最开始尝试使用crontab来担任进程down掉之后自动检查以及重启的工作,但是不知道是什么原因,在crontab中设置的自动重启线程并不好用,事实上,根本就不会自动运行检测的脚本,这个之后有时间再查。

急于解决当前的需求,在google一段时间后发现linux下大多都使用daemontools来管理服务进程,于是着手研究。daemontools使用起来并不复杂,在debian/ubuntu当前的发行版本中就已经有daemontools可以直接安装了。

使用apt-get来安装

apt-get install daemontools daemontools-run

如果你不是debian发行版,而恰好碰到supervise not run的错误提示,则表示你的服务并没有打开,你需要运行以下命令来启动service的监视服务。

/etc/init.d/svscan start

添加配置文件
/etc/service目录下建立一个新的目录名称,用于存放你的进程的运行脚本(该脚本文件名称为:run)。所以,假设你的service名称为ume,一个完整的创建好的service目录应该为/etc/service/ume,并且在该目录下有一个可执行的脚本文件名称为:/etc/service/ume/run,请注意检查该脚本文件权限,必须要有可执行权,如果没有可执行权,使用chmod +x /etc/service/ume/run命令来添加执行权。

脚本文件范例

#!/bin/sh
PID_FILE=/var/lock/ume-sc.pid
[ -f $PID_FILE ] && rm $PID_FILE

DATE=`date +%Y-%m-%d_%H-%M-%S`
LOG_FILENAME=/var/log/ume-sc-$DATE.log
echo $LOG_FILENAME > /var/lock/ume-sc.logname
exec /usr/local/bin/ume-sc --config-file=/usr/local/etc/ume-sc.conf > $LOG_FILENAME 2>&1

脚本说明

  • 除了exec命令之外,其它的命令都很容易搞清楚,输出的日志放到了/var/log/ume-sc.log文件中,然后错误日志放到了/var/log/ume-sc-err.log文件中
  • exec的命令的含义是使用之后的命令来替换掉当前的shell脚本的进程,而不再启动一个新的进程(注:这个命令的最后是没有&符号的,也就是说,这个命令是直接在后台运行,不需要额外的后台运行指示)。

注:若不用exec来执行命令则无法使用svc -du来重启进程的。

进程管理

  • 使用svc -u /etc/service/ume来启动你的进程,或者你也可以使用svc -u /etc/service/*来启动所有的进程
  • 使用svc -du /etc/service/ume来重新启动你的进程,对于所有的进程格式同上
  • 使用svc -d /etc/service/ume来停止进程
  • 使用svstat /etc/service/*来查看所有的被监视的进程的状态,特别是uptime是非常有用的,若uptime很短就得考虑是不是进程有经常崩溃的可能

总结:使用daemontools来保证进程运行是非常方便的,svc使用supervise命令来监视目标进程是否有在线,若目标进程掉线则会在5秒钟之内启动一个新的进程,而要完成这一个操作只需要写一个简单的run脚本放到对应的/etc/service目录下,若使用CMakeLists.txt来编译程序,还可以直接把对应的run文件拷贝到/etc/service目录下,简单则是最高效的。

安装

apt-get install iptables

使用日志

使用日志可以很快的排查问题,特别有一些协议访问被BLOCK掉的时候,使用如下的命令

iptables -A INPUT -j LOG --log-prefix "HELLO_"

然后使用以下命令来查看日志

tail -f /var/log/syslog

设置基本规则

下面这句将会设置所有的INPUT包都被DROP掉(忽略掉),添加本规则前一定要记住先添加SSH对应的端口号ACCEPT的规则,不然SSH将直接断开

iptables -P INPUT DROP

清除所有的规则

iptables -F
iptables -X
iptables -Z

添加基本的防火墙设置

#允许本地回环接口(即运行本机访问本机)
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
# 允许已建立的或相关连的通行
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#允许所有本机向外的访问
iptables -A OUTPUT -j ACCEPT
# 允许访问22端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#允许访问80端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#允许FTP服务的21和20端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
#如果有其他端口的话,规则也类似,稍微修改上述语句就行
#禁止其他未允许的规则访问
iptables -A INPUT -j REJECT  (注意:如果22端口未加入允许规则,SSH链接会直接断开。)
iptables -A FORWARD -j REJECT

屏蔽IP地址

#如果只是想屏蔽IP的话“3、开放指定的端口”可以直接跳过。
#屏蔽单个IP的命令是
iptables -I INPUT -s 123.45.6.7 -j DROP
#封整个段即从123.0.0.1到123.255.255.254的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP
#封IP段即从123.45.0.1到123.45.255.254的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP
#封IP段即从123.45.6.1到123.45.6.254的命令是
iptables -I INPUT -s 123.45.6.0/24 -j DROP

保存iptables的配置

iptables-save > /etc/iptables.rules

恢复iptables的配置

iptables-restore < /etc/iptables.rules

今天花了些时间把公司的svn服务器搭了起来,之前都是在Windows上安装Subversion服务端,今天碰到些问题,记录一下:
1、使用apt-get install subversion subversion-tools来安装svn服务器
2、使用svnadmin create [目录]来建立一个repository
3、建立好了repository,可以启动daemon了,使用svnserve -d -r [repository的上一级目录]启动subversion服务器
4、编辑[repository目录]/conf/svnserve.conf文件,将包含passwd及authz的注释去掉,然后修改anon-access = none,最后将access的两句的注释去掉
5、分别修改passwd及authz两个文件,将用户,密码以及权限分别设置好
6、在客户端使用svn://[ip address]/[repository name]来访问svn代码服务器

首先参考这篇文章:http://jaqque.sbih.org/kplug/apt-pinning.html
基本步骤:
1. 修改/etc/apt/sources.list,复制增加testing及unstable的deb源,类似如下

#Stable
deb http://ftp.us.debian.org/debian stable main non-free contrib
deb http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free
 
#Testing
deb http://ftp.us.debian.org/debian testing main non-free contrib
deb http://non-us.debian.org/debian-non-US testing/non-US main contrib non-free
 
#Unstable
deb http://ftp.us.debian.org/debian unstable main non-free contrib
deb http://non-us.debian.org/debian-non-US unstable/non-US main contrib non-free

2. 创建/etc/apt/preferences文件,加入以下内容

Package: *
Pin: release a=stable
Pin-Priority: 700
 
Package: *
Pin: release a=testing
Pin-Priority: 650
 
Package: *
Pin: release a=unstable
Pin-Priority: 600

3. 最后使用sudo apt-get update更新源
4. 安装使用sudo apt-get -t unstable install 来安装,当然也可以使用apt-cache来查找包

1. ssed与-Re参数,可以开启perl中的高级正则表达式的功能,如\s或者非贪婪模式
2. ssed需要单独安装apt-get install ssed
3. 例如:下面的命令可以清除(purge)所有的dpkg中已经删除的包的残留信息(例如设置信息等)

dpkg -l | grep ^rc | ssed -Re 's/^rc\s+(.*?)\s+.*$/\1/g' | xargs sudo dpkg -P

4. sed默认不带参数是匹配正则表达式,正则表达式需要用/符号框起来,在之后带上d表示匹配的行不显示,若sed带参数-n并且在正则表达式后添加p表示只显示匹配的行,例如:

# 显示不包含Tables_*的行
mysql -uroot -p < show_tables.sql | sed '/Tables_*/'d
 
# 只显示包含Tables_*的行
mysql -uroot -p < show_tables.sql | sed -n '/Tables_*/'p

1. 需要安装efi的支持包以保证debian下可以访问efi结构的硬盘分区

sudo apt-get install efibootmgr

2. 安装exfat的驱动,该驱动的程序开源在exfat.googlecode.com,使用svn将该代码树拷贝下来,还需要安装scons来编译,如下:

sudo apt-get install subversion scons libfuse-dev gcc
svn co http://exfat.googlecode.com/svn/trunk/ exfat-read-only
cd exfat-read-only
scons
sudo scons install

3. 直接使用mount命令挂载分区,挂载之前可以用fdisk -l命令来查看当前的连接到系统的设备分区。例如:

mount -t exfat-fuse /dev/sda1 /mnt

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo 'Asia/Shanghai' > /etc/timezone
apt-get install ntpdate
ntpdate pool.ntp.org
hwclock --systohc

1. 安装直接可以使用apt-get install gitolite
2. 安装完成后,会自动建立一个名称为gitolite的帐号,使用命令sudo su – gitolite切至该帐号中,然后使用gl-setup 来导入管理员用户的public key文件,该文件存在于管理员机器的~/.ssh/id_rsa.pub文件中
3. 回到管理员机器,使用命令git clone gitolite@server-ip:gitolite-admin将管理的repo拉下来到本地
4. 修改conf/gitolite.conf文件,在里面增加repo并分配权限,然后commit, push到远程服务器后会自动在远程建立git repo
5. 新建用户,可以将别的用户的id_rsa.pub文件改名后放到keydir中,然后commit, push到远程服务器后会增加该用户。若该用户有几个对应的public key,可以放到不同的目录中
6. 附上conf/gitolite.conf中的repo权限表:

repo 語法: <權限> [零個或多個正規表示式批配的引用] = <user> [<user> ...]
每條指令必須指定一個權限, 權限可以用下面任何一個權限的關鍵字: C, R, RW, RW+, RWC, RW+C, RWD, RW+D, RWCD, RW+CD
C : 建立
R : 讀取
RW : 讀取 + 寫入
RW+ : 讀取 + 寫入 + 對 rewind 的 commit 做強制 Push
RWC : 授權指令定義 regex (regex 定義的 branch、tag 等), 才可以使用此授權指令.
RW+C : 同上, C 是允許建立 和 regex 配對的引用 (branch、tag 等)
RWD : 授權指令中定義 regex (regex 定義的 branch、tag 等), 才可以使用此授權指令.
RW+D : 同上, D 是允許刪除 和 regex 配對的引用 (branch、tag 等)
RWCD : 授權指令中定義 regex (regex 定義的 branch、tag 等), 才可以使用此授權指令.
RW+CD : C 是允許建立 和 regex 配對的引用 (branch、tag 等), D 是允許刪除 和 regex 配對的引用 (branch、tag 等)
- : 此設定為不能寫入, 但是可以讀取
註: 若 regex 不是以 refs/ 開頭, 會自動於前面加上 refs/heads/
群組
 
@all 代表所有人的意思
@myteam user1 user2 : user1, user2 都是屬於 myteam 這個群組

1. 使用debian来配置当前的系统的时区,使用以下命令然后按照提示选择Asia/Chongqing即可。

dpkg-reconfigure tzdata

2. 修改当前的主机名称使用命令

hostname myhostname