搬家到GCP Centos 7 (SELinux)日志:

系统环境:Centos 7
selinux:开启
Apache:2.4
PHP :5.4
Mysql:GCP 云SQL

GCP目标系统基础运行LAMP环境搭建:

yun -y install httpd php php-gd php-mbstring php-mysql wget unzip zip nano
可选组件安装:
yun -y install php-opcache php-devel php-mcrypt php-pdo php-fpm php-xml php-common

接着开始网站搬家

1、备份数据库。

借助帝国备份王备份数据库:http://ebak.phome.net/

2、打包网站。

使用zip命令打包网站以及备份数据库文件
zip -q -r www.zip /var/www/
格式:zip 参数 压缩包名字 压缩文件夹目录
然后mv移动压缩包文件到你网站根目录。

3、转移打包文件。

mkdir创建一个临时目录,并进入
使用wget http://clin003.com/www.zip (记得域名替换为自己的)

4、解压。

unzip www.zip

5、导入数据库。

使用帝国备份王,恢复备份的数据库

6、测试网站。

如果只有一个网站,并且使用了默认网站目录,那么到此基本没有什么问题,一切顺利。

……

遇到Selinux之文件属性问题

然而如果你爱折腾,使用了非默认网站目录,那么可能会发现,从上一步开始,怎么搞也是
(13)Permission denied AH00035

[core:error] [pid 1519] (13)Permission denied: [client 1.11.21.21:19224] AH00035: access to /index.html denied (filesystem path '/clin003.com/index.html') because search permissions are missing on a component of the path

这个看上去很容易解决,不就是没权限么!
排查顺序如下:
cd /clin003.com/
ls -l index.html
chmod 644 index.html

然后
ls -la
chmod +x .

重启httpd服务。
问题依旧Permission denied

经过Google,翻阅文档:(13) Permission Denied
最终找到解决办法
那就是selinux开启的情况下。
ls -alZ
查看文档权限属性
通过对比默认目录和自定义目录,发现问题
[gcp@clin003.com]$ ls -alZ
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 .
drwxr-xr-x. root root system_u:object_r:var_t:s0 ..
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html
[gcp@clin003.com]$ ls -alZ
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 .
dr-xr-xr-x. root root system_u:object_r:root_t:s0 ..
-rw-r–r–. root root unconfined_u:object_r:default_t:s0 index.html
通过对比可以发现同样的owner属性,实际的安全属性却不同
那么解决的办法就是给自定义目录及目录下文件添加“httpd_sys_content_t”属性,命令如下:
chcon -R -t httpd_sys_content_t /clin003.com

遇到Selinux之php语法错误问题解决方法

Parse error: syntax error, unexpected end of file in *.php on line *

这个比较容易解决,定位到目标行后发现是php结尾处错误!检查php.ini配置文件

找到short_open_tag

把short_open_tag = off 改为 short_open_tag = on

开启段标签模式就可一解决。

 

遇到Selinux之PHP连接MySQL出现 Can’t connect to MySQL server 的解决方法

问题情景,命令行mysql客户端可以连接成功,网站php连接不成功。

无论是指定IP、端口的tcp/ip方式连接,或者是用unix socket方式连接,报错信息都类似:

Could not connect: Can't connect to MySQL server on 'MYSQL.SERVER' (13)

php.ini配置文件,php mysql组件,防火墙均检查没问题。

最终把目标盯在SElinux

getsebool -a|grep -i httpd

可以看到这里设置了httpd进程的许可模式,再仔细看一下,有一个选项:

getsebool -a|grep -i httpd_can_network_connect
httpd_can_network_connect --> off

原来是SELinux限制了httpd对外访问的权限。将其开启即可:

setsebool -P httpd_can_network_connect=1

如果对SELinux不熟悉,也可以直接修改系统配置文件 /etc/sysconfig/selinux,全局关闭SELINUX!

#SELINUX=enforcing
#把设置改为disabled
SELINUX=disabled

然后重启操作系统,即可生效。
或者,直接执行命令,可在线生效:
[gcp@clin003.com]# setenforce 0
setenforce: SELinux is disabled

至此,坑已填完,网站已搬家完成!

参考文档:

(13) Permission Denied

https://wiki.apache.org/httpd/13PermissionDenied

SELinux导致PHP连接MySQL异常

https://yq.aliyun.com/ziliao/145002

 

Error establishing a database connection

最近服务器经常“Error establishing a database connection”

下面是逐步排查

连接mysql
#mysql -u root -p

出现 ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2)

查看mysql进程状态
#ps -A|grep mysql

没有看到mysql进程,启动mysql
#/etc/init.d/mysql restart

启动后mysql提示:Checking for corrupt, not cleanly closed and upgrade needing tables..

检查和优化mysql表
mysqlcheck -a -c -o -r -m –all-databases -uroot -p

暂时没发现是啥问题,干脆先弄个监控mysql进程的脚本,发现mysql异常就自动重启mysql进程好了

