今天决定写一篇LNMP的深入调优,
LNMP=Linux Nginx Mysql PHP
LNMP的调优着重体现在Nginx服务器上的调优
Nginx 是一个高性能的 HTTP 和 反向代理 服务器,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名,其特点是占有内存少,并发能力强,百度BWS、新浪、网易、腾讯等都在使用。
[root@xuegod68 ~]#tar xvf nginx-1.8.0.tar.gz -C /usr/local/
[root@xuegod68 ~]#cd /usr/local/nginx-1.8.0/
编译前的优化主要是用来修改程序名等
[root@xuegod68 ~]# curl -I http://www.baidu.com
HTTP/1.1 200 OK
Server: bfe/1.0.8.18 #我们需要的做的是将nginx修改名字,这儿默认是nginx,我们看到的百度是隐藏后的。
Date: Thu, 19 Apr 2018 08:05:56 GMT
Content-Type: text/html
Content-Length: 277
Last-Modified: Mon, 13 Jun 2016 02:50:08 GMT
Connection: Keep-Alive
ETag: "575e1f60-115"
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Pragma: no-cache
Accept-Ranges: bytes
我们需要修改一下配置文件:
[root@xuegod68 nginx-1.8.0]# vim src/core/nginx.h //目的更改源码隐藏软件名称和版本号
#define NGINX_VERSION "9.9.9" #此行修改的是你想要的版本号
#define NGINX_VER "sandiandian/" NGINX_VERSION #此行修改的是你想修改的软件名称
[root@xuegod68 nginx-1.8.0]# vim src/http/ngx_http_header_filter_module.c
//修改HTTP头信息中的connection字段,防止回显具体版本号
通用http头域:
通用头域包含请求和响应消息都支持的头域,通用头域包含Cache-Control、 Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。对通用头域的扩展要求通讯双方都支持此扩展,如果存在不支持的通用头域,一般将会作为实体头域处理。那么也就是说有部分设备,或者是软件,能获取到connection,部分不能,要隐藏就要彻底!
49 static char ngx_http_server_string[] = "Server:sandiandian" CRLF;
[root@xuegod68 nginx-1.8.0]# vim src/http/ngx_http_special_response.c
//这个文件定义了http错误码的返回,有时候我们页面程序出现错误,Nginx会代我们返回相应的错误代码,回显的时候,会带上nginx和版本号,我们把他隐藏起来
21 static u_char ngx_http_error_full_tail[] =
22 "<hr><center>" NGINX_VER "</center>" CRLF
23 "</body>" CRLF
24 "</html>" CRLF
25 ;
26
27
28 static u_char ngx_http_error_tail[] =
29 "<hr><center>nginx</center>" CRLF
30 "</body>" CRLF
31 "</html>" CRLF
ok ,到这个时候呢我们编译之前的优化已经完成,接下里我们开始编译安装:
[root@xuegod68 nginx-1.8.0]#[root@xuegod63 nginx-1.9.12]# yum install gcc gcc-c++ autoconf automake zlib zlib-devel openssl openssl-devel –y #安装依赖包,以免在编译过程中出现报错。
[root@xuegod68 ~]# tar xvf pcre-8.37.tar.bz2 -C /usr/local/ #pcre依赖 不需要编译,下载解压 就可以
[root@xuegod68 ~]#./configure --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre=/usr/local/src/pcre-8.37
各个模块功能呢,各位自行找资料脑补,我这儿就不进行普及了。 可以使用 ./configure --help
[root@xuegod68 ~]#make && make install
ok 到这儿我们已经完成了nginx的编译安装,接下来启动测试
[root@xuegod68 ~]# /usr/local/nginx/sbin/nginx
[root@xuegod68 ~]# /usr/local/nginx/sbin/nginx
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) #如果出现这种报错 就说明你的80端口被占用,执行一下命令查看端口,关闭就好,一般是apche
[root@xuegod68 ~]#netstat -antup | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2286/nginx #我这边是正常的
测试是否隐藏了版本和软件名
[root@xuegod68 ~]#curl -I 127.0.0.1
Server: sandiandian/9.9.9 #效果很明显
错误代码测试:
Nginx运行用户:
[root@xuegod68 ~]#useradd -M -s /sbin/nologin nginx
[root@xuegod68 nginx]#vim /usr/local/nginx/conf/nginx.conf #修改运行用户为nginx 默认为noboby
user nginx;
Nginx运行进程个数:
[root@xuegod68 nginx]#vim /usr/local/nginx/conf/nginx.conf
worker_processes 4;
[root@xuegod68 ~]# /usr/local/nginx/sbin/nginx -s reload
nginx 3211 0.0 0.2 22612 1448 ? S 17:27 0:00 nginx: worker process
nginx 3212 0.0 0.2 22612 1456 ? S 17:27 0:00 nginx: worker process
nginx 3213 0.0 0.2 22612 1456 ? S 17:27 0:00 nginx: worker process
nginx 3214 0.0 0.2 22612 1392 ? S 17:27 0:00 nginx: worker process
Nginx运行CPU亲和力:
这根据你的CPU线程数配置
比如4核4线程配置
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
4线程的CPU,跑两个进程,如下设置
worker_processes 2;
worker_cpu_affinity 0101 1010;
worker_processes最多开启8个,8个以上性能提升不会再提升了,而且稳定性变得更低,8个进程已经够用了。
Nginx最多可以打开文件数:
[root@xuegod68 ~]#ulimit -n
1024
worker_rlimit_nofile 102400;
nginx分配请求并不是很均匀,所以最好与ulimit -n的值保持一致。
Nginx事件处理模型:
14 events {
15 worker_connections 1024;
16 }
Work_connections是单个进程允许客户端最大连接数,这个数值一般根据服务器性能和内存来制定,也就是单个进程最大连接数,实际最大值就是work进程数乘以这个数
开启高效传输模式:
19 http {
20 include mime.types;
21 default_type application/octet-stream;
22
23 #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
24 # '$status $body_bytes_sent "$http_referer" '
25 # '"$http_user_agent" "$http_x_forwarded_for"';
26
27 #access_log logs/access.log main;
28
29 sendfile on;
30 #tcp_nopush on;
Include mime.types; 媒体类型
default_type application/octet-stream; 默认媒体类型 足够
sendfile on; 开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
tcp_nopush on; 必须在sendfile开启模式才有效,防止网路阻塞,积极的减少网络报文段的数量
连接超时时间:
主要目的是保护服务器资源,CPU,内存,控制连接数,tcp3次握手,4次挥手,建立连接是需要耗费资源的,如果发出连接,一直没有连接,一直没有得到回应,处于等待的全部断掉
keepalive_timeout 60; # 客户端连接保持会话超时时间,超过这个时间,服务器断开这个链接
tcp_nodelay on; #防止网络阻塞
client_header_timeout 15; #客户端请求头读取超时时间,如果超过设个时间没有发送任何数据,nginx将返回request time out的错误
client_body_timeout 15; #客户端求主体超时时间,超过这个时间没有发送任何数据,和上面一样的错误提示
send_timeout 15; # 响应客户端超时时间,这个超时时间仅限于两个活动之间的时间,如果超哥这个时间,客户端没有任何活动,nginx关闭连接
文件上传大小限制:
http {
……
client_max_body_size 10m;
Fastcgi调优:
如果本身是一台服务器的,不配置Fastcgi 是一个失败的nginx,如果是作为代理的话 就不需要配置
在nginx配置文件中是没有Fastcgi选项的
配置之前,我们需要了解这两个概念:
Cache:写入缓存区
Buffer:读取缓存区
[root@xuegod68 ~]#free -m
total used free shared buffers cached
Fastcgi是静态服务和动态服务的一个接口
修改nginx.conf配置文件,在http标签中添加如下:
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
#fastcgi_temp_path /data/ngx_fcgi_tmp;
fastcgi_cache_path /data/ngx_fcgi_cache levels=1:2
keys_zone=ngx_fcgi_cache:512m
inactive=1d max_size=40g;
在server location标签添加如下:
location ~ .*\.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
fastcgi_cache ngx_fcgi_cache;
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
fastcgi_cache_min_uses 1;
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_cache_key http://$host$request_uri;
}
#各个标签的作用呢,由于太多 我就不在这儿一一讲解了,可以参考以下网站。
官方文档:
http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache
gzip调优:
使用gzip压缩功能,可以为我们节约带宽,加快速度,节约成本。在前面编译的时候,我们已经将这个模块编译进去了
配置压缩的过程:
gzip on;
gzip_min_length 1k;
gzip_buffers 4 32k;
gzip_http_version 1.1;
gzip_comp_level 9;
gzip_types text/css text/xml application/javascript;
gzip_vary on;
expires缓存调优:
缓存,主要针对于图片,css,js等元素更改机会比较少的情况下使用:
当我们第一次打开页面的时候,可能没什么感觉,当我们第二次打开同一个的时候,我们就会发现速度快了很多,这就是缓存的功劳。我们可以把这些缓存设置一个时间 15天,或者是更长的时间,视情况而定。设置如下:
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 3650d;
}
location ~ .*\.(js|css)?$
{
expires 30d;
}
同时也可以对目录及其进行判断:
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
expires 360d;
}
location ~(robots.txt) {
expires 7d;
break;
}
expire优点:
节约带宽,节约服务器成本,节约人力成本,提升用户体验。
expire缺点:
因为缓存可能会给客户提供的还是旧页面,反而降低用户体验,可以通过缩短缓存时间,对缓存的对象改名,来解决这个问题。
nginx的调优呢,已经进入尾声了,对于MySQL的优化,我会开新篇讲解。
转载于:https://www.cnblogs.com/sandiandian/p/8883668.html
今天决定写一篇LNMP的深入调优,相关推荐
- 原理剖析(第 013 篇)应用系统性能调优
原理剖析(第 013 篇)应用系统性能调优 - 一.大致介绍 1. 本人接手的一个打车系统,因为出现了一次响应十分缓慢的情况,因此才有了应用调优的篇章: 2.由于过程中可能没有阐述的太清楚,如想详细了 ...
- Mysql高级调优篇——第一章:调优必备索引知识
1.Sql预热 常见的七种Join理论,看图就非常清晰 左连接:A独有+在A中的B部分 select * from A left join B on A.key = B.key 因为没有满足A的B,所 ...
- lnmp一键安装调优,lnmp,memcache,全文检索
2019独角兽企业重金招聘Python工程师标准>>> 全文检索 中文问题还没搞定,欢迎提出各种优化参数优化意见 #!/bin/bash echo $1 #exit; ret=$(p ...
- c语言实现linux下的top命令来获取cpu利用率_有用的一篇笔记,linux 调优各项监控指标...
自开始负责生产环境部署,中间遇到了若干线上环境内存以及CPU的问题.由于微服务以及容器的流行,现在已经可以很方便的使用 K8s + prometheus + grafana + alert 的方式进行 ...
- Go实现Raft第四篇:持久化和调优
女主宣言 今天小编为大家分享一篇关于Golang实现Raft的文章,本篇文章为系列中的第四篇,对Raft中通过添加持久性和一些优化来完成Raft的基本实现.希望能对大家有所帮助. PS:丰富的一线技术 ...
- JVM GC一篇通 - 基础与调优
GC 基础 GC 有三种语义: Garbage Collection , 垃圾收集技术 Garbage Collector 垃圾收集器 Garbage Collecting 垃圾收集动作. GC 中的 ...
- SQL Server调优系列进阶篇(如何维护数据库索引)
前言 上一篇我们研究了如何利用索引在数据库里面调优,简要的介绍了索引的原理,更重要的分析了如何选择索引以及索引的利弊项,有兴趣的可以点击查看. 本篇延续上一篇的内容,继续分析索引这块,侧重索引项的日常 ...
- SQL Server调优系列基础篇(子查询运算总结)
前言 前面我们的几篇文章介绍了一系列关于运算符的介绍,以及各个运算符的优化方式和技巧.其中涵盖:查看执行计划的方式.几种数据集常用的连接方式.联合运算符方式.并行运算符等一系列的我们常见的运算符.有兴 ...
- SQL Server调优系列玩转篇三(利用索引提示(Hint)引导语句最大优化运行)
SQL Server调优系列玩转篇三(利用索引提示(Hint)引导语句最大优化运行) 原文:SQL Server调优系列玩转篇三(利用索引提示(Hint)引导语句最大优化运行) 前言 本篇继续玩转模块 ...
最新文章
- 【 ML 】Newton – Raphson Iteration Procedure of TOA - Based Positioning Simulation
- 互联网协议 — IPv4 互联网协议第 4 版
- [Linux] shell
- Confluence 6 配置服务器基础地址示例
- Oracle创建假脱机文件,oracle – 在sqlplus中假脱机csv文件时的标头格式
- Altium Designer20原理图绘制
- BZOJ 3203 Sdoi2013 保护出题人 凸包+三分
- 想做点副业,一天200-300就行
- 数据库原理--事务(一)
- HTTP的请求报文响应报文
- Java宝典app下载
- python画直方图-python plotly绘制直方图实例详解
- 问题3:点击应用icon,会卡几秒后才进入到启动界面
- ai进入轮廓模式怎么退出_AI 绘图工具里,我不知道按了什么键一保存都是轮廓了!怎么办!怎样恢复呢?...
- 基于SSM的手机销售商城设计与实现 文档+项目源码及数据库文件
- 在使用计算机结束时,计算机使用完毕后应将显示器的电源关闭对吗?
- python 同时输出国际和国内BMI值
- 用c语言写一个求和的程序,C语言实现两数求和
- Eclipse方式: Processes that Adapt (part I)
- Ubuntu下解压rar文件的方法
热门文章
- vb.net 正则 替换 第n个_Python中正则表达式模块详解
- 忽略并存在数据损坏风险_内部审计快速启动数据分析的6个关键点
- c语言visit函数指针,C++中的函数指针总结
- android发短信乱码,android 音乐信息乱码处理
- Tensorflow【实战Google深度学习框架】使用 TFLearn 实现逻辑运算符
- 信度效度难度区分度是什么意思_高考试题的效度信度区分度难度什么意思?
- 和 对比_家用保温杯小对比
- 静态网页案例_手把手教你构建网页
- 分布式,微信小程序 服务器保持登入态解决方案,
- msfvenom java_Msfvenom命令总结大全