Ubuntu 14.04使用OpCache提升PHP5.5+程序性能

概述


PHP 5.5以后内建了OpCache,OpCache的加速原理是把编译后的bytecode存储在内存里面, 避免重复编译 PHP 所造成的资源浪费.Ubuntu 14.04默认自带 PHP 5.5.9,已经集成了这个功能。但是默认是不启用的。

启用


修改 php.ini 文件

$ sudo vim /etc/php5/fpm/php.ini
$ sudo vim /etc/php5/cgi/php.ini
$ sudo vim /etc/php5/apache2/php.ini

在文件最后面加入:

; 开关打开
opcache.enable=1
; 可用内存, 酌情而定, 单位 megabytes
opcache.memory_consumption=128
; 对多缓存文件限制, 命中率不到 100% 的话, 可以试着提高这个值
opcache.max_accelerated_files=5000
; Opcache 会在一定时间内去检查文件的修改时间, 这里设置检查的时间周期, 默认为 2, 单位为秒
opcache.revalidate_freq=240

重启服务器

$ sudo service php5-fpm restart
$ sudo service apache2 restart

效果


加速效果极端明显,强烈建议启用这个功能。

Ubuntu14.04升级到Ubuntu16.04出现错误

Ubuntu14.04升级到Ubuntu16.04出现错误,如下图所示:
from_ubuntu_14_upgrade_ubuntu_16_error
如果机器上安装了postgresql,则是由于postgresql处于升级黑名单中,因此无法升级。
一般建议手工卸载postgresql

$ sudo apt-get remove postgresql*

$ sudo apt-get remove pgadmin3

卸载完成后继续执行升级命令

$ sudo do-release-upgrade -d

具体参考这个BUG的链接:
postgresql packages in the removal blacklist making it hard to upgrade

Ubuntu 14.04编译安装Apache 2.4.20

1.安装开发工具包

$ sudo apt-get install build-essential

2.下载Apache 2.4.20的源代码

$ wget http://apache.opencas.org//httpd/httpd-2.4.20.tar.gz

3.安装apr依赖库

$ sudo apt-get install libapr1 libaprutil1 libapr1-dev libaprutil1-dev

4.安装pcre

$ sudo apt-get install libpcre++-dev

5.解压缩代码

$ tar -zxvf httpd-2.4.20.tar.gz

6.配置并编译

$ cd  httpd-2.4.20

$ ./configure \
	--prefix=/opt/apache-2.4.20 \
	--enable-ssl \
	--with-mpm=event \
	--enable-rewrite \
	--enable-proxy \
	--enable-layout=Debian \
	--enable-so \
	--with-suexec-caller=www-data \
	--with-suexec-docroot=/var/www  \
	--enable-deflate \
	--enable-headers \
	--with-program-name=apache2
	
$ make && make install

参考链接


Ubuntu 14.04(64位)源码编译安装PHP7并配置Apache2支持

下载PHP7源代码


$ cd ~

$ wget http://cn2.php.net/distributions/php-7.0.5.tar.gz

解压缩到当前目录


$ tar -zxvf php-7.0.5.tar.gz

安装编译需要的依赖


安装libxml2-dev

$ sudo apt-get update

$ sudo apt-get install libxml2-dev

安装gcc

$ sudo apt-get install build-essential

安装依赖的库

$ sudo apt-get install openssl

$ sudo apt-get install libssl-dev

$ sudo apt-get install make

$ sudo apt-get install curl

$ sudo apt-get install libcurl4-gnutls-dev

$ sudo apt-get install libfreetype6-dev

$ sudo apt-get install libjpeg-dev

$ sudo apt-get install libpng-dev

$ sudo apt-get install libmcrypt-dev

$ sudo apt-get install libreadline6 libreadline6-dev

安装apache2-dev,否则无法指定--with-apxs2=/usr/bin/apxs来生成libphp7.so

$ sudo apt-get install apache2-dev

切换到编译目录

$ cd php-7*

配置并编译


配置开启php-fpm支持,开启多线程支持--enable-maintainer-zts,否则无法使用Apache2Event MPM功能。

