折腾 HTTP/2

之前看到 ningx 1.9.5 版发布了,把 spdy 换成了 http2,安装主要参考了 这里

  1. nginx 官网上下载最新的 1.9.5 源代码,因为 HTTP/2 module 需要用到 “ALPN” OpenSSL_1.0.2 以上提供与 “NPN” OpenSSL_1.0.1 以上提供, 所以还要去 OpenSSLLibreSSL(建议用 LibreSSL 有一些新的特性)官网下载最新的 SSL 源码包并分别解压。

  2. 预编译的时候需要启用 http_v2_modulehttp_ssl_module 这两个模块:

    $ ./configure --with-openssl=/PATH/TO/LibreSSL --with-http_v2_module --with-http_ssl_module --with-ld-opt=-lrt #使用 LibreSSL
    $ ./configure --with-openssl=/PATH/TO/OpenSSL --with-http_v2_module --with-http_ssl_module  #使用 OpenSSL
  3. 然后 makemake install

  4. 在 Nginx 配置中启用站点对 HTTP/2 的支持也很方便,只需要在 listen 时加上 http2 就可以了:

    listen 443 ssl http2;

  5. 其它配置就跟 https 的配置是一样的,可以参考以前的

体验 IPv6

今天在 v2ex 上的这个帖子中看到有个叫六年级的IPv6服务,用的其实是 OpenVPN 技术,所以在 Windows 上安装好后在 link 目录下找到相关的文件,包括 ca.crt,ta.key,client.ovpn 后放到 Linux/OS X 下面也是可以用的。

到六年级的网站注册,购买一个个人免费套餐,会在后台看到相关的用户名与密码,记下用于后续登录。

下面是我在 ArchLinux 上配置的相关过程。
继续阅读体验 IPv6

Debian Linux 编译 Realtek (RTL8111/RTL8168) 网卡驱动

有一台电脑上用了 Realtek (RTL8111/RTL8168) 的网卡,lspci 显示:

01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 06)

在这台电脑上装了 Debian wheezy,虽然 Debian 内核里有它的驱动(用了 r8169),也能使用,但网络很不稳定。所以我打算把 r8169 换成官方的 Realtek (r8168) 驱动。
继续阅读Debian Linux 编译 Realtek (RTL8111/RTL8168) 网卡驱动

archlinux 的 top 命令变红了

Archlinux 在某次更新了 procps-ng 后,top 命令变成红色了,如下图
红色top

看习惯了传统的 top 对这个还是很不习惯,所以找方法把它变成原来的样子:

首先删除 $HOME 目录下的 .toprc 如果有的话

rm ~/.toprc

然后启动 top,在 top 界面依次按如下键:

 z
 V
 1
 y
 m m
 t t t

这个时候,应该可以发现跟原来的 top 命令一样了,最后按 W 保存配置,这样就可以在 ~/.toprc 里写入 top 的配置,下次使用 top 命令的时候也是原来的样子了。

press W

参考:https://bbs.archlinux.org/viewtopic.php?pid=1474872#p1474872

nginx 中 https 优化配置

https 网站比 http 网站慢一些,原因很多,诸如握手次数、缓存限制等。

那么进行一定的配置优化可以加快一些 https 的加载速度,下面是一个配置示例:

ssl on spdy;
ssl_certificate ssl/ssl.crt;
ssl_certificate_key ssl.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM;
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate ssl/trustchain.crt;
resolver 223.5.5.5 223.6.6.6;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000";
error_page 497  https://$host$request_uri;

其中ssl_certificate对应单张证书,ssl_certificate_key对应私钥,ssl_trusted_certificate对应信任链,即需要附加到单张证书后面的那两张证书链,这里可以把他们剥离出来。

参考:
Optimizing HTTPS on Nginx – {bjørn:johansen}
Nginx Performance Tuning for SSL – Tech Samurais

另外,当配置好SSL之后,可以去这个站点进行测试,看看还有没有什么的地方可以优化的 SSL 配置检查工具

使用 homebrew 安装 php-fpm

虽然在 OS X 上自带了 php-fpm 但是好多 ext 都没有,要装的话要自己编译,想想还是从 homebrew 里新装一个 php 吧。

在 homebrew 里安装 php-fpm 很简单:

brew tap homebrew/dupes
brew tap homebrew/versions
brew tap homebrew/php
brew install --without-apache --with-fpm php5x #这里需要把 x 换成版本号,比如 3, 4, 5, 6
brew install php5x-mcrypt php5x-memcache php5x-memcached ...

配置文件在 /usr/local/etc/php/版本号/ 目录下面

安装好后,可以在 /usr/local/sbin/ 目录下找到 php5x-fpm,这就是启动脚本了,赋予它执行权限

chmod a+x php5x-fpm

然后就可以 /usr/local/sbin/php5x-fpm {start|restart|stop} 了。

Nginx 使用 openssl 的自签名证书

一、准备证书

0. 前期准备工作

cd ~/
mkdir ssl
cd ssl
mkdir demoCA
cd demoCA
mkdir newcerts
mkdir private
touch index.txt
echo '01' > serial

1. 制件 CA 证书

生成 CA 私钥: ca.key

openssl genrsa -des3 -out ca.key 2048

这样是生成 rsa 私钥,`des3` 算法,openssl 格式,2048 位强度。`ca.key` 是密钥文件名。为了生成这样的密钥,需要一个至少四位的密码。另外可以通过以下方法生成没有密码的key:

openssl rsa -in ca.key -out ca_decrypted.key

