1. 程式人生 > >【Linux】企業實戰-搭建高可用的WEB群集(全過程)

【Linux】企業實戰-搭建高可用的WEB群集(全過程)

大家好,今天給大家帶來web高可用,其中服務包括(Nginx,PHP,MySQL,Memcached,zabbix,keepalived以及Xcahce外掛等;

其中包含:       

       Nginx (Nginx的安裝及Nginx反向代理配置,對Nginx進行優化)

       PHP(對PHP進行安裝,及使用Xcache來加速php服務)

       MySQL(對Mysql進行安裝,Mysql調優,Mysql主主同步,使用memcached+mysql實現高效能使用)

       使用keepalived對Nginx快取服務進行高可用,防止單點故障等;

在安裝LNMP環境時掌握分離部署的搭建;對LNMP編寫一鍵安裝指令碼等等....

其實我為什麼想寫這篇文章,也就是我目前部落格大部分的知識也都概括了,有web服務,mysql資料庫,負載均衡,快取,高可用,以及監控等等。。所以我想結合在一起做成一個小架構~ 

經過我的整理,大致的拓撲圖如下:

這裡目前一共是有13臺機器,大致的IP地址分類如下:

客戶端-windows10x86_64

Linux環境-Centos7.2x86_64

Nginx-keepavlied-masterIP地址:192.168.1.10(1.12.2)

Nginx-keepavlied-slaveIP地址:192.168.1.20(1.12.2)

Nginx-web服務1-IP地址:192.168.1.30(1.12.2)

Nginx-web服務1-IP地址:192.168.1.40(1.12.2)

PHP+Xcache1-IP地址:192.168.1.50(php5.6)

PHP+Xcache2-IP地址:192.168.1.60(php5.6)

MySQL_master-keepalived-1-IP地址:192.168.1.70(Mysql5.7)

MySQL_slave-keepalived-1-IP地址:192.168.1.80(Mysql5.7)

MySQL_Master-keepalived-2-IP地址:192.168.1.90(Mysql5.7)

MySQL_slave-keepalived-2IP地址:192.168.1.100(Mysql5.7)

memcached1-IP地址:192.168.1.110

memcached2-IP地址:192.168.1.120

zabbix監控:192.168.1.130   郵箱:Email-163.com

一、什麼是Nginx?

Nginx是俄羅斯人編寫的十分輕量級的HTTP伺服器,Nginx,它的發音為“engineX”,是一個高效能的HTTP和反向代理伺服器,同時也是一個IMAP/POP3/SMTP代理伺服器.Nginx是由俄羅斯人 Igor Sysoev為俄羅斯訪問量第二的 Rambler.ru站點開發.

Nginx以事件驅動(epoll)的方式編寫,所以有非常好的效能,同時也是一個非常高效的反向代理、負載平衡。由於Nginx本身的一些優點,輕量,開源,易用,越來越多的公司使用nginx作為自己公司的web應用伺服器

如何選擇Nginx版本?

nginx的英文官方網站是:http://www.nginx.org/在這裡我們可以直接檢視Nginx的各個版本號。Nginx的軟體有三種版本:穩定版,開發板,和歷史穩定版。開發板更新的較快,包含最近的功能和BUG修復,但同時也可能會遇到新的BUG,開發板的更新一旦穩定下來就會被納入穩定版中。穩定版更新的較慢,但是軟體的BUG會很少,可以作為企業的首選,因此通常建議使用穩定版。當然在實際工作中,選擇穩定版時,儘量避免使用最新的版本,選擇比已出來的最近版晚6-10個月的版本比較好。在本次我們選擇用nginx1.12.2版本

二、代理的優點

1、反向代理(Reverse Proxy)方式是指以代理伺服器來接受客戶端的連線請求,然後將請求轉發給網路上的web伺服器(可能是apache、nginx、tomcat、iis等),並將從web伺服器上得到的結果返回給請求連線的客戶端,此時代理伺服器對外就表現為一個伺服器。

2、反向代理的作用

1)保護網站安全:任何來自Internet的請求都必須先經過代理伺服器;

2)通過配置快取功能加速Web請求:可以快取真實Web伺服器上的某些靜態資源,減輕真實Web伺服器的負載壓力

3)實現負載均衡:充當負載均衡伺服器均衡地分發請求,平衡叢集中各個伺服器的負載壓力;

3、安裝Nginx反向代理伺服器(nginx-cache-master1.10)

1)安裝Nginx基礎依賴包 pcre zlib openssl

[[email protected] ~]# yum install –y gcc gcc-c++ pcre-devel zlib-devel openssl-devel

