nginx 配置参考手册

[TOC]

nginx 常用配置 nginx -V查看编译参数。

Baisc Auth

语法: auth_basic string | off;
默认值: auth_basic off;
配置段: http, server, location, limit_except

默认表示不开启认证,后面如果跟上字符,这些字符会在弹窗中显示。

语法: auth_basic_user_file file;
默认值: —
配置段: http, server, location, limit_except

用户密码文件,文件内容类似如下:

ttlsauser1:password1
ttlsauser2:password2:comment

配置示例:

http {
    ...
    location / {
        auth_basic "basic";
        auth_basic_user_file conf/htpasswd;
    }
}

密码生成

  • openssl openssl passwd -crypt 原始密码
  • htpasswd 需要安装yum -y install httpd-tools

proxy

  location ~ {
                proxy_pass http://127.0.0.1:8090;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection 'upgrade';
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_cache_bypass $http_upgrade;
        }

默认配置

nginx 的 default_server 指令可以定义默认的 server 去处理一些没有匹配到 server_name 的请求,如果没有显式定义,则会选取第一个定义的 server 作为 default_server。

    server {
        listen  80 default_server;
        server_name  -;# _ 并不是重点 __ 也可以 ___也可以

        #charset koi8-r;
        return 404;

    }

为了方便维护,最好是定义default_server。这样与顺序无关。

获取用户真实ip

需要realip模块,编译时加上--with-http_realip_module

 set_real_ip_from 192.168.50.0/24; # 设置上级代理服务器ip, 
 set_real_ip_from 61.22.22.22;
 set_real_ip_from 121.207.33.33;
 set_real_ip_from 127.0.0.1;
 real_ip_header X-Forwarded-For;
 real_ip_recursive on;

譬如获取到的X-Forwarded-For是:120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121

php通过$_SERVER['REMOTE_ADDR'] 获取ip地址。

从右往左数,第一个ip是192.168.50.121,出现在set_real_ip_from中,忽略,如果real_ip_recursive=off 则获取的真实ip是 121.207.33.33。

如果是real_ip_recursive=on, 则继续判断。发现121.207.33.33依然在set_real_ip_from中,继续忽略,知道获取真实ip是120.22.11.11

参考nginx使用set_real_ip_from获取用户真实IP

后端nginx使用set_real_ip_from获取用户真实IP

自定义错误页面

error_page  502  /502.htm;
location = /502.htm {
   root   /usr/share/nginx/html;
 }

跨域

    location / {
        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
        add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
        if ($request_method = 'OPTIONS') {
            return 204;
        }
    }

静态文件

   location  ~* ^.+\.(xml|gz|txt)$ {
            root /root/deploy/web/dist/;
    }

proxy_cache

是在负载均衡层做的。需要磁盘大。参考nginx 反向代理之 proxy_cache
Nginx Proxy Cache 的配置

声明配置 nginx.conf

http {
    ...
        proxy_cache_path  /mnt/zxdfs/service/ottcache/cachevod levels=1:2 keys_zone=cachefile:100m inactive=180d max_size=148g limitedexpiredfiles=2 expiredtimeinterval=2300-1900 expired_percent=95 use_temp_path=off;
}

代码说明:

proxy_cache_path 缓存文件路径

levels 设置缓存文件目录层次;levels=1:2 表示两级目录

keys_zone 设置缓存名字和共享内存大小.【在使用的地方要使用相同的变量名】

inactive 在指定时间内没人访问则被删除

max_size 最大缓存空间,如果缓存空间满,默认覆盖掉缓存时间最长的资源。

use_temp_path: 如果为off,则nginx会将缓存文件直接写入指定的cache文件中,而不是使用temp_path存储,official建议为off,避免文件在不同文件系统中不必要的拷贝;

这些是默认有的配置,当然可以根据自己业务的需求对缓存有其他新增的配置说明。

当配置好之后,重启nginx,如果不报错,则配置的proxy_cache会生效

proxy_cache_path 得每个域名单独配置,否则会遇到’ERR_EMPTY_RESPONSE’ 问题

把磁盘改成memcache可以参考nginx+memcache增加全站缓存系统

使用 location位置

