服務器集羣及優化筆記

 

高性能的服務器的架設php

 

對於高性能網站 ,請求量大,如何支撐?css

1方面,要減小請求mysql

對於開發人員----合併css, 背景圖片, 減小mysql查詢等.nginx

 

2: 對於運維 nginx的expires ,利用瀏覽器緩存等,減小查詢.sql

3: 利用cdn來響應請求apache

 

4: 最終剩下的,不可避免的請求----服務器集羣+負載均衡來支撐.瀏覽器

 

因此,來到第4步後,就不要再考慮減小請求這個方向了.緩存

而是思考如何更好的響應高併發請求.服務器

 

大的認識-------既然響應是不可避免的,咱們要作的是把工做內容」平均」分給每臺服務器.cookie

最理想的狀態 每臺服務器的性能都被充分利用.

 

 

 

 

服務器介紹:

 

服務器IP:

A  192.168.1.201

B  192.168.1.202

C 203

D204

 

Root: zixue.it

 

 

1臺 A

RAM: 2G

HD: 500G

 

 

3臺 B, C, D

RAM: 8G

Hd  : 200G

 

步驟:

1:A號服務器

           1.1安裝 mysql

    1.2並導入數據.

注意:先把表中的索引去掉,加快導入速度

 

2: C號服務器:

  2.1: 編譯PHP

注意: enbale-fpm , with-mysql=mysqlnd   (編譯成獨立fpm進程,支持mysql,)

  2.2: 下載第3方的memcached擴展 編譯進來

 

3: D號服:

  3.1 編譯 memcached

 

4: B號服:

編譯nginx ,並配置

Cd /app/pcre-8.12

./configure

Make && make install

 

Cd nginx-1.2.7

./configure --prefix=/usr/local/nginx --add-module=/app/ngx_http_consistent_hash-master

注:紅線部分是nginx的第3方模塊,須要本身下載.

 

 

安裝統計模塊,便於觀察nginx的狀態

./configure --prefix=/usr/local/nginx/ --add-module=/app/ngx_http_consistent_hash-master --with-http_stub_status_module

 

 

 

 

 

 

Php 安裝配置

1 tar -xzvf  /path/’

2 cd /path/

3 .configure --prefix=/usr/local/php --

 

 

 

 

服務器集羣與負載均衡搭建完畢

1:問題  C-->A 的mysql鏈接很慢

解決: my.cnf中的[mysqld]節點中,添加

skip-name-resolve   // 這句話使mysql鏈接時忽略解析域名,在制定Mysql權限時,只能根據IP限制,不能根據域名限制.

 

2: 問題  當memcache中沒有相應的數據,從後臺回調數據時,

http的狀態碼是404,(雖然內容正常),這樣不利於SEO

解決: nginx/conf/nginx.conf

 error_page 404  =200 /callback.php;  // 這樣 404被改寫成200來響應中

 

 

 

壓力測試:

模擬 前0-10萬是熱數據,

10-20萬是冷門數據

 

請求熱數據 0-10,請求9次

請求准予數據 請求1次,     -----100萬次的請求.

 

 

優化思路:

nginx響應請求

1:創建socket鏈接

2: 打開文件,並沿socket返回.

 

排查問題,也要注意觀察這兩點,

主要從系統的dmesg ,和nginx的error.log來觀察

 

 

 

1:判斷nginx的瓶頸

 

1.1: 首先把ab測試端的性能提升,使之能高併發的請求.

易出問題: too many open files

緣由 :  ab在壓力測試時,打開的socket過多

解決: ulimit -n 30000 (重啓失效)

觀察結果: nginx 不須要特殊優化的狀況下, 5000個鏈接,1秒內響應.

知足要求,但 wating狀態的鏈接過多.

 

1.2: 解決waiting進程過多的問題.

解決辦法: keepalive_timeout = 0; 

即: 請求結果後,不保留tcp鏈接.

在高併發的狀況下, keepalive會佔據大量的socket鏈接.

結果: waiting狀態的鏈接明顯減小.

 

1.3: 解決服務端 too many open files

分析: nginx要響應,

1是要創建socket鏈接,

2 是要讀本地文件

這兩個者限制.

 

 

 

 

 

由上圖可看出,nginx的問題容易出在2點上:

1: nginx接受的tcp鏈接多,可否創建起來?

2: nginx響應過程,要打開許多文件 ,可否打開?

 

第1個問題: 在內核層面(見下)

第2個問題 (見下)

 

 

系統內核層面:

net.core.somaxconn = 4096 容許等待中的監聽

net.ipv4.tcp_tw_recycle = 1  tcp鏈接快速回收

net.ipv4.tcp_tw_reuse = 1    tcp鏈接重用  

net.ipv4.tcp_syncookies = 0  不抵禦洪水攻擊

ulimit -n 30000

 

 

Nginx層面:

解決: nginx.conf 下面: work_connection 加大

worker_connections  10240;

Worker_rlimit_nofiles 10000;

Keepalive_timeout 0;

 

 

 

 

 

Nginx---->php-fpm之間的優化

 

如上圖,在不少個nginx來訪問fpm時, fpm的進程要是不夠用, 會生成子進程.

 

生成子進程須要內核來調度,比較耗時,

若是網站併發比較大,

咱們能夠用靜態方式一次性生成若干子進程,保持在內存中.

 

方法 -- 修改php-fpm.conf

Pm = static  讓fpm進程始終保持,不要動態生成

Pm.max_children= 32  始終保持的子進程數量

 

 

Php-mysql的優化

 

Linux機器下 ,php 經過IP鏈接其餘mysql服務器時,容易出的問題

能ping能,但connect不到.

 

 

 

通常是由:mysql服務器的防火牆影響的.

 

併發1萬鏈接,響應時間過長.

 

優化思路: 同上的nginx

1: 內核層面,加大鏈接數,並加快tcp回收

2: mysql層面,增大鏈接數

3: php層面,用長鏈接,節省鏈接數

4: 用memcached緩存,減輕mysql負擔

 

具體:

1.1  , PHP服務器增大 ulimint -n選項

1.2 mysql服務器內核配置

添加或修改以下選項

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_syncookies = 0

 

# syscttl -p 使修改當即生效

 

2.1  修改mysql.cnf

Vi  /etc/my.conf

# service mysqld restart 重啓mysql

 

3.1 PHP層面 ,用長鏈接

Mysql_connect ---> mysql_pconnect

注: pconnect 在PHP以apache模塊的形式存在時,無效果.

 

Nginx+phjp+mysql+nginx

相關文章
相關標籤/搜索