生產環境 centos6 源碼編輯安裝lnmp


傳統上基於進程或線程模型架構的web服務通過每進程或每線程處理併發連接請求,這勢必會在網絡和I/O操作時產生阻塞,其另一個必然結果則是對內存或CPU的利用率低下。生成一個新的進程/線程需要事先備好其運行時環境,這包括爲其分配堆內存和棧內存,以及爲其創建新的執行上下文等。這些操作都需要佔用CPU,而且過多的進程/線程還會帶來線程抖動或頻繁的上下文切換,系統性能也會由此進一步下降。


在設計的最初階段,nginx的主要着眼點就是其高性能以及對物理計算資源的高密度利用,因此其採用了不同的架構模型。受啓發於多種操作系統設計中基於“事件”的高級處理機制,nginx採用了模塊化、事件驅動、異步、單線程及非阻塞的架構,並大量採用了多路複用及事件通知機制。在nginx中,連接請求由爲數不多的幾個僅包含一個線程的進程worker以高效的迴環(run-loop)機制進行處理,而每個worker可以並行處理數千個的併發連接及請求。


如果負載以CPU密集型應用爲主,如SSL或壓縮應用,則worker數應與CPU數相同;如果負載以IO密集型爲主,如響應大量內容給客戶端,則worker數應該爲CPU個數的1.5或2倍。


Nginx會按需同時運行多個進程:一個主進程(master)和幾個工作進程(worker),配置了緩存時還會有緩存加載器進程(cache loader)和緩存管理器進程(cache manager)等。所有進程均是僅含有一個線程,並主要通過“共享內存”的機制實現進程間通信。主進程以root用戶身份運行,而worker、cache loader和cache manager均應以非特權用戶身份運行。


主進程主要完成如下工作:

1. 讀取並驗正配置信息;

2. 創建、綁定及關閉套接字;

3. 啓動、終止及維護worker進程的個數;

4. 無須中止服務而重新配置工作特性;

5. 控制非中斷式程序升級,啓用新的二進制程序並在需要時回滾至老版本;

6. 重新打開日誌文件,實現日誌滾動;

7. 編譯嵌入式perl腳本;


worker進程主要完成的任務包括:

1. 接收、傳入並處理來自客戶端的連接;

2. 提供反向代理及過濾功能;

3. nginx任何能完成的其它任務;


cache loader進程主要完成的任務包括:

1. 檢查緩存存儲中的緩存對象;

2. 使用緩存元數據建立內存數據庫;


cache manager進程的主要任務:

1. 緩存的失效及過期檢驗;


Nginx的配置有着幾個不同的上下文:main、http、server、upstream和location(還有實現郵件服務反向代理的mail)。配置語法的格式和定義方式遵循所謂的C風格,因此支持嵌套,還有着邏輯清晰並易於創建、閱讀和維護等優勢。



Nginx的代碼是由一個核心和一系列的模塊組成, 核心主要用於提供Web Server的基本功能,以及Web和Mail反向代理的功能;還用於啓用網絡協議,創建必要的運行時環境以及確保不同的模塊之間平滑地進行交互。不過,大多跟協議相關的功能和某應用特有的功能都是由nginx的模塊實現的。這些功能模塊大致可以分爲事件模塊、階段性處理器、輸出過濾器、變量處理器、協議、upstream和負載均衡幾個類別,這些共同組成了nginx的http功能。事件模塊主要用於提供OS獨立的(不同操作系統的事件機制有所不同)事件通知機制如kqueue或epoll等。協議模塊則負責實現nginx通過http、tls/ssl、smtp、pop3以及imap與對應的客戶端建立會話。


在nginx內部,進程間的通信是通過模塊的pipeline或chain實現的;換句話說,每一個功能或操作都由一個模塊來實現。例如,壓縮、通過FastCGI或uwsgi協議與upstream服務器通信,以及與memcached建立會話等。


一、安裝Nginx:


1、解決依賴關係