脚本下载地址:mysql_status

建议每十分钟运行一次
*/10 * * * * root /bin/sh /root/mysql_status.sh

具体原理:
1)先检测MYSQL的3306端口是否正常;
2)使用帐号连接数据库并执行show databases命令;
3)如以上两点都能正常工作则表示数据库运行正常。

另外,监控MYAQL端口可以使用三种方式:
1)/usr/bin/nmap localhost | grep 3306
2)lsof -i:3306
3)netstat -na|grep “LISTEN”|grep “3306”|awk -F[:” “]+ ‘{print $5}’

这里采用的是第三种。注意,不同的操作系统'{print $5}’处可能不一样,请各人自己测试。如果采用的第一种方式,需要安装nmap。

参考链接:
http://blog.csdn.net/faye0412/article/details/7884245#
WordPress出现“Error establishing a database connection”解决办法

CentOS5 安装 Apache MySQL PHP Zend Optimizer

系统环境:Centos 5.8

更新系统内核
yum -y update

1、安装Apahce、PHP、MySQL、PHP连接MySQL库组件;
yum -y install httpd php mysql mysql-server php-mysql
安装MySQL扩展;
yum -y install mysql-connector-odbc mysql-devel libdbi-dbd-mysql
mysqladmin -u root password ‘设置密码’; (引号内填密码)

查看mysql版本号
mysql -V

2、PHP的安装
yum -y install php-gd php-xml php-mbstring php-ldap php-pear php-xmlrpc php-mcrypt

3、安装Apache扩展
yum -y install httpd-manual mod_ssl mod_perl mod_auth_mysql

4、安装Zend Optimizer
cd /usr/local/src
wget http://downloads.zend.com/optimizer/3.3.9/ZendOptimizer-3.3.9-linux-glibc23-x86_64.tar.gz
tar xzvf ZendOptimizer-3.3.9-linux-glibc23-x86_64.tar.gz

有暗转说明。。。

五、启动服务配置
/sbin/chkconfig httpd on (设置Apache为自启动)
/sbin/chkconfig –add mysqld (MySQL服务)
/sbin/chkconfig mysqld on (mysqld服务)
service httpd start (自启动httpd服务)
service mysqld start (自启动mysqld服务)

Debian6(Squeeze)使用 apt-get 安装Nginx+MySQL+PHP服务器环境(备忘)

#cat /proc/version
Linux version 2.6.32-5-amd64 (Debian 2.6.32-39) (houyi-dev@aliyun-inc.com) (gcc version 4.3.5 (Debian 4.3.5-4) ) #1 SMP Sun Jan 1 04:57:38 CST 2012

#uname -a
Linux AY***cb 2.6.32-5-amd64 #1 SMP Sun Jan 1 04:57:38 CST 2012 x86_64 GNU/Linux

# apt-get update

# apt-get dist-upgrade

Debian官方的源一般都以稳定为主,所以里面的软件版本也相对比较低,Dotdeb的源更新速度比较快,而且里面的软件包都是最新稳定版的,所以我使用Debian一般都喜欢加入Dotdeb的源,安装最新的稳定版软件。

根据你使用的Debian的发行版本(Debian 5.0 “Lenny”/oldstable 或 Debian 6.0 “Squeeze”/stable),在/etc/apt/sources.list文件中加入两行(选择最近的镜像站):
Squeeze :
deb http://packages.dotdeb.org stable all
deb-src http://packages.dotdeb.org stable all
Lenny :
deb http://packages.dotdeb.org oldstable all
deb-src http://packages.dotdeb.org oldstable all

增加源,支持php5-fpm
然后获取GnuPG 密钥
wget http://www.dotdeb.org/dotdeb.gpg
cat dotdeb.gpg | apt-key add –

rm dotdeb.gpg

# apt-get update

# apt-get dist-upgrade

2:安装 MySQL 5

apt-get install mysql-server mysql-client

在弹出的页面输入2次密码

修改mysql配置文件,去掉innodb,这样可以节省不少内存
vi /etc/mysql/my.cnf

增加下面语句
skip-innodb

保存后,mysql重启一下就生效

3:安装Nginx+php+php5-fpm+memcache

apt-get install php5-cgi php5-mysql php5-gd php5-imagick php5-mcrypt php5-memcache memcached php5-fpm php5-cli nginx

apt-get install php5-cgi php5-mysql php5-curl php5-gd php5-imagick php5-mcrypt php5-mhash libmcrypt* libmcrypt-dev php5-memcache memcached php5-fpm php5-cli php5-xmlrpc nginx

apt-get install php5-cgi php5-mysql php5-curl php5-imagick php5-mcrypt php5-mhash libmcrypt* libmcrypt-dev php5-fpm php5-cli php5-xmlrpc nginx

安装成功后

mkdir /var/www
chown www-data:www-data /var/www

修改memcache的端口和内存大小
vi /etc/memcached.conf

vi /etc/php5/cgi/php.ini
修改下面这句
cgi.fix_pathinfo=1

