请选择 进入手机版 | 继续访问电脑版
热搜: 活动 交友 discuz
话题

防伪查询认证中心

二级导航二级导航

生活

二级导航二级导航二级导航

二级导航二级导航二级导航

兴趣

二级导航二级导航

二级导航二级导航

资讯

二级导航二级导航二级导航

二级导航二级导航二级导航

便民

道具任务笑傲江湖

勋章好友江湖社区

[服务器优化] 高性能网站服务器的架设优化-Nginx优化

[复制链接]
查看: 906|回复: 0

参加活动: 0

组织活动: 0

1

主题

1

帖子

28

积分

实习版主

贡献:0

金钱:27

威望:0

发表于 2019-1-29 10:16:57 | 显示全部楼层 |阅读模式
一:对于高性能网站 ,请求量大,如何支撑?思路
在网站架构设计中,大家一定对 LNMP (Linux Nginx Mysql Php) 不陌生。
LNMP 确实是一个非常优秀的架构,秉承着自由,开放,高效,易用的设计理念.利用它构建大型Web。如果多用户访问次数过高服务器吃不消怎么办?那我们就要想办法 来解决,从两个大方面来说:一方面减少用户请求次数,另一方面优化服务器。
如果要减少请求,
1.对于开发人员----可以合并css, 背景图片, 减少mysql查询等分库分表.不同数据库不同服务器访问,这样服务器压力不会太大。
2: 对于运维 nginx的expires ,利用浏览器缓存.jpg、png、css等,减少查询.
3.安装Memcached/Redis缓存工具,可以减少数据库查询。
4: 利用cdn来响应请求缓存.
5: 最终剩下的,不可避免的请求----服务器集群+负载均衡来支撑.(LVS/Haproxy/Nginx)
所以,来到第4步后,就不要再考虑减少请求这个方向了,根据业务需求来选择多少台服务器,以便于做集群,是IO大点的选择更好的磁盘。而是思考如何更好的响应高并发请,既然响应是不可避免的,我们要做的是把工作内容”平均”分给每台服务器,最理想的状态是每台服务器的性能都被充分利用.
T46oVU4le0MvX3t3.jpg
如上图所示。浏览器向Web服务器发送http请求,首先到达我们的代理曾,有代理决定请求分发到哪里,遇到html、js、css原路返回,遇到php交给后端LNMP服务器解析,使用memcached缓存数据库查询数据,从而返回给用户。这就是大致优化思路。
二:优化思路
nginx响应请求无非就两种情况:
排查问题,也要注意观察这两点,
1:建立socket连接
2: 打开文件,并沿socket返回.
三:优化过程
1:判断nginx的瓶颈
1.1: 首先把ab测试端的性能提高,使之能高并发的请求.
易出问题: too many open files
原因 : ab在压力测试时,打开的socket过多
解决: ulimit -n 30000 (重启失效)
观察结果: nginx 不需要特殊优化的情况下, 5000个连接,1秒内响应.满足要求,但 wating状态的连接过多.
1.2: 解决waiting进程过多的问题.
解决办法: keepalive_timeout = 0;
即: 请求结果后,不保留tcp连接.在高并发的情况下, keepalive会占据大量的socket连接.
结果: waiting状态的连接明显减少.
VTW2vv8vvxnarnN4.jpg
由上图可看出,nginx的问题容易出在2点上:
1: nginx接受的tcp连接多,能否建立起来?
2: nginx响应过程,要打开许多文件 ,能否打开?
第1个问题: 在内核层面(见下)
第2个问题 (见下)
系统内核层面:
net.core.somaxconn = 4096 允许等待中的监听
net.ipv4.tcp_tw_recycle = 1 tcp连接快速回收
net.ipv4.tcp_tw_reuse = 1 tcp连接重用
net.ipv4.tcp_syncookies = 0 不抵御洪水攻击
net.ipv4.tcp_fin_timeout = 15 控制tcp连接时间
net.ipv4.tcp_keepalive_time = 600 控制tcp连接超时时间
net.ipv4.tcp_synack_retries = 2 握手状态重试次数,默认5
net.ipv4.tcp_max_syn_backlog = 8192 送到队列的数据包的最大数目
ulimit -n 30000 打开文件数
Nginx层面:
worker_processes 24; =cpu的核数
worker_connections 10240;  连接数  
Worker_rlimit_nofiles 10000; nginx可打开文件数
Keepalive_timeout 0;
gzip on;   压缩设置.减少网络传输数据量.
gzip_min_length 1k;
gzip_buffers 4 8k;
gzip_http_version 1.0;
gzip_comp_level 5;
gzip_vary on;
gzip_types text/plain application/x-javascript text/css application/xml;
location ~ .+\.(htm|html|css|swf|xml|gif|png|jpg|class|ico|mp3|zip|rar|mp4|flv|exe|txt|ff|mod|atf)?$ {
expires 7d;
} 利用location规则进行expires 图片浏览器缓存
Nginx---->php-fpm之间的优化
TVP5E6E54p6iDEzQ.jpg
如上图,在很多个nginx来访问fpm时, fpm的进程要是不够用, 会生成子进程.
生成子进程需要内核来调度,比较耗时,
如果网站并发比较大,
我们可以用静态方式一次性生成若干子进程,保持在内存中.
方法 -- 修改php-fpm.conf
Pm = static 让fpm进程始终保持,不要动态生成
Pm.max_children= 50 始终保持的子进程数量
群集方面
做nginx转发机,利用nginx反向代理方式 平均分摊请求,做内网转发。
upstream qinyj { #定义负载均衡站点名称  
server 192.168.0.161:80;
server 192.168.0.162:80; #后端真实ip一般指内网  
}
#proxy_pass http://192.168.7.133:8080;
proxy_pass http://qinyj;   #配置代理站点或后端真实ip
其他可以根据业务需求使用LVS/Haproxy
如果是其他如java应用,可以在后端部署tomcat/jboss,再由nginx反向代理这也就是所谓的Nginx动静分离。
location ~ .*.jsp$ {
index index.jsp;
proxy_pass http://192.168.0.163:8080; #来自jsp请求交给tomcat处理
proxy_redirect off;
proxy_set_header Host $host; #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m; #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数
proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间
proxy_read_timeout 90; #连接成功后,后端服务器响应时间
proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 6 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
proxy_busy_buffers_size 64k;#高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
}
*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则