Linux基礎之命令練習Day7-nginx,nfs
一. Nginx
Nginx("engine x") 是一個高性能的HTTP和反向代理服務器,也是一個IMAP/POP3/SMTP服務器。Nginx是由Igor Sysoev為俄羅斯訪問量第二的Rambler.ru站點開發的,第一個公開版本0.1.0發布於2004年10月4日。其將源代碼以類BSD許可證的形式發布,因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗及並發能力強而聞名。
1. nginx的安裝(yum安裝)
首先需要安裝epel軟件源,因為它裏面包含了許多基本源裏沒有的軟件,方便nginx的安裝;yum install epel-release -y
安裝完epel後接著就可以安裝nginx了;yum install nginx -y
nginx配置文件默認應該在"/etc/nginx/nginx.conf",可以使用vim編輯修改配置
# Info : The conf for nginx
# Author : dingtm
# CTime : 2010.07.01
user www www; #運行NGINX所使用的用戶和組
worker_processes 4; #nginx進程數,建議按照cpu數目來指定,一般為它的倍數,每個進程消耗約10M內存
error_log /data/logs/nginx/error.log crit;
pid /elain/apps/nginx/nginx.pid;
worker_rlimit_nofile 65535; #nginx能打開文件的最大句柄數,最好與ulimit -n的值保持一致,使用ulimit -SHn 65535 設置
events {
use epoll; #使用epoll的I/O模型
connections 20000; #每個進程允許的最多連接數
worker_connections 65535; #該值受系統進程最大打開文件數限制,需要使用命令ulimit -n 查看當前設置
maxclients=65535*2
}
http {
include mime.types; #mine.types內定義各文件類型映像
types {
text/html html;
image/gif gif;
image/jpeg jpg;
image/png png;
}
default_type application/octet-stream; #設置默認類型是二進制流,若未設置時,比如未加載PHP時,是不予解析,用瀏覽器訪問則出現下載窗口
server_names_hash_bucket_size 128; #不能帶單位!配置個主機時必須設置該值,否則無法運行Nginx或測試時不通過,該設置與server_names_hash_max_size 共同控制保存服務器名的HASH表,hash bucket size總是等於hash表的大小,並且是一路處理器緩存大小的倍數。若hash bucket size等於一路處理器緩存的大小,那麽在查找鍵的時候,最壞的情況下在內存中查找的次數為2。第一次是確定存儲單元的地址,第二次是在存儲單元中查找鍵 值。若報出hash max size 或 hash bucket size的提示,則我們需要增加server_names_hash_max_size的值。
client_header_buffer_size 128k; #客戶端請求頭部的緩沖區大小,根據系統分頁大小設置,分頁大小可用命令getconf PAGESIZE取得
large_client_header_buffers 4 128k; #4為個數,128k為大小,默認是4k。申請4個128k。當http 的URI太長或者request header過大時會報414 Request URI too large或400 bad request,這是很有可能是cookie中寫入的值太大造成的,因為header中的其他參數的size一般比較固定,只有cookie可能被寫入較 大的數據,這時可以調大上述兩個值,相應的瀏覽器中cookie的字節數上限會增大。
client_max_body_size 8m; #HTTP請求的BODY最大限制值,若超出此值,報413 Request Entity Too Large
open_file_cache max=65535 inactive=20s; #max指定緩存數量,建議和打開文件數一致,inactive是指經過多長時間文件沒被請求後刪除緩存。
open_file_cache_valid 30s; #指多長時間檢查一次緩存的有效信息
open_file_cache_min_uses 1; #open_file_cache指令中的inactive參數時間內文件的最少使用次數,如果超過這個數字,文件描述符一直是在緩存中打開的,如上例, 如果有一個文件在inactive時間內一次沒被使用,它將被移除。
server_tokens off; #關閉錯誤時Nginx版本顯示
#提高文件傳輸性能
sendfile on; #打開系統函數sendfile()支持
tcp_nopush on; #打開linux下TCP_CORK,sendfile打開時才有效,作減少報文段的數量之用
keepalive_timeout 60; #keepalive超時時間
tcp_nodelay on; #打開TCP_NODELAY在包含了keepalive才有效
fastcgi_connect_timeout 300; #指定連接到後端FastCGI的超時時間
fastcgi_send_timeout 300; #向FastCGI傳送請求的超時時間,這個值是指已經完成兩次握手後向FastCGI傳送請求的超時時間。
fastcgi_read_timeout 300; #接收FastCGI應答的超時時間,這個值是指已經完成兩次握手後接收FastCGI應答的超時時間。
fastcgi_buffer_size 64k; #這裏可以設置為fastcgi_buffers指令指定的緩沖區大小
fastcgi_buffers 16 16k; #指定本地需要用多少和多大的緩沖區來緩沖FastCGI的應答
fastcgi_busy_buffers_size 128k; #建議為fastcgi_buffers的兩倍
fastcgi_temp_file_write_size 128k; #在寫入fastcgi_temp_path時將用多大的數據塊,默認值是fastcgi_buffers的兩倍,設置上述數值設置太小時若負載上來時可能報 502 Bad Gateway
fastcgi_cache dingtm #開啟FastCGI緩存並且為其制定一個名稱,有效降低CPU負載,並且防止502錯誤
fastcgi_cache_valid 200 302 1h; #指定應答代碼緩存時間為1小時
fastcgi_cache_valid 301 1d; #1天
fastcgi_cache_valid any 1m; #其它為1分鐘
fastcgi_cache_min_uses 1; #緩存在fastcgi_cache_path指令inactive參數值時間內的最少使用次數 f
gzip on; #打開GZIP壓縮,實時壓縮輸出數據流
gzip_min_length 1k; #從Content-Length中數值獲取驗證,小於1K會越壓越大
gzip_buffers 4 16k; #以16K為單位4倍的申請內存做壓縮結果流緩存
gzip_http_version 1.1;
gzip_comp_level 3; #壓縮比率1-9,1壓縮比最小處理速度最快,9壓縮比最大但處理最慢且耗CPU
gzip_types text/plain application/x-javascript text/css application/xml; #壓縮類型
include vhosts/*.conf; #虛擬主機
}
#虛擬主機
server {
listen 80;
server_name www.elain.org; #多域名用空格隔開
index index.php index.html index.shtml;
root /elain/data/htdocs/elain;
#limit_conn connlimit 20; #限制一個IP只能最多只能發起20個連接,超過報 503 Service unavailable,可防止惡意連接
access_log /elain/logs/nginx/access_www.elain.org.log access;
error_log /elain/logs/nginx/error_www.elain.org.log;
location / {
ssi on; #WEB文檔根目錄打開SSI支持
ssi_types text/html;
ssi_silent_errors off; #處理SSI出錯時不提示
}
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ {
access_log off;
expires 30d;
}
location ~ .*.(js|css)?$ {
expires 1h;
add_header Cache_Control private;
}
location ~ /.ht {
deny all;
}
location /NginxStatus { #設定查看Nginx狀態的地址
stub_status on;
access_log off;
auth_basic “NginxStatus”; #標識
auth_basic_user_file conf/.htpasswd; #網頁加密,提示登錄框,輸入用戶名和密碼可查看
}
location ~ .*.(php|php5)?$ { #匹配文件後綴php, php5
#fastcgi_pass unix:/tmp/php-cgi.sock; #SOCKET方式轉交fastcgi處理
fastcgi_pass 127.0.0.1:9000; #9000端口方式fastcgi
fastcgi_index index.php;
include fastcgi_params; #包含fastcgi配置
#fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
設置完nginx.conf後應該先將linux系統的防火墻關掉,因為其會阻止遠程對nginx默認端口80的訪問;命令:systemctl stop firewalld(關掉防火墻),systemctl disable firewalld(開機不啟動防火墻)selinux 阻止了html文件下幾個html文件的遠程被訪問,需要修改selinux配置文件;命令:vim /etc/selinux/config,將第二個SELINUX=disabled,保存退出,重啟系統;
此時,就可以啟動nginx服務了,命令:systemctl start nginx(啟動nginx),systemctl enable nginx(設為開機啟動)。
2. nginx的安裝(源碼安裝)-這位大神已經寫得很詳細了。
3. nginx的配置使用
4. nginx均衡負載(LB)
負載均衡技術是構建大型網站必不可少的架構策略之一。它的目的是,把用戶的請求分發到多臺後端的設備上,用以均衡服務器的負載。
Nginx負載均衡器的特點是:
1). 工作在網絡的7層之上,可以針對http應用做一些分流的策略,比如針對域名、目錄結構;
2). Nginx安裝和配置比較簡單,測試起來比較方便;
3). 也可以承擔高的負載壓力且穩定,一般能支撐超過上萬次的並發;
4). Nginx可以通過端口檢測到服務器內部的故障,比如根據服務器處理網頁返回的狀態碼、超時等等,並且會把返回錯誤的請求重新提交到另一個節點,不過其中缺點就是不支持url來檢測;
5). Nginx對請求的異步處理可以幫助節點服務器減輕負載;
6). Nginx能支持http和Email,這樣就在適用範圍上面小很多;
7). 默認有三種調度算法: 輪詢、weight以及ip_hash(可以解決會話保持的問題),還可以支持第三方的fair和url_hash等調度算法;
二. nfs
NFS 是Network File System的縮寫,即網絡文件系統。一種使用於分散式文件系統的協定,由Sun公司開發,於1984年向外公布。功能是通過網絡讓不同的機器、不同的操作系統能夠彼此分享個別的數據,讓應用程序在客戶端通過網絡訪問位於服務器磁盤中的數據,是在類Unix系統間實現磁盤文件共享的一種方法。
NFS 的基本原則是“容許不同的客戶端及服務端通過一組RPC分享相同的文件系統”,它是獨立於操作系統,容許不同硬件及操作系統的系統共同進行文件的分享。
NFS在文件傳送或信息傳送過程中依賴於RPC協議。RPC,遠程過程調用 (Remote Procedure Call) 是能使客戶端執行其他系統中程序的一種機制。NFS本身是沒有提供信息傳輸的協議和功能的,但NFS卻能讓我們通過網絡進行資料的分享,這是因為NFS使用了一些其它的傳輸協議。而這些傳輸協議用到這個RPC功能的。可以說NFS本身就是使用RPC的一個程序。或者說NFS也是一個RPC SERVER。所以只要用到NFS的地方都要啟動RPC服務,不論是NFS SERVER或者NFS CLIENT。這樣SERVER和CLIENT才能通過RPC來實現PROGRAM PORT的對應。可以這麽理解RPC和NFS的關系:NFS是一個文件系統,而RPC是負責負責信息的傳輸。
1. nfs安裝,yum install rpcbind nfs-utils -y
2. nfs配置,vim /etc/exports
配置文件格式:<輸出目錄> [客戶端1 選項(訪問權限,用戶映射,其他)] [客戶端2 選項(訪問權限,用戶映射,其他)]
a. 輸出目錄:
輸出目錄是指NFS系統中需要共享給客戶機使用的目錄;
b. 客戶端:
客戶端是指網絡中可以訪問這個NFS輸出目錄的計算機
客戶端常用的指定方式
- 指定ip地址的主機:192.168.0.200
- 指定子網中的所有主機:192.168.0.0/24 192.168.0.0/255.255.255.0
- 指定域名的主機:david.bsmart.cn
- 指定域中的所有主機:*.bsmart.cn
- 所有主機:*
c. 選項:
選項用來設置輸出目錄的訪問權限、用戶映射等。
NFS主要有3類選項:
訪問權限選項
- 設置輸出目錄只讀:ro
- 設置輸出目錄讀寫:rw
用戶映射選項
- all_squash:將遠程訪問的所有普通用戶及所屬組都映射為匿名用戶或用戶組(nfsnobody);
- no_all_squash:與all_squash取反(默認設置);
- root_squash:將root用戶及所屬組都映射為匿名用戶或用戶組(默認設置);
- no_root_squash:與rootsquash取反;
- anonuid=xxx:將遠程訪問的所有用戶都映射為匿名用戶,並指定該用戶為本地用戶(UID=xxx);
- anongid=xxx:將遠程訪問的所有用戶組都映射為匿名用戶組賬戶,並指定該匿名用戶組賬戶為本地用戶組賬戶(GID=xxx);
其它選項
- secure:限制客戶端只能從小於1024的tcp/ip端口連接nfs服務器(默認設置);
- insecure:允許客戶端從大於1024的tcp/ip端口連接服務器;
- sync:將數據同步寫入內存緩沖區與磁盤中,效率低,但可以保證數據的一致性;
- async:將數據先保存在內存緩沖區中,必要時才寫入磁盤;
- wdelay:檢查是否有相關的寫操作,如果有則將這些寫操作一起執行,這樣可以提高效率(默認設置);
- no_wdelay:若有寫操作則立即執行,應與sync配合使用;
- subtree:若輸出目錄是一個子目錄,則nfs服務器將檢查其父目錄的權限(默認設置);
- no_subtree:即使輸出目錄是一個子目錄,nfs服務器也不檢查其父目錄的權限,這樣可以提高效率;
3. nfs啟動
1). 假如我們設置了 /share 為共享目錄,因為其它用戶需要權限進行訪問,所以需要修改該目錄及其子目錄文件的讀寫權限;命令:chmod -R o=rw- /share
2). 啟動服務
首先需要先啟動相關服務rpcbind,命令:systemctl start rpcbind.service(啟動),systemctl enable rpcbind.service(設為開機啟動)
然後再啟動nfs,命令:systemctl start nfs-server.service(啟動),systemctl enable nfs-server.service(設為開機啟動)
確認nfs啟動成功,命令:rpcinfo,exportfs(有輸出,例如:/share 192.168.31.0/24)
查看服務信息,命令:showmount -e #默認查看自己共享的服務,前提是要DNS能解析自己,不然容易報錯;showmount -a #顯示已經與客戶端連接上的目錄信息
3). 客戶端配置
客戶端按照同樣的方法安裝好nfs服務並啟動,無需修改exports配置文件,但需要將主機的共享目錄掛載在自己的默認訪問的html裏
命令:mount 192.168.47.133:/share /usr/nginx/html(綠色字體依自己機器的設置而定)
4). 接下來就可以在瀏覽器中驗證結果了
5). nginx+nfs共享集群配置
參考資料
1. http://baike.baidu.com/link?url=Rx4o-b2mkZxEiom-QWgVUlKwZRdeECcaXeAh2PKj0SllpFqwtY6yVc7SQNGqEXUC51pbA03HJLH_PhLEocmnP_
2. http://www.cnblogs.com/shengshuai/archive/2013/01/11/2856339.html
3. http://blog.csdn.net/lsm135/article/details/51863276
4. http://blog.csdn.net/finded/article/details/51889914
5. http://nginx.org/en/docs/http/load_balancing.html
6. http://www.cnblogs.com/langtianya/p/5242653.html
7. http://www.cnblogs.com/linhaifeng/articles/6045600.html#_label19
Linux基礎之命令練習Day7-nginx,nfs