二二点三四

where come ! where go !

更新:换了个仓库,本地调试完发现,我kao,服务器问题

邮箱收到邮件说底部没有添加备案标识,一看果然如此,大概是上次迁移的时候掉了,再说,搭在家里的服务器本来有没有标识都无所谓的。
如今放到网上还是要添加下的,但是 hexo 版本和 next 主题已经升级好几个版本了,之前的改动也都忘了在哪里设置的了,就这样吧。

在本地使用 php7.2.6 调试项目的时候,发现 openssl 和 curl 模块无法加载
网上搜索了好多解决方案,大体都是拷贝 libssh2.dllssleay32.dlllibeay32.dll 到 apache\bin 目录下并在 httpd.conf 中加载的方法

我自己的开发环境是 win10 + apache2.4.3 + php7.2.6,反正试了都不行,后来在一篇帖子里找到 php 官方安装 curl 的页面地址 http://php.net/manual/zh/curl.installation.php
有个笔记吸引了我

Beginning with version 1.1.0 OpenSSL did change their libary names!
libeay32.dll is now libcrypto-.dll (e.g. libcrypto-1_1-x64.dll for OpenSSL 1.1.x on 64bit windows)
ssleay32.dll is now libssl-
.dll (e.g. libssl-1_1-x64.dll for OpenSSL 1.1.x on 64bit windows)

于是试了在 httpd.conf 中加载了这两个文件,重启服务,果然解决。

1
2
LoadFile "D:/wamp/bin/php/php7.2.6/libcrypto-1_1.dll"
LoadFile "D:/wamp/bin/php/php7.2.6/libssl-1_1.dll"

安装 acme.sh

1
$ curl  https://get.acme.sh | sh

cloudxns 添加 CAA 记录及申请接口

1
hehe.fnzoo.com. CAA 0 issue letencrypt.org

根据 dns 服务商修改相应接口验证信息(例:Cloudxns.com)

1
2
3
4
$ vi /root/.acme.sh/dnsapi/dns_cx.sh

CX_Key="f4054cae35ab6a925dd1026c9be8aa82"
CX_Secret="aae7150d6ff3b654"

生成 ECC 证书

1
2
3
4
5
6
7
$ "/root/.acme.sh"/acme.sh --issue --dns dns_cx -d hehe.fnzoo.com -k ec-256

# 成功后输出
[Mon Dec 4 14:36:38 CST 2017] Your cert is in /root/.acme.sh/hehe.fnzoo.com_ecc/hehe.fnzoo.com.cer
[Mon Dec 4 14:36:38 CST 2017] Your cert key is in /root/.acme.sh/hehe.fnzoo.com_ecc/hehe.fnzoo.com.key
[Mon Dec 4 14:36:39 CST 2017] The intermediate CA cert is in /root/.acme.sh/hehe.fnzoo.com_ecc/ca.cer
[Mon Dec 4 14:36:39 CST 2017] And the full chain certs is there: /root/.acme.sh/hehe.fnzoo.com_ecc/fullchain.cer

安装证书

1
2
3
4
5
$ /root/.acme.sh/acme.sh --ecc \
--installcert -d hehe.fnzoo.com \
--key-file /etc/cert/hehe.fnzoo.com.key \
--fullchain-file /etc/cert/fullchain.cer \
--reloadcmd "/usr/local/nginx/sbin/nginx -s reload"

使用 CA 证书生成 HPKP 证书指纹

1
2
3
4
5
$ openssl x509 -in /root/.acme.sh/hehe.fnzoo.com_ecc/ca.cer -pubkey -noout | openssl rsa -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64

# 成功后输出
writing RSA key
YLh1dUR9y6Kja30RrAn7JKnbQG/uEtLMkBgFF2Fuih2=

自签名 CA 证书,用于生成备份 HPKP(证书指纹)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
$ mkdir /etc/cert
$ cd /etc/cert
# 生成 1024 位加密的服务器私钥
$ openssl genrsa -out fnzoo.com.key 1024
# 制作 CSR 证书申请文件
$ openssl req -new -key fnzoo.com.key -out fnzoo.com.csr

# 制作 CSR 问题回答,红色为填写部分
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:Beijing
Locality Name (eg, city) []:Beijing
Organization Name (eg, company) [Internet Widgits Pty Ltd]:fnzoo.com
Organizational Unit Name (eg, section) []:IT
Common Name (e.g. server FQDN or YOUR name) []:hehe.fnzoo.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