2)下載軟體包,進入http://nginx.org/download/複製對應版本的下載連結地址。

[[email protected] src]# cd /usr/local/src/
[[email protected] src]# wget http://nginx.org/download/nginx-1.12.2.tar.gz

3)建立Nginx執行使用者

[[email protected] src]# useradd -M -s /sbin/nologin nginx

4)解壓Nginx原始碼包並進入解壓目錄,進行配置;在我們編譯安裝前我們可以隱藏Nginx軟體名稱以及版本號如下:

[[email protected] nginx-1.12.2]# vim src/core/nginx.h

修改HTTP頭資訊中的connection欄位,防止回顯具體版本號

[[email protected] nginx-1.12.2]# vim src/http/ngx_http_header_filter_module.c

有時候我們頁面程式出現錯誤,Nginx會代我們返回相應的錯誤程式碼,回顯的時候,會帶上nginx和版本號,我們把他隱藏起來

修改完以上配置我們進行編譯安裝

[[email protected]]# ./configure--prefix=/usr/local/nginx --with-http_dav_module--with-http_stub_status_module --with-http_addition_module --with-http_sub_module  --with-http_flv_module --with-http_mp4_module--with-pcre --with-http_ssl_module --with-http_gzip_static_module  --user=nginx --group=nginx 

看到上圖那麼安裝還是挺順利的 接著make && make install即可

安裝完成後 我們做一條軟連結,方便我們啟動Nginx程式

[[email protected] nginx-1.12.2]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

啟動Nginx

接下來訪問測試:

測試版本號!以及返回錯誤頁面

錯誤資訊

到這裡我們的第一臺Nginx安裝完畢也就是主機:(nginx-cache-master1.10)

在(nginx-cache-slave1.20)主機上安裝Nginx操作和master1是一樣的這裡我已經安裝好了

三、配置Nginx反向代理

1)nginx-sticky-module模組:

這個模組的作用是通過cookie黏貼的方式將來自同一個客戶端(瀏覽器)的請求傳送到同一個後端伺服器上處理,這樣一定程度上可以解決多個backend servers的session同步的問題 —— 因為不再需要同步,而RR輪詢模式必須要運維人員自己考慮session同步的實現。

另外內建的 ip_hash也可以實現根據客戶端IP來分發請求,但它很容易造成負載不均衡的情況,而如果nginx前面有CDN網路或者來自同一區域網的訪問,它接收的客戶端IP是一樣的,容易造成負載不均衡現象。nginx-sticky-module的cookie過期時間,預設瀏覽器關閉就過期。

這個模組並不合適不支援Cookie或手動禁用了cookie的瀏覽器,此時預設sticky就會切換成RR。它不能與ip_hash同時使用。

upstream backend {  
        server 192.168.146.120:80 weight=1;  
        server 192.168.146.130:80 weight=1;  
        sticky;  
}  

2)負載均衡與健康檢查:


嚴格來說,nginx自帶是沒有針對負載均衡後端節點的健康檢查的,但是可以通過預設自帶的 ngx_http_proxy_module 模組和ngx_http_upstream_module 模組中的相關指令來完成當後端節點出現故障時,自動切換到下一個節點來提供訪問

upstream backend {  
     sticky;  
      server 192.168.1.30:80 weight=1 max_fails=2 fail_timeout=10s;  
      server 192.168.1.40:80 weight=1 max_fails=2 fail_timeout=10s;  
}  
server {  
 ……  
location / {  
       proxy_pass http://backend;  
}  
……  
}  

weight: 輪詢權值也是可以用在ip_hash的,預設值為1
max_fails : 允許請求失敗的次數,預設為1。當超過最大次數時,返回proxy_next_upstream 模組定義的錯誤。
fail_timeout : 有兩層含義,一是在10s時間內最多容許2 次失敗;二是在經歷了 2 次失敗以後,10s時間內不分配請求到這臺伺服器

3nginxproxy快取使用:
快取也就是將jscssimage等靜態檔案從後端伺服器快取到nginx指定的快取目錄下,既可以減輕後端伺服器負擔,也可以加快訪問速度,但這樣快取及時清理成為了一個問題,所以需要 ngx_cache_purge 這個模組來在過期時間未到之前,手動清理快取。
proxy模組中常用的指令時proxy_passproxy_cache.
nginxweb快取功能的主要是由proxy_cachefastcgi_cache指令集和相關指令集完成,proxy_cache指令負責反向代理快取後端伺服器的靜態內容,fastcgi_cache主要用來處理FastCGI動態程序快取。

 