生成 CA 根证书的公钥 ca.crt:

openssl req -new -x509 -days 3650 -key ca.key -out ca.crt

2. 制作网站的 https 证书,并用 CA 签名认证

假设我们需要为 abc.com 域名制作证书

先生成 abc.com 的证书私钥 abc.com.pem

openssl genrsa -des3 -out abc.com.pem 1024

无密码的私钥

openssl rsa -in abc.com.pem -out abc.com.key

生成 csr 签名请求

openssl req -new -key abc.com.pem -out abc.com.csr

这里需要输入国家,地区,组织,email等。最重要的是 **common name**,可以写你的名字或者域名。如果为了 https 申请,这个必须和域名一样,即,这里要写 abc.com,否则会引发浏览器警报,这里可以用 *.abc.com 来做泛域名证书。

最后,需要用 CA 证书进行签名:

openssl ca -policy policy_anything -days 1460 -cert ./demoCA/ca.crt -keyfile ./demoCA/ca.key -in abc.com.csr -out abc.com.crt

这样网站的 https 证书就做完了。

还有一步就是把 ca.crt 的内容追加到 abc.com.crt 后面,因为有些浏览似乎不支持。

cat demoCA/ca.crt >> abc.com.crt

nginx 配置

加入配置内容:

server {
        listen 443;
        server_name abc.com www.abc.com;

        root html;
        index index.html index.htm;

        ssl on; 
        ssl_certificate /PATH/TO/abc.com.crt;
        ssl_certificate_key /PATH/TO/abc.com.key;

        ssl_session_timeout 5m;

        ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
        ssl_prefer_server_ciphers on;

        location / {
                try_files $uri $uri/ =404;
        }       
}

其它

其实很多时候,并不需要加密的 key,所以像这面这么做就好了。

cd ~/
mkdir ssl
cd ssl
mkdir demoCA
cd demoCA
mkdir newcerts
mkdir private
touch index.txt
echo '01' > serial
openssl genrsa -out ca.key 2048
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
cd ..
openssl genrsa -out abc.com.key 2048
openssl req -new -key abc.com.key -out abc.com.csr
openssl ca  -policy policy_anything  -days 1460 -in abc.com.csr -out abc.com.crt -cert ./demoCA/ca.crt -keyfile ./demoCA/ca.key

Ubuntu 下移动 MySQL 的默认目录

最近配置了一台 Ubuntu 1404 的服务器,装好 MySQL 之后,准备把 MySQL 的数据目录(datadir)移动到其它地方(/srv/mysql),之前在 Debian 下面的话,直接做完下面几步就好了:

# service mysql stop
# cp -rp /var/lb/mysql /srv/mysql
# 在 my.cnf 中修改 datadir = /srv/mysql 
# service mysql start

但,这次在 Ubuntu 下直接启动不成功,抛出 start: Job failed to start,Google 之,发现原来在 Ubuntu 中引入了一个 AppArmor 的安全模组,它可以界定单个程序进入一组文件列表。

所以在 Ubuntu 下还需要做一步操作:

/srv/mysql/ 目录加入到 mysqld 的目录列表中去,编辑 /etc/apparmor.d/usr.sbin.mysqld

# vim /etc/apparmor.d/usr.sbin.mysqld

作以下修改

...
  /var/lib/mysql/ r,
  /var/lib/mysql/** rwk,
+ /srv/mysql/ r,
+ /srv/mysql/** rwk, 
...

重启 apparmor

# /etc/init.d/apparmor restart

然后启动 MySQL 就不会报错了。

# service mysql restart

关于 AppArmor 的官方介绍:https://help.ubuntu.com/14.04/serverguide/apparmor.html

Debian 下设置默认的编辑器

debian 安装好后,转为的编辑器是 nano,我想把它改成 vim,以前都是在 .bashrc 里添加 export EDITOR=vim

其实,Debian 下面有专门设置默认编辑器的工具:

sudo update-alternatives --config editor

update-alternatives 是 Debian/Ubuntu 系统中专门维护系统命令链接符的工具,通过它可以很方便的设置系统默认使用哪个命令、哪个软件版本,比如,上面的修改默认编辑器。

关于 update-alternatives 的用户可以 man update-alternatives 问一下男人。

l2tp/ipsc 在更新 openswan 后不能正常工作

虽然自己搭建了一个 VPN,但也只是偶尔用用;今天要用的时候,突然发现连不上了。查看日志是出现了以下错误:

Jun 11 15:12:45 wso pluto[8123]: “L2TP-PSK-NAT”[1] xx.xx.xx.xx #1: message ignored because it contains an unknown or unexpected payload type (ISAKMP_NEXT_SAK) at the outermost level
Jun 11 15:12:45 wso pluto[8123]: “L2TP-PSK-NAT”[1] xx.xx.xx.xx #1: sending notification INVALID_PAYLOAD_TYPE to xx.xx.xx.xx:500

在查找错误后,发现是因为 openswan 的一个安全更新造成的,因为我用的是 debian wheezy 系统,所以以下应该只针对 debian wheezy:

首先用 dpkg -l | grep openswan 是不是安装了 1:2.6.37-3+deb7u1,如果是的话,就只能先降级到 1:2.6.37-3 的版本了:

apt-get install openswan=1:2.6.37-3

重启后,又可以继续使用了。当然这只是一个临时的解决方法,不知道是哪里的 bug,希望能快点解决吧。

参考: http://superuser.com/questions/740545/l2tp-ipsec-stopped-working-after-openssl-upgrade