我的是512M的vps,所以修改php-fpm的配置文件
vi /etc/php5/fpm/pool.d/www.conf

pm.max_children = 25
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 10
pm.max_requests = 500

大家也可以根据自己服务器的条件和实际负载需要进行调整

修改nginx的配置文件

vi /etc/nginx/sites-available/default

添加:
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name;
include fastcgi_params;
}

保存后,重启nginx
/etc/init.d/nginx restart

写一个测试php页面

如果能正常显示那页面,那就大功告成

如果你想手工编译nginx+php+fpm,请参考我的另外一篇指导文章
VPS 安装Nginx+MySQL+PHP 5.2.17(FastCGI)服务器环境(Debian6)备忘

常用组合,查看出正在连接和网络信息
netstat -ntulpa

VPS 安装Nginx+MySQL+PHP 5.2.17(FastCGI)服务器环境(Debian6)备忘

CentOS 5.3,和RedHat请参考张宴“Nginx0.8.x + PHP 5.2.13(FastCGI)搭建胜过Apache十倍的Web服务器(第6版):http://blog.s135.com/nginx_php_v6/

附件:debian6服务器环境 Nginx MySQL php5.2.17(FastCGI)服务器环境配置备忘

debian6服务器环境:
cat /proc/version
Linux version 2.6.18-194.26.1.el5.028stab079.2 (root@rhel5-build-x64) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)) #1 SMP Fri Dec 17 19:25:15 MSK 2010
root@vps:~# cat /etc/issue
Debian GNU/Linux 6.0 \n \l

root@vps:~# uname -a
Linux vps 2.6.18-194.26.1.el5.028stab079.2 #1 SMP Fri Dec 17 19:25:15 MSK 2010 i686 GNU/Linux

 

photonvps买了个VPS,装上了debian6,然后装shopex的,折腾那个zend,结果debian默认是php3的,本来内存不大,干脆就直接卸掉Apache,换用Nginx了,还是编译安装php5.2装shopex吧。(话说shopex对这个“高”版本的mysql 5.5.3也是不能很好支持的,最后是直接用原来空间里的备份文件恢复进去的,直接新装是悲剧的,安装系统数据失败什么的,总之shopex真挺拽的!!)
用netstat -ntlp查检一下系统中启动的哪些服务

删除sendmail named(bind9)
/etc/init.d/sendmail stop
/etc/init.d/apache2 stop
/etc/init.d/bind9 stop
/etc/init.d/samba stop
dpkg -l |grep sendmail
apt-get remove sendmail sendmail-base sendmail-bin sendmail-cf sendmail-doc
dpkg -l |grep sendmail
dpkg –force-all -P sendmail-base sendmail-bin sendmail-cf sendmail-doc

dpkg -l |grep apache
apt-get remove apache2 apache2-doc apache2-mpm-prefork apache2-utils apache2.2-bin apache2.2-common
dpkg -l |grep apache
dpkg –force-all -P apache2-doc apache2.2-common

dpkg -l |grep bind9
apt-get remove bind9 bind9-host bind9utils libbind9-60
dpkg -l |grep bind9
dpkg –force-all -P bind9 libbind9-60

dpkg -l |grep samba
apt-get remove samba samba-common
dpkg -l |grep samba
dpkg –force-all -P samba samba-common
安装源码编译的环境
apt-get install build-essential

 

 

获取相关开源程序
mkdir /root/soft
cd /root/soft
vim down.sh
内容如下:
wget http://sysoev.ru/nginx/nginx-0.8.34.tar.gz
wget http://blog.s135.com/soft/linux/nginx_php/php/php-5.2.14.tar.gz
wget http://php-fpm.org/downloads/php-5.2.14-fpm-0.5.14.diff.gz
wget http://blog.s135.com/soft/linux/nginx_php/mysql/mysql-5.5.3-m3.tar.gz
wget http://blog.s135.com/soft/linux/nginx_php/libiconv/libiconv-1.13.1.tar.gz
wget http://blog.s135.com/soft/linux/nginx_php/mcrypt/libmcrypt-2.5.8.tar.gz
wget http://blog.s135.com/soft/linux/nginx_php/mcrypt/mcrypt-2.6.8.tar.gz
wget http://blog.s135.com/soft/linux/nginx_php/memcache/memcache-2.2.5.tgz
wget “http://downloads.sourceforge.net/mhash/mhash-0.9.9.9.tar.gz?modtime=1175740843&big_mirror=0”
wget http://blog.s135.com/soft/linux/nginx_php/pcre/pcre-8.10.tar.gz
wget http://blog.s135.com/soft/linux/nginx_php/eaccelerator/eaccelerator-0.9.6.1.tar.bz2
wget http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz
wget http://blog.s135.com/soft/linux/nginx_php/imagick/ImageMagick.tar.gz
wget http://pecl.php.net/get/imagick-2.3.0.tgz
设置可执行权限
chmod +x down.sh
开始下载
./down.sh
安装PHP 5.2.13(FastCGI模式)
编译安装PHP 5.2.13所需的支持库
tar zxvf libiconv-1.13.1.tar.gz
cd libiconv-1.13.1/
./configure –prefix=/usr/local
make && make install
cd ../
tar zxvf libmcrypt-2.5.8.tar.gz
cd libmcrypt-2.5.8/
/sbin/ldconfig
cd libltdl/
./configure –-enable-ltdl-install
make && make install
cd ..
./configure
make && make install
cd ../