location /internal_proxyfile
{
        proxy_buffering on # 控制缓冲是否启用, 默认就是on, 
    proxy_buffers 2 8k # 该指令控制代理响应缓冲区的数量(第一个参数)和大小(第二个参数)。默认配置是8个缓冲区大小等于一个内存页(4K或者8K)。增加缓冲区的数目可以让你缓冲更多信息。
    proxy_buffer_size 8k # 从后端服务器的响应头缓冲区大小,它包含headers,和其他部分响应是分开的。该指令设置响应部分的缓冲区大小。默认情况下,它和proxy_buffers是相同的尺寸,但因为这是用于头信息,这通常可以设置为一个较低的值。
    proxy_busy_buffers_size 8k # 此指令设置标注“client-ready”缓冲区的最大尺寸。而客户端可以一次读取来自一个缓冲区的数据,缓冲被放置在队列中,批量发送到客户端。此指令控制允许是在这种状态下的缓冲空间的大小。

proxy_max_temp_file_size 2048m # 这是每个请求能用磁盘上临时文件最大大小。这些当上游响应太大不能装配到缓冲区时被创建。

proxy_temp_file_write_size 32k # 这是当被代理服务器的响应过大时Nginx一次性写入临时文件的数据量。

proxy_temp_path:当上游服务器的响应过大不能存储到配置的缓冲区域时,Nginx存储临时文件硬盘路径。

正如你所看到的,Nginx提供了相当多的不同的指令来调整缓冲行为。大多数时候,你不必担心太多,但它对于调整一些值可能是有用的。可能最有用的调整是proxy_buffers和proxy_buffer_size指令。

    proxy_cache_use_stale error timeout updating http_502 http_504;
        #此处是托底配置,旧的总比出错强,当nginx请求后台服务器报错的时候,
        #如果返回配置的错误响应码,nginx则直接取缓存文件中的旧数据返回给用户,托底使用必选配置。

    proxy_cache_lock off;
        #缓存并发锁,当nginx缓存没有命中的时候只有一个请求回源tomcat请求数据,其他请求会等待。非必选配置。
        #意思就是 当多个请求传递到此配置时即他们的proxy_cache_key 是一样的,那多个请求只有一个才会真正回源【即到真正应用阶段生成响应内容】,
        #最后将响应内容 添加到 cache ,然后其他请求 就从cache 获取数据,或直到超时。
    proxy_cache_lock_timeout 20s;
        #等待锁超时时间设置 非必选配置。

    proxy_ignore_headers Cache-Control Expires;

    proxy_cache cachefile; 
        # 配置了缓存空间名称,只有这个是必填项,其他都是选填。
    proxy_cache_valid  200 206 304 180d; 
        # 根据响应码设置缓存时间,超过这个时间即使缓存文件中有缓存数据,nginx也会回源请求新数据。

    proxy_cache_key $cdn_cid;
    proxy_cache_prefix_dir $cpid_cid;
    proxy_pass  $upstream_url;     # 代理后转发的路径
}

gzip

    gzip on;
    gzip_min_length  1k;
    gzip_buffers     4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 2;
    gzip_types       text/plain application/x-javascript text/css application/xml;
    gzip_vary on;

ip频率限制 limit_reqzone

可以加ip白名单,忽略限制。

说明

  1. limit_req_zone
    > 语法: limit_req_zone $variable zone=name:size rate=rate;
    >
    >默认值: none
    >
    >配置段: http
    设置一块共享内存限制域用来保存键值的状态参数。 特别是保存了当前超出请求的数量。 键的值就是指定的变量(空值不会被计算)。如
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

