【nginx】高性能服务器架设原理及问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了【nginx】高性能服务器架设原理及问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4227字,纯文字阅读大概需要7分钟。
内容图文
- 对于高性能网站,请求量大,如何支撑
- 减少请求:开发人员合并css,背景图片,减少mysql查询等
- 对于运维 nginx的expires 利用浏览器缓存等,减少查询
- 利用cdn(内容分发网络)来响应请求
- 不可避免的请求:服务器集群+负载均衡
- 最理想的状态:每台服务器的性能都被充分利用
- 安装统计模块:
./configure --prefix=/usr/local/nginx/ --add-module=/app/ngx_http_consistent_hash-master --with-http_stub_status_module
- nginx对统计模块的配置
location /nginx_status { # Turn on stats stub_status on; access_log off; # only allow access from 192.168.1.5 # allow 192.168.1.5; deny all }
- 服务器说明
- 1台 A服务器(mysql) RAM 2G, HD 500G
- 3台 B/C/D服务器 RAM 8G, HD 200G
- 步骤
- A号服务器
- 安装mysql
- 导入数据(注意把表中的索引去掉,加快导入速度)
- C号服务器
- 编译php(注意enable-fpm.with-mysql=muysqlnd,编译成独立fpm进程,支持mysql)
- 下载第三方memcached扩展,编译进来
- D号服务器
- 编译memcached
- B号服务器
- 编译nginx,并配置
cd /app/pcre-8.12 ./configure make && make install cd nginx-1.2.7 ./configure --prefix=/usr/local/nginx --add-module=/app/ngx_http_consistent_hash-master # 第三方模块需要自己下载
- 编译nginx,并配置
- 安装统计模块,便于统计
- php安装配置
tar -xzvf /path/
cd /path/
configure --prefix=/usr/local/php --
- 搭建完毕遇到的问题
- C->A 的mysql连接很慢
- 解决方案:在my.cnf中的[mysqld]节点中添加
skip-name-resolve
//这句话使mysql连接时忽略解析域名,在制定有MySQL权限时,只能根据ip限制,不能根据域名限制
- 解决方案:在my.cnf中的[mysqld]节点中添加
- 当memcache中没有相应的数据,从后台回调数据时,http的状态码是404,(虽然内容正常),这样不利于seo
- 解决方案:nginx/conf/nginx.conf中
error_page 404 = 200 /callback.php
// 这样 404被改写成200 来响应
- 解决方案:nginx/conf/nginx.conf中
- C->A 的mysql连接很慢
- 压力测试:./ab -c 1000 -n 50000 -k 请求地址
- 其中-c代表并发,-n代表请求总数,-k代表等待
- 优化思路(高并发思路)
-
socket
- nginx
- http连接快速关闭:keep_alivetime:0
- 子进程允许打开的连接:work_connections
- 系统层面
- 最大连接数:sonmaxconn
- 加快tcp连接的回收:recycle
- 空的tcp是否允许回收利用:reuse
- 洪水攻击 不做洪水攻击
- 防火墙(建议关掉)
net.nf_conntrack_max = 655350 net.netfilter.nf_conntrack_tcp_timeout_established = 120
- 文件:
- fs.file-max = 655360 系统最大文件描述符
- 进程最大文件描述符 /etc/security/limits.conf
* soft nofile 50000 * hard nofile 50000
- nginx
-
文件
- nginx
- 子进程允许打开的文件:worker_limit_nofiles
- 系统
- ulimit -n 设置一个比较大的值 65550
- nginx
-
排查问题:主要从系统的dmesg和nginx的error log来观察
-
- 优化过程
- 判断nginx的瓶颈
- 首先把ab测试端的性能提高,使之能高并发的请求
- 易出问题:too many open files
- 原因:ab在压力测试的时候,打开的socket过多
- 解决方案:ulimit -n 30000:修改最大文件连接数open files(重启失效)
- 想要不失效
- 1.在/etc/rc.local 中增加一行 ulimit -SHn 65536
- 2.在/etc/profile 中增加一行 ulimit -SHn 65536
- 3.在/etc/security/limits.conf最后增加如下两行记录
* soft nofile 65536 * hard nofile 65536
- 想要不失效
- 解决waiting进程过多的问题
- 解决办法:
keepalive_timeout=0;
- 解释:请求结果后,不保留tcp连接,在高并发的情况下,keepalive会占据大量的socket连接
- 结果:waiting状态的连接明显减少
- 解决办法:
- 解决服务端 too many open files
- 分析:nginx要响应
- 建立socket连接
- 读取本地文件
- 出现问题
- nginx接受的tcp连接多,能否建立起来(系统内核层面)
- nginx响应过程,要打开许多文件,能否打开(nginx层面)
- 解决方案
- 系统内核层面
net.core.somaxconn=4096 允许等待中的监听 net.ipv4.tcp_tw_recycle = 1 tcp连接快速回收 net.ipv4.tcp_tw_reuse = 1 tcp连接重用 net.ipv4.tcp_syncookies = 0 不抵御洪水攻击 ulimit -n 30000 最大打开文件数
- nginx层面 nginx.conf中
worker_connections 10240; Worker_rlimit_nofiles 10000; Keepalive_timeout 0;
- 系统内核层面
- 分析:nginx要响应
- 首先把ab测试端的性能提高,使之能高并发的请求
- nginx和php-fpm之间的优化
- 在很多个nginx来访问fpm时, fpm的进程要是不够用, 会生成子进程
- 生成子进程需要内核来调度,比较耗时,如果网站并发比较大,可用静态方式一次性生成若干子进程,保持在内存中
- 方法:修改php-fpm.conf
Pm = static 让fpm进程始终保持,不要动态生成 Pm.max_children= 32 始终保持的子进程数量
- mysql和PHP之间的优化
- Linux机器下 ,php 通过IP连接其他mysql服务器时,容易出的问题:能ping能,但connect不到
- 原因:
- mysql服务器的防火墙影响的
- 并发连接,响应时间过长
- 优化思路:同上nginx
- 1: 内核层面,加大连接数,并加快tcp回收
- 2: mysql层面,增大连接数
- 3: php层面,用长连接,节省连接数
- 4: 用memcached缓存,减轻mysql负担
- 具体:
- PHP服务器增大 ulimint -n选项
- mysql服务器内核配置:添加或修改如下选项
net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_syncookies = 0 syscttl -p # 使修改立即生效
- 修改mysql.cnf,增加最大连接数:
max_connections=1000
- php用长连接:Mysql_connect —> mysql_pconnect
- 注: pconnect 在PHP以apache模块的形式存在时,无效果
- 判断nginx的瓶颈
内容总结
以上是互联网集市为您收集整理的【nginx】高性能服务器架设原理及问题全部内容,希望文章能够帮你解决【nginx】高性能服务器架设原理及问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。