# 自己给自己签发证书
$ openssl x509 -req -days 3650 -in fnzoo.com.csr -signkey fnzoo.com.key -out fnzoo.com.crt
# 生成备份用的 HPKP(证书指纹)
$ openssl x509 -in fnzoo.com.crt -pubkey -noout | openssl rsa -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64

# 成功后输出
writing RSA key
RsO0x8J5EdQMJChV5H+tKaTcOuRjdkv3VazWCYZId2U=

修改 nginx 配置文件并重启

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
$ vi /usr/local/nginx/conf/ssl.conf

# 启用 HSTS
add_header Strict-Transport-Security "max-age=15552000; includeSubDomains;";
# 不允许被框架嵌套
add_header X-Frame-Options DENY;
# 失效内容类型嗅探
add_header X-Content-Type-Options nosniff;
# 防止跨站脚本 XSS
add_header X-XSS-Protection "1; mode=block";
# 启用 Cache Control
add_header Cache-Control max-age=3600;
# 启用 CSP 防止 XSS 攻击
add_header Content-Security-Policy "default-src 'self'";
# 配置 HPKP(证书指纹)
add_header Public-Key-Pins 'pin-sha256="YLh1dUR9y6Kja30RrAn7JKnbQG/uEtLMkBgFF2Fuihg="; pin-sha256="RsO0x8J5EdQMJChV5H+tKaTcOuRjdkv3VazWCYZId+U="; max-age=15552000; includeSubDomains';

# TLS 会话恢复,简化 TLS 握手
ssl_session_cache shared:SSL:10m;
# SSL session 过期时间
ssl_session_timeout 10m;
# 开启浏览器的Session Ticket 缓存
ssl_session_tickets on;

# OCSP stapling 策略
ssl_stapling on;
# OCSP 证书路径,let's encrypt 不返回 ca 证书,所以无需设置 ssl_stapling_verify,ssl_trusted_certificate
ssl_stapling_verify on;
ssl_trusted_certificate /etc/cert/fullchain.cer;

# 用于查询 OCSP 服务器的 DNS
resolver 8.8.8.8 8.8.4.4 valid=300s;
# 查询域名超时时间
resolver_timeout 5s;

# 服务器证书和私钥路径
ssl_certificate /etc/cert/fullchain.cer;
ssl_certificate_key /etc/cert/hehe.fnzoo.com.key;

# 加密协议与算法
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:DES-CBC3-SHA;

# 在 TLSv1 握手时,使用服务端的配置项,以增强安全性
ssl_prefer_server_ciphers on;

$ nginx -s reload

微信活动项目开发一半、想要本地测试的时候才发现服务器 502 错误了
而上传版本到服务器却是没有问题的

查看 nginx 错误日志发现

1
2017/03/29 09:37:36 [error] 4362#0: *245 upstream prematurely closed connection while reading response header from upstream, client: 12 7.0.0.1, server: film.app, request: "GET /activity/GhostScan/index?activity_id=115&cinema_id=59 HTTP/1.1", upstream: "fastcgi://127.0.0 .1:9000", host: "film.app", referrer: "http://film.app/administrator/ActivityGhostScan/link?activity_id=115"

初步怀疑是本地 nginx 配置有问题,求助度娘修改了如下配置

1
2
3
4
5
6
7
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;

fastcgi_buffers 4 64k;
fastcgi_buffer_size 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;

重启 nginx,然而,并没有什么卵用。。。

再次查看 php-fpm 日志发现子进程在访问项目页面时错误退出

1
2
[29-Mar-2017 09:46:41] WARNING: [pool www] child 7007 exited on signal 11 (SIGSEGV) after 26.854745 seconds from start
[29-Mar-2017 09:46:42] NOTICE: [pool www] child 7028 started

使用 dtruss -p php-fpm PID 跟踪 php-fpm 进程,然而,看不懂啊。。。

好吧,放弃了这种思路,一步步从 Yii 框架中断点调试

发现页面在首次请求微信接口后就会报 502 错误,而在之前退出没有问题
接口使用了 curl 请求,我换成 file_get_contents() 之后也没发现问题

难道是 curl 的问题?
接着把该公共方法提出单独测试也没有问题,正常返回抓取数据
无聊试了一下抓取自己的站,服务器 502 了!!!

好吧。和刚才测试比较而言,原来是 curl 在访问 https 协议时报错

定位了错误就好办了,解决一下 curl 没有调用 openssl 的问题就可以了

