【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時間內不分配請求到這臺伺服器
3)nginx的proxy快取使用:
快取也就是將js、css、image等靜態檔案從後端伺服器快取到nginx指定的快取目錄下,既可以減輕後端伺服器負擔,也可以加快訪問速度,但這樣快取及時清理成為了一個問題,所以需要 ngx_cache_purge 這個模組來在過期時間未到之前,手動清理快取。
proxy模組中常用的指令時proxy_pass和proxy_cache.
nginx的web快取功能的主要是由proxy_cache、fastcgi_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
[