Linux自學筆記——LNMP

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

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

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

       Nginx會按需同時運行多個進程:一個主進程(master)和幾個工作進程(worker),配置了緩存時還會有緩存加載器進程(cache loader)和緩存管理器進程(cache manager)等。所有進程均是僅含有一個線程,並主要通過“共享內存”的機制實現進程間通信。主進程以root用戶身份運行,erworker、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或uwcgi協議與upstream服務器通信,以及與mencached建立會話等。

 

以下手動編譯安裝部署LNMP環境:

一、        安裝nginx;

1.      解決依賴關係

編譯安裝nginx需要實現安裝開發包組“Development Tools”和“Server Platform Development”。同時還需安裝pcre-devel,zlib-devel,openssl-devel依賴包,不過一般只需安裝pcre-devel包,其它兩個包已經安裝;

實現安裝/var/tmp/nginx此目錄,不然啓動nginx會出錯;

2.      安裝;

        1)      添加用戶和組,實現以之運行nginx進程;

            # groupadd -r nginx

            # useradd -r -g nginx nginx

          image.png

        2)      解壓縮源碼包,並進入目錄;

          image.png

        3)      用命令./configure --help可以查看安裝選項;

         image.png   

        4)      編譯安裝;

        # ./configure \

          --prefix=/usr/local/nginx \

          --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

          image.png

            # make && make install

     

       Note:如果想使用nginx的perl模塊,可以編譯時添加—with-http_perl_module選項來實現;

        5)      提供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/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/nginx.lock

         

        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

        6)      爲此腳本添加執行權限;

          image.png

        7)      添加服務管理列表,並讓其開啓自動啓動;

          image.png

        8)      啓動服務並測試

         image.png 

 

二、        安裝mariadb-5.5.46(通過二進制方式)

1.      準備數據存放目錄;

    image.png

2.      創建用戶和組,實現運行進程;

    image.png

3.      編譯安裝;

        1)      解壓縮源碼包到指定目錄/usr/local下,創建軟連接mysql並進入mysql目錄;

         image.png   

        2)      修改目錄內文件屬主屬組;

         image.png

        3)      運行腳本,生成元數據庫;指明用戶和數據路存放位置;

         image.png 

4.      爲mysql提供主配置文件;

        1)      複製文件;

        image.png

        2)      編輯配置文件/etc/my.cnf,添加或修改一下內容;

        image.png

5.      爲mysql提供Sysv init服務腳本,以下包括添加執行權限和添加服務列表並測試使用;

 image.png  

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

6.      輸出mysql的man手冊至man命令查找路徑;

編輯/etc/man.config,添加如下行;

    image.png

7.      輸出mysql頭文件至系統頭文件路徑下/usr/include;可以通過簡單的創建鏈接實現;

   image.png 

8.      輸出mysql的庫文件給系統查找路徑;

   image.png

9.      修改PATH環境變量,讓系統可以直接使用mysql相關命令。

   image.png

測試:

  image.png 

至此,mariadb全部安裝完成;

 

三、        安裝php-5.4.26(以fpm方式)

1.      解決依賴關係

首先配置號yum源(系統安裝及epel源)後執行如下命令

# yum -y groupinstall "Desktop Platform Development"

# yum -y install bzip2-devel libmcrypt-devel libxml2-devel

2.      編譯安裝php-5.4.26

        1)      解壓源碼壓縮文件,並進入解壓後的目錄;

         image.png

        2)      編譯安裝;

        ./configure --prefix=/usr/local/php-fpm --with-mysql=/usr/local/mysql --with-openssl --enable-fpm --enable-sockets --enable-sysvshm  --with-mysqli=/usr/local/mysql/bin/mysql_config --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

        # make && make install

3.      爲php提供配置文件

  image.png 

4.      配置php-fpm

        1)      爲php-fpm提供Sysv init服務腳本,並添加至服務列表;

         image.png

        2)      爲php-fpm提供配置文件;

         image.png  

        3)      編輯此配置文件;

            配置fpm的相關選項的值,並啓用pid文件;

           image.png 

            啓用pid文件,去除分號即可啓用:

           image.png

        4)      啓動服務並測試;

           image.png


四、        整合nginx和php-fpm

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

    image.png

Note:有的需要將/scripts替換爲root絕對路徑;這裏可將/scripts替換爲/usr/local/nginx/html

2.      在所支持的主頁面格式中添加php格式的主頁;

    image.png

3.      新建index.php測試頁面,測試php能否正常工作;

    image.png

4.      測試;

   image.png 

 

五、        安裝xcache,爲php加速;

具體步驟可參看本人博客編譯安裝lamp;

六、        補充說明;

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

fastcgi_param  HTTPS  on;


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