摘要:首先,在的主配置文件里先設置好與緩存相關的配置這里需要先手工建立與緩存相應的目錄,并且把它設置為可讀寫。另外如果升級成,對不用緩存的部分性能也會有提升,這就不在本文討論的范圍之內了。
現(xiàn)有一個系統(tǒng)是用Yii2框架開發(fā)的,Web服務器采用Nginx+php-fpm,由于沒有使用Nginx的反向代理緩存技術,用Apache的ab一壓就死掉了,QPS只能達到7或者8的水平,像這樣是無法支持高并發(fā)訪問的:
ab -n 500 -c 100 https://front.we.com/site/robot
用htop查看主要壓力在cpu上,而占用cpu最多的是幾個php-fpm進程,說明nginx只是簡單地做了一個二傳手,把所有壓力全部轉嫁到了php身上,考慮到nginx本身有反向代理緩存技術,因此直接配置好應該就可以了。網上教程一般都是要再安裝一個Apache服務器,由Nginx轉Apache再轉php,考慮到我們已經有php-fpm了,就不想再安裝一個多余的web服務器。
首先,在nginx的主配置文件里先設置好與緩存相關的配置:
proxy_connect_timeout 600; proxy_send_timeout 600; proxy_read_timeout 600; send_timeout 600; proxy_cache_path /var/run/proxy_cache levels=1:2 keys_zone=czone:10m max_size=1000m inactive=600m use_temp_path=off; proxy_cache_key $scheme$host$request_uri; proxy_buffers 256 16k; proxy_buffer_size 32k; proxy_set_header Proxy ""; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
這里需要先手工建立與緩存相應的目錄/var/run/proxy_cache,并且把它設置為可讀寫。keys_zone的czone這個名字可以改成任意名字,只要和下文相對應即可。
然后,在相應的服務器設置里作如下配置:
先增加一個虛擬的上游服務,這個front這個名字由你自己決定:
upstream front { ip_hash; server unix:/var/run/nginx_front.sock; }
將原先監(jiān)聽80端口或者監(jiān)聽443端口的設置改為監(jiān)聽上述虛擬端口:
server { listen unix:/var/run/nginx_front.sock; server_name front.we.com; root /var/www/we/frontend/web; location / { index index.php index.html index.htm; if (!-e $request_filename) { rewrite ^/(.*) /index.php?r=$1 last; } } location ~ .php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } add_header "Referrer-Policy" "no-referrer"; }
再增加一個server監(jiān)聽80或443端口:
server { listen 443 ssl http2; server_name front.we.com; root /var/www/we/frontend/web; ssl on; ssl_certificate /etc/letsencrypt/live/front.we.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/front.we.com/privkey.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; gzip on; gzip_min_length 1k; gzip_buffers 16 64k; gzip_http_version 1.1; gzip_comp_level 5; gzip_proxied any; gzip_types text/plain application/x-javascript application/javascript application/octet-stream text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png image/svg image/svg+xml; gzip_vary on; add_header X-Cache $upstream_cache_status; location ~ /.well-known { allow all; } location ~ /. { return 403; } location /favicon.ico { root html; } location ~* .(css|js|gif|ico|jpg|png|svg)$ { expires 365d; } location / { proxy_set_header Host $host; proxy_redirect off; proxy_cache czone; proxy_cache_revalidate on; proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504; proxy_cache_valid 200 301 302 500m; proxy_cache_valid 404 1m; proxy_pass http://front; } }
注意這里的兩個地方:一個是proxy_cache的czone和我們上面設置的keys_zone要對應,另一個proxy_pass和上面設置的虛擬上游服務器對應。中間加了一個X-Cache的header主要是為了方便我們在瀏覽器端查看緩存起沒起作用而設的,因為如果緩存命不中的話,壓力還是在php上。
設置完成之后,可以先用nginx -t測試一下配置是否正確:
/usr/local/nginx/sbin/nginx -t
一切都正常的話,重新加載配置文件:
/usr/local/nginx/sbin/nginx -s reload
這時如果用瀏覽器直接訪問Yii2生成出來的網頁,很有可能緩存還是命不中,如下圖:
注意看這里的倒數(shù)第二行X-Cache: MISS,說明緩存沒有命中。為什么呢?注意上面第一行,Cache-Control里面有一個no-cache,Yii2缺省的所有controller都是無緩存的,所以導致了這里即使nginx已經配置好緩存,也起不了作用。所以我們還需要改造Yii2,在behaviors里增加一個HttpCache的設置,注意下面的lastModified必須有,否則也不起作用,這里簡單地取了user表中最后一次更新的時間作為lastModified,理論上應該設置更符合業(yè)務應用的方法。
public function behaviors() { return [ [ "class" => "yiifiltersHttpCache", "only" => ["home", "index", "robot", "about"], "lastModified" => function ($action, $params) { $q = new yiidbQuery(); return $q->from("user")->max("updated_at"); }, ], ]; }
現(xiàn)在,再次刷新網頁,你就可以看到X-Cache: HIT了。
至此,由Yii2生成的靜態(tài)網頁的壓力不再傳遞到php而轉交給nginx,我們再次執(zhí)行ab壓一下看:
每秒116QPS,比我們不用緩存時性能提升接近15倍之多!而且用htop查看,壓測時CPU負擔都在nginx上,不在php上。我用的服務器比較渣,只有2核2g,如果服務器再好一些,肯定性能還會有極大提升。另外php如果升級成7.0,對不用緩存的部分性能也會有提升,這就不在本文討論的范圍之內了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/39603.html
摘要:架構演進單機架構以淘寶作為例子。隨著用戶數(shù)的增長,并發(fā)讀寫數(shù)據(jù)庫成為瓶頸第二次演進引入本地緩存和分布式緩存在同服務器上或同中增加本地緩存,并在外部增加分布式緩存,緩存熱門商品信息或熱門商品的頁面等。 1. 概述 本文以淘寶作為例子,介紹從一百個并發(fā)到千萬級并發(fā)情況下服務端的架構的演進過程,同時列舉出每個演進階段會遇到的相關技術,讓大家對架構的演進有一個整體的認知,文章最后匯總了一些架構...
摘要:如果你有一個高流量的站點,提高性能的第一步是在你的前面放一個反向代理服務器。使用在一個已經存在的服務器前做反向代理,作為的一個核心應用,已經被用于全世界成千上萬的站點中。 如果你的 node 服務器前面沒有 nginx, 那么你可能做錯了。— Bryan Hughes Node.js 是使用 最流行的語言— JavaScript 構建服務器端應用的領先工具 。由于可以同時提供 web ...
摘要:是一款輕量級的服務器反向代理服務器及電子郵件代理服務器,并在一個協(xié)議下發(fā)行。是以反向代理的方式進行負載均衡的。 Nginx是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,并在一個BSD-like 協(xié)議下發(fā)行。由俄羅斯的程序設計師Igor Sysoev所開發(fā),供俄國大型的入口網站及搜索引擎Rambler(俄文:Рамблер)使用。其特點是占有內存...
摘要:初探今天給大家講下的基礎配置很多小伙伴在開發(fā)的過程中會使用到但是確對的配置其實并不了解今天我給大家講下基礎的配置項的功能很多但是說到大家最先想到的是反向代理和負載均衡負載均衡在開發(fā)環(huán)境體現(xiàn)的不太明顯主要是為了解決生產環(huán)境的客戶端請求很多的時 初探nginx 今天給大家講下nginx的基礎配置,很多小伙伴在開發(fā)的過程中會使用到 nginx ,但是確對 nginx 的配置其實并不了解,今天...
閱讀 2343·2021-11-15 11:38
閱讀 3550·2021-09-22 15:16
閱讀 1191·2021-09-10 11:11
閱讀 3161·2021-09-10 10:51
閱讀 2936·2019-08-30 15:56
閱讀 2782·2019-08-30 15:44
閱讀 3190·2019-08-28 18:28
閱讀 3527·2019-08-26 13:36