CentOS 5.6(X64)下編譯安裝LNMP平台(Nginx1.0.4+PHP5.3.6+Mysql5.5.12)
系統環境:centos 5.6(x64)+Nginx 1.0.4+Mysql 5.5.12 + PHP 5.3.6
軟體包存放位置 /usr/local/src/websoft
###########本文另附配置文檔,配置文檔在附件裡#################
Nginx(發音同 engine x)是一款輕量級的Web 伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器,并在一個BSD-like 協定下發行。由俄羅斯的程式設計師Igor Sysoev所開發,最初供俄國大型的入口網站及搜尋引擎Rambler(俄文:Рамблер)使用。 其特點是占有記憶體少,并發能力強,事實上nginx的并發能力确實在同類型的網頁伺服器中表現較好.目前中國大陸使用nginx網站使用者有:新浪、網易、 騰訊,另外知名的微網志Plurk也使用nginx。
總體來說nginx的有以下八大優點:
1.高并發連接配接:官方測試能支撐5萬并發連接配接,在實際生産環境中跑到2,~3W并發連接配接。
2.記憶體消耗少:在3W并發連接配接下,開啟的10個NGINX程序才消耗150M記憶體(15M*10=150M)
3.配置檔案非常簡單:風格跟程式一樣通俗易懂。
4.成本低廉:Nginx作為開源軟體,可以免費使用,而購買F5 BIG-IP、NetScaler
等硬體負載均衡交換機則需要十多萬至幾十萬人民币。
5.支援rewrite重寫規則:能夠根據域名、URL的不同,将HTTP請求分發到不同的後端伺服器群組。
6.内置的健康檢查功能:如果Nginx Proxy後端的背景web伺服器當機了,不會音響前端通路。
7.節省帶寬:支援GZIP壓縮,可以添加浏覽器本地緩存的Header頭。
8.穩定性高:用于反向代理,當機的機率微乎其微。
當用戶端在通路動态頁面時,因為apache和nginx隻能提供靜态解析,這是他們通過内置的cgi接口去尋找php等腳本語言,當需要用到資料部分時PHP會去調用背景MYSQL資料庫中的資料,之後通過解析生成靜态頁面在傳回apache/nginx伺服器,再由此傳遞給用戶端。那麼nginx如何調用php提供動态php格式的網頁,那麼就通過FastCGI來實作,後面安裝php的時候會講解
1、首先安裝編譯所需要的庫檔案和編譯環境,這裡我用的CD光牒的yum源
yum -y install gcc openssl-devel zlib-devel pcre-devel libjpeg-devel libpng-devel libtool-ltdl-devel
yum groupinstall "Development Tools" "Development Libraries" -y
2、下載下傳源碼包
#cd /usr/local/src/websoft
#vim download.txt //拷貝下面的内容到檔案裡
wget http://www.cmake.org/files/v2.8/cmake-2.8.4.tar.gz
wget http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.12.tar.gz/from/http://ftp.iij.ad.jp/pub/db/mysql
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz
wget http://downloads.sourceforge.net/mcrypt/libmcrypt-2.5.8.tar.gz?modtime=1171868460&big_mirror=0
wget ttp://downloads.sourceforge.net/mcrypt/mcrypt-2.6.8.tar.gz?modtime=1194463373&big_mirror=0
wget http://downloads.sourceforge.net/mhash/mhash-0.9.9.9.tar.gz?modtime=1175740843&big_mirror=0
wget wget http://cn.php.net/get/php-5.3.6.tar.gz/from/this/mirror
wget http://bart.eaccelerator.net/source/0.9.6.1/eaccelerator-0.9.6.1.tar.bz2
wget http://home.tiscali.cz/~cz210552/distfiles/webbench-1.5.tar.gz
#wget -i download.txt //下載下傳這些軟體包
3、Nginx 安裝
useradd -s /sbin/nologin -M nginx
cd /usr/local/src/websoft
tar zxvf nginx-1.0.4.tar.gz
cd nginx-1.0.4/
./configure --user=nginx --group=nginx \
--prefix=/usr/local/webserver/nginx \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--with-http_stub_status_module \
--with-http_ssl_module \
--without-http_rewrite_module \
--lock-path=/var/lock/nginx.lock \
--pid-path=/var/run/nginx/nginx.pid \
--with-pcre //這個一定要加,不加啟動nginxd會報錯
make && make install
vim /etc/init.d/nginxd/ //添加下面内容,讓nginx 支援service 啟動關閉
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /etc/nginx/nginx.conf
# config: /etc/sysconfig/nginx
# pidfile: /var/run/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
nginx="/usr/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/etc/nginx/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() {
# make required directories
user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
options=`$nginx -V 2>&1 | grep 'configure arguments:'`
for opt in $options; do
if [ `echo $opt | grep '.*-temp-path'` ]; then
value=`echo $opt | cut -d "=" -f 2`
if [ ! -d "$value" ]; then
# echo "creating" $value
mkdir -p $value && chown -R $user $value
fi
fi
done
}
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
make_dirs
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
[ $retval -eq 0 ] && rm -f $lockfile
restart() {
configtest || return $?
stop
sleep 1
start
reload() {
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
force_reload() {
restart
configtest() {
$nginx -t -c $NGINX_CONF_FILE
rh_status() {
status $prog
rh_status_q() {
rh_status >/dev/null 2>&1
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
restart|configtest)
reload)
rh_status_q || exit 7
force-reload)
force_reload
status)
rh_status
condrestart|try-restart)
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac
chmod +x /etc/init.d/nginxd
service nginxd start
chkconfig --add nginxd
chkconfig nginxd on
chkconfig --list nginxd
通過浏覽器通路伺服器,出現welcome to nginx!表示成功
4、編譯安裝mysql
編譯環境前提(mysql 5.5.x 不再用 configure,而用cmake)
# yum -y install gcc gcc-c++ make ncurses-devel //安裝所需的軟體包
#cd /usr/local/src/websoft
#tar xvf cmake-2.8.4.tar.gz
# cd cmake-2.8.4
# ./configure && make && make install
# tar zxvf mysql-5.5.12.tar.gz
# cd mysql-5.5.12
# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/webserver/mysql \
-DMYSQL_DATADIR=/data/mysql/data \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DEXTRA_CHARSETS=all \
-DMYSQL_TCP_PORT=3306
# make
# make install
參數說明:
-DCMAKE_INSTALL_PREFIX=/usr/local/webserver/mysql //安裝目錄
-DMYSQL_DATADIR=/data/mysql/data //資料庫存放目錄
-DWITH_MYISAM_STORAGE_ENGINE=1 //安裝myisam存儲引擎
-DWITH_INNOBASE_STORAGE_ENGINE=1 //安裝innodb存儲引擎
-DWITH_ARCHIVE_STORAGE_ENGINE=1 //安裝archive存儲引擎
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 //安裝blackhole存儲引擎
-DENABLED_LOCAL_INFILE=1 //允許從本地導入資料
-DDEFAULT_CHARSET=utf8 //使用utf8字元
-DDEFAULT_COLLATION=utf8_general_ci //校驗字元
-DEXTRA_CHARSETS=all //安裝所有擴充字元集
-DMYSQL_TCP_PORT=3306 //MySQL監聽端口
mysql 配置
# groupadd -g 3306 mysql
# useradd -u 3306 -g mysql -M -s /sbin/nologin mysql
# mkdir /data/mysql/data
# mkdir /data/mysql/log
# chown -R mysql:mysql /data/mysql
# chmod -R 755 /data/mysql
# cp support-files/my-medium.cnf /etc/my.cnf
#/usr/local/webserver/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/webserver/mysql --datadir=/data/mysql/data & //初始化資料庫
# cp support-files/mysql.server /etc/init.d/mysqld
# chmod +x /etc/init.d/mysqld
# chkconfig --add mysqld
# chkconfig mysqld on
# service mysqld restart
# netstat -tnlp |grep 3306
# cd /usr/local/bin //進入使用者的預設搜尋路徑下建立mysql指令的軟連接配接,可以直接執行mysql指令
# ln -s /usr/local/webserver/mysql/bin/mysql mysql
# ln -s /usr/local/webserver/mysql/bin/mysqlduamp mysqldump
# ln -s /usr/local/webserver/mysql/bin/mysqladmin mysqladmin
# mysqladmin -u root -p password '123456'
# mysql -u root -p
# flush privileges;
vim /etc/my.cnf //Mysql 優化,在[mysqld]配置參數下面添加下面幾行(大概37行下面)
innodb_file_per_table
log-bin-trust-function-creators=1
skip-name-resolv
innodb_flush_log_at_trx_commit=1
sync-binlog=1
lower_case_table_names=1
max_connections = 1500 (預設100)
修改配置檔案裡下面的參數,去掉前面的#
innodb_buffer_pool_size = 2048M (預設16M,可以為系統記憶體50%~70%)
innodb_additional_mem_pool_size = 256M (預設2M)
innodb_log_file_size = 512M (預設5M,innodb_buffer_pool_size的四分之一)
max_allowed_packet = 500M
下面安裝幾個所需要的源碼包
########libiconv 加強系統對支援字元編碼轉換的功能########
tar xvf libiconv-1.13.1.tar.gz
cd libiconv
./configure --prefix=/usr/local/webserver
make
make install
####mcrypt是加密算法庫,PHP擴充mcrypt功能對此庫有依耐關系,要使用mcrypt必須先安裝此庫######
tar zxvf libmcrypt-2.5.8.tar.gz
cd libmcrypt-2.5.8
./configure
/sbin/ldconfig
######加密算法庫#########
tar zxvf mcrypt-2.6.8.tar.gz
cd mcrypt-2.6.8/
###mhash是哈希函數,用來計算消息的校驗碼之類的###
tar zxvf mhash-0.9.9.9.tar.gz
cd mhash-0.9.9.9
ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib //建立一個mysqlclient庫的軟連接配接,不建立在make 的時候會提示找不到這個檔案
5、安裝PHP
php在編譯安裝時,nginx要想能夠調用php提供動态php格式的網頁,必須用FastCGI來實作,但FastCGI隻是一個架構,實作FastCGI架構的有PHP-FPM,但對于5.2.x版本的php來說 預設是不支援PHP-FPM的,需要打上php-fpm的更新檔,對于5.3.2之前版本的也是需要打更新檔的,而且打更新檔的過程比較麻煩。好在5.3.3版本的PHP-FPM被直接做進了源代碼包中,在編譯安裝時隻需啟用PHP-FPM功能即可
加上 --enable-fpm 啟動fpm
tar xvf php-5.3.6.tar.gz
cd php-5.3.6
./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/webserver --with-freetype-dir \
--with-jpeg-dir --with-png-dir --with-zlib \
--with-libxml-dir=/usr --enable-xml --disable-rpath \
--enable-safe-mode --enable-bcmath \
--enable-shmop --enable-sysvsem \
--enable-inline-optimization --with-curl \
--with-curlwrappers \
--enable-mbregex --enable-fpm \
--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 \
--without-pear --enable-fpm
make ZEND_EXTRA_LIBS='-liconv' #因為-liconv的目錄不是在/usr/local下是以安裝時需要手動指定
make install
cp /usr/local/websoft/php-5.3.6/php.ini-production
/usr/local/webserver/php/etc/php.ini //拷貝php配置檔案
6、eaccelerator加速器(這個不是必須的,可以不安裝)
eaccelerator是一個自由開放源碼PHP加速器,優化和動态内容緩存,提高了性能php腳本的緩存性能,使得PHP腳本在編譯的狀态下,對伺服器的開銷幾乎完全消除。 它還有對腳本起優化作用,以加快其執行效率。使您的PHP程式代碼執效率能提高1-10倍;
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
修改php.ini 配置檔案
vim /usrl/local/webserver/php/etc/php.ini //修改extension_dir
extension_dir= /usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20090626/"
配置eAccelerator加速PHP:
建立緩存存放目錄
mkdir -p /usr/local/webserver/eaccelerator_cache
chmod 777 /usr/local/eaccelerator_cache
建立存放日志的目錄
mkdir -p /usr/local/webserver/php/logs
vi /usr/local/webserver/php/etc/php.ini
按shift+g鍵跳到配置檔案的最末尾,加上以下配置資訊:
[eaccelerator]
zend_extension="/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20090626/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"
檢視安裝是否成功:php -v
PHP 5.3.6 (cli) (built: Jun 8 2011 23:10:20)
Copyright (c) 1997-2011 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies
with eAccelerator v0.9.6.1, Copyright (c) 2004-2010 eAccelerator, by eAccelerator
全部安裝工作準備已經完成,剩下進行一些配置.
vim /usr/local/php/etc/php-fpm.conf ##首先修改下面來配置修改
該配置檔案隻用修改以下四點,隻需要把紅色部分前面的注釋去掉
; Note: Used when pm is set to either 'static' or 'dynamic'
; Note: This value is mandatory.
pm.max_children = 50
; The number of child processes created on startup.
; Note: Used only when pm is set to 'dynamic'
; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
pm.start_servers = 10
; The desired minimum number of idle server processes.
; Note: Mandatory when pm is set to 'dynamic'
pm.min_spare_servers = 5
; The desired maximum number of idle server processes.
pm.max_spare_servers = 35
修改完成,試着啟動
#/usr/local/webserver/php/sbin/php-fpm &
啟動後用netstat -tnlp //檢視如果有如圖所示端口 如果有表示正常啟動
<a target="_blank" href="http://blog.51cto.com/attachment/201106/190114592.jpg"></a>
如需要開機自動啟動 則可以添加到/etc/rc.d/rc.local中
vim /etc/rc.d/rc.local
在空白行添加 /usr/local/webserver/php/sbin/php-fpm &
vim /etc/nginx/nginx.conf //下面就是最後修改nginx.conf配置檔案
user nginx //修改ngin守護程序的使用者
worker_processes 4; //工作程序數,一般與 CPU 核數等同,但實際的可以多一些
error_log logs/error.log; //錯誤日志位置
events {
worker_connections 2048;#每個工作程序允許最大的同時連接配接數,可以稍微大一些,1024的倍數
gzip on;
server {
listen 80;
server_name 192.168.175.208; //伺服器位址
找到
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}
把前面注釋全部去掉, root後面的路徑是你網頁檔案所放置的路徑, 該目錄如果不存在的話還需要手動建立。
location / {
root /html;
index index.php index.html index.htm;
修改為如上所示 主要是添加index 後面的index.php
修改完成後儲存退出,重新啟動nginx服務
service nginxd restart
vim /usr/local/webserver/nginx/html/index.php //編輯測試檔案在其中添加
<?php
phpinfo();
?>
儲存退出
之後用web浏覽器通路 如果出現php資訊頁面 表示服務成功,
下面是測試mysql 的連接配接
把剛才/usr/local/webserver/nginx/html/index.php中的内容修改成
$link=mysql_connect("localhost","root","123456");
if(!$link) echo "FAILD!";
else echo "OK!";
然後重新整理web頁面,如果出現OK!字樣 測表示正常連接配接
優化Linux核心參數
#vi /etc/sysctl.conf 在/etc/sysctl.conf末尾增加以下内容(可根據伺服器實際情況進行調整),在檔案最後添加下面的内容
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_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.ip_local_port_range = 1024 65535
#net.ipv4.ip_conntrack_max = 10000
/sbin/sysctl -p
##############Linux核心優化參數說明##########################
net.ipv4.tcp_max_syn_backlog = 65536
#記錄的那些尚未收到用戶端确認資訊的連接配接請求的最大值
#每個網絡接口接收資料包的速率比核心處理這些包的速率快時,允許送到隊列的資料包的最大數目。
#listen()的預設參數,挂起請求的最大數量.預設是128.對繁忙的伺服器,增加該值有助于網絡性能.
#該參數指定了發送套接字緩沖區大小的預設值(以位元組為機關)
該參數指定了接收套接字緩沖區大小的預設值(以位元組為機關)
#該參數指定了接收套接字緩沖區大小的最大值(以位元組為機關)
#該參數指定了發送套接字緩沖區大小的最大值(以位元組為機關)
#時間戳可以避免序列号的卷繞。一個1Gbps的鍊路肯定會遇到以前用過的序列号。時間戳能夠讓核心接受這種“異常”的資料包。這裡需要将其關掉。
#為了打開對端的連接配接,核心需要發送一個SYN并附帶一個回應前面一個SYN的ACK。也就是所謂三次握手中的第二次握手。這個設定決定了核心放棄連接配接之前發送SYN+ACK包的數量。
#在核心放棄建立連接配接之前發送SYN包的數量。
#啟用timewait快速回收。
#開啟重用。允許将TIME-WAIT sockets重新用于新的TCP連接配接。
# 同樣有3個值,意思是:
net.ipv4.tcp_mem[0]:低于此值,TCP沒有記憶體壓力.
net.ipv4.tcp_mem[1]:在此值下,進入記憶體壓力階段.
net.ipv4.tcp_mem[2]:高于此值,TCP拒絕配置設定socket.
上述記憶體機關是頁,而不是位元組
net.ipv4.tcp_max_orphans = 3276800
#系統所能處理不屬于任何程序的TCP sockets最大數量。假如超過這個數量﹐那麼不屬于任何程序的連接配接會被立即reset,并同時顯示警告資訊。之是以要設定這個限制﹐純粹為了抵禦那些簡單的DoS攻擊﹐千萬不要依賴這個或是人為的降低這個限制
#允許系統打開的端口範圍。
#net.ipv4.ip_conntrack_max = 10000
#設定系統對最大跟蹤的TCP連接配接數的限制(CentOS 5.6無此參數)
#####################################################################
編寫每天定時切割Nginx日志的腳本,使用系統的logrotate 工具來復原日志:
logrotate 程式是一個日志檔案管理工具。用來把舊的日志檔案删除,并建立新的日志檔案,我們把它叫做“轉儲”。我們可以根據日志檔案的大小,也可以根據其天數來轉儲,這個過程一般通過 cron 程式來執行。
logrotate 程式還可以用于壓縮日志檔案,以及發送日志到指定的E-mai
#vim /etc/logrotate/nginx //在/etc/logrotate.d/下建立一腳本檔案nginx,内容為:
/usr/local/webserver/nginx/logs/*log {
missingok
rotate 10
daily
notifempty
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/nginx/nginx.pid 2>/dev/null` 2> /dev/null || true
endscript
生成日志的格式為:access_log.1 access_log.2 error_log.3 ......
error_log.1 error_log.2 error_log.3 ........
用Webbench進行簡單的壓力測試
Webbench是有名的網站壓力測試工具。Webbench支援多平台,FreeBSD、Linux、Windows都可以使用。Webbench最多可以模拟3萬個并發連接配接去測試網站的負載能力。
tar xvf webbench-1.5.tar.gz
cd webbench-1.5
Linux壓力測試工具webbench使用:
引用 webbench -c 500 -t 30 http://127.0.0.1/index.php
webbench -c 500 -t 30參數說明:-c表示并發數,-t表示時間(秒)
<a href="http://down.51cto.com/data/2358363" target="_blank">附件:http://down.51cto.com/data/2358363</a>
本文轉自 張玉坡 51CTO部落格,原文連結:http://blog.51cto.com/fighter/588453