Nginx+Apache Yii2.0 配置方案
最近用Yii2.0框架做了個小項目,雖然項目本身業務邏輯不復雜,但是由于本身業務邏輯的特殊性,在上午9點到12點之間系統訪問量會突然上升(瀏覽量和用戶上傳文件量)。導致系統單純的部署在Apache下,支撐不了這么多的并發數;單獨部署Nginx又由于用戶頻繁的提交數據,出現大量的502錯誤。然后又由于各方面的原因,就想通過Nginx+Apache的方式來暫時性的解決這個問題。
安裝apache和nginx的過程就跳過了。apache 監聽的是 8080 端口,nginx 監聽的是80端口。先貼出apache和nginx的配置內容,再來說下踩過的幾個坑。
apache vhost 相關配置
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 相關配置
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 #設置主機頭和客戶端真實地址,以便服務器獲取客戶端真實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 # #設置主機頭和客戶端真實地址,以便服務器獲取客戶端真實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 }
?
? ? ? 通過測試,能夠成功實現動態訪問走apache,靜態資源訪問走nginx。稍微緩解了,項目的壓力。
踩過的坑:
1、在本機調試時,訪問動態內容沒又問題,但是訪問靜態資源時出現500的錯誤。找了好久,最后發現是:【root?D:\trunk\src\websit?】,只用了單‘\’,導致nginx 把'\t'解析成一個tab空格了。相當的囧。換成'\\'就可以了。
2、Yii2.0 開啟了Url美化功能后,導致轉發的動態訪問出現404或者只能訪問默認首頁。找了官方教程和網上的方法,用nginx或者apahce單獨部署是可以的。但是使用nginx+apache結合就不行。
比如:如下解決方案
1 location / { 2 3 if (!-e $request_filename){ 4 5 rewrite ^/(.*) /index.php last; 6 7 } 8 9 }
通過日志分析:假設我們訪問:crm.yangcoder.com/system/msg 這個時候nginx轉發給apache的是:crm.yangcoder.com/index.php/system/msg 。很明顯程序處理不了這個路由。
后來在順著這個思路在網上找到了一個方法。就是添加如下配置:
1 location / { 2 #設置主機頭和客戶端真實地址,以便服務器獲取客戶端真實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 }
這樣就可以正常訪問了。
訪問結果如下圖:
圖1,訪問首頁,顯示請求被轉發到了8080端口上。
圖2,訪問靜態資源
?
3、在同一臺電腦上還測試了負載均衡的效果。唯一的問題是,由于項目后臺部分,使用了Yii2.0的資源管理,在訪問的時候,不同的服務器生成的靜態資源路徑不統一。導致有時候靜態資源加載出現404錯誤。如果前端要解決該問題,個人覺得可行的方法除了同步多服務器代碼文件外,還有就是靜態資源文件單獨存放。
1 upstream crm_cluster{ 2 server crm.yangcoder.com:8080; 3 server crm.yangcoder.com:81; 4 server crm.yangcoder.com:82; 5 }
4、當然針對當前項目的邏輯而言,這個方案并不是最優解決方案。其實通過分析,我們的瓶頸并不是出現在程序、數據查詢上,而是出現在用戶同一時間段大量上傳圖片占用大量上行帶寬上。這一方案目前還能支撐住當前訪問量,8M帶寬,6000+活躍用戶在同一時間段內上傳圖片,統計發現在上午9點到12點之間帶寬的上行帶寬統計是一條平行線。下一步我們想在目前的基礎上介入第三方對象存儲和CDN服務,來優化當前方案。
?
轉載于:https://www.cnblogs.com/yangcoder/p/10109629.html
總結
以上是生活随笔為你收集整理的Nginx+Apache Yii2.0 配置方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求高清原壁纸
- 下一篇: 永劫无间天人模式怎么参加?