編譯安裝nginx需要事先需要安裝開發包組"Development Tools"和 "Development Libraries"。同時,還需要專門安裝pcre-devel包:

# yum -y install pcre-devel

# yum -y groupinstall 'Development Tools'

2、安裝


首先添加用戶nginx,實現以之運行nginx服務進程:

# groupadd -r nginx

# useradd -r -s /sbin/nologin  nginx


接着開始編譯和安裝:

# ./configure \

  --prefix=/usr \

  --sbin-path=/usr/local/nginx/sbin/nginx \

  --conf-path=/etc/nginx/nginx.conf \

  --error-log-path=/var/log/nginx/error.log \

  --http-log-path=/var/log/nginx/access.log \

  --pid-path=/var/run/nginx/nginx.pid  \

  --lock-path=/var/lock/nginx.lock \

  --user=nginx \

  --group=nginx \

  --with-http_ssl_module \

  --with-http_flv_module \

  --with-http_stub_status_module \

  --with-http_gzip_static_module \

  --http-client-body-temp-path=/var/tmp/nginx/client/ \

  --http-proxy-temp-path=/var/tmp/nginx/proxy/ \

  --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \

  --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \

  --http-scgi-temp-path=/var/tmp/nginx/scgi \

  --with-pcre \

  --with-http_realip_module \

  --without-http_memcached_module



# make && make install


說明:如果想使用nginx的perl模塊,可以通過爲configure腳本添加--with-http_perl_module選項來實現,但目前此模塊仍處於實驗性使用階段,可能會在運行中出現意外,因此,其實現方式這裏不再介紹。如果想使用基於nginx的cgi功能,也可以基於FCGI來實現,具體實現方法請參照網上的文檔。


3、爲nginx提供SysV init腳本:


新建文件/etc/rc.d/init.d/nginx,內容如下:

#!/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/local/nginx/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=$?

    echo

    [ $retval -eq 0 ] && rm -f $lockfile

    return $retval

}

 

restart() {

    configtest || return $?

    stop

    sleep 1

    start

}

 

reload() {

    configtest || return $?

    echo -n $"Reloading $prog: "

    killproc $nginx -HUP

    RETVAL=$?

    echo

}

 

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

        $1

        ;;

    restart|configtest)

        $1

        ;;

    reload)

        rh_status_q || exit 7

        $1

        ;;

    force-reload)

        force_reload

        ;;

    status)

        rh_status

        ;;

    condrestart|try-restart)

        rh_status_q || exit 0

            ;;

    *)

        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"

        exit 2

esac


而後爲此腳本賦予執行權限:

# chmod +x /etc/rc.d/init.d/nginx


添加至服務管理列表,並讓其開機自動啓動:

# chkconfig --add nginx

# chkconfig nginx on


而後就可以啓動服務並測試了:

# service nginx start



二、安裝mysql-5.5.33-linux2.6-x86_64.tar.gz


1、準備數據存放的文件系統


新建一個邏輯卷,並將其掛載至特定目錄即可。這裏不再給出過程。


這裏假設其邏輯卷的掛載目錄爲/mydata,而後需要創建/mydata/data目錄做爲mysql數據的存放目錄。

cd 

2、新建用戶以安全方式運行進程:


# groupadd -r mysql

# useradd  -r -s /sbin/nologin -M -d /sobey/mysqldata mysql

# chown -R mysql:mysql /sobey/mysqldata


mkdir -p /sobey/mysqldata/{data,tmp,run,binlogs,log,relaylogs}


chown -R mysql:mysql  /sobey/mysqldata/{data,tmp,run,binlogs,log,relaylogs}

3、安裝並初始化mysql-5.5.28


首先下載平臺對應的mysql版本至本地,這裏是32位平臺,因此,選擇的爲mysql-5.5.28-linux2.6-i686.tar.gz,其下載位置爲ftp://172.16.0.1/pub/Sources/mysql-5.5。


# tar xf mysql-5.5.28-linux2.6-i686.tar.gz -C /usr/local