tar zxvf mhash-0.9.9.9.tar.gz
tar zxvf mhash-0.9.9.9.tar.gz
cd mhash-0.9.9.9/
./configure
make && make install
cd ../
ln -s /usr/local/lib/libmcrypt.la /usr/lib/libmcrypt.la
ln -s /usr/local/lib/libmcrypt.so /usr/lib/libmcrypt.so
ln -s /usr/local/lib/libmcrypt.so.4 /usr/lib/libmcrypt.so.4
ln -s /usr/local/lib/libmcrypt.so.4.4.8 /usr/lib/libmcrypt.so.4.4.8
ln -s /usr/local/lib/libmhash.a /usr/lib/libmhash.a
ln -s /usr/local/lib/libmhash.la /usr/lib/libmhash.la
ln -s /usr/local/lib/libmhash.so /usr/lib/libmhash.so
ln -s /usr/local/lib/libmhash.so.2 /usr/lib/libmhash.so.2
ln -s /usr/local/lib/libmhash.so.2.0.1 /usr/lib/libmhash.so.2.0.1
tar zxvf mcrypt-2.6.8.tar.gz
cd mcrypt-2.6.8/
/sbin/ldconfig
./configure
make && make install
cd ../
编译安装MySQL-5.5.3-m3
mysql安装前需要安装 libncurses5-dev
apt-get install libncurses5-dev

可以开始编译mysql

groupadd mysql
useradd -g mysql mysql
tar zxvf mysql-5.5.3-m3.tar.gz
cd mysql-5.5.3-m3/
./configure –-prefix=/usr/local/webserver/mysql/ –-enable-assembler –-with-extra-charsets=complex –-enable-thread-safe-client –-with-big-tables -–with-readline –-with-ssl –-with-embedded-server –-enable-local-infile -–with-plugins=partition,innobase,myisammrg
make && make install
chmod +w /usr/local/webserver/mysql
chown -R mysql:mysql /usr/local/webserver/mysql
cd ../
①、创建MySQL数据库存放目录
mkdir -p /data0/mysql/3306/data/
mkdir -p /data0/mysql/3306/binlog/
mkdir -p /data0/mysql/3306/relaylog/
chown -R mysql:mysql /data0/mysql/
②、以mysql用户帐号的身份建立数据表
/usr/local/webserver/mysql/bin/mysql_install_db –-basedir=/usr/local/webserver/mysql –-datadir=/data0/mysql/3306/data –-user=mysql

③、创建my.cnf配置文件
vi /data0/mysql/3306/my.cnf
内容参考附件
④、创建管理MySQL数据库的shell脚本
vi /data0/mysql/3306/mysql
输入内容参考附件(这里的用户名admin和密码12345678接下来的步骤会创建)

⑤、赋予shell脚本可执行权限
chmod +x /data0/mysql/3306/mysql ⑥、启动MySQL
/data0/mysql/3306/mysql start ⑦、设置MySql root用户的密码(记住,后面用到)
/usr/local/webserver/mysql/bin/mysqladmin -u root password ’123456789′ ⑧、通过命令行登录管理MySQL服务器(提示输入密码时,输入刚才设置的密码)
/usr/local/webserver/mysql/bin/mysql -u root -p -S /tmp/mysql.sock
这时候到mysql命令行中
⑨、输入以下SQL语句,创建一个具有root权限的用户(admin)和密码(12345678)
GRANT ALL PRIVILEGES ON *.* TO ‘admin’@’localhost’ IDENTIFIED BY ’12345678′;
GRANT ALL PRIVILEGES ON *.* TO ‘admin’@’127.0.0.1′ IDENTIFIED BY ’12345678′;
exit
⑩、(可选)停止MySQL
/data0/mysql/3306/mysql stop

 

