kurnek学习笔记

Let’s Encrypt免费SSL证书获取以及自动续签

免费,自动的证书授权中心 Let’s Encrypt

配置HTTPS需要的从授权证书中心(CertificateAuthority)签发被浏览器认可的证书,而大部分CA证书是需要收费的,单域名证书相对比较便宜,但是如果是多域名的情况下就需要重复购买证书或者购买多域名证书,这样需要花费的支出对于个人网站来说并不算少。

Let’s Encrypt 是一个免费提供SSL证书的CA,虽然每次签发的证书有效期都只有三个月,但是发证是自动化的,发证速度较快,并且可以通过脚本来自动续签,为个人网站使用HTTPS提供了一个不错的选择。

Let’s Encrypt (以下简称LE)的证书签发主要使用基于 ACME协议 的证书自动管理客户端来实现。

LE官方推荐的客户端是 Certbot ,本文中就是使用 Certbot 来获取和续签证书。

NGINX配置HTTPS并启用HTTP2

为什么要使用HTTP/2

http/2作为新一代http协议,可以说是http/1.x的完全重构。

http/2重新定义了http数据包的格式,使用二进制格式的frame来进行传输(在http1.x中使用的是明文字符串),这个改动让http/2更加易于优化和扩展。

http/2支持多路复用,http1.x虽然也能做到在同一个tcp请求中并发进行数个http请求,但是请求是阻塞的(上一个请求取得响应前是得不到下一个请求的响应的),http/2在同一个tcp请求中可以完成所有http请求(非阻塞,后一个请求可以在前一个请求之前取得响应),并且同时实现流量控制以及优先级控制。

http/2对消息头使用了为http请求量身定做的HPACK压缩方案,这个压缩协议简单来说就是客户端和服务端同时维护一个hash表,将常用的消息头以Key-Value形式保存,传输时只传输Key即可,如在http请求中常用的"GET /index.html"用Key:1保存起来,那么在http/2的消息头中就只需要一个数字1即可(在http1.x要使用完整的字符串)。

http/2支持ServerPush,由服务端主动推送资源到客户端。

总结:对比http1.x,http/2的最大改进就是性能,同样的请求,http/2可以在更加短的时间内传输更少的数据来完成,目前主流的浏览器均已经支持了http/2,可以说是大势所趋。

HTTP/2官方链接 实现HTTP/2的项目列表

为什么使用HTTPS

https作为安全的http通道的作用家喻户晓,就不再赘述。

这里简述为什么使用http/2的同时要使用https。

实际上http/2协议包含了两个模式,一个是http/2,基于ssl加密,与https兼容,简称h2,另外一个是http/2 cleartext,也就是http/2明文模式,简称h2c,也就是我们现在一般使用的http。

虽然http/2设计了两种模式(nginx也支持这两种模式),但是各大浏览器厂商都默认抛弃了h2c模式,因此如果不使用https直接使用http2的话,大部分浏览器无法正常访问网页

因此未来h2c的使用场景估计将更多会用于内网服务器的通讯或者自制客户端。

从零开始的典型Linux PHP7服务器安装部署

服务器环境:阿里云ECS

Linux发行版本:CentOS 7

安装软件:Mysql-Server Memcached Redis Nginx PHP

需要注意的要点:

1、依赖库需要优先安装如zlib,openssl,pcre等,PHP放在最后安装。

2、不推荐使用yum安装PHP,因为编译PHP的时候有许多参数其实需要自己按需调整,此外自己编译也能理解PHP需要依赖的库。

哟西~前言说到这,让我们赶紧开始吧w

安装依赖库

#zlib 数据压缩库,许多软件都需要使用
yum install zlib
yum install zlib-devel
#libevent 网络库,memcached需要使用
yum install libevent
yum install libevent-devel
#openssl 加密库
yum install openssl
yum install openssl-devel
#tcl脚本库 redis需要
yum install tcl
yum install tcl-devel
#pcre 正则表达式解释库
yum install pcre
yum install pcre-devel
#xml 解析库
yum install libxml2
yum install libxml2-devel
#curl库
yum install libcurl-devel
#mcrypt加密库
yum install mcrypt
#m4 以及 autoconf库,PHP编译扩展时需要用到
yum install m4
yum install m4-devel
yum install autoconf
#memcached库,PHP的memcached扩展需要
yum install libmemcached
yum install libmemcached-devel
#GD 图片处理库
yum install gd
yum install gd-devel
#freetype 字体引擎,PHP GD库需要
yum install freetype
yum install freetype-devel
#libpng PNG图片处理库,PHP GD库需要
yum install libpng
yum install libpng-devel
#libjpeg JPEG图片处理库,PHP GD库需要
wget http://www.ijg.org/files/jpegsrc.v9b.tar.gz
tar xzvf jpegsrc.v9b.tar.gz
cd jpeg-9b
./configure --prefix=/etc/libjpeg
make && make install
cd ..

