文章目录
隐藏版本号
编辑文件[root@localhost:/usr/local/nginx-1.16.1]# vim src/core/nginx.h
,改变以下内容,可自定义。
防止回显具体版本号:
- 修改http头信息中的connection字段,编辑文件:
[root@localhost:/usr/local/nginx-1.16.1]# vim src/http/ngx_http_header_filter_module.c
- 修改
ngx_http_special_response.c
文件定义了 Nginx报 404错误时,不回显版本号。
注: nginx-1.16.1 版本,不再需要修改。nginx1.10以下还需要修改以下内容:
vim src/http/ngx_http_special_response.c
35 static u_char ngx_http_error_tail[] =
改:36 "<hr><center>nginx</center>" CRLF
为:36 "<hr><center>XWS</center>" CRLF
编译安装nginx
./configure --prefix=/usr/local/nginx \
--user=nginx --group=nginx --with-http_ssl_module \
--with-http_realip_module --with-http_gzip_static_module \
--with-pcre && make -j 4 && make install
#启动服务
/usr/local/nginx/sbin/nginx && netstat -lntp|grep 80
测试是否修改成功:
方式1:
curl -I localhost
方式2:当访问时,出现 404 、403及其它错误时也会返回已经隐藏的版本信息
http://192.168.8.19/asdadas.heml
设置nginx的cpu亲和力
修改nginx配置文件的运行用户为nginx,然后通过ps aux|grep nginx可以看到以nginx身份运行的worker process 是nginx的工作进程,work进程才是为用户提供服务的 。
修改nginx运行进程个数
- nginx运行进程个数一般设置为CPU的核心数或者核心数 2倍。 可以通过top命令按1 查看cpu核心数,然后修改配置文件即可。
- 设置 Nginx运行CPU的亲和力
CPU的亲和力就是把nginx每个进程绑定到固定的CPU上,从而减少CPU上下文的切换导致额外的开销。
比如服务器是 4核 4 线程的cpu,修改配置文件配置为如下:
worker_processes 4; #在此行下添加
worker_cpu_affinity 0001 0010 0100 1000; #8核:00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; 以此类推
查看CPU亲和力:
pstree -p | grep nginx #拿到进程号
taskset -cp 进程号 #4核cpu配置之前发现0-3说明可以在4个cpu上运行;配置亲和力之后发现1,说明只能在第二个cpu运行,说明cpu绑定已经成功。
设置nginx最多可以打开文件数:
worker_cpu_affinity 0001 0010 0100 1000; #在这一行下面,插入以下内容:
worker_rlimit_nofile 102400; #设置woker进程最大打开文件数,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,即:(ulimit -n)/ worker_processes ,但是 nginx分配请求并不是那么均匀,所以最好与 ulimit -n 的值保持一致。
修改nginx事件处理模型
修改nginx事件模型:
events {
worker_connections 1024;
use epoll; 使用epoll事件处理模型
}
nginx事件处理模型对比:
select,poll,epoll都是nginx下的IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。epoll 在Linux2.6 内核中正式引入,和 select 和poll 相似,其实都是I/O 多路复用技术。
epoll优势:
1、epoll没有最大并发连接的限制,上限是最大可以打开文件的数目,这个数字一般远大于 2048, 一 般来说这个数目和系统内存关系很大,具体数目可以 cat /proc/sys/fs/file-max查看。
2、 效率提升,Epoll最大的优点就在于它只管你“活跃”的连接,而跟连接总数无关,因此在实际 的网络环境中,epoll 的效率就会远远高于select 和poll。
3、epoll在这点上使用了“共享内存”,更省内存,效率更高。
设置单个进程允许客户端最大并发连接数
events {
worker_connections 102400;
use epoll;
}
worker_connections: 这个属性是指单个工作进程可以允许同时建立外部连接的数量。无论这个连接是外部主动建立的,还是内部建立的。一个工作进程建立一个连接后,进程将打开一个文件副本。所以这个数量还受限于,操作系统 ulimit -n 设定的值和nginx 的 worker_connections 的值。一般情况下 系统 ulimit -n、worker_rlimit_nofile 、worker_connections三者的值是一样的。
nginx 服务器实际最大并发值就是:worker_processes*worker_connections 的乘积。
可以用top -u nginx命令RES列查看nginx每个进程使用的内存大小。
ServerName匹配
server模块中的ServerName匹配方式:
- 精确匹配:www.aa.com
- 左侧通配符匹配:*.aa.com
- 右侧通配符匹配:www.*
- 正则表达式:~ ^.*.aa.com$
- default_server
- 服务IP地址
location匹配
location匹配:
=
绝对匹配
^~
URL前半部分匹配,不检查正则
~
正则匹配,区分大小写
~*
正则匹配,不区分大小写
\
转义
*
匹配任意单个字符
$
以什么结尾
高效传输模式
sendfile on;
开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile 函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off, 以平衡磁盘与网络 I/O处理速度,降低系统的负载。注意: 如果图片显示不正常把这个改成 off。
tcp_nopush on;
必须在 sendfile 开启模式才有效,防止网络阻塞,积极的减少 网络报文段的数量。
连接超时时间
主要目的是保护服务器资源,CPU,内存,控制连接数,因为建立连接也是需要消耗资源的,TCP的三次握手四次挥手等,我们一般断掉的是那些建立连接但是不做事,也就是我建立了链接开始,但是后续的握手过程没有进行,那么我们的链接处于等待状态的,全部断掉!
同时希望php建立短连接,资源会占用少一些。
keepalive_timeout 65;
客户端连接保持会话超时时间,超过这个时间,服务器断开这个链接。
tcp_nodelay on;
也是防止网络阻塞,不过要包涵在keepalived 参数才有效。
client_header_timeout 15;
客户端请求头读取超时时间,如果超过设个时间没有发送任何数据,nginx 将返回request time out的错误。
client_body_timeout 15;
客户端求主体超时时间,超过这个时间没有发送任何数据,和上面一样的错 误提示。
send_timeout 15;
响应客户端超时时间,这个超时时间仅限于两个活动之间的时间,如果超过这个时间, 客户端没有任何活动,nginx 关闭连接。
client_max_body_size 10m;
文件上传大小限制
fastcgi调优
FastCGI 是一种协议,规定了FastCGI应用和支持FastCGI的Web服务器之间的接口。Fastcgi是静态服务和动态服务的一个接口,FastCGI是二进制连续传递的。
fastcgi相关参数的概念:
cache
写入缓存区
buffer
读取缓存区
fastcgi_connect_timeout 300;
指定链接到后端FastCGI 的超时时间。
fastcgi_send_timeout 300;
向FastCGI 传送请求的超时时间,这个值是指已经完成两次握手后向FastCGI传送请求的超时时间。
fastcgi_read_timeout 300;
指定接收 FastCGI应答的超时时间,这个值是指已经完成两次握手后接收FastCGI 应答的超时时间。
fastcgi_buffer_size 64k;
指定读取FastCGI应答第一部分需要用多大的缓冲区,这个值表示 将使用1个 64KB的缓冲区读取应答的第一部分(应答头),可以设置为 gastcgi_buffers 选项指定的缓冲区大小。
fastcgi_buffers 4 64k;
指定本地需要用多少和多大的缓冲区来缓冲 FastCGI的应答请求,如果一 个php 脚本所产生的页面大小为256KB,那么会分配 4 个 64KB的缓冲区来缓存,如果页面大小大于 256KB,那么大于 256KB 的部分会缓存到 fastcgi_temp 指定的路径中,但是这并不是好方法,因为内 存中的数据处理速度要快于磁盘。一般这个值应该为站点中 php脚本所产生的页面大小的中间值,如果站 点大部分脚本所产生的页面大小为 256KB,那么可以把这个值设置为“8 16K”、“4 64k”等。
fastcgi_busy_buffers_size 128k;
建议设置为fastcgi_buffer 的两倍,繁忙时候的buffer。
fastcgi_temp_file_write_size 128k;
在写入磁盘时fastcgi_temp_path时将用多大的数据库容 量,默认值是fastcgi_buffers的两倍,设置上述数值设置小时若负载上来时可能报 502Bad Gateway。
fastcgi_cache gnix;
表示开启FastCGI缓存并为其指定一个名称。开启缓存非常有用,可以有效降 低CPU的负载,并且防止 502的错误发生,但是开启缓存也可能会引起其他问题,要很据具体情况选择。
fastcgi_cache_valid 200 302 1h;
用来指定状态码的缓存时间,实例中的值表示将 200 和302 应答缓存一小时,要和fastcgi_cache 配合使用。
fastcgi_cache_valid 301 1d;
将301应答缓存一天。
fastcgi_cache_valid any 1m;
将其他应答缓存为 1分钟。
fastcgi_cache_min_uses 1;
请求的数量。用了一次我不缓存
fastcgi_cache_path
定义缓存的路径。
gzip调优
使用gzip压缩功能,可能为我们节约带宽,加快传输速度,提高用户的体验,也为我们节约成本。要使用压缩模块在编译时指定ngx_http_gzip_module
模块,一般要压缩的内容有:文本,js,html,css,对于图片,视频,flash 什么的不压缩,同时也要注意,我们使用gzip的功能是需要消耗 CPU 的!
gzip相关参数的概念:
gzip on;
开启压缩功能。
gzip_min_length 1k;
设置允许压缩的页面最小字节数,页面字节数从 header头的 Content-Length(内容长度)中获取,默认值是 0,不管页面多大都进行压缩,建议设置成大于 1K,如 果小与 1K可能会越压越大。
gzip_buffers 4 32k;
压缩缓冲区大小,表示申请 4 个单位为 32K 的内存作为压缩结果流缓存, 默认值是申请与原始数据大小相同的内存空间来存储 gzip压缩结果。
gzip_http_version 1.1;
压缩版本(默认1.1,前端为 squid2.5 时使用1.0)用于设置识别HTTP 协议版本,默认是 1.1,目前大部分浏览器已经支持 GZIP解压,使用默认即可。
gzip_comp_level 9;
压缩比例,用来指定 GZIP压缩比,1 压缩比最小,处理速度最快,9压缩比 最大,传输速度快,但是处理慢,也比较消耗CPU资源。
gzip_types text/css text/xml application/javascript;
用来指定压缩的类型,‘text/html’ 类型总是会被压缩。
gzip_vary on;
vary header 支持,该选项可以让前端的缓存服务器缓存经过 GZIP压缩的页面, 例如用 Squid缓存经过nginx 压缩的数据。
expire缓存调优
缓存,主要针对于图片,css,js等元素更改机会比较少的情况下使用,特别是图片,占用带宽大,我 们完全可以设置图片在浏览器本地缓存 365天,css,js,html 可以缓存个10来天,这样用户第一次打开 加载慢一点,第二次,就非常快了!
配置expires缓存:
location ~ ^/(image|javascript|js|css|flash|media|static)/ {
expires 360d; //缓存365天
}
expires缓存的优点:
(1)expires可以降低网站购买的带宽,节约成本
(2)同时提升用户访问体验
(3)减轻服务的压力,节约服务器成本,甚至可以节约人力成本,是 web服务非常重要的功能
expires缓存的缺点: 被缓存的页面或数据更新了,用户看到的可能还是旧的内容,反而影响用户体验。 解决办法:减少缓存时间、对缓存的对象改名。不推荐缓存的内容:广告图片、网站流量统计工具、频繁更新的文件。