Nginx优化1

nginx优化

1.隐藏ngixn版本号 2.修改nginx运行账号,为nginx
3.设置CPU亲和力和nginx进程 4.文件最大打开数
5.epoll事件处理模型 6.高效传输 7.启用gzip压缩 8.expires缓存调优(页面/图片等,缓存时间)
9.ServerName和location匹配 10.fastcgi调优(nginx和php连接的接口)

Nginx概念

Nginx (“engine x”) 是一个高性能(轻量级)的 HTTP 和 反向代理 服务器。因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,nginx采用的是epoll事件处理模型。中国大陆使用nginx网站用户有:百度BWS、新浪、网易、腾讯等。Nginx官网:RamBler:http://www.rambler.ru/

在这里插入图片描述

Tengine:

Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。(可以这样理解:淘宝拿到了Nginx源代码之后,进行了功能的填充,优化等等,然后提交给Nginx官方,但是由于Nginx官方相应慢或者不响应,加上语言沟通的不顺畅,于是淘宝公司就自己打包,在遵循GPL的原则上进行二次开发,于是就出了现在的Tengine这个版本)。官网网站:http://tengine.taobao.org/

1.隐藏版本号

在这里插入图片描述
在这里插入图片描述

安装nginx
上传软件包并解压

[root@nginx ~]# ls
anaconda-ks.cfg nginx-1.10.3.tar.gz
[root@nginx ~]# tar -zxvf nginx-1.10.3.tar.gz -C /usr/local/src/

更改源码隐藏软件名称和版本号

[root@nginx ~]# cd /usr/local/src/nginx-1.10.3/ #必须在解压软件包之后,在安装之前,就设置
在这里插入图片描述
有时候我们页面程序出现错误,Nginx会代我们返回相应的错误代码,回显的时候,会带上nginx和版本号,我们把他隐藏起来

安装nginx依赖包

[root@nginx nginx-1.10.3]# yum install -y gcc gcc-c++ autoconf automake zlib zlib-devel openssl openssl-devel pcre pcre-devel

预编译(有很多模块,如果不指定,后期你要用,可以直接加载这个模块)

nginx支持不重启就可以更新版本
[root@nginx nginx-1.10.3]# ./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

–with-http_dav_module #启用支持(增加PUT,DELETE,MKCOL:创建集合,COPY和MOVE方法)默认关闭,需要编译开启
–with-http_stub_status_module #启用支持(获取Nginx上次启动以来的工作状态)
–with-http_addition_module #启用支持(作为一个输出过滤器,支持不完全缓冲,分部分相应请求)
–with-http_sub_module #启用支持(允许一些其他文本替换Nginx相应中的一些文本)
–with-http_flv_module #启用支持(提供支持flv视频文件支持)
–with-http_mp4_module #启用支持(提供支持mp4视频文件支持,提供伪流媒体服务端支持)
–with-pcre #启用pcre库。需要注意,这里指的是源码,用#./configure --help |grep pcre查看帮助 https://www.cnblogs.com/flashfish/p/11025961.html
–with-http_ssl_module #启用ssl证书模块

编译安装

[root@nginx nginx-1.10.3]# make -j 4 && make install

启动nginx

[root@nginx ~]# /usr/local/nginx/sbin/nginx
查看端口号
[root@nginx ~]# netstat -antup | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 7423/nginx: master

测试

在这里插入图片描述

网站测试

http://192.168.100.101/

2.修改nginx运行账号,为nginx

查看nginx当前运行账号

[root@nginx ~]# ps -aux | grep nginx #默认是nobody用户

创建nginx账号

[root@nginx ~]# useradd -M -s /sbin/nologin nginx

修改nginx运行账号

