在同一臺服務(wù)器上,用tcp socket與unix domain socket有什么區(qū)別?
如圖所示,對于進程間通訊的兩個程序,unix domain socket的流程不會走到TCP 那層,直接以文件形式,以stream socket通訊。如果是TCP socket,則需要走到IP層。
對于非同一臺服務(wù)器上,TCP socket走的就更多了。
至于localhost\127.0.0.1以及網(wǎng)絡(luò)IP他們之間的區(qū)別,無意中找到一篇博客寫的是以mysql作為驗證,來說明localhost不走TCP/IP層,跟127.0.0.1不一樣。末學(xué)認為他理解錯了。他的理由如下
(以下截圖均在linux上,windows的沒有unix domain socket)
mysql連接本機時,不加-h參數(shù):
mysql連接本機時,加-h參數(shù)且值是localhost:
mysql連接本機時,加-h參數(shù)且值是127.0.0.1:
那位同學(xué)從mysql工具的使用方法、與結(jié)果的區(qū)別,來理解推導(dǎo)localhost與127.0.0.1的區(qū)別,這從方向上就存在問題,我更相信,這是mysql這個程序自己的行為,遇到-h參數(shù)沒加,或者-h參數(shù)的值不是IP形式,且my.cnf里指定mysql的socket路徑時,則直接使用unix domain socket來連接服務(wù)器,當(dāng)然,這也是我的猜測,沒有去驗證,大家聽聽就好,別相信。
鑒于末學(xué)對以上的理解,將服務(wù)器的架構(gòu)配置變更如下
//NGinx 反代配置 upstream server1 { keepalive 10 single; //參見nginx官方wiki,記得看E文版,中文版的還沒更新 http://wiki.nginx.org/NginxHttpUpstreamModule server 10.10.8.97 max_fails=2 fail_timeout=30s; #app1 server 10.10.8.99 max_fails=2 fail_timeout=30s; #app2 server 10.10.8.85 max_fails=2 fail_timeout=30s; #app3 } //NGINX配置 //獲取PHP擴展名的規(guī)則,適用于 location ~ ^([^.]+\.php)($|/.*) { fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } //php-fpm配置 ; Note: This value is mandatory. listen = /var/run/php5-fpm.sock //與nginx 的fastcgi_pass的路徑一致即可,目錄要有相應(yīng)讀寫權(quán)限
至此,優(yōu)化還為完畢,若php-fpm與mysql使用mysql_pconnect的話,那么php-fpm的子進程生成模式最好用static模式,若為dynamic模式,可能會出現(xiàn)mysql連接數(shù)被占滿的情況,這也跟mysql服務(wù)的連接超時時間有關(guān),適當(dāng)調(diào)整也容易避免。
不過,我們目前還沒用mysql_pconnect,主要原因是我們的代碼中,有些事務(wù)處理開啟之后,對于代碼的失敗處理,忘記寫回滾語句,在短連接的情況下,這個連接的銷毀,哪怕客戶端沒提交ROLLBACK或者COMMIT指令,mysql會自動回滾之前的事務(wù)。但使用長連接之后,不同請求會使用同一個MYSQL連接句柄,每個事務(wù)開啟都會禁用MYSQL的自動提交,即SET AUTOCOMMIT=0語句,這語句會提交之前的事務(wù)。對于我們代碼忘記寫回滾,而直接返回結(jié)果的情況下,這是會出大問題的,也是我們目前唯一沒有使用MYSQL_pconnect的原因。(計劃近期找到?jīng)]有寫回滾語句的代碼,修復(fù),繼續(xù)使用mysql_pconnect)
其實還有,我們php-fpm使用了APC來緩存php file,以及 變量數(shù)據(jù)等,這些也是有優(yōu)化的地方(如果有時間的話,則待續(xù))。
回過頭來再理解下文章開頭那位同學(xué)給的解決辦法,我仍不能從他給的理由中,理解長連接的缺點,哪怕是解決了TIME_WAIT的問題,但每次創(chuàng)建TCP socket ,連接到服務(wù)器時三次握手,關(guān)閉TCP socket時的四次握手 這些也是開銷。當(dāng)然,縮短2MSL的時間,也是更好利用服務(wù)器資源的一個好方法。
最后,我們調(diào)整優(yōu)化的服務(wù)器架構(gòu)圖如下:
好像有點偏離這篇文章的標題了,其實我更想說我不能理解為啥nginx跟php-fpm給的默認配置中,都是TCP socket通訊的,為啥不默認給unix domain socket的默認配置呢?如果說為了方便非同一臺服務(wù)器時的情況,但給的默認IP也是回環(huán)地址呀。
而且,nginx給默認配置中,對于uri請求中的php文件的處理,匹配規(guī)則還是老的,之前發(fā)生因為NGINX與PHP的配置而導(dǎo)致的安全問題,雖然不是nginx的錯,但nginx也可給出更嚴謹?shù)姆独詻]有。
值得欣慰的是,在UBUNTU 12.4中,nginx的默認配置有了很大的改進,不管是匹配uri的規(guī)則,還是nginx與php-fpm的交互方式:
#location ~ \.php$ { # fastcgi_split_path_info ^(.+\.php)(/.+)$; //贊1 # # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini # # # With php5-cgi alone: # fastcgi_pass 127.0.0.1:9000; //贊3 # # With php5-fpm: # fastcgi_pass unix:/var/run/php5-fpm.sock; //贊3 # fastcgi_index index.php; # include fastcgi_params; #}
PS:末學(xué)只是個web程序員,這些只是末學(xué)學(xué)習(xí)研究如上知識的總結(jié),理解上難免有錯,各位請海涵。
原文地址:nginx、php-fpm默認配置與性能–TCP socket還是unix domain socke, 感謝原作者分享。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com