当然以上有些库可能系统本身就已经安装好了,各位看情况安装即可。

安装mysql

在mysql官网的这个地址可以选择需要的版本:https://downloads.mysql.com/archives/community/

此处使用5.7为例子,只安装需要的包(当然也可以直接安装bundle包)

#阿里云某些centOS自带了mariadb-libs,会跟mysql冲突,先卸载
yum erase mariadb-libs
wget https://downloads.mysql.com/archives/get/file/mysql-community-common-5.7.17-1.el7.x86_64.rpm
rpm -iv mysql-community-common-5.7.17-1.el7.x86_64.rpm
wget https://downloads.mysql.com/archives/get/file/mysql-community-libs-5.7.17-1.el7.x86_64.rpm
rpm -iv mysql-community-libs-5.7.17-1.el7.x86_64.rpm
wget https://downloads.mysql.com/archives/get/file/mysql-community-client-5.7.17-1.el7.x86_64.rpm
rpm -iv mysql-community-client-5.7.17-1.el7.x86_64.rpm
wget https://downloads.mysql.com/archives/get/file/mysql-community-server-5.7.17-1.el7.x86_64.rpm
rpm -iv mysql-community-server-5.7.17-1.el7.x86_64.rpm
wget https://downloads.mysql.com/archives/get/file/mysql-community-devel-5.7.17-1.el7.x86_64.rpm
rpm -iv mysql-community-devel-5.7.17-1.el7.x86_64.rpm

安装nginx

#下载openssl 1.0.2k的源码,用于编译nginx的http2模块时候使用
wget https://www.openssl.org/source/openssl-1.0.2k.tar.gz
tar xzvf openssl-1.0.2k.tar.gz
wget http://nginx.org/download/nginx-1.12.0.tar.gz
tar xzvf nginx-1.12.0.tar.gz
cd nginx-1.12.0
mv ../openssl-1.0.2k ./
./configure --prefix=/etc/nginx --sbin-path=/etc/nginx/sbin/nginx --modules-path=/etc/nginx/modules --conf-path=/etc/nginx/conf/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nobody --group=nobody --with-file-aio --with-ipv6 --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_stub_status_module --with-pcre --with-pcre-jit --with-openssl=openssl-1.0.2k
make && make install
cd ..

安装完毕后的nginx会在/etc/nginx目录下~

当然也可以自行修改以上编译参数中的路径将nginx编译到指定的位置去

下载openssl 1.0.2的目的主要是为了编译nginx的http2模块,详细可以参考我的另一篇博文

安装memcached

wget http://memcached.org/files/memcached-1.4.36.tar.gz
tar xzvf memcached-1.4.36.tar.gz
cd memcached-1.4.36
./configure --prefix=/etc/memcached
make && make install
cd ..

安装后的memcached会在/etc/memcached目录下,同理这里也是可以自行修改的~

安装redis

wget http://download.redis.io/releases/redis-3.2.8.tar.gz
tar xzvf redis-3.2.8.tar.gz
cd redis-3.2.8
make
cd ..
mv redis-3.2.8 redis
mv redis /etc/
chmod +x /etc/redis/src/redis-server
chmod +x /etc/redis/src/redis-cli
ln -s /etc/redis/src/redis-cli /usr/bin/redis-cli
ln -s /etc/redis/src/redis-server /usr/bin/redis-server

redis的安装是直接编译以后将目录移动到你想要放置的位置,然后给redis-cli和redis-server加上可执行权限就可以啦~

此处是将redis放到/etc/redis下面,为了方便还做了两个软连接

安装PHP

安装完一大堆依赖以及其他需要用到的软件以后,终于来到安装PHP的环节了~

其实安装PHP除了依赖的库特别多以外,也没什么特别的,也是配置(configure),编译(make),安装(make install)三步走即可~

强烈建议大家安装之前使用./configure --help来仔细看一遍php的编译提供的参数,再来选择自己需要的模块~

此处给出的编译参数只是一个范例~

