Nginx+Apache Yii2.0 配置方案
最近用Yii2.0框架做了個(gè)小項(xiàng)目,雖然項(xiàng)目本身業(yè)務(wù)邏輯不復(fù)雜,但是由于本身業(yè)務(wù)邏輯的特殊性,在上午9點(diǎn)到12點(diǎn)之間系統(tǒng)訪問(wèn)量會(huì)突然上升(瀏覽量和用戶上傳文件量)。導(dǎo)致系統(tǒng)單純的部署在Apache下,支撐不了這么多的并發(fā)數(shù);單獨(dú)部署Nginx又由于用戶頻繁的提交數(shù)據(jù),出現(xiàn)大量的502錯(cuò)誤。然后又由于各方面的原因,就想通過(guò)Nginx+Apache的方式來(lái)暫時(shí)性的解決這個(gè)問(wèn)題。
安裝apache和nginx的過(guò)程就跳過(guò)了。apache 監(jiān)聽(tīng)的是 8080 端口,nginx 監(jiān)聽(tīng)的是80端口。先貼出apache和nginx的配置內(nèi)容,再來(lái)說(shuō)下踩過(guò)的幾個(gè)坑。
apache vhost 相關(guān)配置
1 <VirtualHost *:8080> 2 DocumentRoot "/www/wwwroot/website/web" 3 DirectoryIndex index.php 4 ServerName crm.yangcoder.com 5 ErrorLog "logs/crm-error.log" 6 CustomLog "logs/crm-access.log" common 7 </VirtualHost>
nginx 相關(guān)配置
1 upstream crm_cluster{ 2 server crm.yangcoder.com:8080; 3 #server crm.yangcoder.com:81; 4 #server crm.yangcoder.com:82; 5 } 6 server { 7 listen 80; 8 server_name crm.yangcoder.com; 9 10 #charset koi8-r; 11 access_log logs/crm.yangcoder.access.log; 12 error_log logs/crm.yangcoder.error.log; 13 root E:\\projects\\project\\trunk\\intracompany\\crm\\backend\\web; 14 index index.php index.html index.htm; 15 16 location / { 17 #設(shè)置主機(jī)頭和客戶端真實(shí)地址,以便服務(wù)器獲取客戶端真實(shí)IP 18 proxy_set_header Host $host; 19 proxy_set_header X-Real-IP $remote_addr; 20 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 21 proxy_set_header X-Forwarded-Protocol $scheme; 22 proxy_set_header PATH-INFO $request_uri; 23 add_header backendIP $upstream_addr; 24 add_header backendCode $upstream_status; 25 26 #禁用緩存 27 proxy_buffering off; 28 #反向代理的地址 29 proxy_pass http://crm_cluster; 30 31 if ($request_filename ~* ^.*?\.(txt|pdf|doc|xls|xlsx)$){ 32 add_header Content-Disposition: 'attachment;'; 33 34 } 35 } 36 37 38 #error_page 404 /404.html; 39 40 # redirect server error pages to the static page /50x.html 41 # 42 error_page 500 502 503 504 /50x.html; 43 location = /50x.html { 44 root E:\\projects\\project\\trunk\\intracompany\\crm\\backend\\web; 45 } 46 47 # proxy the PHP scripts to Apache listening on 127.0.0.1:80 48 # 49 #location ~ \.php$ { 50 # try_files $uri =404; 51 # proxy_redirect off; 52 # #設(shè)置主機(jī)頭和客戶端真實(shí)地址,以便服務(wù)器獲取客戶端真實(shí)IP 53 # proxy_set_header Host $host; 54 # proxy_set_header X-Real-IP $remote_addr; 55 # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 56 # proxy_set_header X-Forwarded-Protocol $scheme; 57 # proxy_set_header PATH-INFO $request_uri; 58 # add_header backendIP $upstream_addr; 59 # add_header backendCode $upstream_status; 60 # 61 # #禁用緩存 62 # proxy_buffering off; 63 # #反向代理的地址 64 # proxy_pass http://crm_cluster; 65 #} 66 67 68 69 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ 70 { 71 expires 30d; 72 } 73 74 location ~ .*\.(js|css)?$ 75 { 76 expires 30d; 77 } 78 }
?
? ? ? 通過(guò)測(cè)試,能夠成功實(shí)現(xiàn)動(dòng)態(tài)訪問(wèn)走apache,靜態(tài)資源訪問(wèn)走nginx。稍微緩解了,項(xiàng)目的壓力。
踩過(guò)的坑:
1、在本機(jī)調(diào)試時(shí),訪問(wèn)動(dòng)態(tài)內(nèi)容沒(méi)又問(wèn)題,但是訪問(wèn)靜態(tài)資源時(shí)出現(xiàn)500的錯(cuò)誤。找了好久,最后發(fā)現(xiàn)是:【root?D:\trunk\src\websit?】,只用了單‘\’,導(dǎo)致nginx 把'\t'解析成一個(gè)tab空格了。相當(dāng)?shù)膰濉Q成'\\'就可以了。
2、Yii2.0 開(kāi)啟了Url美化功能后,導(dǎo)致轉(zhuǎn)發(fā)的動(dòng)態(tài)訪問(wèn)出現(xiàn)404或者只能訪問(wèn)默認(rèn)首頁(yè)。找了官方教程和網(wǎng)上的方法,用nginx或者apahce單獨(dú)部署是可以的。但是使用nginx+apache結(jié)合就不行。
比如:如下解決方案
1 location / { 2 3 if (!-e $request_filename){ 4 5 rewrite ^/(.*) /index.php last; 6 7 } 8 9 }
通過(guò)日志分析:假設(shè)我們?cè)L問(wèn):crm.yangcoder.com/system/msg 這個(gè)時(shí)候nginx轉(zhuǎn)發(fā)給apache的是:crm.yangcoder.com/index.php/system/msg 。很明顯程序處理不了這個(gè)路由。
后來(lái)在順著這個(gè)思路在網(wǎng)上找到了一個(gè)方法。就是添加如下配置:
1 location / { 2 #設(shè)置主機(jī)頭和客戶端真實(shí)地址,以便服務(wù)器獲取客戶端真實(shí)IP 3 proxy_set_header Host $host; 4 proxy_set_header X-Real-IP $remote_addr; 5 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 6 proxy_set_header X-Forwarded-Protocol $scheme; 7 proxy_set_header PATH-INFO $request_uri; 8 9 #禁用緩存 10 proxy_buffering off; 11 #反向代理的地址 12 proxy_pass http://crm_cluster; 13 14 if ($request_filename ~* ^.*?\.(txt|pdf|doc|xls|xlsx)$){ 15 add_header Content-Disposition: 'attachment;'; 16 17 } 18 }
這樣就可以正常訪問(wèn)了。
訪問(wèn)結(jié)果如下圖:
圖1,訪問(wèn)首頁(yè),顯示請(qǐng)求被轉(zhuǎn)發(fā)到了8080端口上。
圖2,訪問(wèn)靜態(tài)資源
?
3、在同一臺(tái)電腦上還測(cè)試了負(fù)載均衡的效果。唯一的問(wèn)題是,由于項(xiàng)目后臺(tái)部分,使用了Yii2.0的資源管理,在訪問(wèn)的時(shí)候,不同的服務(wù)器生成的靜態(tài)資源路徑不統(tǒng)一。導(dǎo)致有時(shí)候靜態(tài)資源加載出現(xiàn)404錯(cuò)誤。如果前端要解決該問(wèn)題,個(gè)人覺(jué)得可行的方法除了同步多服務(wù)器代碼文件外,還有就是靜態(tài)資源文件單獨(dú)存放。
1 upstream crm_cluster{ 2 server crm.yangcoder.com:8080; 3 server crm.yangcoder.com:81; 4 server crm.yangcoder.com:82; 5 }
4、當(dāng)然針對(duì)當(dāng)前項(xiàng)目的邏輯而言,這個(gè)方案并不是最優(yōu)解決方案。其實(shí)通過(guò)分析,我們的瓶頸并不是出現(xiàn)在程序、數(shù)據(jù)查詢上,而是出現(xiàn)在用戶同一時(shí)間段大量上傳圖片占用大量上行帶寬上。這一方案目前還能支撐住當(dāng)前訪問(wèn)量,8M帶寬,6000+活躍用戶在同一時(shí)間段內(nèi)上傳圖片,統(tǒng)計(jì)發(fā)現(xiàn)在上午9點(diǎn)到12點(diǎn)之間帶寬的上行帶寬統(tǒng)計(jì)是一條平行線。下一步我們想在目前的基礎(chǔ)上介入第三方對(duì)象存儲(chǔ)和CDN服務(wù),來(lái)優(yōu)化當(dāng)前方案。
?
轉(zhuǎn)載于:https://www.cnblogs.com/yangcoder/p/10109629.html
總結(jié)
以上是生活随笔為你收集整理的Nginx+Apache Yii2.0 配置方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 求高清原壁纸
- 下一篇: spring boot jpa 整合