http {
    #$upstream_cache_status記錄快取命中率
log_format  main  '$remote_addr - $remote_user [$time_local]"$request" '
                     '$status $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for"'
                     '"$upstream_cache_status"';
access_log  logs/access.log  main;
proxy_buffering on;   #代理的時候,開啟或關閉緩衝後端伺服器的響應
proxy_temp_path /usr/local/nginx1.10/proxy_temp;
   proxy_cache_path /usr/local/nginx1.10/proxy_cache levels=1:2keys_zone=my-cache:100m  inactive=600m max_size=2g;
    server {
        listen       80;
        server_name  localhost;
        root   html;
        index  index.php index.html index.htm;
        #ngx_cache_purge實現快取清除
        location  ~/purge(/.*) {
           allow 127.0.0.1;
           allow 192.168.146.0/24;
           deny all;
           proxy_cache_purge my-cache$host$1$is_args$args;
        }
      location ~.*\.(gif|jpg|png|html|htm|css|js|ico|swf|pdf)(.*) {
           proxy_pass  http://backend;
           proxy_redirect off;
           proxy_set_header Host $host;
           proxy_set_header X-Real-IP$remote_addr;
           proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;
           proxy_ignore_headers Set-Cookie;
proxy_hide_header Set-Cookie;
           proxy_next_upstream error timeoutinvalid_header http_500 http_502 http_503 http_504;
           proxy_cache my-cache;
           add_header Nginx-Cache$upstream_cache_status;
           proxy_cache_valid 200 304 301 3028h;
           proxy_cache_valid 404 1m;
           proxy_cache_valid any 1d;
           proxy_cache_key$host$uri$is_args$args;
           expires 30d;
       }

相關選項說明:

proxy_bufferingon;代理的時候,開啟或關閉緩衝後端伺服器的響應。

當開啟緩衝時,nginx儘可能快地從被代理的伺服器接收響應,再將它存入緩衝區中。

proxy_temp_path快取臨時目錄。後端的響應並不直接返回客戶端,而是先寫到一個臨時檔案中,然後被rename一下當做快取放在 proxy_cache_path 。0.8.9版本以後允許temp和cache個目錄在不同檔案系統上(分割槽),然而為了減少效能損失還是建議把它們設成一個檔案系統上。

proxy_cache_path 設定快取目錄,目錄裡的檔名是cache_key的MD5值。

levels=1:2keys_zone=my-cache:100m表示採用2級目錄結構,第一層目錄只有一個字元,是由levels=1:2設定,總共二層目錄,子目錄名字由二個字元組成。Web快取區名稱為my-cache,記憶體快取空間大小為100MB,這個緩衝zone可以被多次使用。檔案系統上看到的快取檔名類似於/usr/local/nginx/proxy_cache/c/29/b7f54b2df7773722d382f4809d65029c 。

inactive=600max_size=2g表示600分鐘沒有被訪問的內容自動清除,硬碟最大快取空間為2GB,超過這個大學將清除最近最少使用的資料。

需要在預設情況,nginx不快取從後端響應的http頭中帶有Set-Cookie的物件。如果客戶端傳送的請求帶有Cookie header,varnish將忽略快取,直接將請求傳遞到後端。nginx中通過proxy_ignore_headers設定忽略它們,設定方法如下:

解決辦法:  

proxy_ignore_headersSet-Cookie;

proxy_hide_headerSet-Cookie;

proxy_cache:引用前面定義的快取區 my-cache

proxy_cache_key:定義如何生成快取的鍵,設定web快取的key值,nginx根據key值md5雜湊儲存快取

proxy_cache_valid:為不同的響應狀態碼設定不同的快取時間,比如200、302等正常結果可以快取的時間長點,而404、500等快取時間設定短一些,這個時間到了檔案就會過期,而不論是否剛被訪問過。

add_header指令來設定response header, 語法: add_header name value;

$upstream_cache_status這個變數來顯示快取的狀態,我們可以在配置中新增一個http頭來顯示這一狀態,

$upstream_cache_status包含以下幾種狀態: 

•MISS未命中,請求被傳送到後端 

•HIT快取命中 

•EXPIRED快取已經過期請求被傳送到後端 

•UPDATING正在更新快取,將使用舊的應答 

•STALE後端將得到過期的應答

expires:在響應頭裡設定Expires:或Cache-Control:max-age,返回給客戶端的瀏覽器快取失

下面的nginx.conf實現nginx在前端做反向代理伺服器的完整配置檔案的例子

user  nginx nginx;  
worker_processes  1;  
error_log  logs/error.log;  
#error_log  logs/error.log  notice;  
#error_log  logs/error.log  info;  
worker_rlimit_nofile 10240;  
pid        logs/nginx.pid;  
events {  
    use epoll;  
    worker_connections  4096;  
}  
http {  
    include       mime.types;  
    default_type  application/octet-stream;  
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '  
                      '$status $body_bytes_sent "$http_referer" '  
                      '"$http_user_agent" "$http_x_forwarded_for"'  
                      '"$upstream_cache_status"';  
access_log  logs/access.log  main;  
server_tokens off;  
    sendfile        on;  
    #tcp_nopush     on;  
    #keepalive_timeout  0;  
    keepalive_timeout  65;  
    #Compression Settings  
    gzip on;  
    gzip_comp_level 6;  
    gzip_http_version 1.1;  
    gzip_proxied any;  
    gzip_min_length 1k;  
    gzip_buffers 16 8k;  
    gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;  
    gzip_vary on;  
    #end gzip  
    # http_proxy Settings  
    client_max_body_size   10m;  
    client_body_buffer_size   128k;  
    proxy_connect_timeout   75;  
    proxy_send_timeout   75;  
    proxy_read_timeout   75;  
    proxy_buffer_size   4k;  
    proxy_buffers   4 32k;  
    proxy_busy_buffers_size   64k;  
proxy_temp_file_write_size  64k;  
proxy_buffering on;  
    proxy_temp_path /usr/local/nginx/proxy_temp;  
    proxy_cache_path /usr/local/nginx/proxy_cache levels=1:2 keys_zone=my-cache:100m max_size=1000m inactive=600m max_size=2g;  
    #load balance Settings  
    upstream backend {  
        sticky;  
        server 192.168.1.30:80 weight=1 max_fails=2 fail_timeout=10s;  
        server 192.168.1.40:80 weight=1 max_fails=2 fail_timeout=10s;  
    }  
    #virtual host Settings  
    server {  
        listen       80;  
        server_name  localhost;  
        charset utf-8;  
        location  ~/purge(/.*) {  
           allow 127.0.0.1;  
           allow 192.168.1.0/24;  
           deny all;  
           proxy_cache_purge my-cache $host$1$is_args$args;  
        }  
        location / {  
            index  index.php index.html index.htm;  
            proxy_pass        http://backend;  
            proxy_redirect off;  
            proxy_set_header  Host  $host;  
            proxy_set_header  X-Real-IP  $remote_addr;  
            proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;  
            proxy_ignore_headers Set-Cookie;  
proxy_hide_header Set-Cookie;  
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;  
        }  
        location ~ .*\.(gif|jpg|png|html|htm|css|js|ico|swf|pdf)(.*) {  
           proxy_pass  http://backend;  
           proxy_redirect off;  
           proxy_set_header Host $host;  
           proxy_set_header X-Real-IP $remote_addr;  
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
           proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;  
           proxy_cache my-cache;  
           add_header Nginx-Cache $upstream_cache_status;  
           proxy_cache_valid 200 304 301 302 8h;  
           proxy_cache_valid 404 1m;  
           proxy_cache_valid any 1d;  
           proxy_cache_key $host$uri$is_args$args;  
           expires 30d;  
        }  
        location /nginx_status {  
            stub_status on;  
            access_log off;  
            allow 192.168.1.0/24;  
            deny all;  
        }  
    }  
}

以上配置檔案加入到Nginx主配置中,兩臺Nginx主配都要一致!

配置完成後儲存退出 重新載入Nginx即可

四、配置keepalived+Nginx實現高可用

keepalived這裡不在做詳細的介紹,簡單一句話,keepalived高可用解決單點故障,如果一臺主機宕機,那麼從伺服器就會接管主伺服器

keepalived工作流程圖如下:

Nginx-cache-master主機操作(安裝keepalived)

[[email protected] src]# tar zxfkeepalived-1.2.12.tar.gz

[[email protected] src]# cdkeepalived-1.2.12/

[[email protected]]# ./configure --prefix=/ && make &&make install  

2、設定開機自啟動

[[email protected] keepalived-1.2.12]# chkconfig--add keepalived

[[email protected] keepalived-1.2.12]# chkconfigkeepalived on

3、Nginx-cache-slave主機操作(安裝keepalived)

[[email protected] keepalived-1.2.12]# tar zxfkeepalived-1.2.12.tar.gz
[[email protected] keepalived-1.2.12]# cd keepalived-1.2.12/

[[email protected] keepalived-1.2.12]#./configure--prefix=/ && make && make instal l

4、keepalived配置(以下是Nginx-cache-master主配置)路徑:/etc/keepalived/keepalived.conf

! Configuration File for keepalived  


global_defs {  
router_id 192.168.1.10
}  
vrrp_script chk_http_port {  
	script "/opt/chk_nginx.sh"  
	interval 2        #每2秒檢測一次nginx的執行狀態  
	weight -5       #失敗一次,將自己的優先順序-5  
}  


vrrp_instance VI_1 {  
	state MASTER        # 狀態,主節點為MASTER,備份節點為BACKUP  
	interface eno16777728     # 繫結VIP的網路介面,通過ifconfig檢視自己的網路介面  
	virtual_router_id 51    # 虛擬路由的ID號,兩個節點設定必須一樣  
	priority 100               # 節點優先順序,值範圍0~254,MASTER要比BACKUP高  
	advert_int 1               # 組播資訊傳送時間間隔,兩個節點必須設定一樣,預設為1秒  
	authentication {           # 設定驗證資訊,兩個節點必須一致  
	auth_type PASS  
	auth_pass 1111  
}  
# 虛擬IP,兩個節點設定必須一樣。可以設定多個,一行寫一個  
	virtual_ipaddress {  
	192.168.1.150/24  
}  


track_script {  
	chk_http_port           # nginx存活狀態檢測指令碼  
}  
}  


nginx-cache-slave主配置如下

! Configuration File for keepalived  
  
global_defs {  
	   router_id 192.168.1.20
}  
	  
vrrp_script chk_http_port {           
	    script "/opt/chk_nginx.sh"     
	    interval 2                        
	    weight -5                         
}  
	  
vrrp_instance VI_1 {  
	    state slave  
	    interface eno16777728 
	    virtual_router_id 51  
	    priority 50   這裡的節點優先順序要小於master主機
	    advert_int 1  
	    authentication {  
	        auth_type PASS  
	        auth_pass 1111  
}  
  virtual_ipaddress {  
	      192.168.1.150/24  
}  
	  
	track_script {                       

配置完成後我們啟動keepalived (master+slave同時操作)
systemctl restart keepalived(重啟完成後檢視vip地址)
master主機:

slave主機:

在keepalived主配置中我們定義了檢檢測Nginx指令碼,我們需要在/opt/下建立chk_nginx.sh指令碼

vrrp_script chk_http_port {           
	script "/opt/chk_nginx.sh"     
    interval 2                        
    weight -5                         
}  

指令碼內容如下:(建立指令碼後需要給指令碼執行許可權)

#!/bin/bash 

A=`ps -Cnginx --no-header |wc -l` 

if [ $A -eq0 ];then 

   killall -9 keepalived 

fi

剖析:如果Nginx服務停止執行,那麼執行killall -9 keepalived同時也停止keepalived,這時候從就收不到主的廣播,從而接管主的任務,驗證如下:

這時候我們再次檢視從的狀態

到這裡我們的keepalived+nginx高可用已經搭建完畢,按照正常情況下我們就可以訪問我們的vip地址來獲取資料了,我們現在來嘗試的訪問一下。http://192.168.1.150:80

但是它提示我們502,502錯誤指的是閘道器錯誤,我們先看下目前我們在整個架構中走到了哪裡

到這裡我們只是配置了前端的nginx反向代理以及keepalived高可用性,我們前端的代理指定了後端的web叢集,所以它才會報502的錯誤,那麼接下來我們配置後端的web叢集!

五、搭建後端的web叢集

1、安裝Nginx1(1.30操作)

1)安裝Nginx相關的依賴包(pcre zlib openssl)

[[email protected] ~]# yum installgcc gcc-c++ pcre-devel zlib-devel openssl-devel –y

2)建立Nginx使用者指定id(因為後端的lnmp環境是分離部署的所以需要指定id)

[[email protected]~]# groupadd -g 1001 nginx
[[email protected]~]# useradd -u 900 nginx -g nginx -s /sbin/nologin

3)下載Nginx原始碼包並隱藏版本號等等,上面已經有了這裡不做演示了。

[[email protected]]#wget http://nginx.org/download/nginx-1.12.2.tar.gz
[[email protected]]# tar zxf nginx-1.12.2.tar.gz
[[email protected]]# cd nginx-1.12.2/

[[email protected]]# ./configure --prefix=/usr/local/nginx --with-http_dav_module--with-http_stub_status_module --with-http_addition_module --with-http_sub_module  --with-http_flv_module --with-http_mp4_module--with-pcre --with-http_ssl_module --with-http_gzip_static_module  --user=nginx --group=nginx && make && make install

4)編譯安裝完成後我們優化執行路徑