编译安装PHP(FastCGI模式)扩展
我们先来看一下下面这两个命令的作用
apt-cache search “freetype”
这个命令是在源中查找和freetype有关的所有软件,然后再根据软件包的描述,找你自己需要的软件,然后就可以用下面的命令进行安装
apt-get install libfreetype6-dev
当然是要根据错误提示来查找相关的软件。
我们在编译过程中,缺什么,就补什么,这个也算是一种解决问题的思路。希望能给大家带来点帮助!
下面也是同样的道理,我就简写了。
tar zxvf php-5.2.14.tar.gz
gzip -cd php-5.2.14-fpm-0.5.14.diff.gz | patch -d php-5.2.14 -p1
cd php-5.2.13/
./configure –prefix=/usr/local/webserver/php –with-config-file-path=/usr/local/webserver/php/etc –with-mysql=/usr/local/webserver/mysql –with-mysqli=/usr/local/webserver/mysql/bin/mysql_config –with-iconv-dir=/usr/local –with-freetype-dir –with-jpeg-dir –with-png-dir –with-zlib –with-libxml-dir=/usr –enable-xml –disable-rpath –enable-discard-path –enable-safe-mode –enable-bcmath –enable-shmop –enable-sysvsem –enable-inline-optimization –with-curl –with-curlwrappers –enable-mbregex –enable-fastcgi –enable-fpm –enable-force-cgi-redirect –enable-mbstring –with-mcrypt –with-gd –enable-gd-native-ttf –with-openssl –with-mhash –enable-pcntl –enable-sockets –with-ldap –with-ldap-sasl –with-xmlrpc –enable-zip –enable-soap
make ZEND_EXTRA_LIBS=’-liconv’
make install
cp php.ini-dist /usr/local/webserver/php/etc/php.ini
cd ../
如果出现下面的错误提示
checking for xml2-config… no
checking for xml-config… no
configure: error: XML configuration could not be found
安装
apt-get install libxml2-dev
出现
configure: error: Cannot find OpenSSL’s <evp.h>
安装
apt-get install libssl-dev
出现
configure: error: Please reinstall the libcurl distribution –
easy.h should be in <curl-dir>/include/curl/
安装
apt-get install libcurl4-openssl-dev
出现
configure: error: libjpeg.(a|so) not found.
安装
apt-get install libjpeg62-dev
出现
configure: error: libpng.(a|so) not found.
安装
apt-get install libpng12-dev
出现
configure: error: freetype.h not found.
安装
apt-get install libfreetype6-dev
出现
configure: error: sasl.h not found!
安装
apt-get install libsasl2-dev

编译安装PHP5扩展模块
在这一步中,我们需要安装autoconf这个软件包
apt-get install autoconf
tar zxvf memcache-2.2.5.tgz
cd memcache-2.2.5/
/usr/local/webserver/php/bin/phpize
./configure –with-php-config=/usr/local/webserver/php/bin/php-config
make && make install
cd ../
tar jxvf eaccelerator-0.9.6.1.tar.bz2
cd eaccelerator-0.9.6.1/
/usr/local/webserver/php/bin/phpize
./configure –enable-eaccelerator=shared –with-php-config=/usr/local/webserver/php/bin/php-config
make && make install
cd ../
tar zxvf PDO_MYSQL-1.0.2.tgz
cd PDO_MYSQL-1.0.2/
/usr/local/webserver/php/bin/phpize
./configure –with-php-config=/usr/local/webserver/php/bin/php-config –with-pdo-mysql=/usr/local/webserver/mysql
make && make install
cd ../
安装 ImageMagick的时候make会出现
/usr/bin/ld: cannot find -lperl
这时候就要安装
apt-get install libperl-dev
tar zxvf ImageMagick.tar.gz
cd ImageMagick-6.5.1-2/
./configure
make && make install
cd ../
tar zxvf imagick-2.3.0.tgz
cd imagick-2.3.0/
/usr/local/webserver/php/bin/phpize
./configure –with-php-config=/usr/local/webserver/php/bin/php-config
make && make install
cd ../
5、修改php.ini文件
手工修改:
查找/usr/local/webserver/php/etc/php.ini中的
extension_dir = “./”
修改为
extension_dir = “/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/”
并在此行后增加以下几行,然后保存:
extension = “memcache.so”
extension = “pdo_mysql.so”
extension = “imagick.so”
再查找
output_buffering = Off
修改为
output_buffering = On
自动修改:
sed -i ‘s#extension_dir = “./”#extension_dir = “/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/”\nextension = “memcache.so”\nextension = “pdo_mysql.so”\nextension = “imagick.so”\n#’ /usr/local/webserver/php/etc/php.ini
sed -i ‘s#output_buffering = Off#output_buffering = On#’ /usr/local/webserver/php/etc/php.ini
sed -i “s#; always_populate_raw_post_data = On#always_populate_raw_post_data = On#g” /usr/local/webserver/php/etc/php.ini
6、配置eAccelerator加速PHP
mkdir -p /usr/local/webserver/eaccelerator_cache
vi /usr/local/webserver/php/etc/php.ini
到配置文件的最末尾,加上以下配置信息
[eaccelerator]
zend_extension=”/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so”
eaccelerator.shm_size=”64″
eaccelerator.cache_dir=”/usr/local/webserver/eaccelerator_cache”
eaccelerator.enable=”1″
eaccelerator.optimizer=”1″
eaccelerator.check_mtime=”1″
eaccelerator.debug=”0″
eaccelerator.filter=””
eaccelerator.shm_max=”0″
eaccelerator.shm_ttl=”3600″
eaccelerator.shm_prune_period=”3600″
eaccelerator.shm_only=”0″
eaccelerator.compress=”1″
eaccelerator.compress_level=”9″
7、创建www用户和组,以及供debian.freeopens.com虚拟主机使用的目录
/usr/sbin/groupadd www
/usr/sbin/useradd -g www www
mkdir -p /data0/htdocs/www
chmod +w /data0/htdocs/www
chown -R www:www /data0/htdocs/www
8、创建php-fpm配置文件(php-fpm是为PHP打的一个FastCGI管理补丁,可以平滑变更php.ini配置而无需重启php-cgi)
在/usr/local/webserver/php/etc/目录中创建php-fpm.conf文件
rm -f /usr/local/webserver/php/etc/php-fpm.conf
vi /usr/local/webserver/php/etc/php-fpm.conf
内容参考附件

 