wget http://am1.php.net/distributions/php-7.1.4.tar.gz
tar xzvf php-7.1.4.tar.gz
cd php-7.1.4
./configure --prefix=/etc/php --enable-fpm --with-openssl --with-pcre-jit --with-zlib --with-curl --with-gd --with-jpeg-dir=/etc/libjpeg --with-png-dir=/usr/include/libpng15 --with-freetype-dir=/usr/include/freetype2/freetype --enable-mbstring --enable-mysqlnd --with-mysqli --with-pdo-mysql --enable-sockets
make && make install
cp php.ini-production /etc/php/lib/php.ini
cd ..

这里将PHP安装到了/etc/php下,并且拷贝了一份预设的php.ini到/etc/php/lib/下~当然啦,路径依然是可以自行修改的,详细参考配置参数。

编译redis以及memcached的PHP扩展

#编译redis扩展
wget http://pecl.php.net/get/redis-3.1.2.tgz
tar xzvf redis-3.1.2.tgz
cd redis-3.1.2
/etc/php/bin/phpize
./configure  --with-php-config=/etc/php/bin/php-config
make && make install
cd ..
#编译memcached扩展
wget http://pecl.php.net/get/memcached-3.0.3.tgz
tar xzvf memcached-3.0.3.tgz
cd memcached-3.0.3/
/etc/php/bin/phpize
./configure  --with-php-config=/etc/php/bin/php-config
make && make install
cd ..

编译好这两个扩展以后,一定不要忘记将这两个扩展添加到php.ini中去哦~

End

好了~软件安装到此结束~至此我们就拥有了一个可以正式进行PHP开发的服务器啦~ww

接下来就是修改PHP和NGINX的配置就完成啦~修改配置的话,网上范例特别多此处就不再赘述(有需要也可以留言,日后可能补上)

PHP OPCACHE 解读

本文译自:http://jpauli.github.io/2015/03/05/opcache.html

由于本人C语言水平英文水平计算机水平等等各种水平有限,因此有些部分可能理解和翻译得不是特别到位,总之尽力啦。

OPCodes 缓存的起源

PHP是一个脚本语言,在通常情况下,PHP会编译任何你让它运行的文件。通过编译获得OPCodes,然后运行并且在结束之后立刻废弃掉这些OPCodes。可以说PHP是被设计成这个样子的:在上一个请求中做过的所有事情,到了下一个请求,它全都忘记了。

在生产环境的服务器上,PHP代码一般不会频繁变动,因此这个编译环节基本上都是在读取同样的源代码,生成并且运行同样的OPCodes。每次请求都需要调用PHP的编译器来编译每一个PHP脚本,这无疑浪费了大量的时间和资源。

undefined

因为编译确实太过花时间了,各种OPCode缓存扩展被设计了出来。它们的目标是让每一个PHP脚本都只编译一次,将编译出来的OPCodes缓存进共享内存,之后的每个PHP worker进程池(通常是PHP-FPM)中的worker都可以直接从内存中读取和执行OPCodes。

这样做给PHP带来的提升是十分巨大的,因为不需要一遍又一遍地编译PHP脚本,通常能够将运行一个PHP脚本的时间降低一半甚至更多(当然也需要看PHP脚本具体执行了什么代码)。

越是复杂的PHP应用,通过这样的方式获得的提升就越大。如果你的PHP应用在每次请求都需要运行成吨的脚本(比方说基于各种大型框架的应用或者类似wordpress这样的PHP应用),你能够体验到10到15倍的速度提升。这是因为PHP的编译器跟其他编译器一样,都是很慢的,毕竟编译器需要将高级语言的语法转换成机器能明白的语法,它要尝试理解代码到底需要机器做些什么,编译器通常还需要为生成后的代码进行优化处理,以便之后的运行性能可以更好;所以编译一个PHP脚本真的很慢,并且很吃内存。类似Blackfire这样的性能分析器可以让你知道编译时间。

undefined

linux常用工具命令

列出了一些自己常用的命令,其实还有很多好用的命令我还没玩溜,所以没有写进来(也有可能是漏写...),以后说不定会更新.

命令中带的参数不做详细解释,如果需要查看一个命令的详细参数的话,不妨使用man命令或者-h和--help来自行解决(使用百度也行啦) :)

通用

man cmd : 查看cmd命令的手册,如man find

cat /proc/version : 查看内核版本

cat /etc/issue : 查看系统信息

env : 查看环境变量

vi /etc/profile : 编辑环境变量,编辑后需要使用 source /etc/profile 生效

iostat : 查看磁盘IO情况

df -h : 查看磁盘容量