[[email protected]]# ln -s /usr/local/nginx/sbin/nginx  /usr/local/sbin/

5)啟動Nginx並訪問測試


驗證錯誤頁面返回資訊

Nginx優化

1)設定Nginx最大開啟的檔案數

worker_rlimit_nofile65535;

這個指令是指當一個nginx程序開啟的最多檔案描述符數目,理論值應該是最多開啟檔案數(ulimit -n)與nginx程序數相除,但是nginx分配請求並不是 那麼均勻,所以最好與ulimit -n的值保持一致。

檔案資源限制的配置可以在/etc/security/limits.conf設定,針對root/user等各個使用者或者*代表所有使用者來設定。
*    soft   nofile   65535 
*    hard  nofile    65535
使用者重新登入生效(ulimit -n)
[[email protected] conf]# vim /etc/security/limits.conf

配置Nginx主配(vim /usr/local/nginx/conf/nginx.conf)

2)Nginx事件處理模型

events {
use epoll;
worker_connections 65535;
multi_accept on;
}

nginx採用epoll事件模型,處理效率高
work_connections是單個worker程序允許客戶端最大連線數,這個數值一般根據伺服器效能和記憶體來制定,實際最大值就是worker程序數乘以work_connections
實際我們填入一個65535,足夠了,這些都算併發值,一個網站的併發達到這麼大的數量,也算一個大站了!
multi_accept 告訴nginx收到一個新連線通知後接受盡可能多的連線

