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中。

  如果日志文件路径含有变量,将存在以下一些限制:

  1. Nginx进程设置的用户和组必须有该路径创建文件的权限。
  2. 缓冲将不会被使用
  3. 对于每一条日志记录,日志文件都将先打开文件,在写入日志文件,然后关闭。

  为了提高变量的日志文件存放路径的性能,需使用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"的值