Debian+Nginx+PHP(FastCGI)+MySQL搭建LNMP服务器(一版)
写在最前:看了张宴的“搭建胜过Apache十倍的Web服务器”系列文章全是基于redhat上的,所以,今天本人来教大家在Debian5.X上也来实现LNMP。本文基于张宴“Nginx0.8.x + PHP 5.2.13(FastCGI)搭建胜过Apache十倍的Web服务器(第6版)”。后面也会不断更新。因为这是Debian上的第一版,所以我就把自己的实现全过程记录下来,这里面包涵了一些排错和我们常遇到的问题,希望对大家后面的学习有用,因为大家的系统环境可能不一样,本次教程的实现过程是在一VPS(USA)上实现的。
本次教程所用的系统环境:
cat /proc/version
Linux version 2.6.18-128.2.1.el5.028stab064.4 (root@rhel5-64-build) (gcc version 4.1.2 20070626 (Red Hat 4.1.2-14)) #1 SMP Mon Jul 27 12:45:01 MSD 2009
cat /etc/issue
Debian GNU/Linux 5.0 \n \l
uname -a
Linux QQ46659160.com 2.6.18-128.2.1.el5.028stab064.4 #1 SMP Mon Jul 27 12:45:01 MSD 2009 i686 GNU/Linux
Mem: 524800k
在进行安装前,最先检查一个,你的系统中是不是安装了mysql apache和一些其它的我们不需要的软件,如果有的话,就删除掉吧!
用netstat -ntlp查检一下启动的哪些服务
我的系统中安装了sendmail,我不需要,所以我就把它删除
/etc/init.d/sendmail stop
/etc/init.d/apache2 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 mysql
apt-get remove libmysqlclient15off mysql-common
dpkg -l |grep mysql
dpkg –force-all -P libmysqlclient15off mysql-common
dpkg -l |grep apache
apt-get remove apache2 apache2-doc apache2-mpm-prefork apache2-utils apache2.2-common
dpkg -l |grep apache
dpkg –force-all -P apache2-doc apache2.2-common
这时候我的系统中就只有22端口是开放了,大家可以根据自己的需要来处理系统中的软件。
好了,闲话就不多说了,下面就开始进行安装。
一、安装源码编译的环境
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://www.php.net/get/php-5.2.13.tar.gz/from/this/mirror
wget http://php-fpm.org/downloads/php-5.2.13-fpm-0.5.13.diff.gz
wget http://mirrors.sohu.com/mysql/MySQL-5.5/mysql-5.5.2-m2.tar.gz
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.tar.gz
wget "http://downloads.sourceforge.net/mcrypt/libmcrypt-2.5.8.tar.gz?modtime=1171868460&big_mirror=0"
wget "http://downloads.sourceforge.net/mcrypt/mcrypt-2.6.8.tar.gz?modtime=1194463373&big_mirror=0"
wget http://pecl.php.net/get/memcache-2.2.5.tgz
wget "http://downloads.sourceforge.net/mhash/mhash-0.9.9.9.tar.gz?modtime=1175740843&big_mirror=0"
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.01.tar.gz
wget http://bart.eaccelerator.net/source/0.9.6/eaccelerator-0.9.6.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模式)
1、编译安装PHP 5.2.13所需的支持库
tar zxvf libiconv-1.13.tar.gz
cd libiconv-1.13/
./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
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 ../
2、编译安装MySQL 5.5.2-m2
mysql安装前需要安装 libncurses5-dev
apt-get install libncurses5-dev
否则就会出现下面的错误
checking for termcap functions library… configure: error: No curses/termcap library found
处理完上面的内容,下面就可以开始编译mysql了
/usr/sbin/groupadd mysql
/usr/sbin/useradd -g mysql mysql
tar zxvf mysql-5.5.2-m2.tar.gz
cd mysql-5.5.2-m2/
./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文件可能是有多个(一个是你系统已经帮你安装好的,一个是自己编译安装的,但MYSQL调用的是你系统里面的配置文件了),这时,你就要查看你的系统中是不是已经安装了mysql-comman了?
Installing MySQL system tables…
100318 19:10:22 [ERROR] /usr/local/webserver/mysql/libexec/mysqld: unknown option ‘–skip-bdb’
100318 19:10:22 [ERROR] Aborting
100318 19:10:22 [Note] /usr/local/webserver/mysql/libexec/mysqld: Shutdown complete
所以我们先来查询一下看看
dpkg -l |grep mysql
会看到类似下面的两个软件,
mysql-common libmysqlclient15off
我们用下面的命令强制删除(把配置文件也一同删除)
dpkg –force-all -P mysql-common
dpkg –force-all -P libmysqlclient15off
③、创建my.cnf配置文件
vi /data0/mysql/3306/my.cnf
内容如下
[client]
character-set-server = utf8
port = 3306
socket = /tmp/mysql.sock
[mysqld]
character-set-server = utf8
replicate-ignore-db = mysql
replicate-ignore-db = test
replicate-ignore-db = information_schema
user = mysql
port = 3306
socket = /tmp/mysql.sock
basedir = /usr/local/webserver/mysql
datadir = /data0/mysql/3306/data
log-error = /data0/mysql/3306/mysql_error.log
pid-file = /data0/mysql/3306/mysql.pid
open_files_limit = 10240
back_log = 600
max_connections = 5000
max_connect_errors = 6000
table_cache = 614
external-locking = FALSE
max_allowed_packet = 32M
sort_buffer_size = 1M
join_buffer_size = 1M
thread_cache_size = 300
thread_concurrency = 8
query_cache_size = 512M
query_cache_limit = 2M
query_cache_min_res_unit = 2k
default-storage-engine = MyISAM
thread_stack = 192K
transaction_isolation = READ-COMMITTED
tmp_table_size = 246M
max_heap_table_size = 246M
long_query_time = 3
log-slave-updates
log-bin = /data0/mysql/3306/binlog/binlog
binlog_cache_size = 4M
binlog_format = MIXED
max_binlog_cache_size = 8M
max_binlog_size = 1G
relay-log-index = /data0/mysql/3306/relaylog/relaylog
relay-log-info-file = /data0/mysql/3306/relaylog/relaylog
relay-log = /data0/mysql/3306/relaylog/relaylog
expire_logs_days = 30
key_buffer_size = 256M
read_buffer_size = 1M
read_rnd_buffer_size = 16M
bulk_insert_buffer_size = 64M
myisam_sort_buffer_size = 128M
myisam_max_sort_file_size = 10G
myisam_repair_threads = 1
myisam_recover
interactive_timeout = 120
wait_timeout = 120
skip-name-resolve
master-connect-retry = 10
slave-skip-errors = 1032,1062,126,1114,1146,1048,1396
#master-host = 192.168.1.2
#master-user = username
#master-password = password
#master-port = 3306
server-id = 1
innodb_additional_mem_pool_size = 16M
innodb_buffer_pool_size = 512M
innodb_data_file_path = ibdata1:256M:autoextend
innodb_file_io_threads = 4
innodb_thread_concurrency = 8
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 16M
innodb_log_file_size = 128M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
innodb_file_per_table = 0
#log-slow-queries = /data0/mysql/3306/slow.log
#long_query_time = 10
[mysqldump]
quick
max_allowed_packet = 32M
④、创建管理MySQL数据库的shell脚本
vi /data0/mysql/3306/mysql
输入以下内容(这里的用户名admin和密码12345678接下来的步骤会创建) #!/bin/sh
mysql_port=3306
mysql_username="admin"
mysql_password="12345678"
function_start_mysql()
{
printf "Starting MySQL…\n"
/bin/sh /usr/local/webserver/mysql/bin/mysqld_safe –defaults-file=/data0/mysql/${mysql_port}/my.cnf 2>&1 > /dev/null &
}
function_stop_mysql()
{
printf "Stoping MySQL…\n"
/usr/local/webserver/mysql/bin/mysqladmin -u ${mysql_username} -p${mysql_password} -S /tmp/mysql.sock shutdown
}
function_restart_mysql()
{
printf "Restarting MySQL…\n"
function_stop_mysql
sleep 5
function_start_mysql
}
function_kill_mysql()
{
kill -9 $(ps -ef | grep ‘bin/mysqld_safe’ | grep ${mysql_port} | awk ‘{printf $2}’)
kill -9 $(ps -ef | grep ‘libexec/mysqld’ | grep ${mysql_port} | awk ‘{printf $2}’)
}
if [ "$1" = "start" ]; then
function_start_mysql
elif [ "$1" = "stop" ]; then
function_stop_mysql
elif [ "$1" = "restart" ]; then
function_restart_mysql
elif [ "$1" = "kill" ]; then
function_kill_mysql
else
printf "Usage: /data0/mysql/${mysql_port}/mysql {start|stop|restart|kill}\n"
fi
⑤、赋予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
3、编译安装PHP(FastCGI模式)
我们先来看一下下面这两个命令的作用
apt-cache search "freetype"
这个命令是在源中查找和freetype有关的所有软件,然后再根据软件包的描述,找你自己需要的软件,然后就可以用下面的命令进行安装
apt-get install libfreetype6-dev
当然是要根据错误提示来查找相关的软件。
我们在编译过程中,缺什么,就补什么,这个也算是一种解决问题的思路。希望能给大家带来点帮助!
下面也是同样的道理,我就简写了。tar zxvf php-5.2.13.tar.gz
gzip -cd php-5.2.13-fpm-0.5.13.diff.gz | patch -d php-5.2.13 -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
4、编译安装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.tar.bz2
cd eaccelerator-0.9.6/
/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
内容如下 <?xml version="1.0" ?>
<configuration>
All relative paths in this config are relative to php’s install prefix
<section name="global_options">
Pid file
<value name="pid_file">/usr/local/webserver/php/logs/php-fpm.pid</value>
Error log file
<value name="error_log">/usr/local/webserver/php/logs/php-fpm.log</value>
Log level
<value name="log_level">notice</value>
When this amount of php processes exited with SIGSEGV or SIGBUS …
<value name="emergency_restart_threshold">10</value>
… in a less than this interval of time, a graceful restart will be initiated.
Useful to work around accidental curruptions in accelerator’s shared memory.
<value name="emergency_restart_interval">1m</value>
Time limit on waiting child’s reaction on signals from master
<value name="process_control_timeout">5s</value>
Set to ‘no’ to debug fpm
<value name="daemonize">yes</value>
</section>
<workers>
<section name="pool">
Name of pool. Used in logs and stats.
<value name="name">default</value>
Address to accept fastcgi requests on.
Valid syntax is ‘ip.ad.re.ss:port’ or just ‘port’ or ‘/path/to/unix/socket’
<value name="listen_address">127.0.0.1:9000</value>
<value name="listen_options">
Set listen(2) backlog
<value name="backlog">-1</value>
Set permissions for unix socket, if one used.
In Linux read/write permissions must be set in order to allow connections from web server.
Many BSD-derrived systems allow connections regardless of permissions.
<value name="owner"></value>
<value name="group"></value>
<value name="mode">0666</value>
</value>
Additional php.ini defines, specific to this pool of workers.
<value name="php_defines">
<value name="sendmail_path">/usr/sbin/sendmail -t -i</value>
<value name="display_errors">0</value>
</value>
Unix user of processes
<value name="user">www</value>
Unix group of processes
<value name="group">www</value>
Process manager settings
<value name="pm">
Sets style of controling worker process count.
Valid values are ‘static’ and ‘apache-like’
<value name="style">static</value>
Sets the limit on the number of simultaneous requests that will be served.
Equivalent to Apache MaxClients directive.
Equivalent to PHP_FCGI_CHILDREN environment in original php.fcgi
Used with any pm_style.
<value name="max_children">128</value>
Settings group for ‘apache-like’ pm style
<value name="apache_like">
Sets the number of server processes created on startup.
Used only when ‘apache-like’ pm_style is selected
<value name="StartServers">20</value>
Sets the desired minimum number of idle server processes.
Used only when ‘apache-like’ pm_style is selected
<value name="MinSpareServers">5</value>
Sets the desired maximum number of idle server processes.
Used only when ‘apache-like’ pm_style is selected
<value name="MaxSpareServers">35</value>
</value>
</value>
The timeout (in seconds) for serving a single request after which the worker process will be terminated
Should be used when ‘max_execution_time’ ini option does not stop script execution for some reason
’0s’ means ‘off’
<value name="request_terminate_timeout">0s</value>
The timeout (in seconds) for serving of single request after which a php backtrace will be dumped to slow.log file
’0s’ means ‘off’
<value name="request_slowlog_timeout">0s</value>
The log file for slow requests
<value name="slowlog">logs/slow.log</value>
Set open file desc rlimit
<value name="rlimit_files">65535</value>
Set max core size rlimit
<value name="rlimit_core">0</value>
Chroot to this directory at the start, absolute path
<value name="chroot"></value>
Chdir to this directory at the start, absolute path
<value name="chdir"></value>
Redirect workers’ stdout and stderr into main error log.
If not set, they will be redirected to /dev/null, according to FastCGI specs
<value name="catch_workers_output">yes</value>
How much requests each process should execute before respawn.
Useful to work around memory leaks in 3rd party libraries.
For endless request processing please specify 0
Equivalent to PHP_FCGI_MAX_REQUESTS
<value name="max_requests">1024</value>
Comma separated list of ipv4 addresses of FastCGI clients that allowed to connect.
Equivalent to FCGI_WEB_SERVER_ADDRS environment in original php.fcgi (5.2.2+)
Makes sense only with AF_INET listening socket.
<value name="allowed_clients">127.0.0.1</value>
Pass environment variables like LD_LIBRARY_PATH
All $VARIABLEs are taken from current environment
<value name="environment">
<value name="HOSTNAME">$HOSTNAME</value>
<value name="PATH">/usr/local/bin:/usr/bin:/bin</value>
<value name="TMP">/tmp</value>
<value name="TMPDIR">/tmp</value>
<value name="TEMP">/tmp</value>
<value name="OSTYPE">$OSTYPE</value>
<value name="MACHTYPE">$MACHTYPE</value>
<value name="MALLOC_CHECK_">2</value>
</value>
</section>
</workers>
</configuration>
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.01.tar.gz
cd pcre-8.01/
./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
输入以下内容
user www www;
worker_processes 8;
error_log /data1/logs/nginx_error.log crit;
pid /usr/local/webserver/nginx/nginx.pid;
#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 65535;
events
{
use epoll;
worker_connections 65535;
}
http
{
include mime.types;
default_type application/octet-stream;
#charset gb2312;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 8m;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
#limit_zone crawler $binary_remote_addr 10m;
server
{
listen 80;
server_name blog.s135.com;
index index.html index.htm index.php;
root /data0/htdocs/blog;
#limit_conn crawler 20;
location ~ .*\.(php|php5)?$
{
#fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fcgi.conf;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 1h;
}
log_format access ‘$remote_addr – $remote_user [$time_local] "$request" ‘
‘$status $body_bytes_sent "$http_referer" ‘
‘"$http_user_agent" $http_x_forwarded_for’;
access_log /data1/logs/access.log access;
}
server
{
listen 80;
server_name www.s135.com;
index index.html index.htm index.php;
root /data0/htdocs/www;
location ~ .*\.(php|php5)?$
{
#fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fcgi.conf;
}
log_format wwwlogs ‘$remote_addr – $remote_user [$time_local] "$request" ‘
‘$status $body_bytes_sent "$http_referer" ‘
‘"$http_user_agent" $http_x_forwarded_for’;
access_log /data1/logs/wwwlogs.log wwwlogs;
}
server
{
listen 80;
server_name status.blog.s135.com;
location / {
stub_status on;
access_log off;
}
}
}
②、在/usr/local/webserver/nginx/conf/目录中创建fcgi.conf文件
vi /usr/local/webserver/nginx/conf/fcgi.conf
输入以下内容
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with –enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
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
六、优化Linux内核参数
vi /etc/sysctl.conf
在末尾增加以下内容
# Add
net.ipv4.tcp_max_syn_backlog = 65536
net.core.netdev_max_backlog = 32768
net.core.somaxconn = 32768
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_tw_recycle = 1
#net.ipv4.tcp_tw_len = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800
#net.ipv4.tcp_fin_timeout = 30
#net.ipv4.tcp_keepalive_time = 120
net.ipv4.ip_local_port_range = 1024 65535
使配置立即生效
/sbin/sysctl -p
七、相关软件的重新启动
如果说你改了nginx的配置文件,就要用下面的命令,使配置生效
/usr/local/webserver/nginx/sbin/nginx -t 检查参数
kill -HUP `cat /usr/local/webserver/nginx/nginx.pid` 平滑重启
如果说你改了php.ini就要用下面的命令,使配置生效
/usr/local/webserver/php/sbin/php-fpm reload 重新加载 mysql数据库重新启动
/data0/mysql/3306/mysql restart
八、每天定时切割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
九、在小内存服务器上的配置优化
1、Nginx 的主配置文件(nginx.conf)优化
vi /usr/local/webserver/nginx/conf/nginx.conf
根据下面的内容进行相应的修改和增加
#Nginx每个进程耗费10M~12M内存,这里只开启一个Nginx进程,节省内存。
worker_processes 1;
#对网页文件、CSS、JS、XML等启动gzip压缩,减少数据传输量,提高访问速度。
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
location ~ .*\.(php|php5)?$
{
#将Nginx与FastCGI的通信方式由TCP改为Unix Socket。TCP在高并发访问下比Unix Socket稳定,但Unix Socket速度要比TCP快。
fastcgi_pass unix:/tmp/php-cgi.sock;
#fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fcgi.conf;
}
location ~ /read.php
{
#将Nginx与FastCGI的通信方式由TCP改为Unix Socket。TCP在高并发访问下比Unix Socket稳定,但Unix Socket速度要比TCP快。
fastcgi_pass unix:/tmp/php-cgi.sock;
#fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fcgi.conf;
}
#博客的图片较多,更改较少,将它们在浏览器本地缓存15天,可以提高下次打开我博客的页面加载速度。
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 15d;
}
#博客会加载很多JavaScript、CSS,将它们在浏览器本地缓存1天,访问者在看完一篇文章或一页后,再看另一篇文件或另一页的内容,无需从服务器再次下载相同的JavaScript、CSS,提高了页面显示速度。
location ~ .*\.(js|css)?$
{
expires 1d;
}
2、PHP(FastCGI)的配置优化
php.ini 配置文件中关于eAcelerator的优化。只使用1M共享内存,删除所有在最后3600秒内无法存取的脚本缓存,用磁盘辅助进行缓存。
vi /usr/local/webserver/php/etc/php.ini
根据内容增加或者修改
eaccelerator.shm_size="1"
eaccelerator.shm_ttl="3600"
eaccelerator.shm_prune_period="3600"
eaccelerator.keys = "disk_only"
eaccelerator.sessions = "disk_only"
eaccelerator.content = "disk_only"
php-fpm.conf 的配置优化
vim /usr/local/webserver/php/etc/php-fpm.conf
一是修改以下一行,将启动的php-cgi进程数由原来的128个改为5个:
<value name="max_children">5</value>
二是修改以下一行,将TCP模式改为Unix Socket模式:
<value name="listen_address">/tmp/php-cgi.sock</value> 3、MySQL配置优化
vi /data0/mysql/3306/my.cnf
根据自己的情况改吧
[client]
port = 3306
socket = /tmp/mysql.sock
[mysql]
prompt="(\u:s135:)[\d]> "
no-auto-rehash
[mysqld]
user = mysql
port = 3306
socket = /tmp/mysql.sock
basedir = /usr/local/webserver/mysql
datadir = /usr/local/webserver/mysql/data
open_files_limit = 600
back_log = 20
max_connections = 100
max_connect_errors = 200
table_cache = 60
external-locking = FALSE
max_allowed_packet = 16M
sort_buffer_size = 128K
join_buffer_size = 128K
thread_cache_size = 10
thread_concurrency = 8
query_cache_size = 0M
query_cache_limit = 2M
query_cache_min_res_unit = 2k
default_table_type = MyISAM
thread_stack = 192K
transaction_isolation = READ-UNCOMMITTED
tmp_table_size = 512K
max_heap_table_size = 32M
/usr/local/webserver/mysql/data/slow.log
/usr/local/webserver/mysql/data/error.log
long_query_time = 1
log_long_format
server-id = 1
#log-bin = /usr/local/mysql/data/binlog
binlog_cache_size = 2M
max_binlog_cache_size = 4M
max_binlog_size = 512M
expire_logs_days = 7
key_buffer_size = 4M
read_buffer_size = 1M
read_rnd_buffer_size = 2M
bulk_insert_buffer_size = 2M
myisam_sort_buffer_size = 4M
myisam_max_sort_file_size = 10G
myisam_max_extra_sort_file_size = 10G
myisam_repair_threads = 1
myisam_recover
[mysqldump]
quick
max_allowed_packet = 16M
最后给个优化前后的对比图
优化前
优化后
本主参考文章:
http://blog.s135.com/nginx_php_v6/
http://blog.s135.com/post/375/
有问题请给我留言,让我们一起交流学习!
珍惜劳动成果,转载请注明本文地址!