./configure --prefix=/opt/php-7.0.5 --with-config-file-path=/opt/php-7.0.5/etc --enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data --with-mysql-sock --with-mysqli --with-pdo-mysql --with-iconv-dir --with-freetype-dir --with-jpeg-dir --with-png-dir --with-libxml-dir=/usr --disable-rpath --enable-bcmath --enable-shmop --enable-inline-optimization --with-curl --enable-mbregex --enable-mbstring --enable-ftp --with-gd --enable-gd-native-ttf --enable-sockets --enable-soap --without-pear --with-gettext --disable-fileinfo --enable-maintainer-zts --disable-debug --enable-shared --enable-opcache --enable-pdo --with-iconv --with-mcrypt --with-mhash --with-openssl --enable-xml --with-xmlrpc --with-libxml-dir --enable-pcntl --enable-sysvmsg --enable-sysvsem --enable-sysvshm --with-zlib --enable-zip --with-readline --without-sqlite3 --without-pdo-sqlite --with-libdir=/lib/x86_64-linux-gnu --with-jpeg-dir=/usr/lib --with-apxs2=/usr/bin/apxs --enable-cgi

配置并安装PHP7


$ make && make test

$ make && sudo make install

拷贝PHP7的配置文件


$ cd ~/php-7.0.5

$ cp php.ini-production /opt/php-7.0.5/etc/php.ini

$ cp /opt/php-7.0.5/etc/php-fpm.conf.default /opt/php-7.0.5/etc/php-fpm.conf

$ cp /opt/php-7.0.5/etc/php-fpm.d/www.conf.default /opt/php-7.0.5/etc/php-fpm.d/www.conf

设置PHP7的配置文件php.ini


PHP7已经默认加载opcache.so了,因此不需要声明zend_extension=opcache.so.

######避免PHP信息暴露在http头中
expose_php = Off

######在关闭display_errors后开启PHP错误日志(路径在php-fpm.conf中配置)
log_errors = On

######开启opcache
[opcache]
; Determines if Zend OPCache is enabled
;opcache.enable=0
opcache.enable=1

; Determines if Zend OPCache is enabled for the CLI version of PHP
;opcache.enable_cli=0
opcache.enable_cli=1

启用Apache2PHP7模块


$ sudo a2dismod php5

$ sudo a2enmod php7

$ sudo service apache2 restart

启用Apache2Event模块


$ sudo a2dismod mpm_prefork

$ sudo a2enmod mpm_worker

$ sudo service apache2 restart

参考链接


ubuntu 14.04上源码编译安装php7
How to install PHP 7 as PHP-FPM & FastCGI for ISPConfig 3 on Debian 8 (Jessie)

Ubuntu 14.04 关闭PHP服务器上返回的X-Powered-By信息

最近在分析网站性能的时候,发现服务器返回了"X-Powered-By"字段,这个字段中携带了PHP的版本号,系统的版本号。如下图:
X-Powered-By

而出于安全考虑,这两个信息是不应该被返回给客户端的。

Ubuntu 14.04下服务器禁止返回"X-Powered-By"的设置如下:
对于使用Apache2内置PHP的服务器,则需要修改Apache2对应目录下的配置文件

$ sudo vim /etc/php5/apache2/php.ini

对于使用PHP-FPM调度的服务器,则需要同时修改PHP-FPM,FastCGI对应目录下的配置文件

$ sudo vim /etc/php5/fpm/php.ini
$ sudo vim /etc/php5/cgi/php.ini

找到

; Decides whether PHP may expose the fact that it is installed on the server
; (e.g. by adding its signature to the Web server header).  It is no security
; threat in any way, but it makes it possible to determine whether you use PHP
; on your server or not.
; http://php.net/expose-php
expose_php = On

把其中的expose_php = On调整为:expose_php = Off,调整后的结果如下:

; Decides whether PHP may expose the fact that it is installed on the server
; (e.g. by adding its signature to the Web server header).  It is no security
; threat in any way, but it makes it possible to determine whether you use PHP
; on your server or not.
; http://php.net/expose-php
expose_php = Off

接下来,重启Apache2

$ sudo service apache2 restart

重启PHP-FPM,如果配置了的话。

$ sudo service php5-fpm restart

再次请求服务器后,发现"X-Powered-By"已经不会再返回了。

X-Powered-By-Off

阿里云服务器从Ubuntu 12.04升级到Ubuntu 14.04

阿里云的服务器是Ubuntu 12.04根据Canonical发布的支持路线图,可以看到2017年4月份之后就不再提供支持。因此很有升级导致Ubuntu 14.04的必要,更别说很多软件在Ubuntu 12.04上已经比较过时了。

Ubuntu LTS版本支持路线图如下图:
1_201204291858511OI60

升级的流程如下所示:(执行下面操作之前,请务必先备份重要数据,阿里云服务器推荐使用自带的系统快照功能,非常好用)

1.首先保证当前系统上的软件都是最新的


$sudo apt-get update
$sudo apt-get dist-upgrade

2.安装系统升级模块


$sudo apt-get install update-manager-core
$sudo do-release-upgrade -d