说明:区域名称为one,大小为10m,平均处理的请求频率不能超过每秒一次。
键值是客户端IP。
使用$binary_remote_addr变量, 可以将每条状态记录的大小减少到64个字节,这样1M的内存可以保存大约1万6千个64字节的记录。
如果限制域的存储空间耗尽了,对于后续所有请求,服务器都会返回 503 (Service Temporarily Unavailable)错误。
速度可以设置为每秒处理请求数和每分钟处理请求数,其值必须是整数,所以如果你需要指定每秒处理少于1个的请求,2秒处理一个请求,可以使用 “30r/m”。

  1. limit_req_log_level

    语法: limit_req_log_level info | notice | warn | error;

    默认值: limit_req_log_level error;

    配置段: http, server, location
    设置你所希望的日志级别,当服务器因为频率过高拒绝或者延迟处理请求时可以记下相应级别的日志。 延迟记录的日志级别比拒绝的低一个级别;比如, 如果设置“limit_req_log_level notice”, 延迟的日志就是info级别。

  2. limit_req_status

    语法: limit_req_status code;

    默认值: limit_req_status 503;

    配置段: http, server, location
    该指令在1.3.15版本引入。设置拒绝请求的响应状态码。

  3. limit_req

    语法: limit_req zone=name [burst=number] [nodelay];

    默认值: —

    配置段: http, server, location
    设置对应的共享内存限制域和允许被处理的最大请求数阈值。 如果请求的频率超过了限制域配置的值,请求处理会被延迟,所以所有的请求都是以定义的频率被处理的。 超过频率限制的请求会被延迟,直到被延迟的请求数超过了定义的阈值,这时,这个请求会被终止,并返回503 (Service Temporarily Unavailable) 错误。这个阈值的默认值为0。

实例

http{  
       ...  
       limit_req_zone $binary_remote_addr zone=allips:10m rate=20r/s;  
       解释:#定义一个名为allips的limit_req_zone用来存储session,大小是10M内存,  
            #以$binary_remote_addr为key,限制平均每秒的请求为20个,  
            #1M能存储16000个状态,rete的值必须为整数,  
            #如果限制两秒钟一个请求,可以设置成30r/m  
            # 
       ...  
       server{  
         ...  
         location {  
           ...  
           limit_req zone=allips burst=5 nodelay;  
           解释: #限制每ip每秒不超过20个请求,漏桶数burst为5  
                 #brust的意思就是,如果第1秒、2,3,4秒请求为19个,  
                 #第5秒的请求为25个是被允许的。  
                 #但是如果你第1秒就25个请求,第2秒超过20的请求返回503错误。  
                 #nodelay,如果不设置该选项,严格使用平均速率限制请求数,  
                 #第1秒25个请求时,5个请求放到第2秒执行,  
                 #设置nodelay,25个请求将在第1秒执行。  
           ...  
         }  
         ...  
       }  
       ...  
}

防盗链

location ~* \.(gif|jpg|swf)$ {
    valid_referers none blocked start.igrow.cn sta.igrow.cn;
    if ($invalid_referer) {
      rewrite ^/ http://$host/logo.png;
    }
}

流量复制

依赖模块ngx_http_mirror_module, 1.13.4版本后默认开启

location / {                        # location /指定了源uri为/,也可以定义为其他指定接口
    mirror /mirror1;                # mirror /mirror指定镜像uri为/mirror
    mirror /mirror2;                # 有多个需要复制流量的,可以配置多条
    mirror /mirror2;                # 配置多条情况下,将会起到流量放大的作用,即主配置请求一次,镜像端会有两次
  # mirror_request_body on;         # 指定是否镜像请求body部分,请求自动缓存;
    proxy_pass http://backend;      # 指定处理主流量的后端Server
}
location = /mirror1 {
    internal;       # 指定此location只能被“内部的”请求调用,外部的调用请求会返回”Not found” (404)
    proxy_pass http://test_backend1$request_uri;    # 指定将要复制流量的Server1
}
location = /mirror2 {
    internal;
    proxy_pass http://test_backend2$request_uri;
}

在重构时,验证新代码的正确性用的。其他流量复制的工具还有Gortcprelaytcpcopy

参考利用NGINX内置模块mirror进行流量复制等操作 Nginx流量复制

根据文件类型设置过期时间

location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {
    if (-f $request_filename) {
        expires 1h;
        break;
    }
}

禁止访问某个目录

location ~* \.(txt|doc)${
    root /data/www/wwwroot/linuxtone/test;
    deny all;
}

安全证书配置

 listen 443 ssl;          
 server_name static.huilv.cc stat.huilv.cc;
 ssl_certificate /etc/nginx/cert/huilvcc.crt;          
 ssl_certificate_key /etc/nginx/cert/myserver.key;   

自动切割日志