因为开发机使用的 mac oscurl 使用包管理 brew 安装的

1
2
3
4
# 卸载旧版本 curl
brew uninstall curl
# 安装支持 openssl 的 curl
brew install curl --with-openssl

再次测试项目,OK

撸了一个 excel 在线转换 icloud 通讯录工具,请不吝品尝。

使用说明:

  1. 下载通讯录模板,依照示例数据填入通讯录数据
  2. 添加刚才编辑好的 excel 文件
  3. 点击 转换 按钮,生成可以导入 icloud 的名片文件

地址:在线转换

  • 确认本地使用证书路径
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ php -r "print_r(openssl_get_cert_locations());"
    Array
    (
    [default_cert_file] => /usr/local/ssl/cert.pem
    [default_cert_file_env] => SSL_CERT_FILE
    [default_cert_dir] => /usr/local/ssl/certs
    [default_cert_dir_env] => SSL_CERT_DIR
    [default_private_dir] => /usr/local/ssl/private
    [default_default_cert_area] => /usr/local/ssl
    [ini_cafile] =>
    [ini_capath] =>
    )
  • 下载最新 curl 证书
    1
    $ wget http://curl.haxx.se/ca/cacert.pem
  • 替换原证书路径文件
    1
    $ sudo mv cacert.pem /usrlocal/ssl/cert.pem
  • 重启 php-fpm
    1
    $ service php-fpm restart
  • 重新安装 composer,正常

本来使用了 mdwiki 来整理文章页面,很想输出原格式的文件内容
可是 nginx 默认没有 .md 类型只会把 .md 类型文件下载

修改 nginx 的文件类型配置文件即可:

1
vi /usr/local/nginx/conf/mime.types

添加

1
text/markdown md;

重载 nginx

1
service nginx reload

阿里云 安装 redismake test 报错无法继续。

报错日志中含有 Killing still running Redis server

最后在 github 上找到了答案。

开启 11111 端口即可。

1
2
3
iptables -I INPUT -p tcp --dport 11111 -j ACCEPT
/etc/init.d/iptables save
service iptables restart

继续 make test 正常。

今天在安装 pyspider 的时候,遇到好多坑,记录一下

  1. Could not run curl-config: [Errno 2] No such file or directory
    搜索了好久,都是 Ubuntusudo apt-get install libcurl4-openssl-dev 的结果,centos 下却没有这个包,可是我的 curl 明明就已经安装过了呀,郁闷
    执行 yum install libcurl-devel,没想到却又可以了。

  2. error: command 'gcc' failed with exit status 1
    执行 yum install python-devel

  3. fatal error: libxml/xmlversion.h: No such file or directory
    执行 yum install libxslt-devel libxml2-devel

  4. #error minimum required version of libxml2 is 2.7.0
    一开始进入误区,非要安装 RPM 的 libxml2 包,卡在系统版本与包不兼容的验证问题上,只好换源码包安装了,顺利编译 libxml2libxslt

  5. # error "Need libcurl version 7.19.0 or greater to compile pycurl."
    继续报错,下载 curl 源码包编译安装

  6. ImportError: libcurl.so.4: cannot open shared object file: No such file or directory
    看来刚才编译安装的包没认到正确的路径啊

    解决方法

    1. vim /etc/ld.so.conf
    2. 添加以下几行:
      1
      2
      3
      /usr/local/lib
      /usr/lib
      /lib
    3. sudo ldconfig
  7. ImportError: No module named _sqlite3
    执行 yum install sqite-devel,然后重新编译 python

  8. 执行 pyspider,终于成功了~

阅读的人

不知何时开始,我害怕阅读的人。就像我们不知道冬天从哪天开始,只会感觉夜的黑越来越漫长。

我害怕阅读的人。一跟他们谈话,我就像一个透明的人,苍白的脑袋无法隐藏。我所拥有的内涵是什么?不就是人人能脱口而出,游荡在空气中最通俗的认知吗?像心脏在身体的左边。春天之后是夏天。美国总统是世界上最有权力的人。但阅读的人在知识里遨游,能从食谱论及管理学,八卦周刊讲到社会趋势,甚至空中跃下的猫,都能让他们对建筑防震理论侃侃而谈。相较之下,我只是一台在MP3世代的录音机;过气、无法调整。我最引以为傲的论述,恐怕只是他多年前书架上某本书里的某段文字,而且,还是不被荧光笔画线注记的那一段。

阅读全文 »