9、启动php-cgi进程,监听127.0.0.1的9000端口,进程数为128(如果服务器内存小于3GB,可以只开启64个进程),用户为www:
ulimit -SHn 65535
/usr/local/webserver/php/sbin/php-fpm start
注:/usr/local/webserver/php/sbin/php-fpm还有其他参数,包括:start|stop|quit|restart|reload|logrotate,修改php.ini后不重启php-cgi,重新加载配置文件使用reload。
如果出现下面的错误(这个错误是我在安装过程中发现的,是内在不足导致的,在文章的结尾优化后,就不会有这样的问题了,在这里做个记录,方便大家学习)
Starting php_fpm eAccelerator: Could not allocate 67108864 bytes, the maximum size the kernel allows is 33554432 bytes. Lower the amount of memory request or increase the limit in /proc/sys/kernel/shmmax.
PHP Warning: [eAccelerator] Can not create shared memory area in Unknown on line 0
PHP Fatal error: Unable to start eAccelerator module in Unknown on line 0
failed

 

安装Nginx 0.8.34
1、安装Nginx所需的pcre库
tar zxvf pcre-8.10.tar.gz
cd pcre-8.10/
./configure
make && make install
cd ../
2、安装Nginx
tar zxvf nginx-0.8.34.tar.gz
cd nginx-0.8.34/
./configure –user=www –group=www –prefix=/usr/local/webserver/nginx –with-http_stub_status_module –with-http_ssl_module
make && make install
cd ../
3、创建Nginx日志目录
mkdir -p /data1/logs
chmod +w /data1/logs
chown -R www:www /data1/logs
4、创建Nginx配置文件
①、在/usr/local/webserver/nginx/conf/目录中创建nginx.conf文件:
rm -f /usr/local/webserver/nginx/conf/nginx.conf
vi /usr/local/webserver/nginx/conf/nginx.conf
输入内容参考附件

②、在/usr/local/webserver/nginx/conf/目录中创建fcgi.conf文件
vi /usr/local/webserver/nginx/conf/fcgi.conf
5、启动Nginx
ulimit -SHn 65535
/usr/local/webserver/nginx/sbin/nginx
如果出现下面的错误
usr/local/webserver/nginx/sbin/nginx: error while loading shared libraries: libpcre.so.0: cannot open shared object file: No such file or directory
安装
apt-get install libpcre3-dev

 

配置开机自动启动Nginx + PHP + Mysql
vi /etc/rc.local
把下面的内容增加到exit 0的上面
/data0/mysql/3306/mysql start
ulimit -SHn 65535
/usr/local/webserver/php/sbin/php-fpm start
/usr/local/webserver/nginx/sbin/nginx
相关软件的重新启动
如果说你改了nginx的配置文件,就要用下面的命令,使配置生效
/usr/local/webserver/nginx/sbin/nginx -t
对于Nginx 0.8.x版本,现在平滑重启Nginx配置非常简单,执行以下命令即可
/usr/local/webserver/nginx/sbin/nginx -s reload
2)对于Nginx 0.8.x之前的版本,平滑重启稍微麻烦一些,按照以下步骤进行即可。输入以下命令查看Nginx主进程号
ps -ef | grep “nginx: master process” | grep -v “grep” | awk -F ‘ ‘ ‘{print $2}’
屏幕显示的即为Nginx主进程号,例如:6302
这时,执行以下命令即可使修改过的Nginx配置文件生效:kill -HUP 6302

每天定时切割Nginx日志
1、创建脚本/usr/local/webserver/nginx/sbin/cut_nginx_log.sh
vi /usr/local/webserver/nginx/sbin/cut_nginx_log.sh
输入以下内容
#!/bin/bash
# This script run at 00:00

# The Nginx logs path
logs_path=”/usr/local/webserver/nginx/logs/”

mkdir -p ${logs_path}$(date -d “yesterday” +”%Y”)/$(date -d “yesterday” +”%m”)/
mv ${logs_path}access.log ${logs_path}$(date -d “yesterday” +”%Y”)/$(date -d “yesterday” +”%m”)/access_$(date -d “yesterday” +”%Y%m%d”).log
kill -USR1 `cat /usr/local/webserver/nginx/nginx.pid`
2、设置crontab,每天凌晨00:00切割nginx访问日志 crontab -e
增加以下内容
00 00 * * * /bin/bash /usr/local/webserver/nginx/sbin/cut_nginx_log.sh

 

