目录
1、 Nginx简介
1.1、Nginx官网
2、隐藏nginx版本号
2.1、安装部署nginx
2.1.1、上传软件包并解压
2.1.2、更改源码隐藏软件名称和版本号
2.2、安装nginx依赖
2.3、预编译
2.4、预编译安装
2.5、启动nginx
2.6、查看端口号
2.7、测试
2.8、网站测试
2.9、配置文件nginx.conf
3、修改nginx运行账号
3.1、查看nginx当前运行账号编辑
3.2、添加path变量
3.3 重载nginx
3.4、nginx服务管理脚本
3.5、配置服务开机自动启动
4、nginx进程
5、设置Nginx运行进程个数
5.1、设置nginx中进程数
5.2、查看nginx进程数
6、Nginx运行CPU亲和力
6.1、4核4线程配置
6.2、那么如果我是4线程的CPU,我只想跑两个进程呢?
7、Nginx最多可以打开文件数
7.1、设置nginx最大可打开的文件数
7.2、修改系统可以打开的最大文件数
7.2.1、临时修改
7.2.2、永久修改
8、 Nginx事件处理模型
8.1、单个进程允许客户端最大并发连接数
9、http主体优化
9.1、开启高效传输模式开启高效传输
9.2、长连接超时时间
9.3、文件上传大小限制
9.4、location匹配
9.5、gzip调优
9.5.1、启用gzip
9.5.2、拷贝测试文件
9.5.3、测试
9.6、expires缓存调优
9.6.1、以扩展名区分
9.6.2、 对目录及其进行判断
9.6.3、expire功能缺点
1、 Nginx简介
Nginx ("engine x") 是一个轻量级、高性能的WEB服务器软件和反向代理服务器(即用户直接访问反向代理服务器就可以获得目标服务器的资源)。Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
Nginx以事件驱动(epoll)的方式编写,所以有非常好的性能,同时也是一个非常高效的反向代理、负载平衡。但是Nginx并不支持cgi方式运行,原因是可以减少因此带来的一些程序上的漏洞。所以必须使用FastCGI方式来执行PHP程序。
由于Nginx本身的一些优点,轻量,开源,易用,越来越多的公司使用nginx作为自己公司的web应用服务器,如百度BWS、新浪、网易、腾讯等。本文详细介绍nginx源码安装的同时并对nginx进行优化配置。
nginx的优点:
1.高并发。静态小文件
2.占用资源少。2万并发、10个线程,内存消耗几百M。
3.功能种类比较多。web,cache,proxy。
4.支持epoll模型,使得nginx可以支持高并发。
5.nginx 配合动态服务和Apache有区别。(FASTCGI 接口)
6.利用nginx可以对IP限速,可以限制连接数。
7.配置简单,更灵活。
1.1、Nginx官网
Nginx官网: http://nginx.org
Nginx官方文档: http://nginx.org/en/docs/
Nginx官网下载地址: http://nginx.org/en/download.html
2、隐藏nginx版本号
问:为什么要隐藏??
答:为了安全,如果暴露版本信息,有可能黑客可以通过版本信息,得知该版本存在的漏洞,进而对服务器进行攻击。
2.1、安装部署nginx
2.1.1、上传软件包并解压
[root@cong11 ~]# ls
anaconda-ks.cfg nginx-1.10.3.tar.gz
[root@cong11 ~]# tar -zxvf nginx-1.10.3.tar.gz -C /usr/local/src/
2.1.2、更改源码隐藏软件名称和版本号
[root@cong11 ~]# cd /usr/local/src/nginx-1.10.3/
[root@cong11 nginx-1.10.3]# vim src/core/nginx.h
修改标红部分
#define NGINX_VERSION "8.8.8" #修改版本号
#define NGINX_VER "web/" NGINX_VERSION #修改服务器名称
[root@cong11 ~]# ls anaconda-ks.cfg nginx-1.10.3.tar.gz [root@cong11 ~]# tar -zxvf nginx-1.10.3.tar.gz -C /usr/local/src/
2.1.2、更改源码隐藏软件名称和版本号
[root@cong11 ~]# cd /usr/local/src/nginx-1.10.3/
[root@cong11 nginx-1.10.3]# vim src/core/nginx.h
修改标红部分
#define NGINX_VERSION "8.8.8" #修改版本号
#define NGINX_VER "web/" NGINX_VERSION #修改服务器名称
修改标红部分
#define NGINX_VERSION "8.8.8" #修改版本号
#define NGINX_VER "web/" NGINX_VERSION #修改服务器名称
[root@cong11 nginx-1.10.3]# vim src/http/ngx_http_header_filter_module.c
static char ngx_http_server_string[] = "Server: web" CRLF; #修改标红部分
#修改HTTP头信息中的server字段,防止回显具体版本号
这个文件定义了http错误码的返回,有时候我们页面程序出现错误,Nginx会代我们返回相应的错误代码,回显的时候,会带上nginx和版本号,我们把他隐藏起来.
"
" NGINX_VER " " CRLF #老版本这里需要修改为web,现在这里不需要修改,因为它调用了NGINX_VER变量"
web " CRLF
2.2、安装nginx依赖
[root@cong11 nginx-1.10.3]# yum install -y gcc gcc-c++ autoconf automake zlib zlib-devel openssl openssl-devel pcre pcre-devel
2.3、预编译
创建添加www组
[root@cong11 ~]# groupadd www
创建nginx运行账户www并加入到www组,不允许www用户直接登录系统。
[root@cong11 ~]# useradd -g www www -s /sbin/nologin
指明nginx的安装目录及需要用到的模块
[root@cong11 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_ssl_module --with-http_gzip_static_module --user=www --group=www
--with-http_dav_module # nginx 编译时通过加入“--with-http_dav_module”可以启用对WebDav协议的支持。WebDAV (Web-based Distributed Authoring and Versioning) 一种基于 HTTP 1.1协议的通信协议。它扩展了HTTP 1.1,在GET、POST、HEAD等几个HTTP标准方法以外添加了一些新的方法,使应用程序可直接对Web Server直接读写,并支持写文件锁定(Locking)及解锁(Unlock),还可以支持文件的版本控制。即ngx_http_dav_module模块用于通过 WebDAV 协议进行文件管理自动化。该模块处理 HTTP 和 WebDAV 的 PUT、DELETE、MKCOL、COPY 和 MOVE 方法。
--with-http_stub_status_module #获取Nginx的状态统计信息
--with-http_addition_module #向响应内容中追加内容,比如想在站点底部追加一个js或者css,可以使用这个模块来实现,即模块ngx_http_addition_module在响应之前或者之后追加文本内容。
--with-http_sub_module # ngx_http_sub_module模块是一个过滤器,它修改网站响应内容中的字符串,比如你想把响应内容中的‘iuwai’全部替换成‘aaaaa‘,这个模块已经内置在nginx中,但是默认未安装,需要安装需要加上配置参数:--with-http_sub_module
--with-http_flv_module #该ngx_http_flv_module模块为Flash视频(FLV)文件提供伪流服务器端支持。它会根据指定的 start 参数来指定跳过多少字节,并在返回数据前面附上 FLV 头。
location ~ .flv$ {
flv;
}
curl localhost/index.flv?start=10
该请求的意思是,从视频文件 index.flv 第10个字节开始读取返回,并在返回的数据上附上 FLV 头。
--with-http_mp4_module #模块提供了对 MP4 视频的播放支持,相关的扩展名 .mp4 .m4v .m4a。
--with-http_ssl_module #启用ngx_http_ssl_module
--with-pcre # 支持正则表达式
注:如果pcre是通过编译安装的话,例如
# tar zxvf /usr/local/src/pcre-8.36.tar.gz -C /usr/local/src/
# cd /usr/local/src/pcre-8.36
# ./configure && make && make install
则--with-pcre=/usr/local/src/pcre-8.36 #需要注意,这里指的是源码,用./configure --help |grep pcre查看帮助。
2.4、预编译安装
[root@cong11 nginx-1.10.3]# make && make install
2.5、启动nginx
[root@cong11 ~]# /usr/local/nginx/sbin/nginx
2.6、查看端口号
[root@cong11 ~]# /usr/local/nginx/sbin/nginx
[root@cong11 ~]# /usr/local/nginx/sbin/nginx
2.6、查看端口号
[root@cong11 ~]# /usr/local/nginx/sbin/nginx
可以看到nginx已经成功启动,接下来我们使用curl命令测试服务名和版本号有没有成功隐藏
2.7、测试
[root@cong11 ~]# curl -I 192.168.121.60
可以看到服务名和版本号都改成了我们修改后的
2.8、网站测试
在浏览器输入我们nginx服务器的ip地址测试是否可以成功访问
2.9、配置文件nginx.conf
- 全局配置
Nginx服务器的主配置文件nginx.conf中,包括全局配置、I/O事件配置、HTTP配置这三大块内容,配置语句的格式为”关键字 值;”(末尾以分号表示结束),以”#”开始的部分表示注释。
常用配置项:
user nobody;//运行用户,Nginx的运行用户实际是编译时指定的nginx,若编译时未指定则默认为nobody
worker_processes 2;//这个指令是指当一个nginx进程打开的最多文件数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。(通过”ulimit –n 数值”可以修改打开的最多文件数目)
error_log logs/error.log; //全局错误日志文件的位置
pid logs/nginx.pid; //PID文件的位置
- I/O事件配置
使用”events {}”界定标记,用来指定Nginx进程的I/O响应模型,每个进程的连接数等设置
events {
use epoll;//使用epoll模型,对于2.6以上的内核,建议使用epoll模型以提高性能
worker_connections 4096;//每个进程允许的最多连接数(默认为1024),每个进程的连接数应根据实际需要来定,一般在10000以下,理论上每台nginx服务器的最大连接数为worker_processes*worker_connections,具体还要看服务器的硬件、带宽等。
}
- HTTP配置
使用”http{}”界定标记,包括访问日志、HTTP端口、网页目录、默认字符集、连接保持、以及虚拟主机、PHP解析等一系列设置。其中大部分配置语句包含在子界定标记”server {}”内。
http{
#设定媒体类型,include 只是一个在当前文件中包含另一个文件内容的指令。
include mime.types;
default_type application/octet-stream;//默认媒体类型足够
#设定日志格式
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
access_log logs/access.log main;
keepalive_timeout 65; //连接保持超时(在处理完一个请求后保持这个TCP连接时长。若接收到来自客户端的其它请求,服务端会利用这个未被关闭的连接,而不需要再建立一个连接。)
#设定虚拟主机
server { //用来配置虚拟主机
listen 80;//WEB服务的监听端口
server_name www.lnmp.com;//网站名
location / { //表示如何匹配后面的路径的
index index.html; //web服务的首页html文件存放路径
root html; //网页根目录位置,默认为Nginx安装目录下的html/子目录
}
charset gb2312; //网页的默认字符集
#设定本虚拟主机的访问日志
access_log logs/www.lnmp.com.access.log main;
error_page 500 502 503 504 /50x.html; //内部错误的反馈页面
location = /50x.html {
root html;
}
}
}
3、修改nginx运行账号
编译安装nginx时若不指定--user=, --group=选项,默认是nobody用户
3.1、查看nginx当前运行账号
3.2、添加path变量
[root@cong11 ~]# ln -s /usr/local/nginx/sbin/* /usr/local/bin/
nginx version: web/8.8.8
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
Options:
-?,-h : this help
-v : show version and exit(显示版本并推出)
-V : show version and configure options then exit(显示版本并配置选项,然后退出)
-t : test configuration and exit(测试配置并退出)
-T : test configuration, dump it and exit(测试配置,转储并退出)
-q : suppress non-error messages during configuration testing(在配置测试期间禁止显示非错误消息)
-s signal : send signal to a master process: stop, quit, reopen, reload(向主进程发送信号:stop, quit, reopen, reload)
-p prefix : set prefix path (default: /usr/local/nginx/)(设置前缀路径(默认值:/usr/local/nginx/))
-c filename : set configuration file (default: conf/nginx.conf)(设置配置文件)
-g directives : set global directives out of configuration file(从配置文件中设置全局指令)
编译安装nginx时若不指定--user=, --group=选项,默认是nobody用户
3.2、添加path变量
[root@cong11 ~]# ln -s /usr/local/nginx/sbin/* /usr/local/bin/
nginx version: web/8.8.8
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
Options:
-?,-h : this help
-v : show version and exit(显示版本并推出)
-V : show version and configure options then exit(显示版本并配置选项,然后退出)
-t : test configuration and exit(测试配置并退出)
-T : test configuration, dump it and exit(测试配置,转储并退出)
-q : suppress non-error messages during configuration testing(在配置测试期间禁止显示非错误消息)
-s signal : send signal to a master process: stop, quit, reopen, reload(向主进程发送信号:stop, quit, reopen, reload)
-p prefix : set prefix path (default: /usr/local/nginx/)(设置前缀路径(默认值:/usr/local/nginx/))
-c filename : set configuration file (default: conf/nginx.conf)(设置配置文件)
-g directives : set global directives out of configuration file(从配置文件中设置全局指令)
nginx version: web/8.8.8
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
Options:
-?,-h : this help
-v : show version and exit(显示版本并推出)
-V : show version and configure options then exit(显示版本并配置选项,然后退出)
-t : test configuration and exit(测试配置并退出)
-T : test configuration, dump it and exit(测试配置,转储并退出)
-q : suppress non-error messages during configuration testing(在配置测试期间禁止显示非错误消息)
-s signal : send signal to a master process: stop, quit, reopen, reload(向主进程发送信号:stop, quit, reopen, reload)
-p prefix : set prefix path (default: /usr/local/nginx/)(设置前缀路径(默认值:/usr/local/nginx/))
-c filename : set configuration file (default: conf/nginx.conf)(设置配置文件)
-g directives : set global directives out of configuration file(从配置文件中设置全局指令)
3.3 重载nginx
[root@cong11 ~]# nginx -h
3.4nginx服务管理脚本
#!/bin/bash
# chkconfig: 2345 99 20
# description: Nginx Service Control Script
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
case "$1" in
start)
netstat -anplt |grep ":80" &> /dev/null && pgrep "nginx" &> /dev/null
if [ $? -eq 0 ]
then
echo "Nginx service already running."
else
$PROG -t &> /dev/null
if [ $? -eq 0 ] ; then
$PROG
echo "Nginx service start success."
else
$PROG -t
fi
fi
;;
stop)
netstat -anplt |grep ":80" &> /dev/null && pgrep "nginx" &> /dev/null
if [ $? -eq 0 ]
then
kill -s QUIT $(cat $PIDF)
echo "Nginx service stop success."
else
echo "Nginx service already stop"
fi
;;
restart)
$0 stop
$0 start
;;
status)
netstat -anplt |grep ":80" &> /dev/null && pgrep "nginx" &> /dev/null
if [ $? -eq 0 ]
then
echo "Nginx service is running."
else
echo "Nginx is stop."
fi
;;
reload)
netstat -anplt |grep ":80" &> /dev/null && pgrep "nginx" &> /dev/null
if [ $? -eq 0 ]
then
$PROG -t &> /dev/null
if [ $? -eq 0 ] ; then
kill -s HUP $(cat $PIDF)
echo "reload Nginx config success."
else
$PROG -t
fi
else
echo "Nginx service is not run."
fi
;;
*)
echo "Usage: $0 {start|stop|restart|reload}"
exit 1
esac
3.5、配置服务开机自动启动
#!/bin/bash
# chkconfig: 2345 99 20
# description: Nginx Service Control Script
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
case "$1" in
start)
netstat -anplt |grep ":80" &> /dev/null && pgrep "nginx" &> /dev/null
if [ $? -eq 0 ]
then
echo "Nginx service already running."
else
$PROG -t &> /dev/null
if [ $? -eq 0 ] ; then
$PROG
echo "Nginx service start success."
else
$PROG -t
fi
fi
;;
stop)
netstat -anplt |grep ":80" &> /dev/null && pgrep "nginx" &> /dev/null
if [ $? -eq 0 ]
then
kill -s QUIT $(cat $PIDF)
echo "Nginx service stop success."
else
echo "Nginx service already stop"
fi
;;
restart)
$0 stop
$0 start
;;
status)
netstat -anplt |grep ":80" &> /dev/null && pgrep "nginx" &> /dev/null
if [ $? -eq 0 ]
then
echo "Nginx service is running."
else
echo "Nginx is stop."
fi
;;
reload)
netstat -anplt |grep ":80" &> /dev/null && pgrep "nginx" &> /dev/null
if [ $? -eq 0 ]
then
$PROG -t &> /dev/null
if [ $? -eq 0 ] ; then
kill -s HUP $(cat $PIDF)
echo "reload Nginx config success."
else
$PROG -t
fi
else
echo "Nginx service is not run."
fi
;;
*)
echo "Usage: $0 {start|stop|restart|reload}"
exit 1
esac
3.5、配置服务开机自动启动
#给脚本添加可执行权限
chmod +x /etc/init.d/nginx
#把nginx添加为系统服务
chkconfig --add nginx
#把nginx添加开机自启动
chkconfig nginx on
#查看nginx开机启动项
chkconfig --list nginx
4、nginx进程
ps aux | grep nginx | grep -v "grep"
在这里我们还可以看到在查看的时候,worker进程是www程序用户,但是master进程还是root,其中,master是监控进程,也叫主进程,worker是工作进程,还有cache相关进程,关系如图:
可以直接理解为master进程是管理worker进程,而worker进程才是为用户提供服务的。
5、设置Nginx运行进程个数
nginx运行进程个数一般我们设置CPU的核心或者核心数x2,如果你不了解,top命令之后按1也可以看出来。也可以查看/proc/cpuinfo文件
[root@cong11 ~]# top #按1,可以看到我这里是4 核心
5.1、设置nginx中进程数
在nginx.conf的全局设置中修改
vim /usr/local/nginx/conf/nginx.conf
改:
worker_processes 1;
为
worker_processes 4; #我这里查看到是4个cpu,修改为4
5.2、查看nginx进程数
6、Nginx运行CPU亲和力
这个要根据你的CPU线程数配置,在高并发情况下,通过设置cpu亲和力来降低由于多CPU核切换带来的性能损耗。
6.1、4核4线程配置
在nginx.conf文件全局配置中添加
vim /usr/local/nginx/conf/nginx.conf
worker_cpu_affinity 0001 0010 0100 1000;
上面的配置表示:4核CPU,开启4个进程。0001表示开启第一个cpu内核, 0010表示开启第二个cpu内核,依次类推;有多少个核,就有几位数,1表示该内核开启,0表示该内核关闭。
6.2、那么如果我是4线程的CPU,我只想跑两个进程呢?
vim /usr/local/nginx/conf/nginx.conf
worker_processes 2;
worker_cpu_affinity 0101 1010;
表示第一个进程在第一个和第三个cpu上运行,第二个进程在第二个和第四个cpu上运行,两个进程分别在这两个组合上轮询!
补充:
2核CPU,开启2个进程
worker_processes2;
worker_cpu_affinity 01 10;
2核CPU,开启8进程
worker_processes8;
worker_cpu_affinity 01 10 01 10 01 10 01 10;
8核CPU,开启2进程
worker_processes2;
worker_cpu_affinity 10101010 01010101;
说明:10101010表示开启了第2,4,6,8内核,01010101表示开始了1,3,5,7内核
通过 apache 的ab测试查看nginx对CPU的使用状况:
在nginx.conf文件全局配置中添加
vim /usr/local/nginx/conf/nginx.conf
worker_cpu_affinity 0001 0010 0100 1000;
上面的配置表示:4核CPU,开启4个进程。0001表示开启第一个cpu内核, 0010表示开启第二个cpu内核,依次类推;有多少个核,就有几位数,1表示该内核开启,0表示该内核关闭。
vim /usr/local/nginx/conf/nginx.conf
worker_processes 2;
worker_cpu_affinity 0101 1010;
表示第一个进程在第一个和第三个cpu上运行,第二个进程在第二个和第四个cpu上运行,两个进程分别在这两个组合上轮询!
补充:
2核CPU,开启2个进程
worker_processes2;
worker_cpu_affinity 01 10;
2核CPU,开启8进程
worker_processes8;
worker_cpu_affinity 01 10 01 10 01 10 01 10;
8核CPU,开启2进程
worker_processes2;
worker_cpu_affinity 10101010 01010101;
说明:10101010表示开启了第2,4,6,8内核,01010101表示开始了1,3,5,7内核
通过 apache 的ab测试查看nginx对CPU的使用状况:
如果多个CPU内核的利用率都相差不多,证明nginx己经成功的利用了多核CPU。
测试结束后,CPU内核的负载应该都同时降低。
7、Nginx最多可以打开文件数
7.1、设置nginx最大可打开的文件数
在nginx.conf文件全局配置中添加
vim /usr/local/nginx/conf/nginx.conf
worker_rlimit_nofile 102400; 添加标红内容
当一个nginx进程打开的最多文件数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。
当一个nginx进程打开的最多文件数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。
7.2、修改系统可以打开的最大文件数
7.2.1、临时修改
ulimit -n设定系统最多打开的文件数
[root@cong11 ~]# ulimit -n 102400
7.2.2、永久修改
修改linux的软硬件限制文件/etc/security/limits.conf
vim /etc/security/limits.conf
在文件尾部添加如下代码:
* soft nofile 102400
* hard nofile 102400
用户重新登录生效
8、 Nginx事件处理模型
vim /usr/local/nginx/conf/nginx.conf
events{
use epoll;
worker_connections 65535; #单个进程允许客户端最大并发连接数
}
events{
use epoll;
worker_connections 65535; #单个进程允许客户端最大并发连接数
}
nginx采用epoll事件模型,处理效率高
worker_connections是单个worker进程允许客户端最大连接数,这个数值一般根据服务器性能和内存来制定,实际最大值就是worker进程数乘以work_connections
实际我们填入一个65535,足够了,这些都算并发值,一个网站的并发达到这么大的数量,也算一个大站了!
8.1、单个进程允许客户端最大并发连接数
worker_connections 65535;
这个数值一般根据服务器性能和内存来制定,也就是单个进程最大连接数,实际最大并发值就是work进程数乘以这个数。
9、http主体优化
9.1、开启高效传输模式开启高效传输
vim /usr/local/nginx/conf/nginx.conf
http{
include mime.types; #媒体类型
default_type application/octet-stream; #默认媒体类型足够
sendifile on;
tcp_nopush on; #取消注释
sendfile on;
开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,当nginx是一个静态文件服务器的时候,开启sendfile配置项能大大提高nginx的性能
tcp_nopush on;
必须在sendfile开启模式才有效,防止网络阻塞,积极的减少网络报文段的数量(将响应头和响应体两部分一起发送,而不一个接一个的发送。)
9.2、长连接超时时间
主要目的是保护服务器资源,CPU,内存,控制连接数,因为建立连接也是需要消耗资源的
vim /usr/local/nginx/conf/nginx.conf
keepalive_timeout 65;
keepalived_timeout 与client的keep-alive连接超时时间,单位是秒。服务器将会在这个时间后关闭连接,长连接可以减少重建连接的开销,如果设置时间过长,用户又多,长时间保持连接会占用大量资源
9.3、文件上传大小限制
nginx可以修改上传文件大小限制
vim /usr/local/nginx/conf/nginx.conf
client_max_body_size 10m; #在40行添加
9.4、location匹配
9.4.1、location匹配
Nginx的location通过指定模式来与客户端请求的URI相匹配,location可以把网站的不同部分,定位到不同的处理方式上,基本语法如下:
location [=|~|~*|^~] pattern {
........
}
注:中括号中为修饰符,即指令模式。Pattern为url匹配模式
= 表示做精确匹配,即要求请求的地址和匹配路径完全相同
~:正则匹配,区分大小写
~*:正则匹配”不区分大小写
注:nginx支持正则匹配,波浪号(~)表示匹配路径是正则表达式,加上*变成~*后表示大小写不敏感
^~:指令用于字符前缀匹配。例如:location ^~ /images/ {…}
9.5、gzip调优
9.5.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 则返回压缩副本。如果没有带这个头信息,默认返回非压缩副本。
9.5.2、拷贝测试文件
[root@cong11 ~]# cp /etc/passwd /usr/local/nginx/html/passwd.html
[root@cong11 ~]# cd /usr/local/nginx/html/
[root@cong11 html]# -sh *
9.5.3、测试
打开浏览器,输入测试网址
http://192.168.1.11/passwd.html
按F12然后刷新网页,在开发人员工具里可以看到,passwd.html大小为927B,在网页标头里可以看到,Accept-Encoding: gzip, deflate启用了gzip压缩。
输入网址,按F12在network里点击passwd.html,在标头里找Request Headers,也可以看到Accept-Encoding: gzip, deflate,开启gzip压缩
9.6、expires缓存调优
缓存,主要针对于图片,css,js等元素更改机会比较少的情况下使用,特别是图片,占用带宽大,我们完全可以设置图片在浏览器本地缓存365d,css,js,html可以缓存个10来天,这样用户第一次打开加载慢一点,第二次,就非常快了!缓存的时候,我们需要将需要缓存的扩展名列出来!Expires缓存配置在server字段里面。
9.6.1、以扩展名区分
vim /usr/local/nginx/conf/nginx.conf
9.6.2、 对目录及其进行判断
注:用于中断当前相同作用域中的Nginx配置,和循环语句中的break语法类似,可以在server块和location以及if块中使用。
- expires可以降低网站购买的带宽,节约成本
- 同时提升用户访问体验
- 减轻服务的压力,节约服务器成本,甚至可以节约人力成本,是web服务非常重要的功能。
9.6.3、expire功能缺点
被缓存的页面或数据更新了,用户看到的可能还是旧的内容,反而影响用户体验。
解决办法:
10、日志切割优化第一个 缩短缓存时间,例如:1天,不彻底,除非更新频率大于1天
第二个 对缓存的对象改名
日志优化的目的:防止日志文件过大,同时也方便查找
10.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
0 0 * * * /bin/sh /usr/local/nginx/logs/cut_nginx_log.sh >/dev/null 2>&1
//在每天的0:0时执行此脚本,实现日志截断
为该脚本添加执行权限
chmod +x cut_nginx_log.sh10.2、去掉不需要的日志统计
健康检查的日志,不用输入到log中,因为这些日志没有意义,我们分析的话只需要分析访问日志,看看一些页面链接,如200,301,404的状态码,在SEO中很重要,而且我们统计PV是页面计算,这些都没有意义,反而消耗了磁盘IO,降低了服务器性能,我们可以屏蔽这些如图片,js,css这些不宜变化的内容
vim /usr/local/nginx/conf/nginx.conf
在配置文件中设置日志记录规则
location ~ .*.(js|jpg|jpeg|JPG|JPEG|css|bmp|gif|GIF)$ {
access_log off;
}
10.3、日志格式优化注:
error log 关闭
关闭error log千万不要写error_log off; 这样错误日志会被写到一个叫做off的文件中
正确的关闭方法:error_log /dev/null;
Nginx软件会把每个用户访问网站的日志信息记录到指定的日志文件里,供网站提供者分析用户的浏览行为等,此功能由ngx_http_log_module模块负责。
访问日志参数
Nginx的访问日志主要由两个参数控制。
Nginx日志格式中默认的参数配置如下:
vim /usr/local/nginx/conf/nginx.conf
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;
11、目录文件访问控制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设置
主要用在禁止目录下指定文件被访问,当然也可以禁止所有文件被访问!一般什么情况下用?比如是有存储共享,这些文件本来都只是一些下载资源文件,那么这些资源文件就不允许被执行,如sh,py,pl,php等等
11.1、对访问来源控制这个需要ngx_http_access_module模块支持,不过,默认会安装
修改配置文件
vim /usr/local/nginx/conf/nginx.conf
location ~ ^/aa/ {
allow 192.168.121.0/24; #允许121.0网段IP访问
deny all;
}
location /bb/ { return 403 ; }
重载服务
nginx -s reload12、IP和301优化
有时候,我们发现访问网站的时候,使用IP也是可以得,我们可以把这一层给屏蔽掉,让其直接反馈给403,也可以做跳转
12.1、跳转vim /usr/local/nginx/conf/nginx.conf
12.2、403反馈的做法server{
listen 80;
server_name www.benet.com benet.com;
if($host = 192.168.121.60) {
rewrite ^ http://www.baidu.com;
}
当访问使用IP192.168.121.60时跳转到百度
vim /usr/local/nginx/conf/nginx.conf
12.3、301跳转的做法server{
listen 80;
server_name www.benet.com benet.com;
if($host = 192.168.121.60) {
return 403;
}
当访问使用IP192.168.121.60时返回403状态码
我们域名在解析的过程中,将benet.com跳转到www.benet.com
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
root html;
server_name www.benet.com benet.com
if($host=benet.com) {
rewrite ^/(.*)$ http://www.benet.com/$1 permanent;
}
修改hosts文件
vim /etc/hosts
192.168.121.60 www.benet.com
192.168.121.60 benet.com
重载配置文件
nginx -s reload13、防盗链
防止别人直接从你网站引用图片等链接,消耗了你的资源和网络流量,那么我们的解决办法由几种:
1:水印,品牌宣传,你的带宽,服务器足够
2:防火墙,直接控制,前提是你知道IP来源
3:防盗链策略
13.1、直接给予404的错误提示vim /usr/local/nginx/conf/nginx.conf
13.2、设置图片,来做rewrite跳转location / {
root html;
index index.html index.htm;
}#直接在第一个localtion下面填写以下内容
location ~* .(jpg|gif|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
root html;
valid_referers none blocked *.benet.com benet.com;
if ($invalid_referer) {
return 404;
}
expires 365d;
}
vim /usr/local/nginx/conf/nginx.conf
location ~* .(jpg|gif|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
root html;
valid_referers none blocked *.benet.com benet.com;
if ($invalid_referer) {
rewrite ^/ http://www.benet.com/img/test.png;
}
expires 365d;
}
参数说明:
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版本以后可以在名称中使用“*”通配符