1-do-release-upgrade

3.升级流程


允许系统在升级期间开放1022端口用来处理系统升级异常,当系统升级异常的时候,可以通过这个端口进行某些恢复操作。(实际上没太大作用,出问题就快照回滚了,更快速安全方便)
2-ssh-port-query-yes

输入y,点击回车(Enter)。

3-iptables-add-port-press-enter

点击回车(Enter),允许在iptable上面开放1022端口出来,这个端口在安装完成后会自动关闭,不需要过多关心。

4-rewrite-sources-list-yes

允许升级程序更新sources.list用来获取升级所需要的文件,输入y,点击回车(Enter)。

5-upgrade-confirm

询问是否确认系统升级,输入y,点击回车(Enter)。

6-disable-ssh-password-no

询问是否禁止root用户通过ssh访问系统,这个一定要选择No,否则升级完成后,我们无法远程登陆系统。

7-restart-services-without-asking-yes

询问在升级期间是否允许自动重启需要升级的服务,这个一定要选择Yes,否则会不断的询问你是不是确定重启服务,非常麻烦。

8-serurity-limits-conf-replace-enter

询问是否用新系统的文件替换原系统的/etc/security/limits.conf文件,直接回车(Enter),不允许替换,使用原系统的配置。

9-etc-default-rcS-enter

同上,直接回车(Enter)。

9-etc-default-rcS-enter

同上,直接回车(Enter)。

10-etc-sysctl-conf-enter

同上,直接回车(Enter)。

11-etc-vsftpd-conf-enter

同上,直接回车(Enter)。

12-etc-php5-fpm-php-fpm-conf-enter

同上,直接回车(Enter)。

13-etc-php5-fpm-php-ini-enter

询问是否替换文件,同上,直接回车(Enter),不允许替换。

14-etc-php5-cgi-php-ini-enter

同上,直接回车(Enter)。

15-etc-init-mounted-run-conf-enter

同上,直接回车(Enter)。

16-etc-apache2-mods-available-fcgid-conf-enter

同上,直接回车(Enter)。

17-etc-sv-git-daemon-run-enter

同上,直接回车(Enter)。

18-etc-default-tomcat7-enter

同上,直接回车(Enter)。

19-upgrade-phpmyadmin-enter

询问是否升级数据库,此处选择Yes,回车(Enter)。

20-upgrade-phpmyadmin-password-enter

输入数据库的密码,完成后点击回车(Enter)。

21-remove-obsolete-packages-yes

询问是否删除不再使用的安装包,输入y后点击回车(Enter)。

22-restart-required-yes

升级完成,询问是否重启系统,输入y后点击回车(Enter)。系统会重启,远程连接会断开,需要稍等几分钟后重新连接服务器。

3.恢复被修改后的系统配置信息


安装Apache2PHP扩展libapache2-mod-php5,Ubuntu 12.04版本的库,在升级的过程中被丢弃了,需要重新手动安装。

23-after-restart-install-libapache2-mod-php5

询问是否替换已经存在的PHP配置文件,直接点击回车,不允许替换。

24-after-restart-install-libapache2-mod-php5-php-ini-enter

修改Apache2的配置文件

$sudo vim /etc/apache2/apache2.conf

25-after-restart-vim-apache2-conf

原有Apache 2.2配置为:

Include sites-enabled/

发现升级后变更为:

IncludeOptional sites-enabled/*.conf

导致PHP无法正常工作,因此需要修改回来。

修改前:
26-after-restart-vim-apache2-conf-IncludeOptional

修改后:27-after-restart-vim-apache2-conf-IncludeOptional-modify-complete

Apache 2.4修改了默认目录位置(这导致2.2版本设置的禁止目录流量功能失效),并且默认开启了目录浏览功能,会导致潜在的安全问题,需要手工关闭.

修改前:29-after-restart-apache2-disable-indexs

修改后:30-after-restart-apache2-disable-indexs-modify

重启Apache2

$sudo service apache2 restart

28-after-restart-apache2-restart

到此,整个系统升级完成,所有功能恢复正常。

从升级的效果来看,服务器的响应明显变快,非常值得升级!

Putty通过SSH无密码登陆Ubuntu12.04

(1)生成公钥/私钥对

$ ssh-keygen -t rsa -P ''

注意"-P"后面输入的内容为空的时候代表不需要输入密码。
完成后会在当前用户目录下的.ssh目录下生成id_rsa,id_rsa.pub这两个文件。
(2)拷贝证书到本地机器
.ssh/id_rsa.pub拷贝下来,然后重命名成id_rsa.pub.git也就是Key加上用户名的命名方式,这样在Linux或者执行命令行的时候SSH可以自动进行用户名,密码的对应。
(3)对于Linux复制的id_rsa.pub.git添加到.ssh/authorzied_keys文件里

$ cat id_rsa.pub.git >> .ssh/authorized_keys

$ chmod 600 .ssh/authorized_keys

authorized_keys的权限要是600
(4)对于Windows,则需要把id_rsa这个文件拷贝下来,然后使用TortoiseGit自带的Puttygen转换为被TortoiseGit支持的.ppk文件。

点击"Conversions"菜单中的"Import key"选项,然后导入我们下载到的id_rsa

PuttyKeyGeneratorImportKey

导入后,

SavePPK

由于Puttygen的BUG,导致如果直接点击"Save private key",会导致生产的Public key是不正确的,因此,需要先点击"Save public key",保存为文件后,无视这个文件即可。然后接下来点击"Save private key"按钮,保存为.ppk文件,这个PPK文件才是我们需要的。

(5)修改SSHD的配置文件/etc/ssh/sshd_config
找到

#AuthorizedKeysFile %h/.ssh/authorized_keys

这句,然后去掉注释。然后重启SSH服务

$ sudo  /etc/init.d/ssh  restart

(6)修改登录认证文件,把认证信息导入到需要认证的用户目录下的.ssh/authorized_keys文件中。

以上面添加的用户git为例子,通过命令:

$ cat /etc/passwd | grep git

可以看到输出如下信息:

git:x:999:1000:git,,,:/shares:/bin/sh

从而找到用户git的工作目录在/share目录下面.

因此执行如下命令:

$ cp -r /root/.ssh /share/.ssh

$ cd /share/.ssh

$ cat id_rsa.pub >> authorized_keys

接下来,需要修改authorized_keys的所有者为用户git,否则git无法通过这个文件进行认证。

$ cd /share/.ssh

$ chown git authorized_keys

而对于管理员root而言,我们不需要执行拷贝操作,只需要修改一下SSH的配置文件,并且执行如下命令即可:

$ cat id_rsa.pub >> authorized_keys

(7)Putty设置使用PPK文件进行登陆认证

左侧栏中选择Connection->SSH->Auth:

LoginPPK
然后点击左侧栏中的Session,点击Save保存设置,然后点击Open连接服务器。
SaveSession

(8)登陆时候,还是需要输入用户名的,因为Ubuntu服务器需要根据用户名来核查证书。输入用户名后,直接回车,会发现不需要再输入密码,就直接登陆了。

putty-7

Ubuntu 12.04安装Jetty

1. 如果没有装JDK的话,安装OpenJDK

$sudo apt-get install openjdk-7-jdk

2. 安装Jetty,Ubuntu软件源里的是Jetty6

$sudo apt-get install jetty

3. 配置Jetty,修改Jetty默认配置文件

$sudo gedit /etc/default/jetty

然后把

NO_START=1

改为

NO_START=0

再设置JDK目录

JDK_DIRS="/usr/lib/jvm/default-java /usr/lib/jvm/java-7-openjdk-i386"

4. 启动Jetty

$sudo service jetty start

5. 测试,在浏览器地址栏中输入

http://localhost:8080

Jetty的端口在/etc/default/jetty中也可以设置

参考链接 Ubuntu 12.04安装Jetty

Ubuntu中shell下root用户切换其他用户运行程序

工作中,一些程序,需要随机启动,但是不是以root用户运行,于是需要在rc.local中通过shell,从root用户切换到其他用户运行程序,命令如下:

$su -c 'command' - user

$sudo -u jetty ./nexus start

实例


/etc/rc.localexit 0之前加入如下内容:

#vim /etc/rc.local
su - jetty -c "/data/nexus/nexus-2.12.0-01/bin/nexus start"

参考链接


shell下root用户切换其他用户运行程序

sort+awk+uniq 统计文件中出现次数最多的前10个单词

使用linux命令或者shell实现:文件words存放英文单词,格式为每行一个英文单词(单词可以重复),统计这个文件中出现次数最多的前10个单词。

$cat words.txt | sort | uniq -c | sort -k1,1nr | head -10

主要考察对sort,uniq命令的使用,相关解释如下,命令及参数的详细说明请自行通过man查看,简单介绍下以上指令各部分的功能:
sort:  对单词进行排序
uniq -c: 显示唯一的行,并在每行行首加上本行在文件中出现的次数
sort -k1,1nr: 按照第一个字段,数值排序,且为逆序
head -10: 取前10行数据

参考链接


sort +awk+uniq 统计文件中出现次数最多的前10个单词