摘要:首先,在的主配置文件里先设置好与缓存相关的配置这里需要先手工建立与缓存相应的目录,并且把它设置为可读写。另外如果升级成,对不用缓存的部分性能也会有提升,这就不在本文讨论的范围之内了。
现有一个系统是用Yii2框架开发的,Web服务器采用Nginx+php-fpm,由于没有使用Nginx的反向代理缓存技术,用Apache的ab一压就死掉了,QPS只能达到7或者8的水平,像这样是无法支持高并发访问的:
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; }
将原先监听80端口或者监听443端口的设置改为监听上述虚拟端口:
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监听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生成出来的网页,很有可能缓存还是命不中,如下图:
注意看这里的倒数第二行X-Cache: MISS,说明缓存没有命中。为什么呢?注意上面第一行,Cache-Control里面有一个no-cache,Yii2缺省的所有controller都是无缓存的,所以导致了这里即使nginx已经配置好缓存,也起不了作用。所以我们还需要改造Yii2,在behaviors里增加一个HttpCache的设置,注意下面的lastModified必须有,否则也不起作用,这里简单地取了user表中最后一次更新的时间作为lastModified,理论上应该设置更符合业务应用的方法。
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"); }, ], ]; }
现在,再次刷新网页,你就可以看到X-Cache: HIT了。
至此,由Yii2生成的静态网页的压力不再传递到php而转交给nginx,我们再次执行ab压一下看:
每秒116QPS,比我们不用缓存时性能提升接近15倍之多!而且用htop查看,压测时CPU负担都在nginx上,不在php上。我用的服务器比较渣,只有2核2g,如果服务器再好一些,肯定性能还会有极大提升。另外php如果升级成7.0,对不用缓存的部分性能也会有提升,这就不在本文讨论的范围之内了。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/39603.html
摘要:架构演进单机架构以淘宝作为例子。随着用户数的增长,并发读写数据库成为瓶颈第二次演进引入本地缓存和分布式缓存在同服务器上或同中增加本地缓存,并在外部增加分布式缓存,缓存热门商品信息或热门商品的页面等。 1. 概述 本文以淘宝作为例子,介绍从一百个并发到千万级并发情况下服务端的架构的演进过程,同时列举出每个演进阶段会遇到的相关技术,让大家对架构的演进有一个整体的认知,文章最后汇总了一些架构...
摘要:如果你有一个高流量的站点,提高性能的第一步是在你的前面放一个反向代理服务器。使用在一个已经存在的服务器前做反向代理,作为的一个核心应用,已经被用于全世界成千上万的站点中。 如果你的 node 服务器前面没有 nginx, 那么你可能做错了。— Bryan Hughes Node.js 是使用 最流行的语言— JavaScript 构建服务器端应用的领先工具 。由于可以同时提供 web ...
摘要:是一款轻量级的服务器反向代理服务器及电子邮件代理服务器,并在一个协议下发行。是以反向代理的方式进行负载均衡的。 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler(俄文:Рамблер)使用。其特点是占有内存...
摘要:初探今天给大家讲下的基础配置很多小伙伴在开发的过程中会使用到但是确对的配置其实并不了解今天我给大家讲下基础的配置项的功能很多但是说到大家最先想到的是反向代理和负载均衡负载均衡在开发环境体现的不太明显主要是为了解决生产环境的客户端请求很多的时 初探nginx 今天给大家讲下nginx的基础配置,很多小伙伴在开发的过程中会使用到 nginx ,但是确对 nginx 的配置其实并不了解,今天...
阅读 2335·2021-11-15 11:38
阅读 3544·2021-09-22 15:16
阅读 1187·2021-09-10 11:11
阅读 3156·2021-09-10 10:51
阅读 2920·2019-08-30 15:56
阅读 2774·2019-08-30 15:44
阅读 3185·2019-08-28 18:28
阅读 3525·2019-08-26 13:36