# cd /usr/local/

# ln -sv mysql-5.5.24-linux2.6-i686  mysql

# cd mysql 


# chown -R mysql:mysql  .

# scripts/mysql_install_db --user=mysql --datadir=/sobey/mysqldata

# chown -R root  .


4、爲mysql提供主配置文件:


# cd /usr/local/mysql

# cp support-files/my-large.cnf  /etc/my.cnf


並修改此文件中thread_concurrency的值爲你的CPU個數乘以2,比如這裏使用如下行:

thread_concurrency = 2


另外還需要添加如下行指定mysql數據文件的存放位置:

datadir = /mydata/data



5、爲mysql提供sysv服務腳本:


# cd /usr/local/mysql

# cp support-files/mysql.server  /etc/rc.d/init.d/mysqld


添加至服務列表:

# chkconfig --add mysqld

# chkconfig mysqld on


而後就可以啓動服務測試使用了。



爲了使用mysql的安裝符合系統使用規範,並將其開發組件導出給系統使用,這裏還需要進行如下步驟:


6、輸出mysql的man手冊至man命令的查找路徑:


編輯/etc/man.config,添加如下行即可:

MANPATH  /usr/local/mysql/man


7、輸出mysql的頭文件至系統頭文件路徑/usr/include:


這可以通過簡單的創建鏈接實現:

# ln -sv /usr/local/mysql/include  /usr/include/mysql


8、輸出mysql的庫文件給系統庫查找路徑:


# echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf


而後讓系統重新載入系統庫:

# ldconfig


9、修改PATH環境變量,讓系統可以直接使用mysql的相關命令。具體實現過程這裏不再給出。

echo ‘export PATH=/usr/local/mysql/bin:"$PATH"’ > /etc/profile.d/mysql.sh


三、編譯安裝php-5.4.4


1、解決依賴關係:


請配置好yum源(可以是本地系統光盤)後執行如下命令:

# yum -y groupinstall "X Software Development" 


如果想讓編譯的php支持mcrypt、mhash擴展和libevent,此處還需要下載ftp://172.16.0.1/pub/Sources/ngnix目錄中的如下幾個rpm包並安裝之:

libmcrypt-2.5.8-9.el6.x86_64.rpm

libmcrypt-devel-2.5.8-9.el6.x86_64.rpm

mhash-0.9.9.9-3.el6.x86_64.rpm

mhash-devel-0.9.9-1.el5.centos.i386.rpm

mcrypt-2.6.8-10.el6.x86_64.rpm


yum install -y  "libxml2-devel" "Server Platform Development"  "bzip2-devel"  curl-devel

# yum install    

最好使用升級的方式安裝上面的rpm包,命令格式如下:

# rpm -Uvh 



另外,也可以根據需要安裝libevent,系統一般會自帶libevent,但版本有些低。因此可以升級安裝之,它包含如下兩個rpm包。

libevent-2.0.18-2.fc18.x86_64.rpm

libevent-devel-2.0.18-2.fc18.x86_64.rpm


說明:libevent是一個異步事件通知庫文件,其API提供了在某文件描述上發生某事件時或其超時時執行回調函數的機制,它主要用來替換事件驅動的網絡服務器上的event loop機制。目前來說, libevent支持/dev/poll、kqueue、select、poll、epoll及Solaris的event ports。


2、編譯安裝php-5.4.4


首先下載源碼包至本地目錄,下載位置ftp://172.16.0.1/pub/Sources/new_lamp。


# tar xf php-5.4.4.tar.bz2

# cd php-5.4.4

#  

 

 ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-openssl --enable-fpm --enable-sockets --enable-sysvshm  --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib-dir --with-libxml-dir=/usr --enable-xml --with-mhash --with-mcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2 --with-curl --enable-soap --enable-mbregex --with-gd --enable-gd-native-ttf --disable-rpath --enable-inline-optimization --enable-ftp --enable-zip --enable-opcache=no --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd

 