3)Nginx連線超時時間
1、主要目的是保護伺服器的資源,CPU,記憶體,控制的連線數,因為在建立連線也需要消耗資源的具體引數如下:

keepalive_timeout 60;  
tcp_nodelay on;  
client_header_buffer_size 4k;  
open_file_cache max=102400 inactive=20s;  
open_file_cache_valid 30s;  
open_file_cache_min_uses 1;  
client_header_timeout 15;  
client_body_timeout 15;  
reset_timedout_connection on;  
send_timeout 15;  
server_tokens off;  
client_max_body_size 10m;  

keepalived_timeout 客戶端連線保持會話超時時間,超過這個時間,伺服器斷開這個連結

tcp_nodelay 也是防止網路阻塞,不過要包涵在keepalived引數才有效

client_header_buffer_size4k;
客戶端請求頭部的緩衝區大小,這個可以根據你的系統分頁大小來設定,一般一個請求頭的大小不會超過 1k,不過由於一般系統分頁都要大於1k,所以這裡設定為分頁大小。分頁大小可以用命令getconf PAGESIZE取得
open_file_cache max=102400 inactive=20s;
這個將為開啟檔案指定快取,預設是沒有啟用的,max指定快取數量,建議和開啟檔案數一致,inactive 是指經過多長時間檔案沒被請求後刪除快取。

