从 Vagrant 到 Docker

最近看了《第一本 Docker 书》,尝试用 docker 来搭一个 lnmp 环境,看看能不能代替 vagrant。


Create Dockerfile

Dockerfile

FROM ubuntu:16.04

RUN echo "mysql-server mysql-server/root_password password root" | debconf-set-selections
RUN echo "mysql-server mysql-server/root_password_again password root" | debconf-set-selections

RUN apt-get update && apt-get install -y \
nginx \
mysql-server \
php7.0-cli \
php7.0-fpm \
php7.0-mysql \
php7.0-curl \
php7.0-gd \
php7.0-mbstring \
php7.0-mcrypt \
php7.0-xml \
php7.0-zip \
curl

EXPOSE 80 443 3306

COPY ./scripts/startup.sh /opt/scripts/startup.sh

CMD ["bash", "/opt/scripts/startup.sh"]

scripts/startup.sh

#!/bin/bash

/etc/init.d/nginx start & /etc/init.d/mysql start & /etc/init.d/php7.0-fpm start

Build

docker build -t lnmp:ubuntu-16.04 .

Run

docker run -it --rm lnmp:ubuntu-16.04

参考:

http://tech.osteel.me/posts/2015/12/18/from-vagrant-to-docker-how-to-use-docker-for-local-web-development.html
http://tech.osteel.me/posts/2017/01/15/how-to-use-docker-for-local-web-development-an-update.html

426 total views, no views today

八月

2017年4月4日去看了张大磊导演的《八月》,看完之后就一直想写点什么纪念一下,但是好几天过去了竟然一个字都没有憋出来。电影讲述了张小雷小学毕业的那个暑假发生的故事,是一个关于夏天关于父亲的回忆。不禁让人想起另外一部经典影片,北野武导演的《菊次郎的夏天》,小男孩(正男)和大叔(菊次郎)踏上寻找妈妈的旅程,度过了一个难忘的夏天,而菊次郎正是导演父亲的名字。那么我自己人生中最难忘的那个夏天我在干什么呢?

应该是在2002年夏天,那时候我刚小学毕业,小学升初中的考试已经结束,我们那里是按区域录取的,倒也没有什么好担心的。我哥已经提前带我参观了学校,分班的事情我三爷也已经帮我安排好了,魏安圣老师的四班。说没有不舍吧,还是有那么一点不舍的,毕竟我六年级的同桌可算是个美女,而且已经发育好了,还有几个玩得不错的小伙伴以后估计也不常见到了,但是很快就被对于未知生活的新鲜感给冲淡了。在我们还没有真正品尝过失去滋味的年纪,对于未来的憧憬是要盖过对于过去的回忆的。

一切都准备好了,离开学还有一两个月,每天待在家里也不是个事,我爸就突发奇想要带我出去体验生活。那时候我爸已经跟着我大伯开始收古董了,就是隔三岔五去乡下收一些以前的老东西,然后拿到古玩市场去卖。至于能不能收到就看运气了,有时候颗粒无收,有时候能收到一两件好东西,当然有时候也会收到炸弹(水货)。由于常年在外面跑,总会遇到各种各样的事情,回来就会不厌其烦的讲给我们听,一个故事讲了无数遍,我们还是听得津津有味。后来我才明白这些故事肯定是加工过的,真实的生活除了惊险刺激,更多的为了生活枯燥的重复。

我们翻了好几天的安徽省地图,最后决定去黄山。那天起了个大早,先坐班车到安庆,再从安庆坐长途汽车到屯溪,然后又转了一辆中巴到渔亭镇,已经是晚上了。我们在渔亭小学门口找了个旅馆住下来,炒了个青椒炒肉丝,吃了两碗米饭。吃完晚饭之后用楼下的水龙头洗了个澡,又洗了一会衣服,才终于有时间躺在床上商量一下明天去哪里。之后去了哪些地方现在我已经想不起来了,至今还印象深刻的是渔亭小学墙上建设四个现代化的标语和旅馆的木板床吱呀吱呀的响。

那一趟我们跑了很多地方,虽然这么多年过去记忆已经渐渐模糊了,但是走过的路永远不会忘。偶尔会回忆起一点点碎片,走了几个小时的山路,没有车也找不到人家。中午逗留在一个村子里面,找不到吃饭的地方,我爸就想从人家的树上摘一个桃子给我吃,结果留我们吃午饭。旅店老板送我们自己炒的茶叶,在房间里面泡的方便面,各种味道各种回忆混杂在一起。后来我们是从祁门上车回家,中间倒了几趟车我已经不记得了。那一趟我们收到木雕花板至今还堆在家里的某个角落里,没有卖出去。

这就是我的关于黄山的记忆,关于八月的记忆,关于父亲的记忆。十五年前,我们曾经那么依赖彼此,和谐共处。

442 total views, 2 views today

四月读书计划

三月份看完了福楼拜的《包法利夫人》和《一颗简单的心》。左拉的《小酒馆》花了两个星期才看完,所以另外一本《娜娜》就没有时间看了。