参考Nginx 使用 logrotate 进行日志滚动

官方方案

向 Nginx 主进程发送 USR1 信号。

USR1 信号量被 Nginx 自定义了,为重新打开日志;当 kill 命令发送 USR1时,nginx 会重新打开日志文件,并重新创建进程。

logrotate

安装yum install logrotate 一般默认已安装which logroate

配置

# nginx logratate 配置文件
$ vi /etc/logrotate.d/nginx
/usr/local/nginx/logs/*.log {
    daily # 指定转储周期为每天
    dateext # 使用当期日期作为命名格式
    missingok # 如果日志丢失,不报错继续滚动下一个日志
    rotate 31 # 保留 31 个备份
    notifempty # 如果是空文件的话,不转储
    create 0640 www www #转储文件,使用指定的文件模式创建新的日志文件
    compress # 压缩
    delaycompress  # 第二次转储时压缩
    sharedscripts # 整个日志组运行一次的脚本
    postrotate # 转储以后需要执行的命令
        # 重新打开日志文件
        [ ! -f /usr/local/nginx/nginx.pid ] || kill -USR1 `cat /usr/local/nginx/nginx.pid`
    endscript
}

测试下

logrotate -d -f /etc/logrotate.d/nginx

一些可用的全局变量:

$args
$content_length
$content_type
$document_root
$document_uri
$host
$http_user_agent
$http_cookie
$limit_rate
$request_body_file
$request_method
$remote_addr
$remote_port
$remote_user
$request_filename
$request_uri
$query_string
$scheme
$server_protocol
$server_addr
$server_name
$server_port
$uri

几个知识点

proxy_pass中url末尾带/与不带/的区别

结论:

  1. 将原uri去除location匹配表达式后的内容拼接在proxy_pass中的url之后: url带/ 或者 url带path
  2. 直接将原uri拼接在proxy_pass中url之后: url没有path且不带/

proxy_pass配置中url末尾带/时,nginx转发时,会将原uri去除location匹配表达式后的内容拼接在proxy_pass中url之后。

测试地址:http://192.168.171.129/test/tes.jsp

场景一:
location ^~ /test/ {
    proxy_pass http://192.168.171.129:8080/server/;
}
代理后实际访问地址:http://192.168.171.129:8080/server/tes.jsp

场景二:
location ^~ /test {
    proxy_pass http://192.168.171.129:8080/server/;
}
代理后实际访问地址:http://192.168.171.129:8080/server//tes.jsp

proxy_pass配置中url末尾不带/时,如url中不包含path,则直接将原uri拼接在proxy_pass中url之后;

如url中包含path,则将原uri去除location匹配表达式后的内容拼接在proxy_pass中的url之后。

 场景一:
 location ^~ /test/{
    proxy_pass http://192.168.171.129:8080/server;
 }
 代理后实际访问地址:http://192.168.171.129:8080/servertes.jsp
 场景四:
location ^~ /test {
    proxy_pass http://192.168.171.129:8080;
}
代理后实际访问地址:http://192.168.171.129:8080/test/tes.jsp

alias 和 root的区别

alias 是目录别名,必须以/结束。

root 则可有可无,当带/时等价于 alias, 当不带/时,有差别:

location /i/ {
    root /usr/local/nginx/html/admin/; // 去/usr/local/nginx/html/admin目录下找文件
}

location /j/ {
    root /usr/local/nginx/html/admin;// 去/usr/local/nginx/html/admin/j 目录下查找
}

location 匹配优先级

语法规则: location [=|~|~*|^~] /uri/ { … }

=开头 表示精确匹配

^~开头 表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。

~开头 表示区分大小写的正则匹配

~*开头 表示不区分大小写的正则匹配

!~!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则

/ 通用匹配,任何请求都会匹配到。

多个location配置的情况下匹配顺序为(参考资料而来,还未实际验证,试试就知道了,不必拘泥,仅供参考):

首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给/通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。
例子,有如下匹配规则:

location = / {
   #规则A
}
location = /login {
   #规则B
}
location ^~ /static/ {
   #规则C
}
location ~ \.(gif|jpg|png|js|css)$ {
   #规则D
}
location ~* \.png$ {
   #规则E
}
location !~ \.xhtml$ {
   #规则F
}
location !~* \.xhtml$ {
   #规则G
}
location / {
   #规则H
}

那么产生的效果如下:
访问根目录/, 比如http://localhost/ 将匹配规则A

访问 http://localhost/login 将匹配规则B,

http://localhost/register 则匹配规则H

访问 http://localhost/static/a.html 将匹配规则C

访问 http://localhost/a.gif, http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用,而 http://localhost/static/c.png 则优先匹配到规则C

访问 http://localhost/a.PNG 则匹配规则E,而不会匹配规则D,因为规则E不区分大小写。

访问 http://localhost/a.xhtml 不会匹配规则F和规则G,

http://localhost/a.XHTML不会匹配规则G,因为不区分大小写。规则F,规则G属于排除法,符合匹配规则但是不会匹配到,所以想想看实际应用中哪里会用到。

访问 http://localhost/category/id/1111 则最终匹配到规则H,因为以上规则都不匹配,这个时候应该是nginx转发请求给后端应用服务器,比如FastCGI(php),tomcat(jsp),nginx作为方向代理服务器存在。

所以实际使用中,个人觉得至少有三个匹配规则定义,如下:

  1. 直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。
    这里是直接转发给后端应用服务器了,也可以是一个静态首页
    第一个必选规则
location = / {
    proxy_pass http://tomcat:8080/index
}
  1. 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
    有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ {
    root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
    root /webroot/res/;
}
  1. 第三个规则就是通用规则,用来转发动态请求到后端应用服务器
    非静态文件请求就默认是动态请求,自己根据实际把握
    毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了
    location / {
    proxy_pass http://tomcat:8080/
    }

ReWrite语法

last – 基本上都用这个Flag。
break – 中止Rewirte,不在继续匹配
redirect – 返回临时重定向的HTTP状态302
permanent – 返回永久重定向的HTTP状态301

1、下面是可以用来判断的表达式:

-f和!-f用来判断是否存在文件

-d和!-d用来判断是否存在目录

-e和!-e用来判断是否存在文件或目录

x和!-x用来判断文件是否可执行

2、下面是可以用作判断的全局变量
例:http://localhost:88/test1/test2/test.php

$host:localhost
$server_port:88
$request_uri:http://localhost:88/test1/test2/test.php
$document_uri:/test1/test2/test.php
$document_root:D:\nginx/html
$request_filename:D:\nginx/html/test1/test2/test.php

示例

server {
    listen 80;
    server_name start.igrow.cn;
    index index.html index.php;
    root html;
    if ($http_host !~ “^star\.igrow\.cn$&quot {
        rewrite ^(.*) http://star.igrow.cn$1 redirect;
    }
}

server_name

nginx server_name 规则:

1.确切的server_name匹配

例如:

server {
    listen       80;
    server_name  www.luwen.cc luwen.cc;
    ...
}

2.以*通配符开始的最长字符串

server {
    listen       80;
    server_name  *.luwen.cc;
    ...
}

3.以*通配符结束的最长字符串

server {
    listen       80;
    server_name  www.*;
    ...
}

这两条有两个特别要注意的事项:

通配符名字只可以在名字的起始处或结尾处包含一个星号,并且星号与其他字符之间用点分隔。所以,“www.*.luwen.cc”和“w*.luwen.cc”都是非法的。

4.匹配正则表达式

server {
    listen       80;
    server_name  ~^(.+)-www\.luwen\.cc$;
    ...
}

server_name正则表达式应用:

server_name指令一项很实用的功能便是可以在使用正则表达式的捕获功能.nginx使用的正则表达式兼容PCRE。为了使用正则表达式,虚拟主机名必须以波浪线“~”起始否则该名字会被认为是个确切的名字

如果表达式含星号,则会被认为是个通配符名字(而且很可能是一个非法的通配符名字)。不要忘记设置“^”和“$”锚点,语法上它们不是必须的,但是逻辑上是的。同时需要注意的是,域 名中的点“.”需要用反斜线“\”转义。含有“{”和“}”的正则表达式需要被引用

error_log

Nginx错误日志级别

常见的错误日志级别有debug | info | notice | warn | error | crit | alert | emerg

级别越高记录的信息越少,如果不定义,默认级别为error.

它可以配置在main、http、server、location段里。

如果在配置文件中定义了两个error_log,在同一个配置段里的话会产生冲突,所以同一个段里只允许配置一个error_log。

但是,在不同的配置段中出现是没问题的。

Nginx错误日志示例

error_log /var/log/nginx/error.log crit;

如果要想彻底关闭error_log,需要这样配置

error_log /dev/null;

完整示例

#定义Nginx运行的用户和用户组
user www www;

#nginx进程数,建议设置为等于CPU总核心数。
worker_processes 8;

#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log info;

#进程文件
pid /var/run/nginx.pid;

#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。
worker_rlimit_nofile 65535;

#工作模式与连接数上限
events
{
# 参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ];  epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
use epoll;
#单个进程最大连接数(最大连接数=连接数*进程数)
worker_connections 65535;
}

#设定http服务器
http
{
    include mime.types; #文件扩展名与文件类型映射表
    default_type application/octet-stream; #默认文件类型
    #charset utf-8; #默认编码
    server_names_hash_bucket_size 128; #服务器名字的hash表大小
    client_header_buffer_size 32k; #上传文件大小限制
    large_client_header_buffers 4 64k; #设定请求缓
    client_max_body_size 8m; #设定请求缓
    sendfile  on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数   来输出文件,对于普通应用设为  on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改 成off。
    autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。
    tcp_nopush on; #防止网络阻塞
    tcp_nodelay on; #防止网络阻塞
    keepalive_timeout 120; #长连接超时时间,单位是秒

    #FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思  都能理解。
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;

    #gzip模块设置
    gzip on; #开启gzip压缩输出
    gzip_min_length 1k; #最小压缩文件大小
    gzip_buffers 4 16k; #压缩缓冲区
    gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
    gzip_comp_level 2; #压缩等级
    gzip_types text/plain application/x-javascript text/css application/xml;
    #压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
    gzip_vary on;
    #limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用

    upstream blog.ha97.com {
    #upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
    server 192.168.80.121:80 weight=3;
    server 192.168.80.122:80 weight=2;
    server 192.168.80.123:80 weight=3;
}

#虚拟主机的配置
server
{
    #监听端口
    listen 80;
    #域名可以有多个,用空格隔开
    server_name www.ha97.com ha97.com;
    index index.html index.htm index.php;
    root /data/www/ha97;
    location ~ .*.(php|php5)?$
    {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi.conf;
    }
    #图片缓存时间设置
    location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires 10d;
    }
    #JS和CSS缓存时间设置
    location ~ .*.(js|css)?$
    {
      expires 1h;
    }
    #日志格式设定
    log_format access ‘$remote_addr – $remote_user [$time_local] “$request” ‘
    ‘$status $body_bytes_sent “$http_referer” ‘
    ‘”$http_user_agent” $http_x_forwarded_for’;
    #定义本虚拟主机的访问日志
    access_log /var/log/nginx/ha97access.log access;

    #对 “/” 启用反向代理
    location / {
        proxy_pass http://127.0.0.1:88;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #以下是一些反向代理的配置,可选。
        proxy_set_header Host $host;
        client_max_body_size 10m; #允许客户端请求的最大单文件字节数
        client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
        proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
        proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
        proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
        proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
        proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置
        proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
        proxy_temp_file_write_size 64k;
        #设定缓存文件夹大小,大于这个值,将从upstream服务器传
    }

    #设定查看Nginx状态的地址
    location /NginxStatus {
        stub_status on;
        access_log on;
        auth_basic “NginxStatus”;
        auth_basic_user_file conf/htpasswd;
        #htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
    }

    #本地动静分离反向代理配置
    #所有jsp的页面均交由tomcat或resin处理
    location ~ .(jsp|jspx|do)?$ {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://127.0.0.1:8080;
    }
    #所有静态文件由nginx直接读取不经过tomcat或resin
    location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
    {
         expires 15d;
    }
    location ~ .*.(js|css)?$
    {
         expires 1h;
    }

}

参考

Nginx Proxy Cache原理和最佳实践

ngx_http_proxy_module

Tags: