[TOC]
~~~
1. gzip压缩优化
2. expires缓存有还
3. 网络IO事件模型优化
4. 隐藏软件名称和版本号
5. 防盗链优化
6. 禁止恶意域名解析
7. 禁止通过IP地址访问网站
8. HTTP请求方法优化
9. 防DOS攻击单IP并发连接的控制,与连接速率控制
10. 严格设置web站点目录的权限
11. 将nginx进程以及站点运行于监牢模式
12. 通过robot协议以及HTTP_USER_AGENT防爬虫优化
13. 配置错误页面根据错误码指定网页反馈给用户
14. nginx日志相关优化访问日志切割轮询,不记录指定元素日志、最小化日志目录权限
15. 限制上传到资源目录的程序被访问,防止木马入侵系统破坏文件
16. FastCGI参数buffer和cache配置文件的优化
17. php.ini和php-fpm.conf配置文件的优化
18. 有关web服务的Linux内核方面深度优化(网络连接、IO、内存等)
19. nginx加密传输优化(SSL)
20. web服务器磁盘挂载及网络文件系统的优化
21. 使用nginx cache
~~~
# 1、基本安全优化
## 1.1 隐藏版本信息
一般来说,软件的漏洞都和版本相关,所以我们要隐藏或消除web服务对访问用户显示的各种敏感信息。
~~~
#在http模块下加入:
server_tokens off;
~~~
## 1.2 隐藏nginx要修改源代码
要修改内容的路径:
第一路径:
~~~
1 /home/oldboy/tools/nginx-1.6.3/src/core/nginx.h 第14,16行
2 #define NGINX_VERSION "1.6.2" 修改为想要的版本号如2.4.3
3 #define NGINX_VER "nginx/" NGINX_VERSION 将nginx修改为想要修改的软件名称,如Apache。
~~~
第二路径
~~~
1 /home/oldboy/tools/nginx-1.6.3/src/http/ngx_http_header_filter_module.c第49行
2 grep 'Server:nginx' ngx_http_header_filter_module.cstatic
3 sed -i 's#Server:nginx#Server:Apache#g' ngx_http_header_filter_module.c
~~~
第三路径
~~~
/home/oldboy/tools/nginx-1.6.3/src/http/ngx_http_special_response.c第21,30行
"<hr><center>"NGINX_VER "(http://oldboy.blog.51cto.com)</center>" CRLF
"<hr><center>OWS</center>" CRLF
~~~
然后重新编译
## 1.3 更改nginx服务的默认用户
第一种方法:
直接更改配置文件nginx.conf.default参数,将默认的#user nobody;改为user nginx.nginx;
第二种方法:
直接在编译nginx的时候指定用户和用户组命令如下:
./configure --prefix=/application/nginx-1.6.3 --user=nginx --group=nginx --with-http\_ssl\_module --with-http\_stub\_status\_module
# 2、根据参数优化nginx服务性能
## 2.1 优化nginx进程个数的策略
**一般调整到与CPU的核数相同(如,2个四核的cpu计为8)**
worker\_processes 1;
查看LInux可查看CPU个数及总核数
~~~
grep processor /proc/cpuinfo|wc -l
~~~
## 2.2 优化绑定不同的nginx进程到不同的CPU上
默认情况下,nginx的进程跑在某一个CPU或CPU的某一个核上,导致nginx进程使用硬件的资源不均,本节的优化是不同的nginx进程给不同的CPU处理,充分有效的利用有效的硬件资源
四核cpu配置
~~~
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
~~~
双核配置
~~~
worker_processes 2;
worker_cpu_affinity 0101 1010;
~~~
还有一个命令taskset -c用来分配服务给CPU
## 2.3 调整nginx单个进程允许的客户端最大连接数
参数语法:worker\_connections number
默认配置:worker\_connections 512
放置位置:events 标签
~~~
events {
worker_connections 1024; #一个worker进程的并发
}
~~~
总并发= worker\_processes\* worker\_connections
## 2.4 配置nginx worker进程最大打开文件数
参数语法:worker\_rlimit\_nofile number
放置位置:主标签段
说明:作用是改变worker processes能打开的最大文件数
~~~
worker_rlimit_nofile 65535;
~~~
## 2.5 开启高效文件传输模式
设置参数 sendfile on;
sendfile参数用于开启文件的高效传输模式。同时将tcp\_nopush和tcp\_nodelay两个指令设置为on,可防止网络及磁盘i/o阻塞,提升nginx工作效率。
~~~
http {
sendfile on; #放在http,server,location都可以
}
~~~
设置参数tcp\_nopush;
激活tcp\_nopush参数可以允许把httpresponse header和文件的开始放在一个文件里发布,积极的作用是减少网络报文段的数量(只有sendfile on开启才生效)
## 2.6 设置keepalive处理的最大请求数
设置在一个长连接上可以服务的最大请求数目。当达到最大请求数目并结束服务后,连接被关闭。
默认100,当面对高并发/高吞吐量时,意味着nginx可能会快速回收与client的长连接。
keepalive\_requests
## 2.7 配置nginx gzip压缩实现性能优化
nginx压缩功能的介绍:
nginx gzip压缩模块提供了压缩文件内容的功能,用户请求的内容在发送给客户端之前,nginx服务器会根据一些具体的策略实施压缩,以节省网站出口带宽,同时加快了数据传输效率,提升了用户的访问体验。
### 2.7.1 压缩的优点:
提升网站用户体验:由于发给用户的内容小了,所以用户访问单位大小的页面就快了,用户体验就提升了
节约网站带宽成本:由于数据时压缩传输的,因此,会消耗一些cpu资源
### 2.7.2 压缩的对象:
纯文本内容压缩比很高,因此,纯文本的内容最好要压缩。
被压缩的纯文本文件必须要大于1KB,由于压缩算法的特殊原因,极小的文件压缩反而变大。
图片、视频(流媒体)等文件尽量不要压缩,因为这些文件大多都是经过压缩的,如果再压缩很可能不会减小或减小很少,或者有可能增大,而在压缩时还会消耗大量的CPU、内存资源。
### 2.7.3 参数介绍及配置说明:
在文件传输过程中是否开启压缩,
> gzip
> 默认值: off
是否开启压缩
> gzip\_buffers
> 默认值: 4 4k/8k
用于指定存放压缩响应的缓冲的数量和大小。如果没有设定,则等于一个页面的大小。
> gzip\_comp\_level
> 默认值: 1
用于设定压缩级别,1是最小压缩率,9是最大压缩率。
> gzip\_min\_length
> 默认值:20
设置响应体的最小长度
> gzip\_types mime-type
> 默认值:text/html;
指定需要压缩的mime类型
> gzip\_vary on | off;
> 默认值:off
是否向响应头中添加vary:`Accept-Encoding HTTP`
**[ngx\_http\_gzip\_static\_module]**
> gzip\_static on | off | always;
> 默认值:off;
开启这个功能,会查找与请求文件同名并且以gz结尾的文件,这个文件被称为预压缩格式,我们先进行了压缩,以后就不会重复进行压缩了。
~~~
gzip -c index.html > index.html.gz
~~~
## 2.8 nginx expires功能
为用户访问网站的内容设定一个过期时间,当用户第一次访问到这些内容时,会把这些内容存储在用户浏览器本地,这样用户第二次及之后继续访问该网站,浏览器就会检查已经缓存在用户浏览器本地的内容,就不会去浏览器下载了,直到缓存的内容过期或者被清除为止。
### 2.8.1 expires作用和优点:
expires可以降低网站的带宽,节约成本
加快用户访问网站的速度,提升了用户访问体验
服务器访问量降低,服务器压力就减轻了,服务器的成本也会降低,甚至可以节约人力成本
### 2.8.2 nginx expires 配置详解:
~~~
## Add expires header according to URI(path or dir).
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
expires 360d;
}
~~~
### 2.8.3 expire缺点及解决办法:
当网站被缓存的页面或数据更新了,此时用户端看到的可能还是旧的已经缓存的内容,这样就会影响用户体验,那么如何解决这个问题呢?
第一:对于经常需要的变动图片等文件,可以缩短对象缓存时间,例如,百度、谷歌等网站的首页图片经常会换成一些节日的图,这里可以将缓存期修改为1天
第二:当网站改版或更新内容时,可以在服务器将缓存的对象改名(网站代码程序)
# 3、nginx日志的优化
## 3.1 编写脚本实现日志轮询
运维人员可以通过利用脚本开发、nginx的信号控制功能或reload重新加载,来实现日志的自动切割、轮询。
~~~text
nginx -s signal
signal:
stop — fast shutdown
quit — graceful shutdown
reload — reloading the configuration file
reopen — reopening the log files
用来打开日志文件,这样nginx会把新日志信息写入这个新的文件中
~~~
`/data/nginx/sbin/nginx -V`查看已经编译的参数。
使用kill命令操作nginx。格式:`kill -信号 PID`
信号名称
* TERM,INT 快速关闭
* QUIT 优雅的关闭,保持吸纳有的客户端连接
* HUP 重启应用新的配置文件
* USR1 重新打开日志文件
* USR2 升级程序
* WINCH 优雅的关闭工作进程
~~~
mv access.log access_$(date +F -d -1day).log
/usr/local/nginx/sbin/nginx -s reopen
~~~
## 3.2 不记录不需要的日志
在实际工作中,对于负载均衡器健康检查节点或某些特定的文件(图片、JS、CSS)的日志,一般不需要记录下来,因为在统计PV时是按照页面计算的,而且日志写入的太频繁会消耗磁盘i/o,降低服务的性能
~~~
具体配制方法:
location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$ {
access_log off;
}
~~~
# 4、nginx站点目录及文件URL访问控制
## 4.1 根据扩展名限制程序和文件访问
某些应用场景允许用户发图片甚至附件上传到服务器上,给用户开启了上传的功能。带来了很大的安全隐患。
下面将利用nginx配置禁止访问上传资源目录下的PHP,SHELL,PERL,PYTHON程序文件,这样就算是用户上传了木马文件也没办法执行
~~~
location ~ ^/images/.*\.(php|php5|.sh|.pl|.py)$
{
deny all;
}
location ~ ^/static/.*\.(php|php5|.sh|.pl|.py)$
{
deny all;
}
location ~* ^/data/(attachment|avatar)/.*\.(php|php5)$
{
deny all;
}
~~~
对于上述目录的限制必须写在nginx处理PHP服务配置的前面
## 4.2 禁止访问指定目录下的所有文件和目录
配置禁止访问指定的单个或多个目录
~~~
location ~ ^/static {
deny all;
}
~~~
禁止访问目录并且返回代码404
~~~
server {
listen 80;
server_name www.etiantian.org etiantian.org;
root /data/www/www;
index index.html index.htm;
access_log /app/logs/www_access.log commonlog;
location /admin/ { return 404; }
location /templates/ { return 403; }
}
~~~
## 4.3 限制网站来源的IP访问
使用ngx\_http\_access\_module限制网站来源IP访问。
范例1:禁止外界访问,但允许某个IP访问该目录
~~~
location ~ ^/oldboy/ {
allow 202.111.12.211;
deny all;
}
~~~
范例2:限制及指定IP或IP段访问。
~~~
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
deny all;
}
~~~
## 4.4 配置nginx禁止非法域名解析访问企业网站
问题:nginx如何防止用户IP访问网站(恶意域名解析,相当于直接使用IP访问网站)
方法1:直接报错,用户体验不好
~~~
server {
listen 80 default_server;
server_name _;
return 501;
}
~~~
方法2:通过301跳转到主页
~~~
server {
listen 80 default_server;
server_name _;
rewrite ^(.*) http//:blog.etiantian.org/$1 permanent;
}
~~~
# 5、nginx图片防盗链解决方案。
简单的说,没有经过你的允许在自己网站嵌入你的图片。
## 5.1 常见的防盗链解决方案的基本原理
1. 根据HTTP referer实现防盗链
2. 根据cookie防盗链
## 5.2 防盗链实战
valid\_referers 指令详解
该指令后面可以接 none blocked serevr\_names string或者是正则表达式
none 代表没有referer
blocked 代表有referer但是被防火墙或者是代理给去除了
string或者正在表达式 用来匹配referer
**nginx会通过查看referer字段和valid\_referers后面的referer列表进行匹配,如果匹配到了就invalid\_referer字段值为0 否则设置该值为1**
被盗链的网站配置:
~~~
1 #Preventing hot linking of images and other file types
2
3 location ~* ^.+\.(jpg|png|swf|flv|rar|zip)$ {
4
5 valid_referers none blocked *.etiantian.org etiantian.org;
6
7 if ($invalid_referer) {
8
9 rewrite ^/ http://bbs.etiantian.org/img/nolink.gif;
10
11 }
12
13 root html/www;
14
15 }
~~~
# 6、nginx错误页面的优雅显示
范例:当出现403错误会跳转到403.html页面
~~~
error_page 403 /403.html;
~~~
# 7、站点目录权限设置
(1)站点目录权限设置
方案1:推荐方案
目录:755
文件:644
所有者:root
图片及上传目录设置所有者为www
~~~
chown -R root.root /html/www
find /html/www -type f|xargs chmod 644
find /html/www -type d|xargs chmod 755
~~~
# 8、nginx防爬虫优化
配置
~~~
if ($http_user_agent ~* LWP:Simple|BBBike|wget) {
return 403 ;
rewrite ^(.*) http://blog.etiantian.org/$1 permanent;
}
~~~
# 9、利用nginx限制HTTP的请求方法
配置:
~~~
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 501;
}
~~~
# 10、使用普通用户启动Nginx(监牢模式)
解决方案:
给Nginx服务降权,用普通用户跑Nginx服务,给运维设置普通账号 。
使用普通账号即可管理nginx服务及站点下的程序和日志
```
user nginx
```
# 11、控制Nginx并发连接数量
模块:nginx\_http\_limit\_conn\_module
模块作用:限制每个key值的连接数,特别是单个IP连接数。
不是所有的连接数都会被计算,一个符合要求的连接是整个请求已经被读取的连接。
**Nginx并发连接数参数说明**
~~~
limit_conn_zone参数:
语法:limit_conn_zone key zone=name:size;
上下文:http
~~~
用于设置共享内存区域,key可以是字符串,nginx自有变量或前两个组合,如$binary\_remote\_addr、$server\_name。name为内存区域的名称,size为内存区域的大小。
~~~
limit_conn参数:
语法:limit_conn zone number;
上下文:http、server、location
~~~
# 12、 控制客户端请求Nginx的速率
在一些提供下载的站点,需要进行流量控制,核心模块提供了limit\_rate,limit\_rate\_after指令。
**指令**
> limit\_rate speed
> 上下文:http, server, location,if in location
该限制针对一个连接设定的,如果同时有两个连接,速度将会是设置值的两倍。
也可以利用$limit\_rate变量设置流量限制。如果想在特定条件下限制响应传输速率,可以使用这个功能:
~~~
server {
if($slow){
set $limit_rate 4k;
}
}
~~~
> limit\_rate\_after bytes
> 默认值:1m
> 上下文:http, server, location,if in location
在传输了多少之后进行流量控制。
**示例**
以最快的速度现在3M后,速度控制为512k
实际测试结果,开始下载速度是1M多,下载3M后,逐步降速为512k
~~~
location /downlaod {
limit_rate_after 3m;
limit_rate 512k;
}
~~~
- CentOS运维手册
- CentOS6.9挂载额外的磁盘
- ACL(access control list)-权限控制
- 普通用户不能绑定80端口
- ssh8.1p1编译步骤
- 制作openssh8_1的rpm包
- 离线yum源维护
- 去除VIM中打开文件里有的^M字符
- Mysql运维手册
- CentOS6.9搭建Mariadb-Galera集群
- mysql编码报错
- haproxy代理mysql galera
- 常用sql
- MySQL通用知识点
- 修复断电损坏的MySQL数据表
- sync_binlog配置的分析
- Xtrabackup备份与恢复
- Innodb线程并发同步机制
- redo log
- 死锁分析
- 慢SQL分析
- nginx运维手册
- nginx日志分割
- proxy_set_header作用
- nginx优化
- url末尾不加/
- 负载均衡
- haproxy和nginx研究
- haproxy配置
- redis运维手册
- redis_5.0.8集群搭建
- Redis集群原理分析
- predixy的安装和配置
- redis优化
- NFS运维手册
- flock操作失败
- mongodb运维手册
- MongoDB开启用户认证
- shell编码规范
- HTTP
- HTTP的传输编码
- 性能分析
- java内存分析
- javaCPU分析