四月份还是两位法国作家,莫泊桑的短篇小说精选和勒布朗的侠盗亚森·罗平。

1. 莫泊桑短篇小说精选,浙江文艺出版社,2016

2. 侠盗亚森·罗平,华东师范大学出版社,2011

3. 第一本 Docker 书,人民邮电出版社,2015

4. 你不知道的 JavaScript,人民邮电出版社,2015

435 total views, 2 views today

Let’s Encrypt

去年开始把博客升级成全站 https,用的是在阿里云申请的一年免费 WoSign 证书,原本准备等到期了再换的,但是最近博客被 Google 浏览器标记为不安全,所以不得不提前切换到 Let’s Encrypt 证书。


1. Let’s Encrypt 是什么?

想要在网站上启用 HTTPS 的话,你需要从证书颁发机构(CA)获取证书。Let’s Encrypt 就是一个免费的 CA。

2. 怎么申请 Let’s Encrypt 证书?

Let’s Encrypt 网站上面详细介绍了 With Shell Access 和 Without Shell Access 应该怎么申请证书,这里我们使用 Certbot。首先我们在服务器上安装 Certbot。

sudo apt install software-properties-common

sudo add-apt-repository ppa:certbot/certbot

sudo apt-get update

sudo apt-get install certbot

然后执行 certbot certonly,按照提示一步一步操作,证书就生成好了。

3. 配置 nginx 使用 Let’s Encrypt 证书。

在 /etc/letsencrypt/live/your.domain/ 目录下面找到你的证书文件,然后修改 nginx 配置文件。

ssl_certificate /etc/letsencrypt/live/tanghengzhi.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/tanghengzhi.com/privkey.pem;

修改完成之后不要忘了重启 nginx。

sudo nginx -s reload

最后再打开浏览器验证一下。

4. 定期更新证书

Let’s Encrypt 证书的有效期为 90 天,所以每隔三个月就要重新申请一次证书。

certbot renew

参考:

https://letsencrypt.org/getting-started/

https://certbot.eff.org/

510 total views, no views today

Linux 常见命令

看了福楼拜的狂人回忆、秋之韵、一颗简单的心,年轻时激情四射的文字和晚年的冷静克制的文笔简直判若两人啊。看完之后并没有太多的感概一定要写出来的,所以还是来写点技术方面的文章吧。


查看进程

ps -ef | grep "string"

查看端口占用

lsof -i:port | grep "string"

统计字符串出现次数

grep -o "string" filename | wc -l

Pipeline

在 Linux 操作系统中,管道(|)的作用就是把前一个命令的输出(stdout)转化为下一个命令的输入(stdin)。

pipeline.c

#include <stdio.h>

int main(void)
{
        char buf[BUFSIZ];
        while(fgets(buf, sizeof buf, stdin)) {
            char * out = buf;
            printf("%s", out);
        }
        return 0;
}
gcc pipeline.c -o pipeline
ls -l | ./pipeline
pipeline.php

function stdin_stream()
{
    while ($line = fgets(STDIN)) {
        yield $line;
    }
}

foreach (stdin_stream() as $line) {
    echo $line;
}
ls -l | php pipeline.php

参考:

https://en.wikipedia.org/wiki/Pipeline_%28Unix%29

346 total views, no views today

包法利夫人

没有令人惊艳的开头,回味无穷的结尾,甚至连叙述也很克制。福楼拜就这样为我们讲述了一个对爱情充满幻想,对现实生活不满,最终被欲望摧毁了的女人,Emma Bovary 的故事。

我看的两个版本,白天看的是 Kindle 上的李建吾译本(上海三联书店,2014),晚上回家看的是上海图书馆借的周克希译本(华东师范大学出版社,2011)。可能是我交替着看的,早上 Kindle 看到第一部的第 5 章,晚上直接把书翻到第一部第 6 章接着看。除了翻译的名字不一样,比如李健吾把 Charles Bovary 翻译成查理,周克希把 Charles Bovary 翻译成夏尔,其他地方倒是没有发现太大的差别。(也可能是我看的不够仔细。)

包法利是一个务实的,有些懦弱的医生,渴望老婆孩子热炕头的生活。他娶了爱玛,生了个女儿,然后觉得人生圆满。

爱玛嫁给包法利之后没有体会到她想象中的那种完美爱情,于是觉得生活苦闷,找了两个情人,最终因为挥霍无度,无力还债,服毒自杀。

现在看来也许是一个很老套的故事,但是我们能够感受到爱玛的天真和热情,在欲望中的纠结和挣扎,沉迷于欲望后的任性和贪婪,如此的真实,仿佛我们曾经见过这样一个女人,仿佛那就是我们自己的故事。

523 total views, 2 views today

三月读书计划

一月看了何伟的中国三部曲中的前两本,最后一本寻路中国还没有去看。二月看了两本汪曾祺的小说集和散文集之后,又想着是不是去看看沈从文的边城。有太多想要看的书,奈何时间有限,除了加快阅读速度,就只能断舍离了。


