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

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

    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"的值
    

      

      

  • 相关阅读:
    java springboot连接两个数据源
    Android状态栏高度、虚拟操作栏高度
    Java代码实现两种数据库的数据迁移
    微信小程序生成海报
    【比较耗性能的一个东西】Firefox的LayoutReflow
    JS中关于带操作赋值的一个小问题
    js控制样式一个细节
    javascript中打开客户端,关于void的一个疑问
    项目管理日志05-01-05
    项目管理日志05-01-04
  • 原文地址:https://www.cnblogs.com/txtfashion/p/3634733.html
Copyright © 2020-2023  润新知