[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
改:
#user nobody;
为:
user nginx;

添加path变量

[root@nginx ~]# ln -s /usr/local/nginx/sbin/* /usr/local/bin/

重载nginx

[root@nginx ~]# nginx -s reload
重载实现原理:开一个新的进程(把后来,来的用户都放到这个新进程当中)等原进程处理完之后(把原进程删掉)。和不关服务修改版本号一样的原理

查看运行账号

[root@nginx ~]# ps -aux | grep nginx
在这里插入图片描述
在这里我们还可以看到在查看的时候,work进程是nginx用户了,但是master进程还是root
其中,master是监控进程,也叫主进程,work是工作进程.
所以我们可以master监控进程使用root,可以是降级使用普通用户,如果都是用普用户,那么编译安装的时候,是用普通用户执行,sudo方式操作!可以直接理解为master是管理员,work进程才是为用户提供服务的!
(master)主程序就用来调度,用来监控的。work进程是用来工作的
visudo:用来设置nginx用户有什么权限,允许nginx启动程序,允许它侦听地址

生成服务启动脚本

[root@nginx ~]# vim /etc/init.d/nginx
#!/bin/bash
#chkconfig: - 99 2
#description: Nginx Service Control Script
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
case “$1” in
start)
$PROG
;;
stop)
kill -3 $(cat $PIDF)
;;
restart)
$0 stop &> /dev/null
if [ $? -ne 0 ] ; then continue ; fi
$0 start
;;
reload)
kill -1 $(cat $PIDF)
;;
*)
echo “Userage: $0 { start | stop | restart | reload }”
exit 1
esac
exit 0

配置服务开机自动启动

[root@nginx ~]# chmod +x /etc/init.d/nginx #给脚本添加可执行权限
[root@nginx ~]# chkconfig --add nginx #把nginx添加为系统服务
[root@nginx ~]# chkconfig nginx on #把nginx添加开机自启动
[root@nginx ~]# chkconfig --list nginx #查看nginx开机启动项

3.设置CPU亲和力和nginx进程

查看cpu个数

[root@nginx ~]# top #按1,可以看到我这里是2颗CPU
在这里插入图片描述

设置nginx中cpu个数

