nginx的配置和优化(隐藏版本号、gzip、expires、防盗链......等)

Nginx配置和优化

1.隐藏版本号

默认情况下,使用curl命令会把nginx的版本信息等获取到,如:

[[email protected]_machine ~]# curl -I -H"www.beyond.com" "http://172.16.254.5/index.php" 
HTTP/1.1 200 OK
Server:nginx/1.6.3
Date: Wed, 24 Jun 2015 02:50:59 GMT
Content-Type: text/html
Connection: keep-alive
X-Powered-By: PHP/5.4.30

现在通过添加server_tokensoff参数隐藏版本号.在http{}模块中添加

http {
....
server_tokens off;
}

继续curl一下,发现Server:后边的nginx版本号已经没了

[[email protected]_machine ~]# curl -I -H"www.beyond.com" "http://172.16.254.5/index.php"
HTTP/1.1 200 OK
Server:nginx
Date: Wed, 24 Jun 2015 02:54:54 GMT
Content-Type: text/html
Connection: keep-alive
X-Powered-By: PHP/5.4.30

2.客户端curl某个页面,返回404

在server模块中加入下面规则即可

if ($http_user_agent ~*"curl"){
            return 404;
        }

3.根据CPU核数进行nginx进程优化

四核cpu配置:
worker_processes    4;
worker_cpu_affinity 0001 0010 01001000;
八核cpu服务器参数配置:
worker_processes    8;
worker_cpu_affinity 0000000100000010 00000100 00001000 00010000 00100000 01000000 10000000;
worker_cpu_affinity 0001 0010 01001000 0001 0010 0100 1000;
官方文档说明
worker_processes    4;
worker_cpu_affinity 0001 0010 01001000;
binds each worker process to aseparate CPU, while
worker_processes    2;  4核2进程
worker_cpu_affinity 0101 1010;

4.调整nginx事件处理模型、客户端最大连接数、最大打开的文件数

4.1 nginx 的连接处理机制在不同的操作系统上采用不用的IO模型,在linux下,nginx使用epoll的IO多路复用模型,在freebsd使用kqueue的IO多路复用模型,在solaris使用/dev/pool方式的IO多路复用模型,在windows使用的icop等等。

根据系统类型不同选择不同的事务处理模型,选择有“use [ kqueue | rtsig |epool |dev/pool |select |pllo ];”我们使用的是Centos6.4的linux,因此将nginx的事件处理模型调整为epool模型。

4.2调整nginx worker单个进程允许的客户端最大连接数,这个值根据服务器性能和程序的内存来指定(一个进程启动使用的内存根据程序确定),这个参数是单个进程的最大链接数,实际最大链接数是worker进程数乘以这个数。

Max_client=worker_processes*worker_connections

4.3配置nginx worker进程最大打开文件数,相当于系统ulimit –HSn,注意配置参数不是越大越好,最好设为服务器承受的极限点,最好与ulimit-n的值保持一致

events {

use epoll;

worker_connections 1024;

worker_rlimit_nofile65535;

}

5.设置连接超时时间

http {
..........
keepalive_timeout 60;
###设置客户端连接保持会话的超时时间,超过这个时间,服务器会关闭该连接。
tcp_nodelay on;
####打开tcp_nodelay,在包含了keepalive参数才有效
client_header_timeout 15;
####设置客户端请求头读取超时时间,如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误
client_body_timeout 15;
####设置客户端请求主体读取超时时间,如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误
send_timeout 15;
####指定响应客户端的超时时间。这个超过仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接。
......
 
}

6.配置gzip压缩功能

Gzip压缩是可以节省带宽,提高传输效率,但是由于是在服务器上进行压缩,会消耗服务器起源

使用的是nginx_http_gzip_module模块

参数:

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压缩的数据。

具体配置:

没配置gzip压缩之前;

[[email protected]_machine ~]# curl -I -H"www.beyond.com" "http://172.16.254.5/index.php"
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 24 Jun 2015 04:51:53 GMT
Content-Type: text/html
Connection: keep-alive
X-Powered-By: PHP/5.4.30

在http模块中添加下面参数

gzip on;
gzip_min_length  1k;
gzip_buffers     4 32k;
gzip_http_version 1.1;
gzip_comp_level 9;
gzip_types  text/css text/xml application/javascript;
gzip_vary on;

重新curl一下,出现vary表示压缩已经开启

[[email protected]_machine ~]# curl -I -H"www.beyond.com" "http://172.16.254.5/index.php"
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 24 Jun 2015 04:53:46 GMT
Content-Type: text/html
Connection: keep-alive
Vary:Accept-Encoding
X-Powered-By: PHP/5.4.30

7.配置nginx expires缓存

expire功能优点

(1)expires可以降低网站购买的贷款,节约成本

(2)同时提升用户访问体验

(3)减轻服务的压力,节约服务器成本,甚至可以节约人力成本,是web服务非常重要的功能。

expire功能缺点:

被缓存的页面或数据更新了,用户看到的可能还是旧的内容,反而影响用户体验。

解决办法:

第一个 缩短缓存时间,例如:1天,不彻底,除非更新频率大于1天

第二个 对缓存的对象改名

a.图片,附件一般不会被用户修改,如果用户修改了,实际上也是更改文件名重新传了而已

b.网站升级对于js,css元素,一般可以改名,把css,js,推送到CDN。

配置方法:

配置前curl一下

[[email protected]_machine ~]# curl -I -H"www.beyond.com" "http://172.16.254.5/index.php"
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 24 Jun 2015 04:53:46 GMT
Content-Type: text/html
Connection: keep-alive
Vary: Accept-Encoding
X-Powered-By: PHP/5.4.30

现在设置缓存图片1个月,css、javascript、flush等缓存一天

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {

expires 30d;

}

location ~.*\.(js|css|javascript|fluash)$ {

expires 24h;

}

重新curl一下,发现expires 缓存到了下个月今天

[[email protected]_machine ~]# curl -I -H"www.beyond.com" "http://172.16.254.5/du.jpg"   
HTTP/1.1 200 OK
Server: nginx/1.6.3
Date: Wed, 24 Jun 2015 05:20:34 GMT
Content-Type: image/jpeg
Content-Length: 27696
Last-Modified: Mon, 07 Jul 201404:26:08 GMT
Connection: keep-alive
ETag: "53ba2160-6c30"
Expires:Fri, 24 Jul 2015 05:20:34 GMT
Cache-Control: max-age=2592000
Accept-Ranges: bytes

8.nginx错误页面友好显示

当访问网站出现400 403 404 405 408 410,500 501 502 503 504 等状态码时,可以将其重定向到一个友好页面,提升用户体验。

配置方法:

1)在http模块中开启:fastcgi_intercept_errors on;  (注意必须开启,否则不生效)

2)在http或者server模块配置下面参数

error_page  500 501 502 503 504 /error/5-error.html;

error_page 400 403 404 405 408 410 411 412413 414 415 /error/4-error.html;

注意:这里是相对路径,‘/’表示网站根目录,如果需要自定义目录的话,需要在下面添加location指定该目录位置

3)确保在网站根目录下存在error和相关网页

效果:

[[email protected]_machine ~]# curl  -H "www.beyond.com""http://172.16.254.5/aaa.php"    
<!DOCTYPE html>
<html>
<head>
<title>Error</title>
<style>
   body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial,sans-serif;
   }
</style>
</head>
<body>
<h1>40x error</h1>
<h1>40x error</h1>
<h1>40x error</h1>
<h1>40x error</h1>
<h1>40x error</h1>
<h1>40x error</h1>
<h1>40x error</h1>
<h1>40x error</h1>
<h1>40x error</h1>
<h1>40x error</h1>
<h1>40x error</h1>
</body>
</html>

注意,也可以将错误重定向到其他的url连接

下面是天猫的nginx优雅显示案例

error_page  500 501 502 503 504 http://err.tmall.com/error2.html;

error_page 400 403 404 405 408 410 411 412413 414 415 http://err.tmall.com/error1.html;

9.nginx设置防掉链

防盗链就是其他网站通过url引用你网站上的资源,达到填充本网站的显示效果,这样会增加自己的带宽,增加服务器的压力。

解决办法:

location ~* \.(gif|jpg|png|swf|flv)${
valid_referers none blocked www.beyond.comwww.zsms.com;
if ($invalid_referer) {
rewrite ^/ http://www.beyond.com/403.html;
#return 404;
}
}
第一行:gif|jpg|png|swf|flv
表示对gif、jpg、png、swf、flv后缀的文件实行防盗链
第二行:www.beyond.com www.zsms.com
表示对www.beyond.com www.zsms.com这2个来路进行判断
if{}里面内容的意思是,如果来路不是指定来路就跳转到错误页面,当然直接返回404也是可以的。

10.nginx限制访问

10.1 根据扩展名限制程序和目录访问,可以防止通过访问网页,而执行网页上的脚本

Nginx限制访问指定目录:
location ~ ^/images/.*\.(php|php5|.sh|.pl|.py)$ 
{
deny all;
}
注意需要放在php解析location的下面
 
Nginx禁止访问*.txt,*.doc
location ~* \.(txt|doc)$ {
if (-f $request_filename) {
root /data/www/www;
#rewrite …..可以重定向到某个URL
break;
}
}

10.2 限制ip访问

location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
deny all;
}
或者
if ( $remote_addr = 10.0.0.7 ) {
return 403;
}

10.3限制客户端类型:可有效防止爬虫

下面内容可以防止爬虫
if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot")
{
return 403;
}
 
禁止某类浏览器访问
if ($http_user_agent ~* "Firefox|MSIE")
{
return 403;
rewrite ^(.*) http://blog.etiantian.org/$1 permanent;
}

11.Nginx修改源码隐藏软件名称及版本号