不错,我还没有研究出来。
[回复]
支持原创,谢谢了
[回复]
顶,顶,顶,顶,继续努力!
[回复]
有什么问题,希望大家及时提出,我好更正!
感谢大家的支持!
[回复]
博客文章写的不错啊,再多些几篇都快成业余作者了,模板挺漂亮很醒目 O(∩_∩)O哈哈~希望你再接再厉啊 2010年一定要努力 努力!
[回复]
羽飞 回复:
三月 23rd, 2010 at 11:34
你的网站要很强悍啊!!多向你学习,以后多多指点!
[回复]
topkey 回复:
三月 23rd, 2010 at 12:45
飞哥,那是广告
[回复]
羽飞 回复:
三月 23rd, 2010 at 14:32
不是吧!!看来是我太善良了!!
[回复]
轩痕 回复:
七月 18th, 2010 at 14:15
围观委屈的飞哥。。。
[回复]
在
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 ../
中
/sbin/ldconfig 这句的作用是什么?
cd libltdl/ 这句出错,No such file or dierctory
请楼主指点,谢~~
[回复]
羽飞 回复:
三月 25th, 2010 at 14:25
ldconfig 命令的用途主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库,进而创建出动态装入程序(ld.so)所需的连接和缓存文件。
cd libltdl/ 这句出错,No such file or dierctory
看看你在不在libmcrypt-2.5.8这个目录里面
用这个命令cd libmcrypt-2.5.8/ libltdl/试试看
[回复]
carlos 回复:
三月 25th, 2010 at 21:17
谢楼主热情解答
在我本地出错信息如下
debian:~/soft# cd libmcrypt-2.5.8/
debian:~/soft/libmcrypt-2.5.8# /sbin/ldconfig
/sbin/ldconfig: Writing of cache data failed: No space left on device
但是实际上我这一个200多G的硬盘上就装了一个DEBIAN,别的什么都没有,怎么会设备上没有空间了?
郁闷!
[回复]
羽飞 回复:
三月 25th, 2010 at 22:01
df看一下!看看什么个情况!
[回复]
菲戈:
这两句的force前面少了一个’-'吧
dpkg –force-all -P mysql-common
dpkg –force-all -P libmysqlclient15off
应该是
dpkg –force-all -P mysql-common
dpkg –force-all -P libmysqlclient15off
吧~~^_^
[回复]
羽飞 回复:
三月 29th, 2010 at 08:43
是这样的,原本是”–”但发表后就是一个”-”
郁闷啊!!我再看看哪里能解决这个问题!
谢谢提醒!
[回复]
羽飞 回复:
三月 29th, 2010 at 10:58
问题已经解决了!!
[回复]
live 回复:
八月 26th, 2010 at 22:44
dpkg: unknown option -o
Type dpkg –help for help about installing and deinstalling packages [*];
Use `dselect’ or `aptitude’ for user-friendly package management;
Type dpkg -Dhelp for a list of dpkg debug flag values;
Type dpkg –force-help for a list of forcing options;
Type dpkg-deb –help for help about manipulating *.deb files;
Type dpkg –license for copyright license and lack of warranty (GNU GPL) [*].
Options marked [*] produce a lot of output – pipe it through `less’ or `more’ !
运行后提示这个是删除了吗?
[回复]
楼主好;
文章里面许多地方出现了全角字符?直接paste出现乱码。
许多应该是 — 的地方都只有 -
如果菲戈有兴趣自己走一遍的话,直接CTRL+C CTRL+V试试就知道了。
另外
执行到
⑦、设置MySql root用户的密码(记住,后面用到)
/usr/local/webserver/mysql/bin/mysqladmin -u root password ‘123456789′
出错如下
/usr/local/webserver/mysql/bin/mysqladmin: connect to server at ‘localhost’ failed
error: ‘Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)’
Check that mysqld is running and that the socket: ‘/tmp/mysql.sock’ exists!
[回复]
羽飞 回复:
三月 26th, 2010 at 13:15
关于 —和 -我有空的时候再来整理一下,关于你说的MySql的错误,是你的MySql没有启动的原因!你再仔细检查一下看看,是不是有哪里出错了?
[回复]
topkey 回复:
三月 26th, 2010 at 20:18
没有启动mysql
[回复]
感谢楼主的帖子,终于走下来了。
本来都打算转投CENTOS了,呵呵。
[回复]
楼主好:
今天在一台512M内存的机器上按照教程配置完毕后出现502 Bad Gateway的错误。在网上查找
根据
http://blog.s135.com/post/361/
进行修改没有效果。
不知菲戈有何提示?
[回复]
topkey 回复:
四月 5th, 2010 at 19:00
查看你的配置文件有没有错误之类的啊。重新弄一边,或者是权限问题。
[回复]
羽飞 回复:
四月 5th, 2010 at 21:41
按topkey 的回复看看!!
[回复]
按照这里的步骤Ctrl C/Ctrl V张宴的代码,一次就OK了,谢谢博主!
[回复]
羽飞 回复:
四月 8th, 2010 at 09:32
在开始的时候,由于博客程序自动把”–”变成”-”所以不能直接复制,现在也可以Ctrl+C/Ctrl+V 就OK了!
[回复]
一次成功~~~ 回复:
四月 8th, 2010 at 10:11
不知博主有没有将命令打包的想法,呵呵.
[回复]
羽飞 回复:
四月 8th, 2010 at 13:29
以后做成PDF文档!
[回复]
一次成功~~~ 回复:
四月 8th, 2010 at 15:19
文中nginx和fpm配置部分至少还有两处因全角字符引起的错误,呵呵.
我已经重新全程记录好了安装过程,尝试看能不能装zend optimizer.
[回复]
羽飞 回复:
四月 8th, 2010 at 16:53
OK,有空的时候,我再重新编辑一下!
又回来了 回复:
四月 9th, 2010 at 00:01
有个请求说下,呵呵.
本文是针对VPS的配置方式吧,能否在下一版针对独立服务器呢?
下午装了zend optimizer,已经记录了安装方式,还算很容易装.
但是刚刚在装memcached的时候出错忘记记录查错过程了,稀里糊涂装好才发现忘记怎么装的…汗…
@又回来了
VPS的配置方式和独立服务器一样啊!!只是针对自己的服务器的性能,进行相应的优化,就可以了!!
[回复]
又回来了 回复:
四月 9th, 2010 at 10:30
呵呵我悲剧了.
我只会安装系统(吹牛一下,几乎能下到的所有系统吧),勉强可以安装环境,但不知道怎么优化和配置…
[回复]
羽飞 回复:
四月 9th, 2010 at 11:11
本文的第九点有些说明,你还可以找一下我BLOG中以前我转的关于MYSQL的优化,这样基本上就OK了。
当然,在使用中如果出现问题,就根据问题再进行相应的优化!
以上只是个人观点!!
[回复]
又回来了 回复:
四月 9th, 2010 at 11:15
呵呵,这个也只能实际中慢慢实践了.
[回复]
博主,完全按照你的步骤,因为已经装过mysql了,所以在配置选项中去掉了mysql的两个选项,然而在编译PHP时执行:
make ZEND_EXTRA_LIBS=’-liconv’
遇到错误:
/bin/sh /home/soft/php/php-5.2.13/libtool –silent –preserve-dup-deps –mode=compile gcc -Iext/date/lib -Iext/date/ -I/home/soft/php/php-5.2.13/ext/date/ -DPHP_ATOM_INC -I/home/soft/php/php-5.2.13/include -I/home/soft/php/php-5.2.13/main -I/home/soft/php/php-5.2.13 -I/home/soft/php/php-5.2.13/ext/date/lib -I/usr/include/libxml2 -I/usr/include/freetype2 -I/home/soft/php/php-5.2.13/ext/mbstring/oniguruma -I/home/soft/php/php-5.2.13/ext/mbstring/libmbfl -I/home/soft/php/php-5.2.13/ext/mbstring/libmbfl/mbfl -I/usr/local/include -I/home/soft/php/php-5.2.13/TSRM -I/home/soft/php/php-5.2.13/Zend -I/usr/local/include -g -O2 -c /home/soft/php/php-5.2.13/ext/date/lib/parse_date.c -o ext/date/lib/parse_date.lo
cc1: out of memory allocating 4064 bytes after a total of 32792576 bytes
make: *** [ext/date/lib/parse_date.lo] Error 1
vps 256m内存debian 5,请问是什么问题啊?谢谢。
[回复]
羽飞 回复:
四月 10th, 2010 at 01:29
应该是你的内存不够的原因,你把其它没有用的程序全部KILL掉,只留下一下编译的!这样可能会好点!!
要不,你可以增加一个SWAP,来解决内存不足的问题,前提,你的VPS需要支持自己增加SWAP!
[回复]
支持,我的是CentOS版本的LINUX,我是用RPM包做的,LAMP环境也完成了,这前用BZ包做的时候老出问题,现在看了知道哪里出问题啦。。。非常的感谢,继续加油~~~
[回复]
topkey 回复:
四月 13th, 2010 at 20:20
http://blog.s135.com/post/366/ 参考这个
[回复]
博主,您好:
想向您请教一个关于nginx的问题:nginx能不能想apache那样,在目录列表页添加头部和尾部文件,就像康盛创想的下载中心(http://download.comsenz.com/)那样?
[回复]
羽飞 回复:
四月 30th, 2010 at 09:56
看一下这个文章,对你有帮助不!
http://bbs.linuxtone.org/viewthread.php?tid=5245&highlight=index
[回复]
guiduan 回复:
四月 30th, 2010 at 12:40
谢谢博主,这个很有帮助,但是昨天我把nginx的源码下载下来,并且用grep -r “Index of” ~/nginx/*发现在源码包的src/http/modules/ngx_http_autoindex_module.c中找到了一下代码:
static u_char title[] =
“” CRLF
“Index of ”
;
static u_char header[] =
“” CRLF
“” CRLF
“Index of ”
;
static u_char tail[] =
“” CRLF
“” CRLF
;
然后我就直接在这里添加我自定义的html代码,然后再重新编译安装nginx,结果也还是解决了这个问题,但是花了我好大的力气呀!
[回复]
/data0/mysql/3306/mysql start
飞哥,到这一步MYSQL启动不起来。
一步一步按照教程做的,什么原因呀?
[回复]
羽飞 回复:
四月 30th, 2010 at 08:53
启动不了,有什么提示啊?安装中有没有什么错误提示?
还有就是,是没有3306端口还是什么其它的?
你只有结果,让我很难判断啊!
[回复]
mysql_port=3306
kill -9 $(ps -ef | grep ‘bin/mysqld_safe’ | grep ${mysql_port} | awk ‘{printf $2}’)
kill -9 $(ps -ef | grep ‘libexec/mysqld’ | grep ${mysql_port} | awk ‘{printf $2}’)
飞哥
这两句中的${mysql_port},也就是3306是端口还是路径文件夹名
另外,2个1.5TB磁盘web服务器,怎么分区比较好呢
在你的这篇文章里,好象没有提起其他分区,难道你的只有swap分区和/分区?
[回复]
羽飞 回复:
五月 12th, 2010 at 15:03
是3306端口啊!
至于分区,根据自己的情况不划分吧!!
[回复]
挺好的
[回复]
/usr/local/webserver/mysql/bin/mysqladmin -u root password ’123456789′
执行后 提示
/usr/local/webserver/mysql/bin/mysqladmin -u root password ’123456789′
/usr/local/webserver/mysql/bin/mysqladmin: Can’t read dir of ‘/etc/mysql/conf.d/’ (Errcode: 2)
Fatal error in defaults handling. Program aborted
楼主,怎么办问题出在哪了
[回复]
发表评论