[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
改:
worker_processes 1;

worker_processes 2; #我这里查看到是2个cpu, 将进程和cpu数量设置成一样

重载nginx配置文件

[root@nginx ~]# nginx -s reload
查看nginx进程数
[root@nginx ~]# ps -axu | grep nginx #可以看到2个worker进程

Nginx运行CPU亲和力

这个要根据你的CPU线程数配置(线程绑定CPU)
问:
绑定cpu有什么好处?
缓存命中率提高,使得缓存不容易失效,节省大量的时间。
意思就是:就是第一个用户访问的web1下次还访问这个web1
如果不绑定呢:
可能会进行缓存的更新,等下次被调度上来的时候,之前缓存的已经没了,需要重新从内存中取值
什么是cpu的亲和力:
在多处理器的情况下,进程或者线程每次被调度后可能会在不同的cpu上执行,这样每次从不同的cpu上倒来倒去,会导致该进程或者线程在之前cpu上缓存的数据会被标记为失效。导致缓存失效会非常的影响效率。
由于不断的在不同的处理器上迁移可能带来很大效率上的折损,所以我们希望进程或者线程绑定在同一个处理器上执行,就几乎不会有数据失效的问

4核4线程配置

[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
在这里插入图片描述

8核8线程配置

[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
在这里插入图片描述

那么如果我是4线程的CPU,我只想跑两个进程呢?

[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
在这里插入图片描述
表示第一个进程在第一个和第三个cpu上运行,第二个和第四个cpu上运行,两个进程分别在这两个组合上轮询!
worker_processes最多开启8个,8个以上性能提升不会再提升了,而且稳定性变得更低,所以8个进程够用了。
一般都是:一颗cpu,多个核心! 核心数怎么求:cpu*核心数
几个空格几个进程。这个数里边有几个一,就代表一个进程对应几个核心,几个核心写几位数
在这里插入图片描述
[root@nginx]# nginx -t
使用这条命令查看文件里有没有错误内容,然后再重启

设置Nginx运行进程个数

Nginx运行进程个数一般我们设置CPU的核心或者核心数x2,如果你不了解,top命令之后按1也可以看出来(一般直接追到线程即可)。最大打开文件限制线程数量!

4.文件最大打开数

nginx最大打开文件数量

[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
在这里插入图片描述
当一个nginx进程打开的最多文件数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。
1.一个用户访问你,你就创建一个soket文件,少一个人就少一个soket文件
2.nginx最大文件打开数手系统文件最大打开数限制,要与ulimit -n的值保持一致!
3.每个进程文件最大打开数和你系统最大打开数设置成一样

系统可以打开的最大文件数:

临时修改
ulimit -n设定系统最多打开的文件数
[root@nginx ~]# ulimit -n 102400
[root@nginx ~]# ulimit -n
在这里插入图片描述
永久修改
永久修改linux系统的软硬件限制文件/etc/security/limits.conf
[root@nginx ~]# vim /etc/security/limits.conf
在文件尾部添加如下代码: *代表所有用户
* soft nofile 102400 #*改为nginx用户,针对nginx用户,软限制
* hard nofile 102400 #*改为nginx用户,针对nginx用户,硬限制
重启可测试
[root@nginx ~]# ulimit -n
在这里插入图片描述

单个进程允许客户端最大并发连接数

worker_connections 102400;
这个数值一般根据服务器性能和内存来制定,也就是单个进程最大连接数,实际最大并发值就是work进程数乘以这个数。(就是单个进程最大连接数,实际是最大并发值)
如何设置,可以根据设置一个进程启动所占内存,top -u nginx,但是实际我们填入一个102400,足够了,这些都算并发值,一个网站的并发达到这么大的数量,也算一个大站了!
[root@nginx ~]# top -u nginx
在这里插入图片描述
启动一个进程所占用内存是1.5M左右
在这里插入图片描述=总访问量

5.Nginx事件处理模型

[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
events {
use epoll;
worker_connections 102400; #单个进程允许客户端最大并发连接数
}

IO多路复用的机制(异步非阻塞)

use epoll; #epoll模型就是很快
select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。
Epoll 在Linux2.6内核中正式引入,和select相似,其实都I/O多路复用技术。
epoll优势:
1、Epoll没有最大并发连接的限制,上限是最大可以打开文件的数目,这个数字一般远大于2048, 一般来说这个数目和系统内存关系很大,具体数目可以cat /proc/sys/fs/file-max察看。
[root@nginx ~]# cat /proc/sys/fs/file-max
在这里插入图片描述
2、 效率提升,Epoll最大的优点就在于它只管你“活跃”的连接,而跟连接总数无关,因此在实际的网络环境中,Epoll的效率就会远远高于select和poll。
3、 内存拷贝,Epoll在这点上使用了“共享内存”,这个内存拷贝也省略了。
用户空间,内核空间,在这里插入图片描述

6.高效传输

开启高效传输模式(写在全局当中)

[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
在这里插入图片描述
sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。(图片多的就不要打开这个选项了)不然容易造成图片损坏,如果图片显示不正常把这个改成off
tcp_nopush on; #说明:当有数据时,先别着急发送, 确保数据包已经装满数据, 避免了网络拥塞
必须在sendfile开启模式才有效,防止网络阻塞,积极的减少网络报文段的数量

长连接超时时间

[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
35 keepalive_timeout 65; #总体超时时间,为0表示禁用长连接,添加以下内容
36 keepalive_requests 10000; #一个长连接上可以服务的最大请求数
37 tcp_nodelay on; #开启高效传输模式
38 client_header_timeout 15; #客户端请求超时时间,头部(元数据)
39 client_body_timeout 15; #客户端请求(真实)数据超时时间
40 send_timeout 15; #客户端与服务器两个活动的活跃保持时间/超时时间
注释:
keepalived_timeout 客户端连接保持会话超时时间,超过这个时间,服务器断开这个连接
tcp_nodelay;也是防止网络阻塞,不过要包涵在keepalived参数才有效
client_header_timeout 客户端请求头(头部信息)读取超时时间,如果超过设个时间没有发送任何数据,nginx将返回request time out的错误
client_body_timeout 客户端求主体(真实信息)超时时间,超过这个时间没有发送任何数据,和上面一样的错误提示
send_timeout 响应客户端超时时间,这个超时时间仅限于两个活动之间超时时间的时间,如果超过这个时间,客户端没有任何活动,nginx关闭连接

文件上传大小限制

nginx可以修改上传文件大小限制
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
40 client_max_body_size 10m; #在40行添加

7.gzip(压缩)调优

使用gzip压缩功能,可能为我们节约带宽,加快传输速度,有更好的体验,也为我们节约成本,所以说这是一个重点。启用gzip(在到全局当中)
Nginx启用压缩功能需要你来ngx_http_gzip_module模块,apache使用的是mod_deflate
一般我们需要压缩的内容有:文本,js,html,css,对于图片,视频,flash不压缩,同时也要注意,我们使用gzip的功能是需要消耗CPU的!
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
56 gzip on; #开启注释,将下面的内容粘进去
57 gzip_min_length 1k;
58 gzip_buffers 4 32k;
59 gzip_http_version 1.1;
60 gzip_comp_level 9;
61 gzip_types text/css text/xml application/javascript;
62 gzip_vary on;
在这里插入图片描述

重启服务

[root@nginx ~]#nginx -s reload
[root@nginx ~]#curl -I -H “Accept-Encoding: gzip, deflate” “http://192.168.100.101/passwd.html”
这个命令可以看开没开启gzip压缩
在这里插入图片描述

8.expires缓存调优(页面/图片等,缓存时间)

缓存,主要针对于图片,css,js等元素更改机会比较少的情况下使用,特别是图片,占用带宽大,我们完全可以设置图片在浏览器本地缓存365d,css,js,html可以缓存个10来天,这样用户第一次打开加载慢一点,第二次,就非常快了!缓存的时候,我们需要将需要缓存的拓展名列出来!

以扩展名区分(写到虚拟主机当中)

[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
92 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
93 {
94 expires 365d; #所有图片缓存365天
95 }
96 location ~ .*\.(js|css)?$
97 {
98 expires 30d; #所有js、css代码缓存30天
99 }

对目录、文件及其进行判断:

location ~ ^/(images|javascript|js|css|flash|media|static)/ {
expires 360d; #当你访问我这个目录,我给你缓存多长时间。
}
location ~(robots.txt) {
expires 7d; #当你访问我这个文件,我给你缓存多长时间。
break;
}

expire功能优点(缓存页面数据)

(1)expires可以降低网站购买的带宽,节约成本
(2)同时提升用户访问体验
(3)减轻服务的压力,节约服务器成本,甚至可以节约人力成本,是web服务非常重要的功能。

expire功能缺点(缓存页面数据)

被缓存的页面或数据更新了,用户看到的可能还是旧的内容,反而影响用户体验。
解决办法:
第一个 缩短缓存时间,例如:1天,不彻底,除非更新频率大于1天
第二个 对缓存的对象改名
a.图片,附件一般不会被用户修改,如果用户修改了,实际上也是更改文件名重新传了而已
b.网站升级对于js,css元素,一般可以改名,把css,js,推送到CDN。
##CDN就是就是访问离你最近的服务器,把你定位到最近节点服务器上

网站不希望被缓存的内容

1)广告图片
2)网站流量统计工具
3)更新频繁的文件(google的logo)

9.ServerName和location匹配

修改网站域名

[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
81 server {
82 listen 80;
83 server_name bbs.qingniao.com;
84 #charset koi8-r;
85 #access_log logs/host.access.log main;
86 location / { #/表示网站根目录/usr/local/nginx/
87 root html; #这个网站的目录是/usr/local/nginx/html
88 index bbs.html index.htm; #记得创建这个文件
89 }
90 error_page 500 502 503 504 /50x.html;
91 location = /50x.html {
92 root html;
93 }
94 error_page 404 /404.html; #404页面 ,淘宝用的就是404跳转页面,还打了广告。当有404报错的时候就返回这个页面!
95 }

ServerName匹配:

1:精确匹配:www.qingniao.com
2:左侧通配符匹配:*.qingniao.com
3:右侧通配符匹配:www.*
4:正则表达式:~ ^.*.qingniao.com$ #~表示要用正则表达式,^测试后面写的对不对 .*表示匹配任意次数字符,反正就是开头任意 .用\转译,以.com结尾
5: default_server #域名头部随意
6、服务IP地址

location匹配:

= 绝对匹配
~^:如果把这个前缀用于一个常规字符串,那么告诉nginx 如果路径匹配那么不测试正则表达式。~要用正则表达式,^就是检测一下你这个正则写的对不对
location ~^ /images/ {
~:正则匹配,区分大小写
~*“正则匹配”不区分大小写
\转义
\ * 配置任意个任意字符
$ 以什么结尾

只匹配 / 查询。

location = / {
}

匹配任何以 /images/ 开头的任何查询并且停止搜索。任何正则表达式将不会被测试。

location ^~ /images/ {
}

匹配任何以 gif、jpg 或 jpeg 结尾的请求

location ~*.(gif|jpg|swf)$ {
}

nginx配置文件检测

[root@nginx ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

10.fastcgi调优(nginx和php连接的接口)

配置之前。了解几个概念:

Cache:缓存区 可读!
Buffer:缓冲区 可写! #攒够一定大小写到硬盘当中,例如:1K
Fastcgi是静态服务和动态服务的一个接口(nginx与PHP连接的一个接口)

fastcgi参数解释:

在这里插入图片描述

修改nginx.conf配置文件,在http标签中添加如下:

[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
42 fastcgi_connect_timeout 300;
43 fastcgi_send_timeout 300;
44 fastcgi_read_timeout 300;
45 fastcgi_buffer_size 64k;
46 fastcgi_buffers 4 64k;
47 fastcgi_busy_buffers_size 128k;
48 fastcgi_temp_file_write_size 128k;
49 #fastcgi_temp_path /data/ngx_fcgi_tmp;
50 fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 #缓存路径,levels目录层次2级
51 keys_zone=ngx_fcgi_cache:512m #定义了一个存储区域名字,缓存大小
52 inactive=1d max_size=40g; #不活动的数据在缓存中多长时间,目录总大小

在server location标签添加如下:

70 location ~ .*.(php|php5)?$ #以.php结尾的请求,怎么怎么样
71 {
72 fastcgi_pass 127.0.0.1:9000; #到我本地,9000端口
73 fastcgi_index index.php; #文件位置
74 include fastcgi.conf;
75 fastcgi_cache ngx_fcgi_cache;
76 fastcgi_cache_valid 200 302 1h; #200 302状态码,缓存1小时
77 fastcgi_cache_valid 301 1d; #…状态码缓存1天,例:http变到https
78 fastcgi_cache_valid any 1m; #其他状态码就缓存一分钟
79 fastcgi_cache_min_uses 1;
80 fastcgi_cache_use_stale error timeout invalid_header http_500;
81 fastcgi_cache_key http://$host$request_uri;
82 }

检测配置文件

[root@nginx ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: [emerg] mkdir() “/data/ngx_fcgi_cache” failed (2: No such file or directory)
nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed
[root@nginx ~]# mkdir /data
8.5.10、 重启
[root@nginx ~]# systemctl restart nginx

fastcgi cache资料:

官方文档:http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值