Nginx的基本配置与优化
Nginx的完整配置示例
查看nginx.conf文件,可以看出,nginx.conf的配置文件结构主要有以下几部分构成:
...... events { ...... } http { ...... server { ...... } server { ...... } ...... }
我们在写一个简化的虚拟主机配置文档前,先简单的介绍下虚拟主机:
虚拟主机使用的是特殊的软硬件技术,它把一台运行在英特网上的服务器主机分成一台台“虚拟”的主机,每台虚拟主机都可以是一个独立的网站,可以具有独有的域名,具有完整的Internet服务器功能(www、FTP、Email等),同一台主机上的虚拟主机之间是完全独立的,从网站访问者来看,每一台虚拟主机和一台独立主机完全一样。
接下来我们来写一个简化的虚拟主机配置文档:
http { server { #监听的端口 listen 192.168.1.20:80; #主机名 servername 192.168.1.20; #访问日志存放路径 acess_log logs/access.log combined; location { #默认首页文件,顺序从左到右,如果找不到index.html文件,则查看index.htm文件作为首页 index index.html index.htm; #HTML网页文件存放的路径 root html; } } }
从上面的配置文件中可以看出,一段server{....}就是一个虚拟主机,如果要配置多个虚拟主机,建立多段server{}配置文件即可,非常方便。监听的IP和端口也可以不写IP地址,只写端口,把它配置成“listen 80;”,则表示监听该服务器上所有的IP的80端口,可以通过server_name区分不同的虚拟主机。
配置基于域名的虚拟主机是常见的一种虚拟主机。只需要配置你的DNS服务器,将每个主机名映射到正确的IP地址,然后将配置文件中的server_name改成你的域名就行了,如"server_name www.txtfashion.com;"。这种虚拟主机技术,使很多虚拟主机可以共享同一个IP地址,有效的解决了IP地址不足的问题。所以如果没有特殊要求使你必须使用一个基于IP的虚拟主机,最好还是使用域名的虚拟主机。
Nginx的日志文件配置
与Nginx日志相关的指令主要有两条,一条是log_format,用来设置日志的格式,另外一条是access_log,用来指定日志文件的存放路径、格式和缓存大小。两条指令在Nginx配置文件中的位置可以在http{.....}之间,也可以在虚拟主机之间,即server{...}两个大括号之间。log_format指令用来设置日志的格式,它的语法如下:
log_format name format [format ...] 其中name表示定义的格式名称,format表示定义的格式样式。log_format有一个默认的、无需设置的combined日志格式设置。 log_format combined '$remote_addr - $remote_user [$time_local]' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"' ; 你也可以自定义一份日志的格式,不过要注意的是,log_format指令设置的name不能重复。 假设将Nginx服务器做为Web服务器,位于负载均衡设备、Squid、Nginx反向代理处理之后,就不能获取到客户端的。元婴是过反响代理后,由于在客户端和web服务器之间增加了中间层,因此web服务器无法直接获取到客户端的IP,通过$remote_addr变量拿到的是反向代理服务器的IP地址。但是,反向代理服务器在转发请求的HTTP头信息中,可以增加X-Forwarded—For信息,用以记录原有客户端IP地址和原有客户端请求的服务器地址。 log_format combined '$remote_addr - $remote_user [$time_local]' ‘"$request" $status $body_bytes_sent ' ’"$http_referer" "$http_user_agent" "$http_x_forwarded_for"' ;
用log_format指令设置日志格式后,需要用access_log指令指定日志文件存放路径。access_log指令的语法如下:
access_log path [format [buffer=size | off]] 其中path表示日志文件的存放路径,format表示使用log_format指令设置的日志格式的名称,buffersize表示内存缓存区的大小,例如可以设置buffer=32k。
如果access_log指令中的日志文件路径中可以包含变量,例如:access_log /logs/$server_name.log combined;
假设server_name指令设置的虚拟主机名称为www.txtfashion.com,那么acess_log指令把访问日志记录在/logs/www.txtfashion.com.log中。
如果日志文件路径含有变量,将存在以下一些限制:
- Nginx进程设置的用户和组必须有该路径创建文件的权限。
- 缓冲将不会被使用
- 对于每一条日志记录,日志文件都将先打开文件,在写入日志文件,然后关闭。
为了提高变量的日志文件存放路径的性能,需使用open_log_file_cache设置经常被使用的日志文件描述符缓存。它的语法如下:
open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time] | off 参数说明如下: max:设置缓存中的最大文件描述数量。如果曹国设置的最大文件描述符数量,使用LRU(Least Recently Used)算法来清除。 inactive:设置一个时间,如果在设定的时间内没有使用此文件描述符,则自动删除描述符。默认为10s min_uses:在参数inactive指定的时间范围内,如果日志文件超过被使用的次数,则将该日志文件的描述符计入缓存。默认为1. valid:设置多长时间检查一次,看一看变量指定的日志文件路径与文件名是否存在,默认为60s off:禁用缓存。
Nginx的日志文件配切割
由于访问日志文件增长速度非常快,日志太大会严重影响服务器效率,同时为了方便日志进行分析计算,需要对日志文件定时切割。可以采用以下方式:
mv logs/access.log /logs/20140330.log kill -USR1 Nginx主进程号
首先通过mv将日志文件重命名,然后发送kill -USR1信号给Nginx主进程号,让Nginx重新生成一个新的日志文件。
如果想要每天定时切割日志,还须要借助crontab。我们可以写一个按天切割的日志。按年、月份目录存放日志的shell脚本:
vi /home/txtfashion/shell/cut_nginx_log.sh
#!/bin/bash logs_path="/usr/local/nginx/logs/" mkdir -p ${logs_path}$(date -d "yesterday" "+%Y")/$(date -d "yesterday" "+%m")/ mv ${logs_path}www.txtfashion.com.access.log ${logs_path}$(date -d "yesterday" "+%Y")/$(date -d "yesterday" "+%m")/access_$(date -d "yesterday" "+%Y%m%d").log kill -USR1 `cat /usr/local/nginx/nginx.pid`
另外配置crontab每天凌晨00:00定时执行这个脚本: crontab -e
输入以下内容并保存:
00 00 * * * /home/txtfashion/shell/cut_nginx_log.sh
Nginx的压缩输出配置
gzip(GNU-ZIP)是一种压缩技术,经过gzip压缩后,页面可以变为原来的30%甚至更小,这样,用户浏览页面的时候速度就会快多了,gzip压缩输出的相关指令位于http{.....}之间:
gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 2; gzip_types text/plain application/x-javascript text/css application/xml; gzip_vary on;
Nginx的浏览器本地缓存设置
浏览器缓存是为了加速浏览,浏览器在用户磁盘上对最近请求过的文档进行存储,当访问者再次请求这个页面的时候时,浏览器可以从本地磁盘显示文档,这样就可以加速页面的浏览。浏览器缓存可以通过expires指令输出Header头来实现,expires指令的语法如下:
语法:expoires[time | epoch | max | off] 默认值:expires off 作用域:http,server,location 用途:使用本指令可以控制HTTP应答中的“Expires”和“Cache-Control”的Header头信息(起到控制页面缓存的作用) “Expires”头标的值将通过当前系统时间加上设定time值来设定。 time值还控制"Cache-Control"的值:负数表示no-cache 正数或零表示max-age=time epoch:指定“Expires”的值为 1January,1970,00:00:01 GMT max:指定“Expires”的值为31December2037 23:59:59GMT,"Cache-Control"的值为10年。-1:指定“Expires”的值为当前服务器时间-1s,即永远过期。 off:不修改“Expires”和"Cache-Control"的值