du -sh : 查看当前目录所有文件的占用空间

grep 'xxx' : 全局规则匹配输出,文本匹配命令,一般会跟别的命令配合使用用来过滤出用户想要看到的输出,如在目录文件列表中找到带php的文件可以这样做 ls -l | grep 'php'

grep 'model name' /proc/cpuinfo : 查看CPU信息

crontab -l : 列出本用户的定时任务

crontab -e : 修改本用户的定时任务(详情请搜索crontab)

top : 打开性能分析工具

history : 查看命令历史

whereis cmd: 查找命令cmd所在的位置

ls -l : 列出所在目录文件详细信息

cp -rf $source $target : 复制$source文件覆盖到$target位置

mv $source $target : 移动$source文件到$target位置($source会被重命名为$target,因此也可用作重命名使用)

rm $file : 删除文件,如果要删除目录则加上-r ,强制删除使用-rf,需慎用

find $basePath -name "*$filename*" : 查找$basePath目录下的名为$filename的文件(模糊匹配)

ln -s $sourceFileOrDir $targetSymbol : 建立一个文件或文件夹符号软连接(类似windows的快捷方式)

tar -xzvf file.tar.gz : 解压tar包

tar -czvg target.tar.gz $fileOrDir : 将文件或者目录压缩为tar包

zip / unzip : 压缩/解压缩zip包

netstat -anp | grep $pid : 根据进程PID查看占用的端口号

netstat -na | grep $port : 根据端口号查看占用情况

netstat -n | grep tcp | grep $port | wc -l : 监控网络客户连接数

netstat -n | grep :80 | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' : 查看nginx并发

lsof -i:$port : 查看占用端口的进程

kill -9 $pid : 杀死进程号为$pid的进程

tail -f xxx.log : 追踪日志

ps aux | grep $process : 查看进程信息

ps auxw|head -1;ps auxw|sort -rn -k3|head -10 : CPU占用最多的前10个进程

ps auxw|head -1;ps auxw|sort -rn -k4|head -10 : 内存消耗最多的前10个进程

ps auxw|head -1;ps auxw|sort -rn -k5|head -10 : 虚拟内存使用最多的前10个进程

awk 特别复杂… 不在这写

手动安装Atom编辑器的Package

由于github在国内访问非常不稳定,导致Atom的Pakage经常安装/升级失败,让人很恼火。

因此这篇文章就讲讲怎么手动安装Atom的Package。

本文是在windows下进行的,在其他平台应该大致相通…

PS:刚刚就是因为我的Atom被升级失败的Remote-FTP搞得不断崩溃,所以才会想着要写这篇文章。

 

第一步:安装git(其实不安装也行,不过装了方便点,我觉得大部分开发人员还是需要用到git的)

https://www.git-scm.com/

到git官网下载安装git。

安装的时候如果看不懂选项就一路点next即可。

 

第二步:Clone你想要安装的Package到atom插件目录下(不安装git的话就直接到github上找到代码之后下载下来也是一样的)

本例子以PHP程序员常用的Remote-FTP插件为例。

到Github上找到Package的所在仓库,Remote-FTP的github仓库地址:https://github.com/mgrenier/remote-ftp

运行cmd,找到atom的安装目录,然后将插件代码Clone下来,命令如下:

cd .atom

cd packages

git clone https://github.com/mgrenier/remote-ftp

 

第三步:使用Atom的apm(全称大概是AtomPackageManager)安装插件

只要进入到刚刚clone下来的Package目录,然后执行apm install 包名即可,命令如下:

cd remote-ftp

apm install remote-ftp

网站架构技术术语

 

undefined

大型网站分层简化示意图

前言

本篇文章基本摘自《大型网站技术架构》,文中提到的各种术语和概念大致涵盖了大型网站架构需要的东西,每一条几乎都是一个值得深究的领域,这里只是做一个浅层的描述,以便日后看着本文能够展开思路去思考大型网站中的方方面面的技术细节。

奉上我在这本书上看到的最喜欢的一个观点:

不要企图去设计一个大型网站,大型网站的架构都是根据大型网站自身的业务发展逐渐演化而来的。

又一次开始

生于忧患而死于安乐,这句话大概每个人都听过,却往往容易被忘记。

过去几年实在过得太过安逸,温水煮青蛙一般,自己每天都在一点点落后于身边的人却毫无自觉。

等到现在发现的时候,差点已经到了不可收拾的地步了…

趁着还能挽回的时候,再一次开始吧。

新文章 → Home