open_file_cache_valid30s 這個是指多長時間檢查一次快取的有效資訊

open_file_cache_min_uses1;
open_file_cache指令中的inactive 引數時間內檔案的最少使用次數,如果超過這個數字,檔案描述符一直是在快取中開啟的,如上例,如果有一個檔案在inactive 時間內一次沒被使用,它將被移除。

client_header_timeout 設定請求頭的超時時間。我們也可以把這個設定低些,如果超過這個時間沒有傳送任何資料,nginx將返回request time out的錯誤

client_body_timeout 設定請求體的超時時間。我們也可以把這個設定低些,超過這個時間沒有傳送任何資料,和上面一樣的錯誤提示

reset_timeout_connection 告訴nginx關閉不響應的客戶端連線。這將會釋放那個客戶端所佔有的記憶體空間。

send_timeout 響應客戶端超時時間,這個超時時間僅限於兩個活動之間的時間,如果超過這個時間,客戶端沒有任何活動,nginx關閉連線

server_tokens  並不會讓nginx執行的速度更快,但它可以關閉在錯誤頁面中的nginx版本數字,這樣對於安全性是有好處的。

client_max_body_size  上傳檔案大小限制 

4fastcgi調優

fastcgi_connect_timeout     600;  
fastcgi_send_timeout 600;  
fastcgi_read_timeout 600;  
fastcgi_buffer_size 64k;  
fastcgi_buffers  4 64k;  
fastcgi_busy_buffers_size 128k;  
fastcgi_temp_file_write_size 128k;  
fastcgi_temp_path /usr/local/nginx/nginx_tmp;  
fastcgi_intercept_errors on;  
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=cache_fastcgi:128m inactive=1d max_size=10g;

