編譯軟體的過程與經驗:
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