1、前提說明
php
一、實驗目的css
實現動靜分享的LNMMP網站
html
二、實現功能前端
(1)前端nginx服務器(172.16.7.10)處理靜態內容並向後轉發動態內容
python
(2)php服務器(172.16.7.100)處理動態內容mysql
(3)數據庫爲MariaDB,版本爲mariadb-10.0.10,IP:172.16.7.200linux
(4)在動態系統中,爲了減少數據庫的壓力,提升性能,增長memcached服務器(172.16.7.201)nginx
三、實驗拓撲web
簡單實驗拓撲以下(由於都在一個網絡內測試,因此前端nginx只給了一個IP):
sql
2、安裝nginx服務器(172.16.7.10)
一、解決依賴關係
在安裝前,爲了不一些沒必要要的麻煩,首先裝幾個開發包組:"Development Tools"、"Server Platform Development"、並安裝"pcre-devel包"
二、添加nginx用戶,實現以nginx用戶運行nginx服務進程
# groupadd -r nginx # useradd -r -g nginx nginx |
三、編譯安裝
# ./configure \ --prefix=/usr/local/nginx \ #指定安裝路徑 --sbin-path=/usr/local/nginx/sbin/nginx \ #指定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 \ #指定pid文件路徑 --lock-path=/var/lock/nginx.lock \ #指定鎖文件路徑 --user=nginx \ #指定以nginx用戶運行進程 --group=nginx \ --with-http_ssl_module \ #添加ssl模塊 --with-http_flv_module \ #添加流媒體模塊 --with-http_stub_status_module \ #添加服務器狀態信息模塊 --with-http_gzip_static_module \ #添加gzip壓縮模塊 --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/ \ #指定fcgi臨時目錄 --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \ #指定uwsgi臨時目錄(反向代理python開發的頁面) --http-scgi-temp-path=/var/tmp/nginx/scgi \ #另外一種反向代理用戶請求的協議 --with-pcre #指定pcre # make && make install #安裝 |
四、爲nginx提供SysV風格的腳本
新建文件/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 |
六、把nginx服務添加至服務管理器,並讓其開機自動啓動
# chkconfig --add nginx # chkconfig nginx on |
七、啓動服務並測試
# service nginx start [root@nmshuishui ~]# ss -antlp | grep nginx LISTEN 0 128 *:80 *:* users:(("nginx",4724,6),("nginx",4726,6)) |
3、安裝MariaDB(172.16.7.200)
一、二進制安裝包
mariadb-10.0.10-linux-x86_64.tar.gz |
二、安裝步驟請參考我在LAMP博文中的連接
http://nmshuishui.blog.51cto.com/1850554/1381822
4、安裝php服務器(172.16.7.100)
一、安裝nginx服務器
同上第二步,安裝完後測試一下
二、安裝php服務器
(1)解決依賴關係
事先已安裝開發包組"Desktop Platform Development"
yum -y install libmcrypt libmcrypt-devel mhash mhash-devel mcrypt |
(2)編譯安裝php-5.4.4
安裝完上面那幾個還有報錯,根據提示又安裝了這幾個
[root@shuishui php-5.4.4]# yum -y install libcurl-devel bzip2-devel libmcrypt-devel |
接下來再次編譯安裝
[root@shuishui php-5.4.4]# ./configure --prefix=/usr/local/php --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 --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd
(3)安裝
[root@shuishui php-5.4.4]# make && make install |
(4)爲php提供配置文件
[root@shuishui php-5.4.4]# cp php.ini-production /etc/php.ini |
(5)爲php-fpm提供Sysv腳本,並將其添加到服務列表
[root@shuishui php-5.4.4]# cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm [root@shuishui php-5.4.4]# chmod +x /etc/rc.d/init.d/php-fpm [root@shuishui php-5.4.4]# chkconfig --add php-fpm [root@shuishui php-5.4.4]# chkconfig php-fpm on |
(6)爲php-fpm提供配置文件
[root@shuishui php-5.4.4]# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
(7)編輯php-fpm配置文件,配置fpm的相關選項,並啓用pid
[root@shuishui ~]# vim /usr/local/php/etc/php-fpm.conf 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 listen = 172.16.7.100:9000 |
(8)啓動php-fpm並驗證
[root@shuishui ~]# service php-fpm start Starting php-fpm . done [root@shuishui ~]# ps -aux | grep php-fpm Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ root 60344 2.0 0.4 99684 4880 ? Ss 01:28 0:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf) nobody 60347 0.0 0.3 99684 3732 ? S 01:28 0:00 php-fpm: pool www nobody 60348 0.0 0.3 99684 3732 ? S 01:28 0:00 php-fpm: pool www nobody 60349 0.0 0.3 99684 3732 ? S 01:28 0:00 php-fpm: pool www nobody 60350 0.0 0.3 99684 3732 ? S 01:28 0:00 php-fpm: pool www nobody 60351 0.0 0.3 99684 3736 ? S 01:28 0:00 php-fpm: pool www nobody 60352 0.0 0.3 99684 3736 ? S 01:28 0:00 php-fpm: pool www nobody 60353 0.0 0.3 99684 3736 ? S 01:28 0:00 php-fpm: pool www nobody 60354 0.0 0.3 99684 3736 ? S 01:28 0:00 php-fpm: pool www root 60356 0.0 0.0 103244 856 pts/1 S+ 01:28 0:00 grep php-fpm |
5、安裝xcache,爲php加速(172.16.7.100)
一、編譯安裝xcache
[root@shuishui ~]# tar xf xcache-3.0.1.tar.bz2 [root@shuishui ~]# cd xcache-3.0.1 [root@shuishui xcache-3.0.1]# /usr/local/php/bin/php php php-cgi php-config phpize [root@shuishui xcache-3.0.1]# /usr/local/php/bin/phpize Configuring for: PHP Api Version: 20100412 Zend Module Api No: 20100525 Zend Extension Api No: 220100525 [root@shuishui xcache-3.0.1]# ./configure --enable-xcache --with-php-config=/usr/local/php/bin/php-config
結束後,會出現以下行
---------------------------------------------------------------------- Build complete. Don't forget to run 'make test'. Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/
二、編輯php.ini,整合php和xcache
(1)首先將xcache提供的樣例配置導入php.ini
[root@shuishui xcache-3.0.1]# mkdir /etc/php.d [root@shuishui xcache-3.0.1]# cp xcache.ini /etc/php.d/ #xcache.ini文件在xcache的源碼目錄中 |
(2)接下來修改/etc/php.d/xcache.ini,找到extension開頭的行,修改成以下行:
extension = /usr/local/php/lib/php/extensions/no-debug-zts-20100525/xcache.so |
三、重啓php-fpm
[root@shuishui xcache-3.0.1]# service php-fpm restart Gracefully shutting down php-fpm . done Starting php-fpm done |
6、整合nginx和php5
一、編輯/etc/nginx/nginx.conf(172.16.7.10)
worker_processes 2; #worker進程的個數 error_log /var/log/nginx/error.log notice; #錯誤日誌路徑及級別 events { worker_connections 1024; #每一個worker可以併發響應的最大請求數 } http { include mime.types; #支持多媒體類型 default_type application/octet-stream; sendfile on; #由內核直接轉發 #keepalive_timeout 0; keepalive_timeout 5; #持久鏈接5s gzip on; #開啓壓縮功能 server { listen 80; server_name www.shuishui.com; add_header X-via $server_addr; #讓客戶端可以看到代理服務器的IP location / { root html; index index.php index.html index.htm; } location ~* \.(jpg|jpeg|png|gif|js|css)$ { #匹配以括號中結尾的格式 root html; #默認目錄在/usr/local/nginx/html } location ~ \.php$ { root html; fastcgi_pass 172.16.7.100:9000; #代理到的服務器 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME scripts$fastcgi_script_name; include fastcgi_params; } } } |
二、編輯/etc/nginx/fastcgi_params,將其內容更改成以下內容:(172.16.7.10)
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; |
三、從新載入nginx
[root@nmshuishui html]# service nginx reload nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful Reloading nginx: [ OK ] |
四、動、靜分離測試
前提:由於沒有DNS服務器,因此事先要把www.shuishui.com所對應的IP:172.16.7.10寫入到hosts文件中
(1)動態測試:在php服務器上的網頁目錄中建立index.php(172.16.7.100)
[root@shuishui html]# pwd /usr/local/nginx/html [root@shuishui html]# vim index.php <h1>Welcome to php server(172.16.7.100)</h1> <?php phpinfo(); ?> |
在windows主機上訪問www.shuishui.com
(2)靜態測試:在前端nginx服務器(172.16.7.10)的網頁目錄中放入1.png圖片
[root@nmshuishui html]# pwd /usr/local/nginx/html [root@nmshuishui html]# ls 1.png 50x.html index.html index.html1 index.php |
再到windows上去測試一下
由上面的動態、靜態測試結果可看出,根據請求的資源類型的不一樣,便可實現動、靜分離。所以,也知道了,網頁目錄須要準備兩份,前端nginx服務器和後端的php服務器各需一份
7、安裝Memcache服務器(172.16.7.201)
一、memcached簡介
Memcached是一款開源、高性能、分佈式內存對象緩存系統,可應用各類須要緩存的場景,其主要目的是經過下降對Database的訪問來加速web應用程序。它是一個基於內存的「鍵值對」存儲,用於存儲數據庫調用、API調用或頁面引用結果的直接數據,如字符串、對象等。
Memcached是一款開發工具,它既不是一個代碼加速器,也不是數據庫中間件。其設計哲學思想主要反映在以下方面:
(1)簡單key/value存儲:服務器不關心數據自己的意義及結構,只要是可序列化數據便可。存儲項由「鍵、過時時間、可選的標誌及數據」四個部分組成;
(2)功能的實現一半依賴於客戶端,一半基於服務器端:客戶負責發送存儲項至服務器端、從服務端獲取數據以及沒法鏈接至服務器時採用相應的動做;服務端負責接收、存儲數據,並負責數據項的超時過時;
(3)各服務器間彼此無視:不在服務器間進行數據同步;
(4)O(1)的執行效率
(5)清理超期數據:默認狀況下,Memcached是一個LRU緩存,同時,它按事先預訂的時長清理超期數據;但事實上,memcached不會刪除任何已緩存數據,只是在其過時以後再也不爲客戶所見;並且,memcached也不會真正定期限清理緩存,而僅是當get命令到達時檢查其時長;
二、安裝memcached服務器(172.16.7.201)
也可使用yum方式安裝,這裏使用編譯安裝
(1)安裝libevent
memcached依賴於libevent API,所以要事先安裝
# yum groupinstall "Development Tools" "Server Platform Deveopment" -y #yum install -y libevent-devel |
(2)安裝配置memcached
# tar xf memcached-1.4.15.tar.gz # cd memcached-1.4.15 # ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent # make && make install |
(3)爲memcached提供sysv腳本
#!/bin/bash # # Init file for memcached # # chkconfig: - 86 14 # description: Distributed memory caching daemon # # processname: memcached # config: /etc/sysconfig/memcached . /etc/rc.d/init.d/functions ## Default variables PORT="11211" USER="nobody" MAXCONN="1024" CACHESIZE="64" OPTIONS="" RETVAL=0 prog="/usr/local/memcached/bin/memcached" desc="Distributed memory caching" lockfile="/var/lock/subsys/memcached" start() { echo -n $"Starting $desc (memcached): " daemon $prog -d -p $PORT -u $USER -c $MAXCONN -m $CACHESIZE -o "$OPTIONS" RETVAL=$? [ $RETVAL -eq 0 ] && success && touch $lockfile || failure echo return $RETVAL } stop() { echo -n $"Shutting down $desc (memcached): " killproc $prog RETVAL=$? [ $RETVAL -eq 0 ] && success && rm -f $lockfile || failure echo return $RETVAL } restart() { stop start } reload() { echo -n $"Reloading $desc ($prog): " killproc $prog -HUP RETVAL=$? [ $RETVAL -eq 0 ] && success || failure echo return $RETVAL } case "$1" in start) start ;; stop) stop ;; restart) restart ;; condrestart) [ -e $lockfile ] && restart RETVAL=$? ;; reload) reload ;; status) status $prog RETVAL=$? ;; *) echo $"Usage: $0 {start|stop|restart|condrestart|status}" RETVAL=1 esac exit $RETVAL |
(4)配置memcached成爲系統服務
# chmod +x /etc/init.d/memcached # chkconfig --add memcached # service memcached start |
(5)查看memcached監聽端口是否成功
[root@shuishui ~]# ss -tnlp | grep 11211 LISTEN 0 128 :::11211 :::* users:(("memcached",3120,27)) LISTEN 0 128 *:11211 *:* users:(("memcached",3120,26)) |
8、安裝php的memcache擴展(172.16.7.100)
一、安裝php的memcache擴展
[root@shuishui ~]# tar xf memcache-2.2.7.tgz [root@shuishui ~]# cd memcache-2.2.7 [root@shuishui memcache-2.2.7]# /usr/local/php/bin/phpize Configuring for: PHP Api Version: 20100412 Zend Module Api No: 20100525 Zend Extension Api No: 220100525 [root@shuishui memcache-2.2.7]# ./configure --with-php-config=/usr/local/php/bin/php-config --enable-memcache …… …… [root@shuishui memcache-2.2.7]# make && make install …… …… Build complete. Don't forget to run 'make test'. Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/
二、編輯/etc/php.ini,在「動態模塊」相關的位置添加以下一行來載入memcache擴展:
extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/memcache.so |
三、重啓php-fpm
[root@shuishui ~]# service php-fpm restart Gracefully shutting down php-fpm . done Starting php-fpm done |
四、在windows客戶端驗證memcached是否安裝成功
剛纔的x-cache也安裝成功了
五、對memcached功能進行測試,在網站目錄中創建測試頁面test.php,添加以下內容
[root@shuishui html]# pwd #php服務器(172.16.7.100) /usr/local/nginx/html [root@shuishui html]# vim test.php <?php $mem = new Memcache; $mem->connect("172.16.7.201", 11211) or die("Could not connect"); $version = $mem->getVersion(); echo "Server's version: ".$version."<br/>\n"; $mem->set('hellokey', 'Hello World', 0, 600) or die("Failed to save data at the memcached server"); echo "Store data in the cache (data will expire in 600 seconds)<br/>\n"; $get_result = $mem->get('hellokey'); echo "$get_result is from memcached server."; ?> ~
在windows服務器上測試,代表memcache已經可以正常工做
由上圖能夠看出,memcached(172.16.7.201)已經能夠正常工做了,到這裏,基於動、靜分離的LNMMP就已經實現了;下一步就是安裝一個博客系統並監控其性能
9、安裝wordpress和數據庫受權(前端nginx和後端的php都須要安裝wordpress)
一、在mysql數據庫(172.16.7.200)中受權訪問網段
MariaDB [(none)]> grant all on *.* to 'wordpress'@'172.16.%.%' identified by 'wordpress'; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> MariaDB [(none)]> flush privileges; Query OK, 0 rows affected (0.00 sec) |
二、建立wordpress數據庫,不然不讓安裝
MariaDB [(none)]> create database wordpress; |
三、wordpress安裝準備
[root@nmshuishui ~]# cd /usr/local/nginx/html/ [root@nmshuishui html]# unzip wordpress-3.2.1-zh_CN.zip [root@nmshuishui html]# cd wordpress [root@nmshuishui wordpress]# cp wp-config-sample.php wp-config.php [root@nmshuishui wordpress]# vim wp-config.php #須要在這裏填入所需的數據庫信息,這個還和Discuz不同 [root@nmshuishui wordpress]# scp wp-config.php root@172.16.7.100:/usr/local/nginx/html/wordpress #前端nginx和後端的php都須要安裝wordpress,因此配置文件一保持一致 |
修改以下幾項便可
四、博客系統安裝成功
10、安裝memadmin-master查看memcached的狀態信息
一、解壓(前端nginx和後端的php都須要解壓安裝memadmin-master)
[root@shuishui html]# unzip memadmin-master.zip |
二、鏈接memadmin-master
三、查看memcached狀態信息