fastcgi_send_timeout600; #向FastCGI傳送請求的超時時間
fastcgi_read_timeout 600; #指定接收FastCGI應答的超時時間。
fastcgi_buffer_size 64k;  #指定讀取FastCGI應答第一部分需要用多大的緩衝區,預設的緩衝區大小為fastcgi_buffers指令中的每塊大小,可以將這個值設定更小。
fastcgi_buffers 4 64k; #指定本地需要用多少和多大的緩衝區來緩衝FastCGI的應答請求,如果一個php指令碼所產生的頁面大小為256KB,那麼會分配4個64KB的緩衝區來快取,如果頁面大小大於256KB,那麼大於256KB的部分會快取到fastcgi_temp_path指定的路徑中,但是這並不是好方法,因為記憶體中的資料處理速度要快於磁碟。一般這個值應該為站點中php指令碼所產生的頁面大小的中間值,如果站點大部分指令碼所產生的頁面大小為256KB,那麼可以把這個值設定為“8 32K”、“4 64k”等。
fastcgi_busy_buffers_size 128k; #建議設定為fastcgi_buffers的兩倍,繁忙時候的buffer
fastcgi_temp_file_write_size 128k;   #在寫入fastcgi_temp_path時將用多大的資料塊,預設值是fastcgi_buffers的兩倍,該數值設定小時若負載上來時可能報502 BadGateway
fastcgi_temp_path #快取臨時目錄
fastcgi_intercept_errors on;# 這個指令指定是否傳遞4xx和5xx錯誤資訊到客戶端,或者允許nginx使用error_page處理錯誤資訊。
注:靜態檔案不存在會返回404頁面,但是php頁面則返回空白頁!!
fastcgi_cache_path /usr/local/nginx1.10/fastcgi_cache levels=1:2keys_zone=cache_fastcgi:128minactive=1d max_size=10g; # fastcgi_cache快取目錄,可以設定目錄層級,比如1:2會生成16*256個子目錄,cache_fastcgi是這個快取空間的名字,cache是用多少記憶體(這樣熱門的內容nginx直接放記憶體,提高訪問速度),inactive表示預設失效時間,如果快取資料在失效時間內沒有被訪問,將被刪除,max_size表示最多用多少硬碟空間。

fastcgi_cache cache_fastcgi;  #表示開啟FastCGI快取併為其指定一個名稱。開啟快取非常有用,可以有效降低CPU的負載,並且防止502的錯誤放生。cache_fastcgi 為proxy_cache_path指令建立的快取區名稱
fastcgi_cache_valid 200 302 1h;  #用來指定應答程式碼的快取時間,例項中的值表示將200和302應答快取一小時,要和fastcgi_cache配合使用
fastcgi_cache_valid 301 1d;      #將301應答快取一天
fastcgi_cache_valid any 1m;      #將其他應答快取為1分鐘
fastcgi_cache_min_uses 1;        #該指令用於設定經過多少次請求的相同URL將被快取。
fastcgi_cache_key http://$host$request_uri; #該指令用來設定web快取的Key值,nginx根據Key值md5雜湊儲存.一般根據$host(域名)、$request_uri(請求的路徑)等變數組合成proxy_cache_key 。fastcgi_pass #指定FastCGI伺服器監聽埠與地址,可以是本機或者其它


nginx的快取功能有:proxy_cache /fastcgi_cache
proxy_cache的作用是快取後端伺服器的內容,可能是任何內容,包括靜態的和動態。
fastcgi_cache的作用是快取fastcgi生成的內容,很多情況是php生成的動態的內容。
proxy_cache快取減少了nginx與後端通訊的次數,節省了傳輸時間和後端寬頻。
fastcgi_cache快取減少了nginx與php的通訊的次數,更減輕了php和資料庫(mysql)的壓力。


5)GZIP調優

使用gzip壓縮功能,可能為我們節約頻寬,加快傳輸速度,有更好的體驗,也為我們節約成本,所以說這是一個重點。
Nginx啟用壓縮功能需要你來ngx_http_gzip_module模組,apache使用的是mod_deflate
一般我們需要壓縮的內容有:文字,js,html,css,對於圖片,視訊,flash什麼的不壓縮,同時也要注意,我們使用gzip的功能是需要消耗CPU的!具體引數如下:

gzip on;  
gzip_min_length  2k;  
gzip_buffers     4 32k;  
gzip_http_version 1.1;  
gzip_comp_level 6;  
gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;  
gzip_vary on;  
gzip_proxied any;

gzip on;     #開啟壓縮功能

