1.gzip压缩优化
1、优点:
a.节约带宽,省钱
b.传输速度快,用户体验好
2、使用模块:
nginx依赖ngx_http_gzip_module模块。
apache使用的是mod_deflate压缩功能
3、需要压缩的内容:纯文本(js,css,html),对于图片,视频,FLASH什么的不压缩,gzip_types参数控制,压缩占用cpu。
部署模板
http {
.......
gzip on; #开启gzip压缩功能
gzip_min_length 1k; #设置允许压缩的页面最小字节数; 表示文件小于几个字节不用压缩
gzip_buffers 4 16k; #设置压缩缓冲区大小,此处设置为4个16K内存作为压缩结果流缓存
gzip_http_version 1.1; #识别http协议的版本,早期浏览器可能不支持gzip自解压,用户会看到乱码
gzip_comp_level 9; #设置gzip压缩等级,等级1-9,最小的压缩最快 但是消耗cpu
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php application/javascript application/json; #制定压缩的类型,线上配置时尽可能配置多的压缩类型!
gzip_disable "MSIE [1-6]\."; #配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)
gzip_vary on; #启用应答头"Vary: Accept-Encoding"
}
2.expires缓存调优
1.简单的来说,nginx expires就是为用户访问的网站内容设定一个过期时间,当用户第一次访问这些内容时,会把这些内容存储在用户浏览器本地,这样用户第二次或者继续访问该网站时,浏览器会检查加载已经缓存在用户的浏览器本地内容,就不会在服务器进行下载了,直到内容被清除为止。
2.作用:可以将网站的图片。视频,css js等网站元素更改机会少的设置在客户端进行本地缓存时间长点,将代码缓存的时间短点。类似与apache的expires
3.优点:降低网站带宽,节省成本。|加快用户访问速度,提升用户访问体验|减少服务器成本|这是个比较重要的功能
nginx默认安装了expires功能
示例:
修改配置文件nginx.conf ,location字段中的设置
vim nginx.conf
location ~ .*\. (gif|jpg|jpeg|png|bmp|swf)$
{
expires 3650d;
}
3.网络IO事件模型优化
设置连接超时时间
keepalive_timeout 指令 Nginx 服务器与客户端保持连接的超时时间
send_timeout 指令 Nginx 服务器响应客户端的超时时间
client_header_buffer_size 指令 Nginx 服务器允许的客户端请求头部的缓冲区大小,默认为1KB
large_client_header_buffers 指令
multi_accept 指令 Nginx 服务器时候尽可能多的接收客户端的网络连接请求,默认值为off 。
4.隐藏软件名和版本号
**更改源码隐藏软件名称及版本号**
在nginx编译安装之前,先更改,之后再编译安装
1、更改版本号,修改nginx-1.3.4/src/core/nginx.h
[root@oldboy /]# cd /home/oldboy/tools/
[root@oldboy tools]# cd nginx-1.6.2/src/core
[root@oldboy core]# sed -n '13,17p'nginx.h
#define NGINX_VERSION "1.6.2" 修改为想要的版本号如2.4.3
#define NGINX_VER "nginx/" NGINX_VERSION 将nginx修改为想要修改的软件名称,如Apache。
修改后查看header结果:
[root@S1-SERVER nginx-1.3.4]# curl -I 10.0.0.182
HTTP/1.1 200 OK
Server:Apache/2.4.3
2、修改nginx-1.6.12/src/http/ngx_http_header_filter_module.c
需要修改的字符串
[root@M-SERVER http]# grep 'Server:nginx' ngx_http_header_filter_module.c
static char ngx_http_server_string[] ="Server:nginx" CRLF;
[root@M-SERVER http]# sed -i 's#Server:nginx#Server:Apache#g' ngx_http_header_filter_module.c
修改后的字符串
[root@M-SERVER http]# grep 'Server:Apache' ngx_http_header_filter_module.c
static char ngx_http_server_string[] ="Server:Apache" CRLF;
3)修改ngx_http_special_response.c
#vi nginx-1.3.4/src/http/ngx_http_special_response.c
static u_char ngx_http_error_full_tail[]=
"<hr><center>"NGINX_VER"</center>"CRLF
"</body>"CRLF
"</html>"CRLF
;
static u_char ngx_http_error_tail[]=
"<hr><center>nginx</center>"CRLF
"</body>"CRLF
"</html>"CRLF
;
修改为:
static u_char ngx_http_error_full_tail[]=
"<hr><center>"NGINX_VER"(http://oldboy.blog.51cto.com)</center>"CRLF"
</body>"CRLF
"</html>"CRLF
;
static u_char ngx_http_error_tail[]=
"<hr><center>Apache</center>"CRLF
"</body>"CRLF
"</html>"CRLF
;
**隐藏版本号**
在nginx配置文件的http标签内加入“server_tokens off; ”参数,也可以放大server标签和location标签中,如下:
http {
..........
server_tokens off;
..........
}
/application/nginx/sbin/nginx -t
/application/nginx/sbin/nginx -s reload
再此查看如下,浏览器访问错误页面也就没有版本号了
[root@c66-kslx conf]# curl -I 127.0.0.1
HTTP/1.1 200 OK
Server: nginx
5.防盗链优化
简单的说,就是某些不法的网站,通过在其自身网站程序里未经许可非法调用其他网站的资源,然后在自己的网站上显示这些调用的资源,达到了填充自身网站显示的效果,但是浪费了调用资源网站的网站流量,造成其他网站的带宽及服务压力吃紧,甚至宕机。
解决办法
(1)图片,视频上打水印,品牌。
(2)防火墙控制,根据ip控制。
(3)防盗链(根据referer控制)
https://blog.csdn.net/Lcongming/article/details/117913080
6.禁止恶意域名解析
影响用户,而且不利于SEO,影响网站收录权重,甚至由于恶意域名没有备案等原因导致服务器被关闭
打开Nginx配置文件/etc/nginx/sites-available/default,在server添加或修改如下:
server {
listern 80 default;
server_name domin or ip;
#【1】此处禁止非己域名解析到ip
if ($host !~ ^(youdomain.cn|www.yourdomain.cn|others.yourdomain.cn)$ ) {
return 400;
}
#此处禁止ip访问网站
if ($host ~* "\d+\.\d+\.\d+\.\d+"){
return 400;
}
..........
}
server_name 后面要填写domin或IP或"",不然nginx会启动失败。
7.禁止通过ip地址访问网站
避免别人恶意指向自己的IP
#禁止IP访问
server {
listen 80 default;
server_name _; #设置这个句后,后面禁止ip访问后,可以通过域名访问
server_name www.example.com example.com #可以通过example.com域名访问服务器
return 500; # 添加这句,当用IP访问时,返回500错误码
}
8.http请求方法优化
目的是:更快的获取到内容。 避免页面加载时间过长,出现请求超时等影响用户体验的问题
限制客户端请求的HTTP方法
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 501;
}
上面的配置实现了只允许GET、HEAD、POST请求,其他请求会直接跳转501
9.防dos攻击单ip并发连接的控制,与连接速率控制
限制请求率
限制连接的数量
关闭慢连接
设置ip黑名单和白名单
10.严格设置web站点目录的权限
设置权限不能是777
11.优化fastCGI的一个超时时间
在确认url没有问题的情况下 报404等错误,一般是 http 请求时间超过了 nginx 所配置的最大连接时间,服务器自动断开连接,并返回 404 资源未找到的错误
解决办法是 更改 nginx.conf 配置文件中的 keepalive_timeout 的值(默认65秒)使浏览器和服务器连接时长增大。为了方便测试,可以改成 600s 即10分钟,
12.启动nginx工作进程的数量,一般设为和cpu核心数相同
为什么要设为cpu核心数相同
1)Ngnix一般只做高并发代理,基本没用IO操作,算是CPU密集操作,所以再处理时基本是瞬时完成的,很少出现IO阻塞。
2)进程与CPU调度的关系,单个核心处理多个进程的时候,是排队处理的,所以将Worker进程数量设置超过核心数是没有太大意义的
如果有四颗CPU内核,就可以进行如下配置:
worker_processes 4;
worker_cpu_affinity 1000 0100 0010 0001;
worker_cpu_affinity配置仅对linux操作系统有效,linux操作系统使用sched_setaffinit()系统调用实现这个功能
13.设置单个工作进程worker的最大并发连接数
#配置Nginx worker进程最大打开文件数
worker_rlimit_nofile 65535;
放置位置:主标签段,不在任何区块
模板示例
worker_processes 2; #启动nginx工作进程的数量
error_log logs/error.log;
#配置Nginx worker进程最大打开文件数
worker_rlimit_nofile 65535;
user www www;
events {
#单个进程允许的客户端最大连接数
worker_connections 20480;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
#访问日志配置
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#隐藏版本号
server_tokens on;
}