apache mysql php实现最大负载的方法_如何架设高性能nginx+php+mysql搭配的服务器,解决高并发问题...
很多站長(zhǎng)會(huì)發(fā)現(xiàn)把網(wǎng)站發(fā)布到服務(wù)器上后,網(wǎng)站訪問(wèn)速度很慢。這個(gè)對(duì)網(wǎng)站來(lái)說(shuō)是個(gè)致命傷,網(wǎng)站相應(yīng)速度慢,即使網(wǎng)站做的很漂亮,內(nèi)容很完整,客戶打開(kāi)蝸牛一樣的也會(huì)失去耐心,可能直接關(guān)閉網(wǎng)站離開(kāi),這樣就導(dǎo)致用戶流失,最后發(fā)現(xiàn)網(wǎng)站每天都沒(méi)有人訪問(wèn)了,另外還有一些網(wǎng)站做起來(lái)后流量越來(lái)越大,但是響應(yīng)速度也越來(lái)越低,甚至有時(shí)候還會(huì)因并發(fā)請(qǐng)求太大而宕機(jī)。那么,對(duì)于這些問(wèn)題,請(qǐng)求量大的網(wǎng)站,服務(wù)器該如何支撐?該如何提高網(wǎng)站速度呢?
通常情況下,我們會(huì)從下面幾點(diǎn)優(yōu)化開(kāi)始:1.要減少請(qǐng)求,對(duì)于開(kāi)發(fā)人員----合并css,?背景圖片,?減少mysql查詢等.
2.對(duì)于運(yùn)維?nginx的expires?,利用瀏覽器緩存等,減少查詢.
3.利用cdn來(lái)響應(yīng)請(qǐng)求
4.最終剩下的,不可避免的請(qǐng)求----服務(wù)器集群+負(fù)載均衡來(lái)支撐.
所以,來(lái)到第4步后,就不要再考慮減少請(qǐng)求這個(gè)方向了.
而是思考如何更好的響應(yīng)高并發(fā)請(qǐng)求.
大的認(rèn)識(shí)-------既然響應(yīng)是不可避免的,我們要做的是把工作內(nèi)容”平均”分給每臺(tái)服務(wù)器.
最理想的狀態(tài) 每臺(tái)服務(wù)器的性能都被充分利用.
服務(wù)器介紹:服務(wù)器IP:
A??192.168.1.201
B??192.168.1.202
C?203
D?204
1臺(tái)?A
RAM:?2G
HD:?500G
3臺(tái)?B,?C,?D
RAM:?8G
Hd??:?200G
步驟:
1:A號(hào)服務(wù)器
1.1安裝?mysql
1.2并導(dǎo)入數(shù)據(jù).
注意:先把表中的索引去掉,加快導(dǎo)入速度
2:?C號(hào)服務(wù)器:
2.1:?編譯PHP
注意:?enbale-fpm?,?with-mysql=mysqlnd???(編譯成獨(dú)立fpm進(jìn)程,支持mysql,)
2.2:?下載第3方的memcached擴(kuò)展?編譯進(jìn)來(lái)
3:?D號(hào)服:
3.1?編譯?memcached
4:?B號(hào)服:
編譯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方模塊,需要自己下載.
安裝統(tǒng)計(jì)模塊,便于觀察nginx的狀態(tài)
./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?--
服務(wù)器集群與負(fù)載均衡搭建完畢1:問(wèn)題??C-->A?的mysql連接很慢
解決:?my.cnf中的[mysqld]節(jié)點(diǎn)中,添加
skip-name-resolve???//?這句話使mysql連接時(shí)忽略解析域名,在制定Mysql權(quán)限時(shí),只能根據(jù)IP限制,不能根據(jù)域名限制.
2:?問(wèn)題??當(dāng)memcache中沒(méi)有相應(yīng)的數(shù)據(jù),從后臺(tái)回調(diào)數(shù)據(jù)時(shí),
http的狀態(tài)碼是404,(雖然內(nèi)容正常),這樣不利于SEO
解決:?nginx/conf/nginx.conf
error_page?404??=200?/callback.php;??//?這樣?404被改寫成200來(lái)響應(yīng)中
壓力測(cè)試:模擬?前0-10萬(wàn)是熱數(shù)據(jù),
10-20萬(wàn)是冷門數(shù)據(jù)
請(qǐng)求熱數(shù)據(jù)?0-10,請(qǐng)求9次
請(qǐng)求準(zhǔn)予數(shù)據(jù)?請(qǐng)求1次,?????-----100萬(wàn)次的請(qǐng)求.
優(yōu)化思路:
nginx響應(yīng)請(qǐng)求
1:建立socket連接
2:?打開(kāi)文件,并沿socket返回.
排查問(wèn)題,也要注意觀察這兩點(diǎn),
主要從系統(tǒng)的dmesg?,和nginx的error.log來(lái)觀察
優(yōu)化過(guò)程1:判斷nginx的瓶頸
1.1:?首先把a(bǔ)b測(cè)試端的性能提高,使之能高并發(fā)的請(qǐng)求.
易出問(wèn)題:?too?many?open?files
原因?:??ab在壓力測(cè)試時(shí),打開(kāi)的socket過(guò)多
解決:?ulimit?-n?30000?(重啟失效)
觀察結(jié)果:?nginx?不需要特殊優(yōu)化的情況下,?5000個(gè)連接,1秒內(nèi)響應(yīng).
滿足要求,但?wating狀態(tài)的連接過(guò)多.
1.2:?解決waiting進(jìn)程過(guò)多的問(wèn)題.
解決辦法:?keepalive_timeout?=?0;
即:?請(qǐng)求結(jié)果后,不保留tcp連接.
在高并發(fā)的情況下,?keepalive會(huì)占據(jù)大量的socket連接.
結(jié)果:?waiting狀態(tài)的連接明顯減少.
1.3:?解決服務(wù)端?too?many?open?files
分析:?nginx要響應(yīng),
1是要建立socket連接,
2?是要讀本地文件
這兩個(gè)者限制.
由上圖可看出,nginx的問(wèn)題容易出在2點(diǎn)上:1:?nginx接受的tcp連接多,能否建立起來(lái)?
2:?nginx響應(yīng)過(guò)程,要打開(kāi)許多文件?,能否打開(kāi)?
第1個(gè)問(wèn)題: 在內(nèi)核層面(見(jiàn)下)
第2個(gè)問(wèn)題 (見(jiàn)下)
系統(tǒng)內(nèi)核層面:net.core.somaxconn?=?4096?允許等待中的監(jiān)聽(tīng)
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之間的優(yōu)化
如上圖,在很多個(gè)nginx來(lái)訪問(wèn)fpm時(shí), fpm的進(jìn)程要是不夠用, 會(huì)生成子進(jìn)程.生成子進(jìn)程需要內(nèi)核來(lái)調(diào)度,比較耗時(shí),
如果網(wǎng)站并發(fā)比較大,
我們可以用靜態(tài)方式一次性生成若干子進(jìn)程,保持在內(nèi)存中.方法?--?修改php-fpm.conf
Pm?=?static??讓fpm進(jìn)程始終保持,不要?jiǎng)討B(tài)生成
Pm.max_children=?32??始終保持的子進(jìn)程數(shù)量
Php-mysql的優(yōu)化Linux機(jī)器下?,php?通過(guò)IP連接其他mysql服務(wù)器時(shí),容易出的問(wèn)題
能ping能,但connect不到.
一般是由:mysql服務(wù)器的防火墻影響的. 并發(fā)1萬(wàn)連接,響應(yīng)時(shí)間過(guò)長(zhǎng).
優(yōu)化思路: 同上的nginx1:?內(nèi)核層面,加大連接數(shù),并加快tcp回收
2:?mysql層面,增大連接數(shù)
3:?php層面,用長(zhǎng)連接,節(jié)省連接數(shù)
4:?用memcached緩存,減輕mysql負(fù)擔(dān)
具體:1.1??,?PHP服務(wù)器增大?ulimint?-n選項(xiàng)
1.2?mysql服務(wù)器內(nèi)核配置
添加或修改如下選項(xiàng)
net.ipv4.tcp_tw_recycle?=?1
net.ipv4.tcp_tw_reuse?=?1
net.ipv4.tcp_syncookies?=?0syscttl -p 使修改立即生效
2.1 修改mysql.cnfVi??/etc/my.conf
#?service?mysqld?restart?重啟mysql
3.1 PHP層面 ,用長(zhǎng)連接Mysql_connect?--->?mysql_pconnect
注:?pconnect?在PHP以apache模塊的形式存在時(shí),無(wú)效果.
Nginx+phjp+mysql+nginx
在引入memcached后,性能提升不明顯,甚至還略有下降
memcached使50%的請(qǐng)求變快了,但是一部分,反倒慢了.
原因在于--PHP->memcached也要建立tcp連接,代價(jià)挺高,
但緩存了數(shù)據(jù)之后,就省去了mysql的查詢時(shí)間.總結(jié): memcached適合存復(fù)雜的sql,尤其是連接查詢/模糊查詢的sql結(jié)果
總結(jié)
以上是生活随笔為你收集整理的apache mysql php实现最大负载的方法_如何架设高性能nginx+php+mysql搭配的服务器,解决高并发问题...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php与mysql同步_php实现mys
- 下一篇: MySQL新建匿名用户_初始化MySQL