gzip_min_length1k; #設定允許壓縮的頁面最小位元組數,頁面位元組數從header頭的Content-Length中獲取,預設值是0,不管頁面多大都進行壓縮,建議設定成大於1K,如果小與1K可能會越壓越大。

gzip_buffers4 32k; #壓縮緩衝區大小,表示申請4個單位為32K的記憶體作為壓縮結果流快取,預設值是申請與原始資料大小相同的記憶體空間來儲存gzip壓縮結果。

gzip_http_version1.1; #壓縮版本,用於設定識別HTTP協議版本,預設是1.1,目前大部分瀏覽器已經支援GZIP解壓,使用預設即可

gzip_comp_level6; #壓縮比例,用來指定GZIP壓縮比,1壓縮比最小,處理速度最快,9壓縮比最大,傳輸速度快,但是處理慢,也比較消耗CPU資源。

gzip_types text/csstext/xmlapplication/javascript; #用來指定壓縮的型別,‘text/html’型別總是會被壓縮。預設值: gzip_types text/html (預設不對js/css檔案進行壓縮)

6)expires快取調優

快取,主要針對於圖片,css,js等元素更改機會比較少的情況下使用,特別是圖片,佔用頻寬大,我們完全可以設定圖片在瀏覽器本地快取365d,css,js,html可以快取個10來天,這樣使用者第一次開啟載入慢一點,第二次,就非常快了!快取的時候,我們需要將需要快取的拓展名列出來, Expires快取配置在server欄位裡面。

location ~* \.(ico|jpe?g|gif|png|bmp|swf|flv)$ {  
	   expires 30d;  
           #log_not_found off;  
           access_log off;  
}  
  
location ~* \.(js|css)$ {  
  expires 7d;  
  log_not_found off;  
  access_log off;  
}     

在這裡Nginx大致的調優就OK了這裡我沒有設定cpu核數,因為我這邊就一核。資源不夠用,配置完成後載入Nginx

[[email protected]~]# nginx -t

nginx: theconfiguration file /usr/local/nginx/conf/nginx.conf syntax is ok

nginx:configuration file /usr/local/nginx/conf/nginx.conf test is successful

[[email protected]~]# nginx -s reload

在這裡我們的Nginx-web1已經配置完畢了,在nginx-web2(1.40主機上的配置和1是一樣的 這裡不在做演示了)

接下來我們匯入不同的頁面來測試Nginx反向代理是否能夠代理後端的web伺服器

Nginx1操作:[[email protected] ~]# echo "192.168.1.30-nginx-web1" >/usr/local/nginx/html/index.html

Nginx2:操作:[[email protected] ~]# echo "192.168.1.40-nginx-web2" >/usr/local/nginx/html/index.html


接下來訪問VIP地址不斷重新整理測試是否能夠代理後端web

出現以上頁面證明,前端的nginx代理伺服器能夠成功的轉發到後端的web伺服器上,在這裡我們在看看在整個架構中走到了哪裡如下:

在豎行左邊我們已經做完了,並且測試完成!前端已經成功的代理了後端的伺服器,接下來配置後端的PHP、MySQL。讓nginx能夠解析到PHP服務,從而展示出動態頁面!

六、安裝部署PHP(PHP+Xcache)1.50操作

1、安裝相關的依賴包

[[email protected] ~]# yum install gcc gcc-c++ libxml2-devel libcurl-devel openssl-devel bzip2-devel –y



2)安裝Libmcrypt

[[email protected] src]# wget ftp://mcrypt.hellug.gr/pub/crypto/mcrypt/libmcrypt/libmcrypt-2.5.7.tar.gz
[[email protected] src]# tar zxf libmcrypt-2.5.7.tar.gz
[[email protected] src]# cd libmcrypt-2.5.7/ 
[[email protected] libmcrypt-2.5.7]# ./configure --prefix=/usr/local/libmcrypt && make && make install



3)正式安裝php(在編譯的過程稍微有點慢~~)
下載php安裝包—>解壓—>編譯安裝

[[email protected] src]# wget http://cn2.php.net/distributions/php-5.6.27.tar.gz
[[email protected] src]# tar zxf php-5.6.27.tar.gz 
[[email protected] src]# cd php-5.6.27/

[[email protected] php-5.6.27]# ./configure --prefix=/usr/local/php5.6 --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-openssl --enable-fpm --enable-sockets --enable-sysvshm --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --with-mhash --with-mcrypt=/usr/local/libmcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2 --enable-maintainer-zts && make && make install

4)編譯安裝完成後我們建立Nginx使用者(UID要和Nginx伺服器一致!)

[[email protected] php-5.6.27]# groupadd -g 1001 nginx
[