附件地址:http://clin003.com/wp-content/uploads/2012/10/new-www.txt

Debian小内存VPS服务器Apache2配置与MySQL配置优化

前几天买了个VPS,打算从G他爹搬走呢,可惜了那XEN架构的VPS可能因为内存太小太不给力,刚把这个博客域名解析上去就打不开了,连首页都打不开了,SSH也是进不去滴,好不容易进去了,半天没反应,,,

只有128M的内存,看看能不能优化下。于是就有了下面的折腾。。

系统环境: Apache2 (Debian 6)

1、先从Apache2翻腾起吧

Apache2超时连接设置Timeout和KeepAliveTimeout

# Timeout: The number of seconds before receives and sends time out.
#我正在往服务器上传图片,如果网速慢,那么这个值就直接决定着我能不能顺利上传。
Timeout 300

#
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to “Off” to deactivate.
#将KeepAlive设置为On,来自同一客户端的请求就不需要再一次连接,避免每次请求都要新建一个连接而加重服务器的负担
KeepAlive On

#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#当启用 KeepAlive 时,每个连接允许的请求数量(网页中的每个图片都会算一个请求)。
MaxKeepAliveRequests 50

#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#同一个客户端的同一次连接两次请求之间的超时时间。
KeepAliveTimeout 10

Apache的prefork模式和worker模式

prefork模式
这个多路处理模块(MPM)实现了一个非线程型的、预派生的web服务器,它的工作方式类似于Apache 1.3。它适合于没有线程安全库,需要避免线程兼容性问题的系统。它是要求将每个请求相互独立的情况下最好的MPM,这样若一个请求出现问题就不会影响到其他请求。

这个MPM具有很强的自我调节能力,只需要很少的配置指令调整。最重要的是将MaxClients设置为一个足够大的数值以处理潜在的请求高峰,同时又不能太大,以致需要使用的内存超出物理内存的大小。

worker模式
此多路处理模块(MPM)使网络服务器支持混合的多线程多进程。由于使用线程来处理请求,所以可以处理海量请求,而系统资源的开销小于基于进程的MPM。但是,它也使用了多进程,每个进程又有多个线程,以获得基于进程的MPM的稳定性。

控制这个MPM的最重要的指令是,控制每个子进程允许建立的线程数的ThreadsPerChild指令,和控制允许建立的总线程数的MaxClients指令。

prefork模式
prefork模式使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接。在大多数平台上,Prefork MPM在效率上要比Worker MPM要高,但是内存使用大得多。prefork的无线程设计在某些情况下将比worker更有优势:它可以使用那些没有处理好线程安全的第三方模块,并且对于那些线程调试困难的平台而言,它也更容易调试一些。
< IfModule mpm_prefork_module >
StartServers 1
MinSpareServers 2
MaxSpareServers 2
MaxClients 5
MaxRequestsPerChild 50
< / IfModule >

MinSpareServers 最小闲置进程数
MaxSpareServers 最大闲置进程数
MaxClients 最多进程数,数目多少取决于你的vps配置。

ServerLimit
默认的MaxClient最大是256个线程,如果想设置更大的值,就的加上ServerLimit这个参数。20000是ServerLimit这个参数的最大值。如果需要更大,则必须编译apache,此前都是不需要重新编译Apache。
生效前提:必须放在其他指令的前面

StartServers
指定服务器启动时建立的子进程数量,prefork默认为5。

MinSpareServers
指定空闲子进程的最小数量,默认为5。如果当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。此参数不要设的太大。

MaxSpareServers
设置空闲子进程的最大数量,默认为10。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。此参数不要设的太大。如果你将该指令的值设置为比MinSpareServers小,Apache将会自动将其修改成”MinSpareServers+1″。

MaxClients
限定同一时间客户端最大接入请求的数量(单个进程并发线程数),默认为256。任何超过MaxClients限制的请求都将进入等候队列,一旦一个链接被释放,队列中的请求将得到服务。要增大这个值,你必须同时增大ServerLimit。

MaxRequestsPerChild
每个子进程在其生存期内允许伺服的最大请求数量,默认为10000.到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild为”0″,子进程将永远不会结束。将MaxRequestsPerChild设置成非零值有两个好处:
1.可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。
2.给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。

worker模式
worker模式使用多个子进程,每个子进程有多个线程。每个线程在某个确定的时间只能维持一个连接。通常来说,在一个高流量的HTTP服务器上,Worker MPM是个比较好的选择,因为Worker MPM的内存使用比Prefork MPM要低得多。但worker MPM也由不完善的地方,如果一个线程崩溃,整个进程就会连同其所有线程一起”死掉”.由于线程共享内存空间,所以一个程序在运行时必须被系统识别为”每个线程都是安全的”。
< IfModule mpm_worker_module >
StartServers 1
MinSpareThreads 2
MaxSpareThreads 2
ThreadLimit 4
ThreadsPerChild 50
MaxClients 100
MaxRequestsPerChild 50
< /IfModule >

