目录
查看nginx进程
ps -aux | grep nginx
图中可以看到 worker 进程是 www 程序用户也是工作进程,master 是监控进程,也是主进程,可理解为 master 进程是监控管理 worker 工作进程的。
2. 设置Nginx运行进程个数
nginx运行进程个数一般我们设置cpu的核心一致或者核心数x2
2.1查看cpu个数
方法一:
grep processor /proc/cpuinfo
也可加个wc -l 统计行数
grep processor /proc/cpuinfo | wc -l
方法二:
使用 top 命令 #按1,可以查看cup的核心
2.2设置Nginx中进程数
在nginx.conf的全局配置中修改
我cpu数量是4,修改为4
2.3重载nginx配置文件
nginx -s reload
2.4查看nginx进程数
3.Nginx运行cpu亲和力
cpu线程数配置,在高并发情况下,通过设置cpu亲和力来降低由于多核切换带来的性能损耗。
3.1 4核4线程配置
在nginx.conf文件全局配置中添加:
vim /usr/local/nginx/conf/nginx.conf
注:4核cpu,开启4个进程 0001表示开启第一个cpu内核,0001表示开启第一个cpu内核 ,0010开启第2个cpu内核,依次类推;有多少个核,就有几位数,1表示该内核开启,0表示该内核关闭。
3.2 8核8线程配置
vim /usr/local/nginx/conf/nginx.conf
3.3如4线程的cpu,只想跑两个进程
vim /usr/local/nginx/conf/nginx.conf
表示第一个进程cpu上运行,第二个进程在第二个和第四个cpu上运行,两个进程分别在这两个组合上轮询!
补充:
2核CPU,开启2个进程
worker_processes2;
worker_cpu_affinity 01 10;
worker_processes 4;
worker_cpu_affinity 01 10 01 10;
worker_processes8;
worker_cpu_affinity 01 10 01 10 01 10 01 10;
worker_processes2;
worker_cpu_affinity 10101010 01010101;
说明:10101010表示开启了第2,4,6,8内核,01010101表示开始了1,3,5,7内核
通过 apache 的ab测试查看nginx对CPU的使用状况:
4. Nginx最多可以打开文件数
4.1设置nginx最大可打开文件数
在nginx.conf文件全局配置中添加:
vim /usr/local/nginx/conf/nginx.conf
nginx进程打开的最多文件数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。
4.2修改系统可以打开的最大文件数
1)临时修改
-n 临时设定系统最多打开的文件数
ulimit -n 102400
ulimit -n
2)永久修改
修改linux的软硬件限制文件/etc/security/limits.conf
vim /etc/security/limits.conf
在文件尾部添加:
用户重新登录即生效
5.Nginx事件处理模型
vim /usr/local/nginx/conf/nginx.conf
nginx采用epoll 事件模型。处理效率高。
5.1单个进程允许客户端最大并发连接数
worker_connections是单个worker进程允许客户端最大连接数,这个数值一般根据服务器性能和内存来制定,实际最大值就是worker进程数乘以work_connections
如何设置,可以根据一个进程启动所占内存,top -u www(www表示nginx程序用户)
刚启动一个进程占用内存是5M左右
6.http主体优化
6.1开启高效传输模式
vim /usr/local/nginx/conf/nginx.conf
sendfile on;
开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来传输,输出文件,当nginx是一个静态文件服务器的时候,开启sendfile配置项能大大提高nginx的性能。
tcp_nopush on;
在sendfile开启模式才有效,防止网络阻塞,积极的减少网络报文段的数量(将响应头和响应体两部分一起发送,而不一个接一个的发送。)
6.2长连接超时时间
主要目的是CPU,内存,控制连接数,因为建立连接也是需要消耗资源的
vim /usr/local/nginx/conf/nginx.conf
keepalive_timeout 65;
keepalived_timeout 与client的keep-alive连接超时时间,单位是秒,服务器和客户端无交互后将在这个时间后关闭连接,长连接可以减少重建连接的开销,如果设置时间过长,用户又多,长时间保持连接会占用大量资源。
6.3文件上传大小限制
vim /usr/local/nginx/conf/nginx.conf
client_max_body_size 10m; #在40行添加
6.4 location匹配
Nginx的location通过指定模式来与客户端请求的URI相匹配,location可以把网站的不同部分,定位到不同的处理方式上,基本语法如下:
location 【= | ~ | ~* | ^~】pattern {
......
}
注:中括号中为修饰符, 即指令模式。Pattern为url匹配模式
= #表示做精准匹配,即要求请求的地址和匹配路径完全相同
~ #正则匹配,区分大小写
~* #正则匹配,不区分大小写
注:nginx支持正则匹配,波浪号(~)表示匹配路径是正则表达式,加上 * 变成 ~* 表示对大小写不敏感
^~ #指令用于字符前缀匹配。例:location ^~ /images/ {…}
1)精确匹配
= 用于精确字符匹配(模式),不能使用正则,区分大小写
例:精确匹配,浏览器输入ip地址/text.html,定位到服务器/var/www/html/text.html文件
重载nginx
nginx -s reload #如没设置环境变量或软连接使用nginx安装路径重载
例2:
匹配命中的location,使用rewrite指令,用于转发。可以理解命中了就重定向到rewrite后面的url即可
重载nginx
nginx -s reload
测试:
可以看到给30.150的demo发请求,通过rewrite 重写到了百度
2)前缀匹配
^~指令用于字符前缀匹配,不能使用正则且区分大小写,不同的是访问的url无需url匹配模式一模一样,只需要其开头前缀和url匹配模式一样即可。
location ^~ /demo {
rewrite ^ http://360.com;
}
重载nginx
nginx -s reload
对于该模式(/demo),访问下列的地址都能匹配
http://ip/demo
http://ip/demo/
http://ip/demo/aaa 等等
测试:
只需要以/demo为前缀开头的url都能匹配。与该模式后的是否大小写无关。
^~不支持正则。模式/demo$中的$并不代表字符模式结束,而是一个是实实在在的$,只有访问/demo$开头的url才能匹配
前缀匹配通常用于匹配文件夹,如配置静态文件。
3)正则匹配
nginx支持正则匹配。所使用的指令是 ~ 和 ~* ,前者表示使用正则,区分大小写,后者表示使用正则,不区分大小写。
例:
vim /usr/local/nginx/conf/nginx.conf
location ~ /[0-9]emo {
rewrite ^ http://weibo.com;
}
重载nginx
nginx -s reload
测试:
4)正常匹配
正常匹配的指令为空,即没有指定匹配指令的即为正常匹配。其形式类似 /XXX/YYY.ZZZ正常匹配中的url匹配模式可以使用正则,不区分大小写
location /demo {
rewrite ^ http://baidu.com;
}
正常匹配和前缀匹配的差别在于优先级。前缀的优先级高于正常匹配。
5)全匹配
全匹配与正常匹配一样,没有匹配指令,匹配的url模式仅一个斜杠 /
location / {
rewrite ^ http://google.com;
}
匹配任何查询,因为所有请求都已 / 开头。但是正则表达式规则和一些较长的字符串将被优先查询匹配。
6)命名查询
nginx的匹配优先级遵循一个大原则和一个小细节。
大原则是关于匹配模式的优先级:
精确匹配 > 前缀匹配 > 正则匹配 > 正常匹配 > 全匹配
小细节则是同级的优先级:
面对一个location,先判断是否是正则匹配,如果是正则匹配,匹配的模式,则命中。
如果不是正则,则把匹配的模式放到一边,继续往下阅读配置,阅读完毕所有的匹配模式,查看哪一种的匹配模式更长,则是最终命中的模式。
同级匹配需注意两个细节,是否正则匹配,是否最长匹配。
7)nginx配置文件检测
nginx -t
6.5 gzip调优
1)启用gzip
使用gzip压缩功能,可为我们节约带宽,加快传输速度,有更好的体验,节约成本
Nginx启用压缩功能需要用ngx_http_gzip_module模块,apache使用的是mod_deflate
一般我们需要压缩的内容有:文本,js,html,css,
对于图片,视频,flash不压缩,同时也要注意,我们使用gzip的功能是需要消耗CPU的!
在http{}区域中添加:
vim /usr/local/nginx/conf/nginx.conf
gzip on;
gzip_min_length 1k;
gzip_buffers 4 32k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_types text/css text/xml application/javascript;
gzip_vary on;
参数说明:
gzip on; #开启压缩功能
gzip_min_length 1k; #设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length(内容长度)中获取,默认值是0,建议设置成大于1K,如果小于1K可能会越压越大。
gzip_buffers 4 32k; #压缩缓冲区大小,表示申请4个单位为32K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果
gzip_http_version 1.1; #压缩版本,用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持GZIP解压,使用默认即可。
gzip_comp_level 6; #压缩比例,用来指定GZIP压缩比,1压缩比最小,处理速度最快,9压缩比最大,传输速度快,但是处理慢,也比较消耗CPU资源。
gzip_types text/css text/xml application/javascript; #用来指定压缩的类型,‘text/html’类型总是会被压缩
默认值: gzip_types text/html (默认不对js/css文件进行压缩)
#不能使用通配符 text/*
#(不论是否指定)text/html 默认压缩
# 设置压缩哪种文本文件可参考 conf/mime.types
gzip_vary on; #启用应答头"Vary: Accept-Encoding"。和http头有关系,加个vary头,给代理服务器用的,有的浏览器支持压缩,有的不支持,所以避免浪费不支持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩。其实cdn,代理服务器,原理上都是代理服务器。他们一般以url为key值进行缓存。而vary属性的设置,告诉了代理根据url缓存的同时,vary的信息也作为key。比如客户端(浏览器)请求的信息里带上了Accept-Encoding:gzip 则返回压缩副本。如果没有带这个头信息,默认返回非压缩副本。
6.6拷贝测试文件
cp /etc/passwd /usr/local/nginx/html/passwd.html
cd /usr/local/nginx/html/
ll 或 du -sh * #查看文件大小
6.7测试
打开浏览器,输入测试网址
按F12刷新网页,在开发人员工具里可以看到,passwd.html大小
在网页标头里可以看到,Accept-Encoding: gzip, deflate启用了gzip压缩
6.8 expires 缓存调优
缓存,主要针对于图片,css,js等元素更改机会比较少的情况下使用,特别是图片,占用带宽大,我们完全可以设置图片在浏览器本地缓存365d,css,js,html可以缓存个10来天,这样用户第一次打开加载慢一点,第二次,就非常快了!缓存的时候,我们需要将需要缓存的扩展名列出来!
Expires缓存配置在server字段里面。
1)以扩展名区分
vim /usr/local/nginx/conf/nginx.conf
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 365d;
}
location ~ .*\.(js|css)?$ {
expires 30d;
}
2)对目录及其进行判断:
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
expires 360d;
}
location ~ (robots.txt) {
expires 7d;
break;
}
注:用于中断当前相同作用域中的Nginx配置,和循环语句中的break语法类似,可以在server块和location以及if块中使用
expire功能优点:
(1)expires可以降低网站购买的带宽,节约成本
(2)同时提升用户访问体验
(3)减轻服务的压力,节约服务器成本,甚至可以节约人力成本,是web服务非常重要的功能
6.9 expire 功能缺点:
被缓存的页面或数据更新了,用户看到的可能还是旧的内容,反而影响用户体验。
解决方法:
第一个 缩短缓存时间,例如:1天,不彻底,除非更新频率大于1天
第二个 对缓存的对象改名
a.图片,附件一般不会被用户修改,如果用户修改了,实际上也是更改文件名重新传了而已
b.网站升级对于js,css元素,一般可以改名,把css,js,推送到CDN。网站不希望被缓存的内容
1)广告图片
2)网站流量统计
3)更新频繁的文件(google的logo)
7.日志切割优化
日志优化的目的,为了一天日志一压缩,按天存放
7.1创建日志切割脚本
cd /usr/local/nginx/logs/
vim cut_nginx_log.sh
#!/bin/bash
date=$(date +%F -d -1day)
cd /usr/local/nginx/logs
if [ ! -d cut ] ; then
mkdir cut
fi
mv access.log cut/access_$(date +%F -d -1day).log
mv error.log cut/error_$(date +%F -d -1day).log
/usr/local/nginx/sbin/nginx -s reload
tar -jcvf cut/$date.tar.bz2 cut/*
rm -rf cut/access* && rm -rf cut/error*
find -type f -mtime +10 | xargs rm -rf
crontab -e 设置计划任务
chmod +x cut_nginx_log.sh #添加可执行
7.2去掉不需要的日志统计
健康检查的日志,不用输入到log中,这些日志没有意义,分析的话只需要分析访问日志,看看一些页面链接,如200,301,404的状态码,在SEO中很重要,如我们统计PV是页面计算,,反而消耗了磁盘IO,降低了服务器性能
location ~ .*\.(js|jpg|jpeg|JPG|JPEG|css|bmp|gif|GIF)$ {
access_log off; #对以上.结尾的文件不做日志记录
}
注:
不要关闭error log 启动和程序允许错误会记录到error log里
正确关闭错误的方法:
error_log /dev/null;
7.3日志格式优化
Nginx软件会把每个用户访问网站的日志信息记录到指定的日志文件里,供我们分析用户的浏览行为等,功能由ngx_http_log_module模块负责。
对应的官方地址为:Module ngx_http_log_module
Nginx的访问日志主要由两个参数控制:
参数 | 说明 |
log_format | 定义记录日志的格式(可以定义多种日志格式,取不同名字即可) |
access_log | 用于指定日志文件的路径及使用各种日志记录日志 |
Nginx日志格式中默认的参数配置:
vim /usr/local/nginx/conf/nginx.conf #开启25-29行
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
1.$remote_addr 与$http_x_forwarded_for 用以记录客户端的ip地址。
2.$remote_user :用来记录客户端用户名称。
3.$time_local : 记录访问时间与时区。
4.$request : 记录请求的url与http协议。
5.$status : 记录请求状态;成功是200。
6.$body_bytes_sent :记录发送给客户端文件主体内容大小。
7.$http_referer :记录从那个页面链接访问过来的。
8.$http_user_agent :记录客户端浏览器的相关信息。
9. $http_x_forwarded_for:客户端IP地址列表(包中间经过的代理),当前有代理服务器时设置web站点记录客户段地址的配置,此参数生效的前提是代理服务器上也进行了相关x_forwarded_for设置
例:
8.目录文件访问控制
主要用在禁止目录下指定文件被访问
8.1禁止访问images下php程序文件
vim /usr/local/nginx/conf/nginx.conf
location ~ ^/images/.*\.(php|php5|sh|py|pl)$ {
deny all; #对 images 下以.结尾文件禁止访问
}
重载nginx
nginx -s reload
测试:
8.2多个目录书写方法:
vim /usr/local/nginx/conf/nginx.conf
location ~ ^/images/(attachment|avatar)/.*\.(php|php5|sh|py|py)$ {
deny all;
}
8.3配置nginx禁止访问 *.txt文件
1)创建测试文件
echo test > /usr/local/nginx/html/a.txt
测试
2)配置规则,禁止访问txt
vim /usr/local/nginx/conf/nginx.conf
location ~* \.(txt|doc)$ {
root /usr/local/nginx/html;
deny all;
}
测试:
3) 可以错误重定向到某一个URL
显示权限被拒绝可能太潦草,可以重定向到别的网站不显示403状态码
vim /usr/local/nginx/conf/nginx.conf
location ~* \.(txt|doc)$ {
root /usr/local/nginx/html;
#deny all;
rewrite ^ http://www.baidu.com last;
测试:
8.4对目录进行访问限制
1)创建2个目录
mkdir -p /usr/local/nginx/html/{aa,bb}
创建测试文件:
echo 'aa' > /usr/local/nginx/html/aa/index.html
echo 'bb' > /usr/local/nginx/html/bb/index.html
2)配置目录拒绝访问
vim /usr/local/nginx/conf/nginx.conf
location /aa/ { return 404 ; }
location /bb/ { return 403 ; }
重载nginx
nginx -s reload
测试:
3)也可以配置deny all 方式拒绝
vim /usr/local/nginx/conf/nginx.conf
location ~ ^/(aa)/ {
deny all;
}
location /bb/ { return 403 ; }
重载nginx: nginx -s reload
8.5 对访问来源控制
需要ngx_http_access_module模块支持,默认会安装。
1)修改配置文件
vim /usr/local/nginx/conf/nginx.conf
location ~ ^/(aa)/ {
allow 192.168.30.0/24; #允许30.0网段IP访问
deny all;
}
location /bb/ { return 403 ; }
重载nginx:nginx -s reload
测试:
2)对整个网站根目录访问控制
针对整个网站的写法,对/限制就OK,允许1.0网段访问网站
location ~ / {
allow 192.168.1.0/24; #可以写IP段,也可以写IP
deny all;
}
3)通过if语句控制,给以友好的错误提示
拒绝192.168.30.150访问网站
vim /usr/local/nginx/conf/nginx.conf
location ~ / {
allow 192.168.30.0/24;
if ( $remote_addr = 192.168.30.150 ) {
return 404;
}
deny all;
}
重载nginx:nginx -s reload
测试:
9.IP和301优化
访问网站的时候,使用IP也是可以得,我们可以把这一层给屏蔽掉,让其直接反馈给403,也可以做跳转
9.1跳转的做法
1)修改配置文件
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.benet.com benet.com;
if ($host = 192.168.30.150) { #客户端IP访问会重定向,IP设置时web服务器的IP
rewrite ^ http://www.baidu.com;
}
重载nginx:nginx -s reload
测试:
如不想跳转可以显示404状态码
通过域名访问:
域名解析我这做是在windows上host映射
9.2 403反馈做法
403状态码时权限被拒绝
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.benet.com benet.com;
if ($host = 192.168.30.150) {
return 403;
}
在通过IP访问:
9.3 301状态码跳转做法
在域名解析过程中,将 xiaolu.com 跳转到 www.xiaolu.com
1)配置301跳转
跳转是一个url 跳转到另一个url
301永久条转 302临时跳转
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
root html;
server_name www.abc.com abc.com;
if ($host = abc.com ) { #当访问abc.com会自动跳转到www.abc.com
rewrite ^/(.*)$ http://www.abc.com/$1 permanent;
}
}
重载nginx:nginx -s reload
2)修改hosts文件
重载nginx :nginx -s reload
测试:
以跳转www.abc.com
10.防盗链
防止别人直接从你网站引用图片等链接,消耗了你的资源和网络流量,解决办法有几种:
1:水印,品牌宣传,你的带宽,服务器足够
2:防火墙,直接控制,前提是知道IP来源
3:防盗链策略
10.1 直接给予404的错误提示
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.abc.com abc.com;
location ~* \.(png)$ {
root /var/www/html;
valid_referers none blocked *.abc.com abc.com ;
if ($invalid_referer) {
return 404;
}
}
}
上传图片:
访问测试:
10.2设置图片,来做rewrite跳转
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.abc.com abc.com;
location ~* \.(png)$ {
root /var/www/html;
valid_referers none blocked *.abc.com abc.com;
if ($invalid_referer) {
return 404;
rewrite ^/ http://www.abc.com/html/xkl.png;
}
}
}
参数说明:
location ~* \.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ { #需要防盗的资源
valid_referers none blocked *.qingniao.com qingniao.com; #这是可以盗链的域名或IP地址,一般情况可以把google,baidu,sogou>,soso,bing,feedsky等域名放进来
none 意思是不存在的Referer头(表示空的,也就是直接访问,比如直接在浏览器打开一个图片)
blocked 意为根据防火墙伪装Referer头,如:“Referer: XXXXXXX”。
server_names 为一个或多个服务器的列表,0.5.33版本以后可以在名称中使用“*”通配符。
10.3防盗链测试
1)在配置文件中增加一个server域名位benet.com在测试的主页上加个超链接a标签
vim /usr/local/nginx/html/index.html
<a href="http://abc.com/xkl.png">xiaolu</a>.</p>
重载nginx:ginx -s reload
2)测试benet网站是否能访问abc.com
重定向失败,可以看到超链接被拒绝了,说明防盗链做成功了。
3)要想通过benet.com 访问abc.com在配置文件里添加benet的域名
重载nginx:nginx -s reload
测试访问:
访问成功