三月的读书计划是上海三联书店的世界名著名译文库系列,福楼拜和左拉。

1. 包法利夫人,福楼拜,上海三联书店,2014

2. 一颗简单的心,福楼拜,上海三联书店,2014

3. 小酒店,左拉,上海三联书店,2014

4. 娜娜,左拉,上海三联书店,2014

374 total views, 1 views today

二月读书计划

一月的时候自信满满地制定了每周读一本书的计划,然而事与愿违,最后只看完了《甲骨文》和《江城》两本。


所以二月份的读书计划只有两本书。

1. 汪曾祺小说经典,人民文学出版社,2005

2. 生活,是很好玩的(汪曾祺散文精选),江西人民文学出版社,2016

362 total views, 1 views today

一月读书计划

2017 年已经来了,你 2016 年的计划都实现了吗?


不管怎样,计划还是要有的,2017 年的计划是每周都能看一本书,然后写一点简短的书评,博客由月更改成周更。

一月的看书计划是何伟(Peter Hessler)的中国三部曲《江城》、《甲骨文》和《寻路中国》,如果时间充足的话,可以再看一下《奇石》或者他妻子写的《打工女孩》。

2016.1.2 ~ 2016.1.8 甲骨文

2016.1.9 ~ 2016.1.15 江城

2016.1.16 ~ 2016.1.22 寻路中国

2016.1.23 ~ 2016.1.29 奇石 or 打工女孩


参考:

https://www.zhihu.com/question/20400051

570 total views, 1 views today

Set Up IKEv2 VPN Server

【2016 年 12 月】之前在阿里云服务器上搭建了 PPTP VPN,但是苹果在最新的 iOS 10 和 macOS Sierra 系统中移除了 PPTP VPN 的选项。所以打算重新搭建一个 IKEv2 VPN。

【2018 年 8 月】之前参考的教程是基于 Ubuntu 16.04 的,而且步骤太复杂了,所以重新写了一个基于 Ubuntu 18.04 的。


Prepare

在开始之前,先检查一下需要准备的东西。

首先,你需要一台有 IPv4 地址的服务器,安装 Ubuntu 18.04 操作系统。

然后,你需要一个域名,绑定到上面提到的 VPN 服务器。(当然直接使用 IP 地址也是可以的,不过比较复杂,后面有贴教程,这里只讨论有域名的情况。)

Steps

服务器和域名都准备好了之后,我们就可以开始操作了。首先 SSH 登录到 VPN Server,依次执行如下命令,然后按照提示一步一步操作就可以了。

git clone https://github.com/jawj/IKEv2-setup.git
cd IKEv2-setup
./setup.sh

当然,你可以随时添加和修改 VPN 用户名和密码。

sudo vi /etc/ipsec.secrets

只要 VPN 用户名和密码符合下面的格式就可以了。

someusername : EAP "somepassword"

修改完成之后别忘了执行下面的命令,让 strongSwan 接受更改,改动才能生效。

sudo ipsec secrets

Connect

一般情况下在脚本跑完之后你会收到一封邮件介绍怎么在 Mac OS X / iOS,Windows,Android,Ubuntu 系统下面连接 IKEv2 VPN。

如果你的服务器没有开通邮件服务,你还可以在你创建的用户目录下面找到对应的配置文件。(比如我的用户目录是 /home/vpn)

== iOS and macOS ==
A configuration profile is attached as vpn-ios-or-mac.mobileconfig — simply open this to install. You will be asked for your device PIN or password, and your VPN username and password, not necessarily in that order.

== Windows ==
You will need Windows 10 Pro or above. Please run the following commands in PowerShell:
Add-VpnConnection -Name “vpn.tanghengzhi.com” `
  -ServerAddress “vpn.tanghengzhi.com” `
  -TunnelType IKEv2 `
  -EncryptionLevel Maximum `
  -AuthenticationMethod EAP `
  -RememberCredential
Set-VpnConnectionIPsecConfiguration -ConnectionName “vpn.tanghengzhi.com” `
  -AuthenticationTransformConstants GCMAES256 `
  -CipherTransformConstants GCMAES256 `
  -EncryptionMethod AES256 `
  -IntegrityCheckMethod SHA256 `
  -DHGroup ECP384 `
  -PfsGroup ECP384 `
  -Force

== Android ==
Download the strongSwan app from the Play Store: https://play.google.com/store/apps/details?id=org.strongswan.android
Server: vpn.tanghengzhi.com
VPN Type: IKEv2 EAP (Username/Password)
Username and password: as configured on the server
CA certificate: Select automatically

== Ubuntu ==
A bash script to set up strongSwan as a VPN client is attached as vpn-ubuntu-client.sh. You will need to chmod +x and then run the script as root.


参考:

https://support.apple.com/en-us/HT206152
https://www.digitalocean.com/community/tutorials/how-to-set-up-an-ikev2-vpn-server-with-strongswan-on-ubuntu-18-04-2
https://www.vultr.com/faq/#downloadspeedtests
https://github.com/jawj/IKEv2-setup

417 total views, 1 views today