MinSpareThreads 最小闲置线程数
MaxSpareThreads 最大闲置线程数
ThreadsPerChild 每个子进程的可创建的线程数
MaxClients 同一时间最多进程数,数目多少取决于你的vps配置。
MaxRequestsPerChild 一个进程接受过这么多次请求后被杀死。以释放内存。

StartServers
服务器启动时建立的子进程数,默认值是”3″。

MaxClients
允许同时伺服的最大接入请求数量(最大线程数量)。任何超过MaxClients限制的请求都将进入等候队列。默认值是”400″,16(ServerLimit)乘以25(ThreadsPerChild)的结果。因此要增加MaxClients的时候,你必须同时增加ServerLimit的值。

MinSpareThreads
最小空闲线程数,默认值是”75″。这个MPM将基于整个服务器监视空闲线程数。如果服务器中总的空闲线程数太少,子进程将产生新的空闲线程。

MaxSpareThreads
设置最大空闲线程数。默认值是”250″。这个MPM将基于整个服务器监视空闲线程数。如果服务器中总的空闲线程数太多,子进程将杀死多余的空闲线程。MaxSpareThreads的取值范围是有限制的。Apache将按照如下限制自动修正你设置的值:worker要求其大于等于MinSpareThreads加上ThreadsPerChild的和。

ThreadsPerChild
每个子进程建立的常驻的执行线程数。默认值是25。子进程在启动时建立这些线程后就不再建立新的线程了。

MaxRequestsPerChild
设置每个子进程在其生存期内允许伺服的最大请求数量。到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild为”0″,子进程将永远不会结束。将MaxRequestsPerChild设置成非零值有两个好处:
1.可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。
2.给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
注意对于KeepAlive链接,只有第一个请求会被计数。事实上,它改变了每个子进程限制最大链接数量的行为。

2、MySQL配置优化
mysql的主配置文件为/etc/mysql/my.cnf,优化之后,资源占用有明显的下降

skip-innodb #不使用InnoDB数据库引擎,虽然InnoDB很强大,但对于小内存VPS就没啥必要使用了,关闭InnoDB引擎后,内存占用有明显的下降

skip-external-locking #不使用外部锁,也就是操作系统提供的锁,这个选项现在默认是打开的

key_buffer #与key_buffer_size是同一个参数,不过后者已经不推荐使用了,此参数指定索引缓冲区的大小,对于小内存VPS,16M的默认值有些大了,1M就差不多了

query_cache_limit #不缓存大于此值的结果,设置为256K

query_cache_size #用于缓存查询结果的内存大小,必须是1024的倍数,设置为query_cache_limit的16倍,即4M

sort_buffer_size #排序缓存
read_buffer_size #读缓存
read_rnd_buffer_size #缓存通过关键字排序的行
#这三个参数可以采用默认值,也可以参考/usr/share/doc/mysql-server-5.1/examples/my-small.cnf来设置

3、让服务器运行在level 3上

id:3:initdefault: #表示启动后进入命令行模式

做法:
nano /etc/inittab

id:3:initdefault:
让服务器运行X是没有必要的

关闭不需要的tty
请编辑你的/etc/inittab
找到如下一段:
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

这段命令使init为你打开了6个控制台,分别可以用alt+f1到alt+f6进行访问
此6个控制台默认都驻留在内存中,事实上没有必要使用这么多的
你用ps auxf这个命令可以看到,是六个进程
root 829 0.0 0.0 5932 92 tty1 Ss+ 12:52 0:00 /sbin/getty 384
root 830 0.0 0.0 5932 92 tty2 Ss+ 12:52 0:00 /sbin/getty 384
。。。

如何关闭这些进程?
通常我们保留前2个控制台就可以了,如果是 VPS 的话,自己不可能物理登录终端,可以全部禁止掉。
用#注释掉就可以了

然后无需重启机器,只需要执行 init q 这个命令即可
init q
q作为参数的含义:重新执行/etc/inittab中的命令

4、优化shell
修改命令history记录
# vi /etc/profile
找到 HISTSIZE=1000 改为 HISTSIZE=100
然后 source /etc/profile

5、加固 SSH 安全。

nano /etc/ssh/sshd_config
Port 222
Protocol 2
PermitRootLogin no
PermitEmptyPasswords no
X11Forwarding no
UsePAM no
UseDNS no
AllowUsers vpsee
Banner /etc/issue

6、使用 netstat -atnp 查看网络连接状态
通过-p选项看到是那个进程开的连接

7、检查和禁止全局可写的 SUID 文件。

find / -perm +4000 -user root -type f -print
find / -perm +2000 -group root -type f -print
chmod u-s /full/path/to/filename
chmod g-s /full/path/to/filename