nfs簡介: php
nfs:Network File System,網絡文件系統;是一種分佈式文件系統協議,最初由Sun公司開發。其功能旨在容許客戶端主機能夠像訪問本地存儲同樣經過網絡訪問服務器端文件。 NFS和其餘許多協議同樣,是基於RPC協議實現的。 html
rpc:Remote Procedure Call,遠程過程調用;是一個計算機通訊協議。該協議容許運行於一臺計算機的程序調用另外一臺計算機的子程序。調用遠程主機上的函數,一部分功能由本地程序,另外一部分功能由遠程主機上的函數完成。 mysql
rpcbind:RPC的守護進程,監聽在111/tcp、111/udp; linux
rpc.mount:RPC的遠程調用進程,監聽在2049/tcp、2049/udp; web
nfs的安全認證: 正則表達式
基於IP的認證: sql
RPC:公共的共享功能 shell
身份認證:集中於某服務器完成身份認證; 數據庫
NIS:NetworkInformation System apache
nfs服務器的組成:
nfsd:用於接收rpc請求,監聽於2048/tcp、2048/udp;
mountd:掛載搜索進程;
idmapd:映射進程;
用戶映射:
經過NFS中的用戶映射,能夠將僞或實際用戶和組的標識賦給一個正在對NFS捲進行操做的用戶。這個NFS用戶具備映射所容許的用戶和組的許可權限。對NFS卷使用一個通用的用戶/組能夠提供必定的安全性和靈活性,而不會帶來不少管理負荷。
在使用NFS掛載的文件系統上的文件時,用戶的訪問一般都會受到限制,這就是說用戶都是以匿名用戶的身份來對文件進行訪問的,這些用戶缺省狀況下對這些文件只有只讀權限。這種行爲對於root用戶來講尤爲重要。然而,實際上的確存在這種狀況:但願用戶以root用戶或所定義的其餘用戶的身份訪問遠程文件系統上的文件。NFS容許指定訪問遠程文件的用戶――經過用戶標識號(UID)和組標識號(GID),能夠禁用正常的squash行爲。
nfs服務器的安裝和配置:
須要事先安裝並啓動rpc服務:
# yuminstall rpcbind # chkconfigrpcbind on # servicerpcbind start
安裝nfs服務:
# yuminstall nfs-utils
安裝nfs-utils生成文件:
# rpm �ql nfs-utils # /etc/rc.d/init.d/nfs :服務腳本 # /etc/sysconfig/nfs :主配置文件 # /etc/exports :配置共享目錄的文件
共享目錄配置格式:
# vim /etc/exports > directory(or file system) client1(option1,option2) client2(option1, option2)
客戶端格式:
IP:192.168.1.10
NETWORK:192.168.1.0/24或192.168.1.0/255.255.255.0
FQDN:www.chencer.org,可以使用通配符:*chencer.org
DOMAIN:chencer.org
經常使用選項:有幾個經常使用的選項能夠對NFS實現進行定製:
secure:這個選項是缺省選項,它使用了1024如下的TCP/IP端口實現NFS的鏈接。指定insecure能夠禁用這個選項。
rw:這個選項容許NFS客戶機進行讀/寫訪問。缺省選項是隻讀的。
async:這個選項能夠改進性能,可是若是沒有徹底關閉NFS守護進程就從新啓動了NFS服務器,這也可能會形成數據丟失。
no_wdelay:這個選項關閉寫延時。若是設置了async,那麼NFS就會忽略這個選項。
nohide:若是將一個目錄掛載到另一個目錄之上,那麼原來的目錄一般就被隱藏起來或看起來像空的同樣。要禁用這種行爲,需啓用hide選項。
no_subtree_check:這個選項關閉子樹檢查,子樹檢查會執行一些不想忽略的安全性檢查。缺省選項是啓用子樹檢查。
no_auth_nlm:這個選項也能夠做爲insecure_locks指定,它告訴NFS守護進程不要對加鎖請求進行認證。若是關心安全性問題,就要避免使用這個選項。缺省選項是auth_nlm或secure_locks。
mp (mountpoint=path):經過顯式地聲明這個選項,NFS要求掛載所導出的目錄。
fsid=num:這個選項一般都在NFS故障恢復的狀況中使用。若是但願實現NFS的故障恢復,請參考NFS文檔。
用戶映射的選項包括:
root_squash:這個選項不容許root用戶訪問掛載上來的NFS卷。
no_root_squash:這個選項容許root用戶訪問掛載上來的NFS卷。
all_squash: 這個選項對於公共訪問的NFS捲來講很是有用,它會限制全部的UID和GID,只使用匿名用戶。缺省設置是no_all_squash。
anonuid和anongid: 這兩個選項將匿名 UID 和 GID 修改爲特定用戶和組賬號。
nfs客戶端工具:
查看NFS服務器端共享的文件系統:
# showmount -e NFSSERVER_IP
掛載NFS文件系統:
# mount -t nfs SERVER:/path/to/sharedfs /path/to/mount_point
# exportfs:維護exports文件導出的文件系統表的專用工具: export -ar:從新導出全部的文件系統; export -au:關閉導出的全部文件系統; export -u FS:關閉指定的導出的文件系統;
開機自動掛載nfs:
# vim /etc/fstab > SERVER:/PATH/TO/EXPORTED_FS /mount_point nfs defaults,_netdev 0 0 _netdev:表示爲網絡設備,開機自動掛載若網絡未鏈接可略過;
NFS服務實踐:LAMP平臺基於NFS服務實現博客站點負載均衡
工做原理:
客戶端請求訪問博客站點,dns服務器經過記錄輪詢返回某個web服務器的地址,2臺web服務器的站點目錄經過nfs服務器共享資源;客戶端在web服務器1提供站點上修改的內容與web服務器2保持同步。
實驗環境:因爲資源有限,對服務器進行整合;
服務器A:
IP:192.168.1.10
操做系統:CentOS6.7 x86_64
提供服務:web1
服務器B:
IP:192.168.1.11
操做系統:CentOS6.7 x86_64
提供服務:web2
服務器C:
IP:192.168.1.12
操做系統:CentOS6.7 x86_64
提供服務:php-fpm,dns
服務器D:
IP:192.168.1.13
操做系統:CentOS6.7 x86_64
提供服務:mysql,nfs
客戶端:
IP:192.168.1.14
操做系統:Windows7
瀏覽器:Chrome44
實驗過程:
服務器D:
新建邏輯卷掛載至目錄;
# pvcreate /dev/sdb # vgcreate -s 8M web /dev/sdb # lvcreate -L 49G -n blog web # mke2fs -t ext4 �b 4096 /dev/web/blog # mkdir /web # vim /etc/fstab > /dev/web/blog /web ext4 defaults,acl 0 0 # mount �a
nfs服務安裝配置:
# yum install rpcbind nfs-utils # vim /etc/exports > /web/blog 192.168.1.0/24(rw,async,no_root_squash)
站點文件部署:
# tar xf wordpress-4.2.2-zh_CN.tar.gz -C /web/ # mv /web/wordpress/ /web/blog # groupadd -r daemon # useradd -M -s /sbin/nologin -g daemon -r daemon # setfacl -R -m u:deamon:rwx /web/blog
配置鏈接數據庫:
# cd /web/blog/ # cp wp-config-sample.php wp-config.php # vim wp-config.php > /** WordPress數據庫的名稱 */ > define('DB_NAME','blogdb'); > > /** MySQL數據庫用戶名 */ > define('DB_USER','bloguser'); > > /** MySQL數據庫密碼 */ > define('DB_PASSWORD','blogpass'); > > /** MySQL主機 */ > define('DB_HOST','192.168.1.13');
啓動服務:
# chkconfig rpcbind on # chkconfig nfs on # service nfs start
mariadb二進制安裝;
建立數據源目錄:
# groupadd -r mysql # useradd -M -s /sbin/nologin -g mysql -r mysql # mkdir -p /web/data # chown -R mysql:mysql /web/data/ # chmod -R o-rx /web/data/
二進制安裝設置:
# tar xf mariadb-5.5.44-linux-x86_64.tar.gz -C /usr/local/ # cd /usr/local/ # ln -sv mariadb-5.5.44-linux-x86_64/ mysql # cd mysql/ # chown -R root:mysql ./* # scripts/mysql_install_db --user=mysql --datadir=/web/data/
添加環境變量:
# vim /etc/profile.d/mysql.sh > export PATH=/usr/local/mysql/bin:$PATH # source /etc/profile.d/mysql.sh
導出頭文件:
# ln -sv/usr/local/mysql/include/ /usr/include/mysql
導出庫文件:
vim /etc/ld.so.conf.d/mysql.conf > /usr/local/mysql/lib # ldconfig
導出man手冊;
# vim /etc/man.config > MANPATH /usr/local/mysql/man
提供配置文件;
# mkdir -p /etc/mysql # cp support-files/my-small.cnf /etc/mysql/my.cnf # vim /etc/mysql/my.cnf > [mysqld] > thread_concurrency = 2 :值CPU個數乘以2; > datadir = /web/data 數據目錄;
提供服務腳本;
# cp support-files/mysql.server /etc/rc.d/init.d/mysqld # chmod +x /etc/rc.d/init.d/mysqld
加入服務列表,啓動,初始化數據庫;
# chkconfig mysqld �add # chkconfig mysqld on # service mysqld start
建立數據庫:
# mysql MariaDB[(none)]> CREATE DATABASE blogdb; MariaDB[(none)]> CREATE USER bloguser@'192.168.1.%' IDENTIFIED BY 'blogpass'; MariaDB[(none)]> GRANT ALL ON blogdb.* TO bloguser@'192.168.1.%'; MariaDB[(none)]> FLUSH PRIVILEGES;
服務器C:
dns服務安裝配置:
# yum install bind # vim /etc/named.conf
區域解析文件:
# vim /etc/named.rfc1912.zones > zone"chencer.org" IN { > type master; > file "chencer.org.zone"; > }; > > zone"1.168.192.in-addr.arpa" IN { > type master; > file"1.168.192.in-addr.arpa.zone"; > };
解析庫文件;
正向解析庫:
# vim /var/named/chencer.org.zone > $TTL 86400 > @ IN SOA dns.chencer.org. root.chencer.org. ( > 2015082101 > 1D > 10M > 5D > 1D ) > @ IN NS dns > @ IN MX 10 mail > dns IN A 192.168.1.12 > blog IN A 192.168.1.10 > blog IN A 192.168.1.11
反向解析庫:
# vim /var/named/1.168.192.in-addr.arpa.zone > $TTL86400 > @ IN SOA dns.chencer.org. root.chencer.org. ( > 2015082101 > 1D > 10M > 5D > 1D ) > @ IN NS dns.chencer.org. > 12 IN PTR dns.chencer.org. > 10 IN PTR blog.chencer.org. > 11 IN PTR blog.chencer.org.
修改解析庫文件屬組和權限:
# chown root:named /var/named/chencer.org.zone # chown root:named /var/named/1.168.192.in-addr.arpa.zone # chmod 640 /var/named/chencer.org.zone # chmod 640 /var/named/1.168.192.in-addr.arpa.zone
檢查語法,啓動服務:
# service named configtest # chkconfig named on # service named start
php-fpm安裝配置;
設置掛載共享目錄:
# yum install nfs-utils # mkdir -p /web/blog # vim /etc/fstab > 192.168.1.13:/web/blog /web/blog nfs defaults,_netdev 0 0 # mount -a
安裝編譯環境;
# yum groupinstall "Server Platform Development" "Development tools" "Desktop Platform Development"
安裝依賴關係程序:
# yum install bzip2-devel libmcrypt-devel mhash-devel
注意:libmcrypt-devel和mhash-devel來自於epel源;
php:
# tar xf php-5.4.43.tar.bz2 # cd php-5.4.43 # ./configure --prefix=/usr/local/php --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-openssl --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --enable-xml --with-libxml-dir=/usr --enable-sockets --enable-fpm --with-mcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2 # make && make install
PHP編譯參數解釋:
--prefix=/usr/local/php :安裝位置; --with-mysql=mysqlnd :指定MySQL安裝位置,若MySQL安裝於其餘服務器,能夠指定mysqlnd,使用本地MySQL驅動; --with-pdo-mysql=mysqlnd : --with-mysqli=mysqlnd : --with-openssl :指定openssl位置; --enable-mbstring :支持多種語言編碼(utf-8等),能夠正常轉換的函數庫;支持中文; --with-freetype-dir :指定freetype目錄位置,支持多種字體;freetype:字體處理工具; --with-jpeg-dir :指定libjpeg目錄位置,支持圖片格式; --with-png-dir :指定libpng目錄位置,支持圖片格式; --with-zlib :使用指定的zlib壓縮庫位置; --enable-xml :支持xml,xml:擴展標記語言; --with-libxml-dir=/usr :指定xml庫文件位置; --enable-sockets :PHP支持sockets通訊; --with-mcrypt :指定mcrypt加密擴展庫位置; --with-config-file-path=/etc :配置文件目錄位置; --with-config-file-scan-dir=/etc/php.d :擴展配置文件目錄位置; 分離式部署httpd和php-fpm; --enable-fpm :支持FastCGI,PHP做爲單獨服務器必須啓動此項; --with-bz2 :支持bz2壓縮格式傳輸; httpd和php安裝在同一服務器上; --with-apxs2=/usr/local/apache/bin/apxs :指定apache擴展模塊位置; --enable-maintainer-zts :支持apache多種MPM;
xcache:
# tar xf xcache-3.1.2.tar.bz2 # cd xcache-3.1.2 #/usr/local/php/bin/phpize :生成configure腳本; # ./configure --enable-xcache --with-php-config=/usr/local/php/bin/php-config # make && make install
添加環境變量:
# vim /etc/profile.d/php.sh > export PATH=/usr/local/php/bin:/usr/local/php/sbin:$PATH # source /etc/profile.d/php.sh
導出頭文件;
# ln -sv /usr/local/php/include/ /usr/include/httpd
爲PHP提供配置文件;
# cp./php-5.4.44/php.ini-production /etc/php.ini php.ini-development :用於開發環境的配置文件; php.ini-production :用於生產環境的配置文件;
爲PHP-fpm提供配置文件:
# cd /usr/local/php/etc/ # cp php-fpm.conf.default php-fpm.conf # vim php-fpm.conf > listen = 192.168.1.12:9000 :監聽IP和端口; > pm.max_children = 50 :最大併發相應量; > pm.start_servers = 5 :啓動php-fpm時,啓動幾個空閒進程; > pm.min_spare_servers = 2 :最小空閒進程數; > pm.max_spare_servers = 8 :最大空閒進程數; > pid = /usr/local/php/var/run/php-fpm.pid :pid文件位置。
配置xcache:
# mkdir -p /etc/php.d # cp ./xcache-3.2.0/xcache.ini /etc/php.d/ # vim /etc/php.d/xcache.ini > extension = /usr/local/php/lib/php/extensions/no-debug-zts-20100525/xcache.so
爲PHP-fpm提供服務腳本;
# cp ./php-5.4.44/sapi/fpm/sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm # chmod +x /etc/rc.d/init.d/php-fpm
添加服務,啓動服務;
# chkconfig php-fpm --add # chkconfig php-fpm on # service php-fpm start
服務器A和B:兩臺web服務安裝配置;
設置掛載共享目錄:
# yum install nfs-utils # mkdir -p /web/blog # vim /etc/fstab > 192.168.1.13:/web/blog /web/blog nfs defaults,_netdev 0 0 # mount -a
安裝編譯環境;
# yum groupinstall "Server Platform Development" "Developmenttools"
apr:
# tar xf apr-1.5.2.tar.bz2 # cd apr-1.5.2 # ./configure --prefix=/usr/local/apr # make && make install
apr-util:
# tar xf apr-util-1.5.4.tar.bz2 # cd apr-util-1.5.4 # ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/ --with-apr=/usr/local/apr/ :指明apr安裝位置; # make && make install
httpd:
# tar xf httpd-2.4.16.tar.bz2 # cd httpd-2.4.16 # ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd --enable-so--enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre--with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modules=all --enable-mpms-shared=all --with-mpm=event # make && make install
httpd編譯參數解釋:
--prefix=/usr/local/apache :安裝位置; --sysconfdir=/etc/httpd :配置文件位置; --enable-so :支持DSO動態裝載模塊; --enable-ssl :支持SSL/TLS,可實現https協議訪問,須要安裝openssl-devel; --enable-cgi :支持CGI腳本; --enable-rewrite :支持URL重寫; --with-zlib :使用指定的zlib壓縮庫,不指定路徑會自動尋找; --with-pcre :使用指定的pcre庫,加強的正則表達式分析工具;不指定路徑會自動尋找 需已安裝pcre-devel; --with-apr=/usr/local/apr :指定依賴apr程序安裝位置; --with-apr-util=/usr/local/apr-util :指定依賴apr-util程序安裝位置; --enable-modules=all :支持動態啓用模塊;all:全部,most:經常使用; --enable-mpms-shared=all :編譯並共享模塊; --with-mpm=event :默認啓用模塊;{prefork|worker|event}
添加環境變量:
# vim /etc/profile.d/httpd.sh > export PATH=/usr/local/apache/bin:$PATH # source /etc/profile.d/httpd.sh
導出頭文件;
# ln -sv /usr/local/apache/include/ /usr/include/httpd
導出man手冊;
# vim /etc/man.config > MANPATH /usr/local/apache/man
編輯配置文件:
# vim /etc/httpd/httpd.conf > PidFile"/usr/local/apache/logs/httpd.pid" :指定pidfile; > #DocumentRoot"/usr/local/apache/htdocs" :關閉中心主機; > Include/etc/httpd/extra/httpd-vhosts.conf :啓用虛擬主機; 啓用模塊: > LoadModule proxy_module modules/mod_proxy.so :啓用反向代理模塊; > LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so :啓用實現FastCGI模塊,此模塊爲mod_proxy.so的擴充; 支持PHP: > <IfModuledir_module> > DirectoryIndex index.php index.html > </IfModule> > AddTypeapplication/x-httpd-php .php > AddTypeapplication/x-httpd-php-source .phps
配置虛擬主機:
# vim /etc/httpd/extra/httpd-vhosts.conf > <VirtualHost 192.168.1.10:80> > DocumentRoot "/web/blog" > ServerName blog.chencer.org > ProxyRequests Off > ProxyPassMatch ^/(.*\.php)$fcgi://192.168.1.12:9000/web/blog/$1 > <Directory "/web/blog"> > Options none > AllowOverride none > Require all granted > </Directory> > </VirtualHost>
提供服務腳本:
可以使用rpm包安裝提供的腳本修改使用;
# vim/etc/rc.d/init.d/httpd > #!/bin/bash > # > #httpd Startup script for theApache HTTP Server > # > #chkconfig: - 85 15 > #description: The Apache HTTP Server is an efficient and extensible \ > # server implementing the current HTTPstandards. > #processname: httpd > #config: /etc/httpd/httpd.conf > #config: /etc/sysconfig/httpd > #pidfile: /usr/local/apache/logs/httpd.pid > # > ###BEGIN INIT INFO > #Provides: httpd > #Required-Start: $local_fs $remote_fs $network $named > #Required-Stop: $local_fs $remote_fs $network > #Should-Start: distcache > #Short-Description: start and stop Apache HTTP Server > #Description: The Apache HTTP Server is an extensible server > # implementing the current HTTP standards. > ### ENDINIT INFO > > #Source function library. > ./etc/rc.d/init.d/functions > > if [ -f/etc/sysconfig/httpd ]; then > . /etc/sysconfig/httpd > fi > > # Starthttpd in the C locale by default. > HTTPD_LANG=${HTTPD_LANG-"C"} > > # Thiswill prevent initlog from swallowing up a pass-phrase prompt if > #mod_ssl needs a pass-phrase from the user. > INITLOG_ARGS="" > > # SetHTTPD=/usr/local/apache/bin/httpd.worker in /etc/sysconfig/httpd to use aserver > # withthe thread-based "worker" MPM; BE WARNED that some modules may not > # workcorrectly with a thread-based MPM; notably PHP will refuse to start. > > # Pathto the apachectl script, server binary, and short-form for messages. > apachectl=/usr/local/apache/bin/apachectl > httpd=${HTTPD-/usr/local/apache/bin/httpd} > prog=httpd > pidfile=${PIDFILE-/usr/local/apache/logs/httpd.pid} > lockfile=${LOCKFILE-/var/lock/subsys/httpd} > RETVAL=0 > STOP_TIMEOUT=${STOP_TIMEOUT-10} > > # Thesemantics of these two functions differ from the way apachectl does > #things -- attempting to start while running is a failure, and shutdown > # whennot running is also a failure. So wejust do it the way init scripts > # areexpected to behave here. > start(){ > echo -n $"Starting $prog: " > LANG=$HTTPD_LANG daemon--pidfile=${pidfile} $httpd $OPTIONS > RETVAL=$? > echo > [ $RETVAL = 0 ] && touch${lockfile} > return $RETVAL > } > > # Whenstopping httpd, a delay (of default 10 second) is required > #before SIGKILLing the httpd parent; this gives enough time for the > # httpdparent to SIGKILL any errant children. > stop(){ > echo -n $"Stopping $prog: " > killproc -p ${pidfile} -d ${STOP_TIMEOUT}$httpd > RETVAL=$? > echo > [ $RETVAL = 0 ] && rm -f ${lockfile}${pidfile} > } > reload(){ > echo -n $"Reloading $prog: " > if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t>&/dev/null; then > RETVAL=6 > echo $"not reloading due toconfiguration syntax error" > failure $"not reloading $httpd dueto configuration syntax error" > else > # Force LSB behaviour from killproc > LSB=1 killproc -p ${pidfile} $httpd-HUP > RETVAL=$? > if [ $RETVAL -eq 7 ]; then > failure $"httpd shutdown" > fi > fi > echo > } > > # Seehow we were called. > case"$1" in > start) > start > ;; > stop) > stop > ;; > status) > status -p ${pidfile} $httpd > RETVAL=$? > ;; > restart) > stop > start > ;; > condrestart|try-restart) > if status -p ${pidfile} $httpd>&/dev/null; then > stop > start > fi > ;; > force-reload|reload) > reload > ;; > graceful|help|configtest|fullstatus) > $apachectl $@ > RETVAL=$? > ;; > *) > echo $"Usage: $prog{start|stop|restart|condrestart|try-restart|force-reload|reload|status|fullstatus|graceful|help|configtest}" > RETVAL=2 > esac > > exit$RETVAL
腳本執行權限;
# chmod +x /etc/rc.d/init.d/httpd
添加服務,啓動服務;
# chkconfig httpd --add # chkconfig httpd on # service httpd start
客戶端訪問站點測試:
經過兩個IP地址訪問站點;
接下來驗證數據同步:
經過IP:192.168.1.10訪問站點新建博客;
經過IP:192.168.1.11訪問站點查看博客;
OK,數據同步目的達成。
結語:
小型博客站點已搭建完成,在互聯網中大部分網站都是由小到大,經過從此的學習會基於lamp平臺不斷擴展便可完成高併發,高可用的網站。以上爲本人學習整理內容,試驗中若有遺漏和失誤,歡迎各路大神來噴。
本文出自 「小馬的學習記錄」 博客,請務必保留此出處http://masachencer.blog.51cto.com/8683770/1688953