天天看點

LNMP架構服務

編譯軟體的過程與經驗:

1,./configure  通過指定參數,來确認你想要安裝的軟體安裝在哪裡,加上哪些功能和去掉哪些功能(如果這一步報錯,基本都是缺少依賴包;

解決方法:使用yum去安裝,一般來說,rhel做為一個成熟的linux作業系統,常見的底層依賴包都自帶了,是以去安裝下面這兩個組,一般都會有你所需要的依賴包。

# yum groupinstall "Development tools" -y

# yum groupinstall "Desktop Platform Development" -y

如果缺少依賴包在rhel的yum源裡找不到,則上網下載下傳第三方的軟體,先編譯第三方軟體,再編譯本軟體

2,make   相當于是把你上一步定義好的,把這個軟體給做出來(這一步一般很少出錯,如果出錯,問題都比較麻煩。可能是一些相容性的問題等等,你可以嘗試上網查詢解決方法,如果查不到,隻能換個環境或者換個軟體版本或者換些編譯參數重新編譯)

3, make install  把做好的軟體,安裝到你第一步所指定的安裝目錄裡(這一步幾

乎不會出錯的)

--------------------------------

讨論1:

關于./configure參數選擇的基本方法:

./configure --help 檢視所有的編譯參數

第一個重要參數

--prefix=    此參數指定安裝目錄(一般安裝到/usr/local/或者/usr/local/軟體名下)

第二類重要參數:

--enable-xxx    打開一個功能(預設是關閉的)

--disable-xxx    關閉一個功能(預設是打開的)

如果你是新手,你就不加任何功能參數,全部使用預設值。但又如果你怕少了功能造成以後需要重編,你可以加上所有的enable參數(但加得越多,錯誤機率也越大,因為調用的依賴會多,有可能會因為少包而報錯)

第三類參數:

--with-xxx=DIR    指定一個目錄,調用此目錄的功能

讨論2:

假設一個軟體abc,安裝到/usr/local和安裝到/usr/local/abc之間的差別?

安裝到/usr/local下:

優點:此軟體的指令一般會安裝到/usr/local/bin或/usr/local/sbin等;這些路徑都預設在$PATH裡,是以安裝的指令可以直接用,而不用使用絕對路徑。

    庫檔案一般都會安裝到/usr/local/lib下,是以把它加入ldconfig,以後所有安裝在此目錄的庫檔案都可以被找到。

缺點:不友善删除,因為很多軟體都安裝到/usr/local下

安裝到/usr/local/abc下:

優缺點與上面正好相反

最終建議:小軟體一般預設安裝/usr/local/;大軟體安裝/usr/local/軟體名/下

讨論3:

關于ldconfig,一個軟體的庫檔案是有可能被其它軟體所調用,那麼其它軟體能否找到你的庫檔案呢?

一般來說,庫檔案安裝到/lib,/lib64,/usr/lib/,/usr/lib64等,都可以被找得到.那麼如果一個軟體abc把庫檔案安裝到/usr/local/abc/lib,别人想要找到,你就要把這個路徑加入到ldconfig可以找到的路徑清單裡面去。

做法為:

# vim /etc/ld.so.conf    --在這個主配置檔案裡加上一行,寫上讓别人要查找庫檔案的路徑

include ld.so.conf.d/*.conf        --或者在這裡的任意.conf結尾的子配置檔案裡加上一行也可以

/usr/local/abc/lib

# ldconfig   --上面加入路徑後,就使用此指令讓其生效

=================================================================

nginx

survey.netcraft.net

檢視各大網站使用的web伺服器,使用下面的指令

curl -I www.sina.com    

結論:現在大型網站幾乎統一都使用nginx或nginx做二次開發的版本(如tengine,OpenResty等)

nginx相對于apache的優勢?

資源占用少

支援大并發

    linux+nginx+mysql+php(fastcgi)

lnmp搭建過程

(nginx,mysql,php這三個軟體用新的編譯方法編譯順序無所謂)

編譯lnmp所有的軟體包在

筆記目錄/lnmp_soft/

Discuz_X3.2_SC_UTF8.zip        mcrypt-2.6.6.tar.gz      ngx_cache_purge-2.3.tar.gz

ImageMagick-6.7.8-9.tar.gz     memcache-2.2.7.tgz       pcre-7.9.tar.gz

imagick-3.1.2.tgz              memcached-1.4.22.tar.gz  php-5.6.12.tar.bz2

libevent-1.4.11-stable.tar.gz  mhash-0.9.9.9.tar.bz2    webbench-1.5.tar.gz

libiconv-1.13.tar.gz           mysql-5.6.26.tar.gz

libmcrypt-2.5.8.tar.bz2        nginx-1.8.0.tar.gz

隻下載下傳共享的軟體包的方法

# wget -m -np -k http://10.1.1.35/program/lnmp_soft/    --m是鏡像下載下傳,k是轉成本地連結,np表示noparent(也就是隻下載下傳目前目錄,不會下載下傳上級目錄)

編譯安裝前準備,先确認編譯所需要的依賴軟體包已經安裝    

# yum install curl-devel ncurses-devel net-snmp-* *icu* libxml2-devel  -y

第一大步:

編譯mysql

mysql-5.6.26.tar.gz

# rm /mysqldata56 -rf

# rm /usr/local/mysql  -rf

# rm /usr/src/mysql-*/ -rf

--删除以前編譯過的,重新編譯

# yum install cmake

# tar xvf mysql-5.6.26.tar.gz -C /usr/src/

# cd /usr/src/mysql-5.6.26/

# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=gbk,gb2312 -DENABLED_LOCAL_INFILE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1

# make ;make install

安裝後

1,手動編寫my.cnf配置檔案

# mkdir /usr/local/mysql/etc

# vim /usr/local/mysql/etc/my.cnf

[mysqld]

port=3307

datadir=/mysqldata56

pid-file=/mysqldata56/mysql56.pid

socket=/mysqldata56/mysql56.socket

log-error=/mysqldata56/mysql56-err.log

user=mysql

[client]

2:建立相關目錄,并修改權限

# mkdir /mysqldata56

# chown mysql.mysql  /mysqldata56  /usr/local/mysql/ -R

3:初始化資料庫

# /usr/local/mysql/scripts/mysql_install_db --defaults-file=/usr/local/mysql/etc/my.cnf --user=mysql --basedir=/usr/local/mysql/

4:啟動服務

# /usr/local/mysql/bin/mysqld_safe --defaults-file=/usr/local/mysql/etc/my.cnf &

5:登入

# /usr/local/mysql/bin/mysql

第二大步:編譯安裝php

編譯之前,确認把以前編譯過的給删除

# rm -rf /usr/src/lnmp

# rm -rf /usr/local/php

1,在安裝php之前,先安裝php擴充包,這些包是rpm裡沒有自帶,是以這裡還是編譯一下

            libiconv-1.13.tar.gz  --語言編碼轉換

# mkdir /usr/src/lnmp/        --我這裡自己專門建立一個目錄存放lnmp項目的所有源碼

# tar xvf libiconv-1.13.tar.gz -C /usr/src/lnmp/

# cd /usr/src/lnmp/libiconv-1.13/

#    ./configure ;make ;make install

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

#    /sbin/ldconfig

            pcre-7.9.tar.gz      --perl相容正規表達式,或者使用rpm自帶的也可以(yum install pcre pcre-devel -y)

# tar xvf pcre-7.9.tar.gz -C /usr/src/lnmp/

# cd /usr/src/lnmp/pcre-7.9/

# tar xf php-5.6.12.tar.bz2 -C /usr/src/lnmp/

# cd /usr/src/lnmp/php-5.6.12/

# ./configure --prefix=/usr/local/php/ --with-config-file-path=/usr/local/php/etc --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --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-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl  --enable-mbregex --enable-fpm --enable-mbstring  --enable-ftp --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets  --with-xmlrpc --enable-zip --enable-soap --with-gettext --enable-mysqlnd --with-pcre-dir=/usr/local/  --enable-opcache

# make

# make install

--上面的編譯參數要注意的幾點;

一,php安裝路徑這一次不是預設的/usr/local,我換成了/usr/local/php,你不換也是可以的,我這裡隻是不想去覆寫以前的lamp編譯到/usr/local下的php

二,with-pcre-dir是指定pcre庫的路徑,因為我前面使用的是編譯版本的pcre,路徑裝到/usr/local/下

三,with-pdo-mysql是指定php與mysql的連接配接,以前pdo-mysql是得去php官網單獨下載下傳安裝的,較新的php版本都自帶了,用這個參數指定mysql的路徑就可以了

四,with-config-file-path這是指定php.ini配置檔案的路徑,沒有使用預設的路徑,這一步也是可選的,無論你指定到哪,後面的過程要使用php.ini,路徑與你現在編譯的對應好就行

五:--enable-fpm參數是支援php的fastcgi模式

六:關于--with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd

三個參數的說明

傳統的安裝php的方式中,我們在編譯PHP時,一般需要指定以下幾項:

--with-mysql=/usr/local/mysql

--with-mysqli=/usr/local/mysql/bin/mysql_config

--with-pdo-mysql=/usr/local/mysql

這實際上就是使用了mysql官方自帶的libmysql驅動, 這是比較老的驅動, PHP 5.3開始已經不建議使用它了, 而建議使用mysqlnd

因為mysqlnd内置于PHP源代碼,故你在編譯安裝php時就不需要預先安裝mysql server也可以提供mysql client API (mysql_connect, pdo , mysqli),這樣就可以實作不用安裝mysql,也可以編譯php(上次講lamp時講的先裝mysql,再編php,最後不用mysql,而用遠端的另一個mysql的做法為老的做法)

把上面的三個參數換為--with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd 就可以了

-----------------------------------------------

編譯php時可能會出現的幾種錯誤總結:

錯誤一:

# ./configure時報下面的錯誤

configure: error: Don't know how to define struct flock on this system, set --enable-opcache=no

解決方法:

# ln -s /usr/local/mysql/lib/libmysqlclient.so /usr/lib/

# ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib/libmysqlclient.so.18

# ldconfig

--或者echo /usr/local/mysql/lib >> /etc/ld.so.conf.d/lnmp.conf && ldconfig

錯誤二:

# ./configure之後如果直接make會報下面的錯誤

collect2: ld returned 1 exit status

make: *** [sapi/cli/php] Error 1

--就最好删掉php的源碼目錄,再重新解壓,重新編譯,使用下面的參數來編譯

# make ZEND_EXTRA_LIBS='-liconv'

錯誤三:

chmod: cannot access `ext/phar/phar.phar': No such file or directory"

# cp ext/phar/phar.php ext/phar/phar.phar

------------------------------------------------

2,php成功安裝後,繼續安裝php第三方子產品

安裝緩存子產品memcache

# tar xvf memcache-2.2.7.tgz -C /usr/src/lnmp/

# cd /usr/src/lnmp/memcache-2.2.7/

# /usr/local/php/bin/phpize     --用phpize生成編譯的configure檔案。注意使用的路徑要為編譯的/usr/local/php的路徑;

    phpize prepare a PHP extension for compiling

如果你不用phpize,你的這個目錄裡根本就沒有configure這個檔案

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

注意安裝資訊

Libraries have been installed in:

   /usr/src/lnmp/memcache-2.2.7/modules

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

# echo /usr/src/lnmp/memcache-2.2.7/modules/ >> /etc/ld.so.conf.d/lnmp.conf

安裝繪圖引擎子產品p_w_picpathmagick,與GD類似

# tar xf ImageMagick-6.7.8-9.tar.gz -C /usr/src/lnmp/

# cd /usr/src/lnmp/ImageMagick-6.7.8-9/

#    ./configure

#    make;make install

安裝imagick(連接配接php與p_w_picpathmagick的通道)

# tar xf imagick-3.1.2.tgz -C /usr/src/lnmp/

# cd /usr/src/lnmp/imagick-3.1.2/

# /usr/local/php/bin/phpize

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

注意安裝的庫路徑的子產品路徑資訊

   /usr/src/lnmp/imagick-3.1.2/modules

# echo /usr/src/lnmp/imagick-3.1.2/modules >> /etc/ld.so.conf.d/lnmp.conf

# /sbin/ldconfig

到此,與nginx之前要編譯的所有軟體及擴充子產品完成

驗證此目錄裡有三個安裝子產品,表示安裝OK

# ls /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/

imagick.so  memcache.so  opcache.so opcache.a

--------------------------------------------

3,拷貝并配置php配置檔案,加上前面所編譯的子產品支援

# cp /usr/src/lnmp/php-5.6.12/php.ini-production /usr/local/php/etc/php.ini

--拷配置檔案,拷的路徑是根據編譯時的--sysconfigdir參數決定的(因為,我指定安裝路徑為/usr/local/php,是以就要拷到/usr/local/php/etc/)

配置php.ini檔案加上前面安裝的擴充的子產品支援

# vim /usr/local/php/etc/php.ini

--直接在最後加上下面一段

extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/"

extension = "memcache.so"

extension = "imagick.so"

[opcache]

zend_extension = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/opcache.so"

opcache.enable=1

opcache.enable_cli=1

opcache.memory_consumption=128

opcache.optimization_level=1

opcache.interned_strings_buffer=8

opcache.max_accelerated_files=4000

opcache.revalidate_freq=60

opcache.fast_shutdown=1

opcache.save_comments=0

關于下面幾個參數的說明

opcache.memory_consumption=128    --共享記憶體大小, 這個根據你們的需求可調

opcache.interned_strings_buffer=8   --interned string的記憶體大小, 也可調

opcache.max_accelerated_files=4000   --最大緩存的檔案數目

opcache.revalidate_freq=60         --60s檢查一次檔案更新

opcache.fast_shutdown=1         --打開快速關閉, 打開這個在PHP Request Shutdown的時候回收記憶體的速度會提高

opcache.save_comments=0         --不儲存檔案或函數的注釋

------------------------------------------------------

第三大步:編譯安裝nginx

--今天使用的是穩定版1.8.0版本的nginx來做

# useradd -r -d /dev/null -s /sbin/nologin nginx    --我這裡建立一個使用者來跑nginx,不做也可以,它預設是用daemon使用者來跑

# id nginx        --nginx的uid,gid無所謂是多少

uid=493(nginx) gid=487(nginx) groups=487(nginx)

# tar xf nginx-1.8.0.tar.gz -C /usr/src/lnmp/

# cd /usr/src/lnmp/nginx-1.8.0/

# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_gzip_static_module  --with-http_stub_status_module  --with-http_ssl_module  --with-pcre=/usr/local/

--with-http_stub_status_module子產品記得要加,後面做檢視nginx狀态需要這個子產品

# ls /usr/local/nginx    --看到這些檔案,則表示nginx安裝成功

conf  html  logs  sbin

=========================================================

第四大步:配置優化php的fastcgi配置檔案,并啟動fastcgi模式的php

配置php-fpm配置檔案 (配置fastcgi)

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

--先改名,把.default去掉

        要在些配置檔案配置的選項有:    

        監聽的IP,端口或者socket

        初始化的程序數

        執行身份

        錯誤是否顯示

        打開的資源限制等

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

164 listen = /var/run/fastcgi/fastcgi.socket

534 php_flag[display_errors] = on

149 user = nginx

150 group = nginx

235 pm.max_children = 64

240 pm.start_servers = 20

255 pm.min_spare_servers = 5

250 pm.max_spare_servers = 35

261 pm.max_requests = 3000

458 rlimit_files = 65535

175 listen.owner = nginx

176 listen.group = nginx

177 listen.mode = 0660

--這三行是控制啟動fastcgi之後的socket檔案的權限(特别是新版本的php,修複了以前socket通路權限的bug,是以這裡指好權限,那麼nginx才能有權限讀取socket來通路fastcgi)

# mkdir /var/run/fastcgi

# chown nginx.nginx /var/run/fastcgi/

啟動php fastcgi程序

# /usr/local/php/sbin/php-fpm -D -y /usr/local/php/etc/php-fpm.conf

    --啟動fastcgi,直接這樣啟動,5.3.3版本之前的php需要加start參數來啟動

ls /var/run/fastcgi/        --啟動過後,就可以在/var/run/fastcgi/目錄下找到socket檔案

fastcgi.socket

# ps -ef |grep fpm    --也可以用此指令來檢視php的factcgi的程序,有20個程序,因為我在前面配置pm.start_servers = 20

--如果要關閉fpm,可以直接pkill fpm就可以了

===============================================================

第五大步:

配置nginx.conf主配置檔案

# vim /usr/local/nginx/conf/nginx.conf

user nginx  nginx;            --運作使用者群組

worker_processes  8;            --啟動ngnix的服務的工作程序數

error_log  logs/error.log  info;    --錯誤日志以及日志等級

pid        logs/nginx.pid;        --pid檔案

worker_rlimit_nofile 65535;        --能打開的最大的檔案描述符    

events {

    use epoll;            --epoll工作模式

    worker_connections  65535;    --每個程序允許打開的并發連接配接數

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    server_tokens off;    

    sendfile        on;

    tcp_nopush     on;

    keepalive_timeout  65;

    gzip  on;

    server {

        listen       8000;        --監聽的端口

        server_name  10.1.1.35;    --域名或者IP    

        charset utf8;            --字元集

            root   /lnmp/web;            --家目錄

            index  index.php index.html index.htm;    --首頁檔案

        error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            root   html;

        }

        location ~ .*\.php$ {

            fastcgi_pass    unix:/var/run/fastcgi/fastcgi.socket;--對應php-fpm.conf裡的設定

            fastcgi_index  index.php;    

            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;        --把/scripts改成$document_root,表示家目錄下的.php檔案也當會以php來執行

            include        fastcgi_params;

    }

# mkdir /lnmp/web -p    --把定義的網站家目錄也建立出來

啟動nginx

# /usr/local/nginx/sbin/nginx

reload的方法

# /usr/local/nginx/sbin/nginx -s  reload

關閉的方法

# /usr/local/nginx/sbin/nginx -s  stop

最基本的驗證:

vim /lnmp/web/index.html --建立一個首頁,去通路它

# vim /lnmp/web/test.php    --和以前lamp時一樣,在家目錄下建立一個php測試頁面來測試

<?php

        phpinfo();

?>

使用http://10.1.1.35:8000/test.php能驗證支援php,說明整個基本的lnmp搭建完成

=====================================================================

ngnix 基本配置

例 1

server {

    listen  80;   --端口

    root /web;    --使用絕對路徑配置網站家目錄

    server_name  li.cluster.com;    --綁定域名或者IP

    index  index.php index.html;  --首頁檔案

    }

例 2

虛拟主機的配置

基于ip的虛拟主機

基于端口的虛拟主機

基于域名的虛拟主機

基于ip的

    server {

        listen 80;

        server_name 10.1.1.35;

        root /web1;

        }

        server_name 10.1.1.9;

        root /web2;

        }    

基于端口的

        listen 8080;

基于域名的

需要DNS的支援

        server_name new.cluster.com;

        server_name sports.cluster.com;

例 3

通路控制的實作

寫法一:

        server_name li.cluster.com;

        root /web

        location /sports/ {

            deny 10.1.1.35;

            allow all;    --location标簽,隻拒絕35通路

            }

寫法二

        root /web;

        deny 10.1.1.35;

        allow all;    --不使用location标簽,隻拒絕35通路

寫法三;

全局控制

http  {

    deny 10.1.1.35;

    allow all;        --全局的通路控制要寫到http { }的大括号裡

例 4

在server {} 配置段裡加上下面一段

  location /nginxstatus {

                stub_status on;

                access_log      on;

                auth_basic      "nginxstatus";

        }       

通路http://10.1.1.35:8000/nginxstatus

Active connections: 3         --活動的連接配接數

server accepts handled requests

 206909 206909 207011         --共建立了206909個連接配接,成功建立206909次握手,總共處理了207011個請求

Reading: 0 Writing: 1 Waiting: 2

例五:

日志格式,和日志切割

在server {  

}    配置段裡加上下面一段日志格式的控制

   log_format main '$remote_addr - $remote_user [$time_local] "$request"'

                        '$status $body_bytes_sent "$http_referer" '

                        '"$http_user_agent" $http_x_forwarded_for';

    access_log logs/access.log  main;

通路日志的切割,把每天的access.log儲存到一個日期的目錄下

提示如何列印昨天的時間,使用-d 'yesterday'

[root@li ~]# date -d 'yesterday' +'%Y-%m-%d'

2015-08-29

vim /usr/local/nginx/sbin/nginx_logrotate.sh

logpath="/usr/local/nginx/logs"

year=`date -d 'yesterday' +'%Y'`

month=`date -d 'yesterday' +'%m'`

day=`date -d 'yesterday' +'%Y-%m-%d'`

mkdir $logpath/$year/$month   -p    

mv $logpath/access.log $logpath/$year/$month/$day.accesslog    

touch $logpath/access.log

kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`    ---USR1是一個自定義的singal,(相當于reload重新整理,在apache的日志切割腳本裡用kill -HUP)主要是mv了日志之後,讓nginx新産生一個空的日志

最後把這個寫到crontab裡,讓它每天晚上淩晨執行

crontab -e

01 0 * * *  sh  /usr/local/nginx/sbin/nginx_logrotate.sh

===================================================================

安裝Discuz論壇

Discuz_X3.2_SC_UTF8.zip

# unzip Discuz_X3.2_SC_UTF8.zip -d /lnmp/web/

# cd /lnmp/web

# mv upload/*  .

# rm upload/ -rf

然後使用firefox用下面的路徑來安裝

http://10.1.1.35:8000/install/

環境檢查這一步,有些目錄和檔案權限需要修改

# chown nginx.nginx /lnmp/web/ -R

資料庫授權

mysql> create database discuz;    --建立一個庫,用于存放将要安裝的discuz論壇的表

mysql> grant all on discuz.* to 'discuzuser'@'localhost' identified by '123';    --授權一個使用者,用于discuz論壇程式連接配接mysql

mysql> flush privileges;

安裝會出現下面的報錯

Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

解決方法1:

把mysql的配置socket路徑改成/tmp/mysql.sock

socket=/tmp/mysql.sock

改完後,重新開機mysql

解決方法2:

如果不想改,可以把原來的socket做一個軟連結到/tmp/mysql.sock

# ln -s /mysqldata56/mysql56.socket /tmp/mysql.sock

解決方法3:

不使用socket連接配接,直接在安裝界面填mysql的host為127.0.0.1:3307指定以tcp/ip協定的3307端口來連接配接

=========================================

memcache介紹與安裝

memcache是一個開源分布式的記憶體對象緩存系統(另一個類似功能的軟體叫redis).一般放在web程式與資料庫,幫助緩存程式取資料庫的資料。

            web

            |

            memcache

            mysql

libevent-1.4.11-stable.tar.gz    --memcache的事件驅動庫

memcached-1.4.22.tar.gz        --memcache主程式包(memcache官網下載下傳)

memcache-2.2.7.tgz        --php的memcache擴充包(php官網下載下傳)

上面三個軟體包,第三個在安裝php第三方擴充子產品時就已經安裝并支援了,是以下面繼續安裝另兩個軟體包

# tar xf libevent-1.4.11-stable.tar.gz -C /usr/src/lnmp

# cd /usr/src/lnmp/libevent-1.4.11-stable/

# ./configure ;make ;make install

# tar xf memcached-1.4.22.tar.gz -C /usr/src/lnmp

# cd /usr/src/lnmp/memcached-1.4.22/

# ./configure --with-libevent=/usr/local/ ;make ;make install

# /usr/local/bin/memcached -d -m 100 -u root    --啟動memcached守護程序,-d表示啟動daemon,-m 100表示配置設定100MB記憶體給memcached做緩存,-u root指定以root使用者來跑這個daemon

關閉方法(kill -TERM PID)

# lsof -i:11211        --預設端口為11211

COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

memcached 28795 root   26u  IPv4 268755      0t0  TCP *:memcache (LISTEN)

memcached 28795 root   27u  IPv6 268756      0t0  TCP *:memcache (LISTEN)

memcached 28795 root   28u  IPv4 268759      0t0  UDP *:memcache

memcached 28795 root   29u  IPv4 268759      0t0  UDP *:memcache

memcached 28795 root   30u  IPv4 268759      0t0  UDP *:memcache

memcached 28795 root   31u  IPv4 268759      0t0  UDP *:memcache

memcached 28795 root   32u  IPv6 268760      0t0  UDP *:memcache

memcached 28795 root   33u  IPv6 268760      0t0  UDP *:memcache

memcached 28795 root   34u  IPv6 268760      0t0  UDP *:memcache

memcached 28795 root   35u  IPv6 268760      0t0  UDP *:memcache

測試:做完上面的步驟,其實你的工作基本就完成了,隻需要告訴php開發人員,你的memcache的端口和IP,他們就可以寫程式連接配接了

# vim /lnmp/web/memcachetest.php    --在家目錄下做一個測試頁面,使用firefox通路這個頁面,如果能顯示This is a test!,則表示成功

$mem = new Memcache;

$mem->connect("127.0.0.1", 11211);

$mem->set('key', 'This is a test!', 0, 60);

$val = $mem->get('key');

echo $val;

測試memcache方法一

(開memcache顯示,關閉memcache不能顯示)

;extension = "memcache.so"        --前面加;符号注釋來模拟關閉

# pkill fpm

--再使用這兩句把php的fastcgi重新開機,使之生效

測試memcache方法二

關閉memcache的11211,上面的This is a test!就無法顯示.打開就OK

-----------------

上面是安裝完memcached後,可以讓開發人員使用。

如果是象discuz這種開源論壇安裝完後,我沒有開發能力,如何讓discuz使用memcache?

使用安裝時的admin使用者和密碼登陸背景http://172.16.2.35:8000/admin.php

點全局--》性能優化--》記憶體優化

可以看到memcache是支援,但是關閉的

把關閉狀态改成打開的方法為:

# vim /lnmp/web/config/config_global.php

 25 $_config['memory']['memcache']['server'] = '127.0.0.1';    --把這個IP127.0.0.1配上(如果memcache在另一台機器上,就寫它的IP)

儲存後,再重新整理背景的記憶體優化界面狀态就變為打開了

====================================================================

補充一:

如果你編譯安裝好的lnmp在安裝某個應用時,出現了php子產品功能(或者叫extension擴充)缺失的報錯,如何解決?

例:

我今天前面的php編譯參數裡并沒有加--enable-mcrypt這個編譯參數,是以并不支援mcrypt這個功能

可以通過三個方法來驗證:

1,安裝一個需要使用mcrypt功能的應用,就會告訴你缺少此功能(但這樣比較麻煩,是以這裡我選擇後面兩種)

2,通路http://172.16.2.35:8000/test.php,查找mcrypt功能,發現沒有支援mcrypt

3,使用/usr/local/bin/php -m 指令顯示所有php支援的extension擴充,發現沒有支援mcrypt

解決方法:

第一種方法:重新編譯php,在原來參數基礎上加上--enable-mcrypt

第二種方法:不需要重編譯php(也分兩種情況自帶擴充或第三方擴充)

1,ls /usr/src/lnmp/php-5.6.12/ext/ 看一下php的安裝源碼目錄下的ext子目錄裡,這裡就有自帶的各種php擴充,如果你少了一個第三方的,那麼就直接下載下傳相關的軟體包,編譯安裝成xxx.so,然後修改php.ini配置檔案,加上這個so的支援就可以了

2,如果是/usr/src/lnmp/php-5.6.12/ext/目錄裡有的擴充,那麼可以不用重編php,編譯這個擴充,并加上此功能

(我這裡以增加mcrypt擴充功能為例,操作過程如下:)

先安裝mcrypt的依賴包mhash和libmcrypt(但rhel6.5沒有自帶,需要第三方下載下傳再安裝)

            mhash-0.9.9.9.tar.bz2

# tar xvf mhash-0.9.9.9.tar.bz2 -C /usr/src/lnmp/

# cd /usr/src/lnmp/mhash-0.9.9.9/

            libmcrypt-2.5.8.tar.bz2

# tar xvf libmcrypt-2.5.8.tar.bz2 -C /usr/src/lnmp/

# cd /usr/src/lnmp/libmcrypt-2.5.8/

# cd /usr/src/lnmp/php-5.6.12/ext/mcrypt/

# /usr/local/php/bin/phpize        --目錄預設沒有configure檔案,需要使用你安裝的對應版本phpize指令執行一下,才會出現configure

# ls /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/mcrypt.so

--産生了mcrpyt.so,表示安裝成功

# vim /usr/local/php/etc/php.ini    --在配置檔案最後加上擴充的資訊(這裡順便把opcache擴充也加上了)

extension = mcrypt.so

最後重新開機php的fastcgi

# /usr/local/php/bin/php -m |grep mcrypt    --可以驗證php支援了mcrypt擴充

mcrypt

======================================

補充二:

一個web應用做好後,需要做一下測試,但一般要注意以下幾點:

1,壓力測試工作應該放到産品上線之前,而不是上線以後

2,測試時盡量跨公網進行,而不是内網

3,測試時并發應當由小逐漸加大,比如并發100時觀察一下網站負載是多少、打開是否流程,并發200時又是多少、網站打開緩慢時并發是多少、網站打不開時并發又是多少

4,應盡量進行單元測試,如B2C網站可以着重測試購物車、推廣頁面等,因為這些頁面占整個網站通路量比重較大

我們這裡是内網做一些基本測試比較來說明lnmp的原理

測試工具

1,ab指令  apache自帶

2,webbench  

# tar xf 筆記目錄/lnmp_soft/webbench-1.5.tar.gz -C /usr/src/lnmp/

# cd /usr/src/lnmp/webbench-1.5/

測試一:測試opcache(php代碼緩存加速軟體,以前有叫apc,xcache,eaccelerator,zend opimizer等等很多)

有支援opcache的lnmp做如下測試

# ab -n 1000 -c 1000 http://172.16.2.35:8000/index.php

Concurrency Level:      1000

Time taken for tests:   0.122 seconds

Complete requests:      1000

Failed requests:        853

   (Connect: 0, Receive: 0, Length: 853, Exceptions: 0)

Write errors:           0

Non-2xx responses:      1000

Total transferred:      646678 bytes

HTML transferred:       458061 bytes

Requests per second:    8226.05 [#/sec] (mean)

Time per request:       121.565 [ms] (mean)

Time per request:       0.122 [ms] (mean, across all concurrent requests)

Transfer rate:          5194.93 [Kbytes/sec] received

# webbench -c 1000 http://172.16.2.35:8000/index.php

Webbench - Simple Web Benchmark 1.5

Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.

Benchmarking: GET http://172.16.2.35:8000/index.php

1000 clients, running 30 sec.

Speed=492092 pages/min, 2901688 bytes/sec.

Requests: 246001 susceed, 45 failed.

# vim /usr/local/php/etc/php.ini  --把opcache相關配置注釋掉然後重新開機php

沒有支援opcache的lnmp做如下測試

Time taken for tests:   0.197 seconds

Failed requests:        158

   (Connect: 0, Receive: 0, Length: 158, Exceptions: 0)

Total transferred:      640892 bytes

HTML transferred:       452154 bytes

Requests per second:    5070.76 [#/sec] (mean)

Time per request:       197.209 [ms] (mean)

Time per request:       0.197 [ms] (mean, across all concurrent requests)

Transfer rate:          3173.64 [Kbytes/sec] received

Speed=309968 pages/min, 2615130 bytes/sec.

Requests: 154966 susceed, 18 failed.

--測試結論:有opcache的性能好(因為我這裡是nginx,加上資源比較充足,是以測試結果差異不大)

課後測試實踐:

1,在相同的機器上安裝lamp和安裝lnmp,都安裝同一個論壇,然後使用測試工具分别對其測試,然後比較結果

2,lnmp裡discuz論壇打開memcache和關閉memcache的測試比較

補充三:

把單機lnmp分離成多機

你可以把nginx,mysql,php分成三台伺服器都可以(或者把nginx和php做成一台)

跟單機lnmp的差別在于:

1,php的編譯如果用下面的參數,那麼編譯沒什麼差別,遠端一樣可以讓php支援mysql

--with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd

2,在安裝論壇時,mysql授權時要寫php的IP

# grant all on discuz.* to 'discuzuser'@'PHP伺服器IP' identified by '123';

# flush privileges;

3,在安裝論壇的web頁面,寫mysql在哪裡,要寫mysql的IP加端口,而不是localhost

繼續閱讀