說明:如果前面第1步解決依賴關係時安裝mcrypt相關的兩個rpm包,此./configure命令還可以帶上--with-mcrypt選項以讓php支持mycrpt擴展。--with-snmp選項則用於實現php的SNMP擴展,但此功能要求提前安裝net-snmp相關軟件包。

如果想拆分LEMP 編譯php 前必須安裝mysql

# make

# make test

# make intall


爲php提供配置文件:

# cp php.ini-production /etc/php.ini


爲php-fpm提供Sysv init腳本,並將其添加至服務列表:

# cp sapi/fpm/init.d.php-fpm  /etc/rc.d/init.d/php-fpm

# chmod +x /etc/rc.d/init.d/php-fpm

# chkconfig --add php-fpm

# chkconfig php-fpm on


爲php-fpm提供配置文件:

# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf 


編輯php-fpm的配置文件:

# vim /usr/local/php/etc/php-fpm.conf

配置fpm的相關選項爲你所需要的值,並啓用pid文件(如下最後一行):

pm.max_children = 150

pm.start_servers = 8

pm.min_spare_servers = 5

pm.max_spare_servers = 10

pid = /usr/local/php/var/run/php-fpm.pid 


接下來就可以啓動php-fpm了:

# service php-fpm start


使用如下命令來驗正(如果此命令輸出有中幾個php-fpm進程就說明啓動成功了):

# ps aux | grep php-fpm



四、整合nginx和php5


1、編輯/etc/nginx/nginx.conf,啓用如下選項:

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;

        }


2、編輯/etc/nginx/fastcgi_params,將其內容更改爲如下內容:

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格式的主頁,類似如下:

location / {

            root   html;

            index  index.php index.html index.htm;

        }

        

而後重新載入nginx的配置文件:

# service nginx reload


3、在/usr/html新建index.php的測試頁面,測試php是否能正常工作:

# cat > /usr/html/index.php << EOF

<?php

phpinfo();

?>


接着就可以通過瀏覽器訪問此測試頁面了。



五、安裝xcache,爲php加速:


1、安裝

# tar xf xcache-2.0.0.tar.gz

# cd xcache-2.0.0

# /usr/local/php/bin/phpize

# ./configure --enable-xcache --with-php-config=/usr/local/php/bin/php-config

# make && make install


安裝結束時,會出現類似如下行:

Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-zts-20100525/


Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/

2、編輯php.ini,整合php和xcache:


首先將xcache提供的樣例配置導入php.ini

# mkdir /etc/php.d

# cp xcache.ini /etc/php.d


說明:xcache.ini文件在xcache的源碼目錄中。


接下來編輯/etc/php.d/xcache.ini,找到zend_extension開頭的行,修改爲如下行:

zend_extension = /usr/local/php/lib/php/extensions/no-debug-zts-20100525/xcache.so


注意:如果php.ini文件中有多條zend_extension指令行,要確保此新增的行排在第一位。


3、重新啓動php-fpm

# service php-fpm restart



六、補充說明


如果要在SSL中使用php,需要在php的location中添加此選項:


fastcgi_param HTTPS on;





補充閱讀材料:


Events is one of paradigms to achieve asynchronous execution. But not all asynchronous systems use events. That is about semantic meaning of these two - one is super-entity of another.


epoll and aio use different metaphors:


epoll is a blocking operation (epoll_wait()) - you block the thread until some event happens and then you dispatch the event to different procedures/functions/branches in your code.


In AIO you pass address of you callback function (completion routine) to the system and the system calls your function when something happens.


Problem with AIO is that your callback function code runs from system thread and so on top of system stack. A few problems with that as you can imagine.


LEMP 分開各個節點

1 php 節點 需要安裝mysql

2 指定 nginx php-fpm 各個監聽地址 並且寫iptables 只允許前端服務器訪問 php-fpm 9000 端口。 

3 網站頁面放在 php 服務器,最好共享訪問


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章