这个需要在编译安装之前进行修改,修改的是源码包的内容

cd nginx-1.6.2/src/core
sed -n ‘13,17p‘nginx.h
#define NGINX_VERSION  "1.6.2" 修改为想要的版本号如2.4.3
#define NGINX_VER "nginx/" NGINX_VERSION 将nginx修改为想要修改的软件名称,如Apache。
时间: 2024-10-14 17:06:54

nginx的配置和优化(隐藏版本号、gzip、expires、防盗链......等)的相关文章

Nginx优化---隐藏版本号与网页缓存时间

配置Nginx隐藏版本号 在生产环境中,需要隐藏Nginx的版本号,以避免安全漏洞的泄漏 查看方法●使用fiddler I具在Windows客户端查看Nginx版本号在CentOS系统中使用"curl -I 网址"命令查看 Nginx隐藏版本号的方法●修改配置文件法●修改源码法 修改配置文件法 1.Nginx的配置文件中的server_ tokens 选项的值设置为off [[email protected] conf]# vim nginx.conf ..... server_ to

I/O模型与Nginx详细配置、优化

I/O: I/O类型: 同步和异步:synchronous, asyncronous 关注的是消息通知机制,即被调用者如何把消息通知给调用者 同步:调用发出之后不会立即返回消息,但一旦返回,则返回即是最终结果: 异步:调用发出之后,被调用方立即返回消息,但返回的并非最终结果:被调用者通过状态.通知机制等来通知调用者,或通过回调函数来处理结果: 阻塞和非阻塞:block, nonblock 关注的是调用者等待被调用者返回调用结果时的状态 阻塞:调用结果返回之前,调用者会被挂起:调用者只有在得到返回

Nginx常用配置及优化安全

一个站点配置多个域名 server { listen 80; server_name demo.ct99.cn demo1.ct99.cn; } server_name 后跟多个域名即可,多个域名之间用空格分隔 一个服务配置多个站点 server { listen 80; server_name demo.ct99.cn; location / { root /home/project/pa; index index.html; } } server { listen 80; server_na

Nginx配置静态资源缓存时间及实现防盗链

环境源主机:192.168.10.158系统:centos 7.4域名:www.wuxier.cn盗链主机:192.168.10.191(使用Nginx+Tomcat实现负载均衡.动静分离的实验主机,点我进行复盘)系统:centos 7.4域名:www.ajie.com 和 www.taobao.com 创建软件包存放目录 [[email protected] ~]# mkdir /root/software [[email protected] ~]# cd /root/software/ [

Nginx 之四: Nginx服务器的rewrite、全局变量、重定向和防盗链相关功能

一:Nginx 后端服务器组的配置: 1.upstream: 用于设置后端服务器组的主要指令,upstream类似于之前的server块或http块,用法如下: upstreame Myserver{ #ip_hash; #least_conn: #fair; #hash $request_uri; #hash_method crc32; server 192.168.0.2:8080 #weight 2 max_fails 3 fail_timeout 60; 192.168.0.3:8080

[Nginx]用Nginx实现与应用结合的訪问控制 - 防盗链

应用场景:图片等资源须要设置权限,如:仅仅有认证过的用户才干訪问自己的图片. 解决的方法:使用Nginx的防盗链模块http_secure_link能够实现,该模块默认情况下不包括.故在安装时要加上--with-http_secure_link_module 该模块依据两个參数控制权限訪问,一个是过期时间(即该链接在这个时间之前可訪问,过期后无法訪问),该參数主要出于安全考虑. 还有一个是通过md5算法算出来的KEY,一般通过uri计算 举例: server { listen 80; serve

Apache网页优化 ---隐藏版本号

(本文环境基于Apache网页优化系列) 概述 Apache的版本信息,透露了-定的漏洞信息,从而给网站带来安全隐患生产环境中要配置Apache隐藏版本信息可使用Fiddler抓包工具分析 配置Apache隐藏版本信息 1.将主配置文件httpd. conf以下行注释去掉 #Include conf/extra/httpd-default.conf 2.修改httpd-default. conf文件两个地方 3.Server Tokens Full修改为Server Tokens Prod 4.

Nginx在windows上安装 及 Nginx的配置及优化

1.下载nginx http://nginx.org/en/download.html         下载稳定版本,以nginx/Windows-1.12.2为例,直接下载 nginx-1.12.2.zip 下载后解压,解压后如下 2.启动nginx 有很多种方法启动nginx (1)直接双击nginx.exe,双击后一个黑色的弹窗一闪而过 (2)打开cmd命令窗口,切换到nginx解压目录下,输入命令 nginx.exe 或者 start nginx ,回车即可 3.检查nginx是否启动成

Apache 隐藏入口文件以及防盗链.htaccess 文件

RewriteEngine on # 隐藏入口文件 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [L] # 防止资源盗链 RewriteCond %{HTTP_REFERER} !^$ [NC] RewriteCond %{HTTP_REFERER} !football.com [NC] RewriteCond %{HTTP_REFE