nginx完整配置文件例子

例一:

这是一个比较完整的nginx配置文件示例,下面的nginx.conf简单的实现nginx在前端做反向代理服务器的例子,处理js、png等静态文件,jsp等动态请求转发到其它服务器tomcat,以及负载均衡的配置。


user  www www;

worker_processes  2;

error_log  logs/error.log;

#error_log  logs/error.log  notice;

#error_log  logs/error.log  info;

pid        logs/nginx.pid;


events {

    use epoll;

    worker_connections  2048;

}

 

http {

    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  logs/access.log  main;

    sendfile        on;

    # tcp_nopush     on;

    keepalive_timeout  65;

  # gzip压缩功能设置

    gzip on;

    gzip_min_length 1k;

    gzip_buffers    4 16k;

    gzip_http_version 1.0;

    gzip_comp_level 6;

    gzip_types text/html text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;

    gzip_vary on;

  # http_proxy 设置

    client_max_body_size   10m;

    client_body_buffer_size   128k;

    proxy_connect_timeout   75;

    proxy_send_timeout   75;

    proxy_read_timeout   75;

    proxy_buffer_size   4k;

    proxy_buffers   4 32k;

    proxy_busy_buffers_size   64k;

    proxy_temp_file_write_size  64k;

    proxy_temp_path   /usr/local/nginx/proxy_temp 1 2;

  # 设定负载均衡后台服务器列表 

    upstream  backend  { 

              #ip_hash; 

              server   192.168.10.100:8080 max_fails=2 fail_timeout=30s ;  

              server   192.168.10.101:8080 max_fails=2 fail_timeout=30s ;  

    }

 

  # 很重要的虚拟主机配置

    server {

        listen       80;

        server_name  itoatest.example.com;

        root   /apps/oaapp;

        charset utf-8;

        access_log  logs/host.access.log  main;

        #对 / 所有做负载均衡+反向代理

        location / {

            root   /apps/oaapp;

            index  index.jsp index.html index.htm;

            proxy_pass        http://backend;  

            proxy_redirect off;

            # 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP

            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_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;


        }

        #静态文件,nginx自己处理,不去backend请求tomcat

        location  ~* /download/ {  

            root /apps/oa/fs;  

        }

        location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$   

        {   

            root /apps/oaapp;   

            expires      7d; 

        }

        location /nginx_status {

            stub_status on;

            access_log off;

            allow 192.168.10.0/24;

            deny all;

        }

        location ~ ^/(WEB-INF)/ {   

            deny all;   

        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html

        #

        error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            root   html;

        }

    }

 

  ## 其它虚拟主机,server 指令开始

}

例二:


#运行用户

user nobody;

#启动进程,通常设置成和cpu的数量相等

worker_processes  1;

 

#全局错误日志及PID文件

#error_log  logs/error.log;

#error_log  logs/error.log  notice;

#error_log  logs/error.log  info;

 

#pid        logs/nginx.pid;

 

#工作模式及连接数上限

events {

    #epoll是多路复用IO(I/O Multiplexing)中的一种方式,

    #仅用于linux2.6以上内核,可以大大提高nginx的性能

    use   epoll; 

 

    #单个后台worker process进程的最大并发链接数    

    worker_connections  1024;

 

    # 并发总数是 worker_processes 和 worker_connections 的乘积

    # 即 max_clients = worker_processes * worker_connections

    # 在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 4  为什么

    # 为什么上面反向代理要除以4,应该说是一个经验值

    # 根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:4 * 8000 = 32000

    # worker_connections 值的设置跟物理内存大小有关

    # 因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数

    # 而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右

    # 我们来看看360M内存的VPS可以打开的文件句柄数是多少:

    # $ cat /proc/sys/fs/file-max

    # 输出 34336

    # 32000 < 34336,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内

    # 所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置

    # 使得并发总数小于操作系统可以打开的最大文件数目

    # 其实质也就是根据主机的物理CPU和内存进行配置

    # 当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。

    # ulimit -SHn 65535


}
 

http {

    #设定mime类型,类型由mime.type文件定义

    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  logs/access.log  main;


    #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,

    #对于普通应用,必须设为 on,

    #如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,

    #以平衡磁盘与网络I/O处理速度,降低系统的uptime.

    sendfile     on;

    #tcp_nopush     on;


    #连接超时时间

    #keepalive_timeout  0;

    keepalive_timeout  65;

    tcp_nodelay     on;

 

    #开启gzip压缩

    gzip  on;

    gzip_disable "MSIE [1-6].";

 

    #设定请求缓冲

    client_header_buffer_size    128k;

    large_client_header_buffers  4 128k;

 

 

    #设定虚拟主机配置

    server {

        #侦听80端口

        listen    80;

        #定义使用 www.nginx.cn访问

        server_name  www.nginx.cn;

 

        #定义服务器的默认网站根目录位置

        root html;

 

        #设定本虚拟主机的访问日志

        access_log  logs/nginx.access.log  main;

 

        #默认请求

        location / {

            #定义首页索引文件的名称

            index index.php index.html index.htm;   
        }

 

        # 定义错误提示页面

        error_page   500 502 503 504 /50x.html;

        location = /50x.html {

        }

 

        #静态文件,nginx自己处理

        location ~ ^/(images|javascript|js|css|flash|media|static)/ {

            #过期30天,静态文件不怎么更新,过期可以设大一点,

            #如果频繁更新,则可以设置得小一点。

            expires 30d;

        }

 

        #PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.

        location ~ .php$ {

            fastcgi_pass 127.0.0.1:9000;

            fastcgi_index index.php;

            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

            include fastcgi_params;

        }


        #禁止访问 .htxxx 文件

            location ~ /.ht {

            deny all;

        }

    }

}

 例三:


user  www www;  #指定Nginx Worker进程运行用户以及用户组

 

worker_processes 2; #指定了Nginx要开启的进程数,多核CPU指定和核数一样多的进程数

 

pid        logs/nginx.pid; #指定进程id的存储文件位置

 

worker_rlimit_nofile 65535; #指定单进程打开文件数,需与系统设定一致

 

 

 

events {

 

use epoll;  #指定nginx工作模式,nginx主要的工作模式有select、poll、kqueue、epoll

 

            其中select、poll是标准工作模式,kqueue、epoll为高效工作模式,epoll用在Linux系统中,而kqueue用在BSD系统中

 

    worker_connections  65535;#指定单进程的最大连接数

 

}

 

 

 

HTTP部分

 

 

 

http {

 

    include      mime.types; #指定配置文件所包含的文件

 

    default_type  application/octet-stream; #指定默认类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置PHP环境时,Nginx是不予解析的,此时,用浏览器访问PHP文件就会出现下载窗口

 

 

 

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '#设定日志格式

 

                      '$status $body_bytes_sent "$http_referer" '

 

                      '"$http_user_agent" "$http_x_forwarded_for"';;

 

   

 

 

 

client_max_body_size  20m;  #设置允许客户端请求的最大的单个文件字节数

 

    client_header_buffer_size    16k;#指定来自客户端请求头的headerbuffer大小,如果自定义了消息头或有更大的cookie,可以在这里增加缓冲大小

 

    large_client_header_buffers  4 32k;#指定客户端请求中较大的消息头的缓存最大数量和大小,4为个数,32k为大小,最大缓存为4个32kb

 

 

 

    sendfile        on;#开启高效传输模式

 

    tcp_nopush    on;  # tcp_nopush,tcp_nodelay设置on,防止网络阻塞

 

    tcp_nodelay    on;         

 

   

 

    keepalive_timeout  65; #指定客户端连接保持活动的超时时间

 

    client_header_timeout  10;#指定客户端请求头读取超时时间,如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误

 

    client_body_timeout  10;#指定客户端请求主体读取超时时间,如果超过这个时间���客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误

 

send_timeout        10;#指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接

 

 

 

 

 

    gzip  on; #开启gzip压缩,实时压缩输出数据流

 

    gzip_min_length  1k; #设置允许压缩的页面最小字节数

 

    gzip_buffers    4  16k; #指定内存空间来存贮压缩结果,这里指定4个单位为16k的内存来存储压缩结果,即总大小为64k

 

    gzip_http_version  1.1;#指定识别HTTP协议版本,默认是1.1

 

    gzip_comp_level  2;#指定gzip压缩比,1 压缩比最小,处理速度最快;9 压缩比最大,传输速度快,但处理最慢,也比较消耗CPU资源

 

    gzip_types  text/plain application/x-javascript text/css application/xml;#指定压缩的类型,无论是否指定,“text/html”类型总是会被压缩

 

    gzip_vary  on;#该选项开启可以让前端的缓存服务器缓存经过gzip压缩的页面,例如,用Varnish缓存经过Nginx压缩的数据

 

 

 

server_tokens off;#隐藏Nginx版本号

 

 

 

server {

 

        listen      8000; #指定Nginx监端口

 

        server_name  localhost;#用来指定IP或者域名

 

 

 

        charset utf-8;#指定Nginx默认的字符集,只有utf-8支持中文字符

 

        access_log  logs/host.access.log  main;#指定访问日志的名称及位置

 

 

 

        location / {

 

            index  index.html index.htm;#设定默认首页

 

            root /tom/webapps/ROOT;#指定网页根目录

 

        }

 

 

 

location ~ (jsp|\?) {      #指定url中包含jsp或者?的全部转发到192.168.0.10的80端口即tomcat处理

 

            proxy_pass  http://192.168.0.10:80;

 

        }

补充阅读:http://blog.****.net/field_yang/article/details/52278390

 

状态监控模块:

nginx完整配置文件例子

nginx完整配置文件例子

注意访问的url

 

0 目录

 

目录
环境及目的
nginx配置文件特点和结构
1 特性
2 主配置文件结构


常用全局配置
1 main段
2 events段


web服务相关配置
1 server_namerootlisten
11 listen指令常用选项
12 server_name定义方式


2 location
21 alias定义路径别名


3 index定义主页
4 error_page定义错误页面
5 长连接相关指令
6 限制响应报文发送速率
7 文件元数据信息缓存
8 访问控制
9 basic认证
10 limit_except
11 状态信息页面
12 防盗链
13 作为https服务端
14 日志相关
141 access_log
142 log_format
143 open_log_file_cache
144 error_log


15 模块ngx_http_rewrite_module
151 rewrite
1511 机制
1512 基本效果
1513 循环重定向问题
1514 替换为的路径是httphttps
1515 各flag


152 rewrite_log
153 if
1531 常用条件
1532 示例


154 return
155 set


16 响应报文压缩
17 模块ngx_http_fastcgi_module
171 lnmp
1711 fastcgi_param
1712 fastcgi_index
1713 lnmp安装discuz


172 为fastcgi的提供缓存功能
1721 fastcgi_cache_path
1722 fastcgi_cache_key
1723 fastcgi_cache_valid
1724 fastcgi_cache
1724 压测效果

 


18 sendfile

 

 

 

 

1 环境及目的

本文演示nginx作为web服务的常用配置,相对于httpd的配置说明。

nginx版本1.8,已编译安装完成。 
安装目录及配置文件目录:

 

[[email protected] ~]% ls /usr/local/nginx
html  logs  nginx

[[email protected] ~]% ls /etc/nginx/
fastcgi.conf          fastcgi_params.default  mime.types          nginx.conf.default   uwsgi_params
fastcgi.conf.default  koi-utf                 mime.types.default  scgi_params          uwsgi_params.default
fastcgi_params        koi-win                 nginx.conf          scgi_params.default  win-utf1234567

安装使用的选项见 http://blog.****.net/wangzhenyu177/article/details/78633278 。

下面主要在nginx配置文件中使用不同配置,验证nginx作为web服务的各功能。 
为方便起见,把nginx命令添加至PATH:

 

[[email protected] ~]% cat /etc/profile.d/nginx.sh
export PATH=/usr/local/nginx:$PATH12

 

2 nginx配置文件特点和结构

 

2.1 特性


nginx是高度模块化的,编译时装载不同的模块,会在配置文件中引入不同的内置变量和指令;
除了内置变量还可自定义变量,格式”set NAME VALUE”,变量的设置和引用均需要”$”符号;
nginx由各指令配置,每个指令必须以分号结尾;
配置指令使用格式类似httpd的,都是”DIRECTIVE VALUE”;


不同模块的参考信息在官网 http://nginx.org/en/docs/ 模块参考项下。其中说明了各模块的内置变量和指令。大部分内置变量在http核心模块。

在nginx配置目录下有很多文件,基本见名知意。主配置文件为nginx.conf:

 

[[email protected] ~]% ls /etc/nginx/
fastcgi.conf          fastcgi_params.default  mime.types          nginx.conf.default   uwsgi_params
fastcgi.conf.default  koi-utf                 mime.types.default  scgi_params          uwsgi_params.default
fastcgi_params        koi-win                 nginx.conf          scgi_params.default  win-utf1234

 

2.2 主配置文件结构

nginx主配置文件结构大致形如:

 

【main段】

events{
    【events段】

http{
    【http段】

……1234567891011

本文编译nginx时没有使用”–with-mail”,所以配置文件中没有mail段。

和httpd类似,nginx的配置文件也可使用指令include把指定文件包含进来,这样可把配置定义在不同的文件中,便于编辑和维护。

主配置文件中,main配置段是直接写在配置文件中,events包括其他所有配置段,都需写在对应的大括号中。 
main段和events段对全局有效,称为全局配置。

 

3 常用全局配置

 

3.1 main段

main配置段主要定义了nginx运行的各属性,默认为:

 

#user  nobody;                                      # 运行worker进程的用户。由于本机上的nginx在编译时指定了用户nginx,这里nobody是注释
worker_processes  1;                                # 启动的worker进程数

#error_log  logs/error.log;                         # 错误日志的路径和级别
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;                         # pid文件路径12345678

main配置段指令由核心模块引入。常用指令:

 


  指令
  意义

 

  user USER [GROUP]
  指定运行worker进程的用户和组(注意master进程要由root运行,因为要监听套接字)。如不指定组,则就是用户所在的组


  pid PATH
  指定nginx的pid文件


  worker_rlimit_nofile
  指定一个worker进程最多打开的文件数


  worker_processes NUM
  指定启动的worker进程数1,默认值1。在较新版本中,参数可指定为”auto”,令其自动设置


  worker_cpu_affinity CPU_MASK
  用于定义worker进程和哪颗CPU有”亲和性”,worker进程就会只在指定的CPU上运行了。CPU使用CPU掩码指定2。也可在CPU掩码前加入”auto”令其自动在指定CPU设置亲和性


  worker_priority NUM
  设置worker进程的nice值以调整其优先级,默认值0。这个指令的参数范围也就是nice值范围(-20至19)

 


查看上述配置效果:

验证worker进程绑定CPU效果:

1、本虚拟机有2CPU核心:

 

[[email protected] ~]% lscpu | grep "CPU(s)"
CPU(s):                2
On-line CPU(s) list:   0,1
NUMA node0 CPU(s):     0,11234

2、启动nginx,因为默认worker进程数是1,所以只启动1个worker进程:

 

[[email protected] ~]% nginx

[[email protected] ~]% ps axo command,pid,psr | grep nginx | grep -v grep
nginx: master process nginx  1986   1
nginx: worker process        1987   012345

3、设置worker_processes为2,效果:

 

worker_processes  2;1

 

[[email protected] ~]% ps axo command,pid,psr | grep nginx | grep -v grep
nginx: master process nginx  1986   0
nginx: worker process        1996   0
nginx: worker process        1997   11234

由于只有2核心,所以master和某个worker运行在同1核心上了。

4、使两worker进程绑定在不同核心:

 

worker_processes  2;
worker_cpu_affinity 01 10;12

 

[[email protected] ~]% ps axo command,pid,psr | grep nginx | grep -v grep
nginx: master process nginx  1986   0
nginx: worker process        2017   0
nginx: worker process        2018   11234

前者worker运行于CPU0,后者运行于CPU1。

5、更换绑定的核心:

 

worker_processes  2;
worker_cpu_affinity 10 01;12

 

[[email protected] ~]% ps axo command,pid,psr | grep nginx | grep -v grep
nginx: master process nginx  1986   0
nginx: worker process        2062   1
nginx: worker process        2063   01234

前者worker运行于CPU1,后者运行于CPU0。

验证调整worker进程优先级效果:

1、默认情况下,nice值为0:

 

[[email protected] ~]% ps axo command,pid,ni | grep nginx | grep -v grep
nginx: master process nginx  1986   0
nginx: worker process        2062   0
nginx: worker process        2063   01234

2、调整nice值为-5:

 

worker_priority -5;1

 

[[email protected] ~]% ps axo command,pid,ni | grep nginx | grep -v grep
nginx: master process nginx  1986   0
nginx: worker process        2078  -5
nginx: worker process        2079  -51234

 

3.2 events段

默认配置:

 

events {
    worker_connections  1024;                       # 定义每个worker进程最大并发连接数
}123

events段常用指令:

 


  指令
  意义

 

  worker_connections NUM
  指定每个worker进程的最大并发连接数3。


  accept_mytex on|off
  多个worker进程负载均衡,轮流处理请求,否则是由较快的worker进程处理新请求。默认开启


  lock_file PATH
  如果多个worker进程负载均衡,需要锁文件。该选项用于指定锁文件路径。编译安装时也可通过./configure的选项指定

 

 


4 web服务相关配置

http段用于定义nginx作为web服务的配置。

http段结构:

 

http{
    ……

    server{
        【server1配置】
    }

    server{
        【server2配置】
    }

    ……
}12345678910111213

server就相当于httpd中的虚拟主机。不同之处是nginx没有中心主机,即便只有一个站点,也要使用一个server段定义。 
在server段外定义的配置,对所有server生效。

server段常用配置指令(如无特别说明在,则指令均来自http核心模块):

 

4.1 server_name、root、listen

 


  指令
  意义

 

  server_name
  指定虚拟主机名。相当于httpd虚拟主机段中的ServerName


  root
  指定页面文件根目录,如果使用相对路径,则相对的是编译安装目录(编译时–prefix指定的路径)。类似于httpd中的DocumentRoot,但不尽相同,root在location段中也常使用。定义root后,各指令所指定的相对路径,就是相对于root了


  listen IP [:PORT] [OPTIONS]
  指定监听的地址、端口

 


这是一个server最简单配置所必须的3指令。

注意: 
httpd中如果是基于IP区分的各虚拟主机,可不定义主机名。对于nginx,监听的地址、端口和server_name一般都要定义。

比如,定义两虚拟主机,监听在192.168.0.106主机的6666和8888端口:

 

server {
        listen 6666;                               # 不指定IP表示监听在本机所有IP的6666端口
        server_name www.6666.com;
        root /var/www/6666;
    }

server {
        listen 8888;
        server_name www.8888.com;
        root /var/www/8888;
    }1234567891011

对应的不同主页内容:

 

[[email protected] ~]% cat /var/www/6666/index.html 
Index Page from 192.168.0.106:6666
[[email protected] ~]% cat /var/www/8888/index.html 
Index Page from 192.168.0.106:88881234

访问效果:

 

 

 

4.1.1 listen指令常用选项

listen指令格式为:listen IP [:PORT] [OPTIONS],其后可以跟众多选项。常用options为:

 


  选项
  意义

 

  default_server
  设置默认虚拟主机,即当没有虚拟主机符合请求时,使用默认虚拟主机响应


  rcvbuf=SIZE
  接收缓冲区大小


  sndbuf=SIZE
  发送缓冲区大小


  ssl
  限制仅能通过ssl连接进行服务,即提供https服务。这时监听的端口应指定为443

 

 


4.1.2 server_name定义方式

定义server_name,用于使用户可根据主机名访问不同主机4。 
定义主机名有以下几种方式:

 


  方式
  示例

 

  精确主机名
  www.test.com


  左侧使用通配
  *.test.com


  右侧使用通配
  www.test.*


  正则表达式匹配
  ~www.test.com$~。要使用波浪线括起来

 


如果客户端在浏览器键入的主机名可以被上述方式中的多种匹配到,则优先级是:精确主机名–>左侧使用通配–>右侧使用通配–>正则表达式匹配。

 

4.2 location

使用格式:location [ = | ~ | ~* | ^~ ] uri { ... }。表示对匹配到的URI,做指定配置。

使用范围:server段、location段

匹配URI的方式,按优先级依次为:

 


  方式
  意义

 

  =PATH
  精确匹配路径


  ^~PATH
  使用正则表达式匹配URI的前半段


  ~PATH
  使用正则表达式匹配URI,区分大小写


  ~*PATH
  使用正则表达式匹配URI,不区分大小写


  PATH
  直接使用PATH匹配,表示在PATH路径下的资源

 


即优先级是先匹配小范围,再匹配大范围。

官方文档的示例:

 

location = / {                                  # 仅当URI为"/"时,使用A配置
    [ configuration A ]
}

location / {                                    # URI为"/"下包含的路径时,使用B配置
    [ configuration B ]
}

location /documents/ {                          # URI为"/documents/"下包含的路径时,使用C配置
    [ configuration C ]
}

location ^~ /images/ {                         # URI靠前部分为"/images/",使用D配置
    [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {                   # URI结尾是gif、jpg或jpeg时,使用E配置
    [ configuration E ]
}12345678910111213141516171819

按上述定义,和优先级规则。比如:

“www.test.com/”匹配A配置; 
“www.test.com/test”、”www.test.com/example”匹配B配置,因为URI都在”/”下; 
“www.test.com/documents/test.html”匹配C配置,虽然它也符合B配置,但能匹配到的越长优先级越高; 
“www.test.com/images/test.html”匹配D配置,虽然它也符合B配置,但正则表达式匹配前端字符优先级高; 
“www.test.com/documents/test.jpg”匹配E配置,虽然它也符合C配置,但正则表达式匹配高于普通字符串。

 

4.2.1 alias定义路径别名

指令alias,仅能定义在location段中,用于把location指定的URI定义别名。

比如:

 

location /test/ {
    alias /data/test/;
}123

表示把uri中的”/test”替换为”/data/test”。 
以具体请求为例,上述的效果是把”http://www.test.com/test/index.html“访问的资源替换为服务端文件系统路径的”/data/test/index.html”,而不是”http://www.test.com/data/test/index.html“。也就是,alias的参数是服务端资源的文件系统路径,不是在原URI上做的替换5。

以106主机为例,配置server:

 

server{
        listen 80;
        server_name www.host.com;
        root /var/www/;
        access_log /var/log/nginx/access_log;
}123456

分别有文件:

 

[[email protected] ~]% cat /var/www/host1/host.html 
@host1
[[email protected] ~]% cat /var/www/host2/host.html 
@host21234

访问效果:

 

 

修改配置文件,添加路径别名:

 

server{
        listen 80;
        server_name www.host.com;
        root /var/www/;
        access_log /var/log/nginx/access_log;

        location /host1/ {
                alias /var/www/host2/;
        }
}12345678910

效果,访问host1,返回的是host2目录下的host.html:

 

特别地,当alias定义的某路径A的别名为/PATH/A,即把某路径A的别名定义为指定路径下的A,则功能同root。比如:

 

location /test/ {
                alias /var/www/test/;
        }123

相当于:

 

location /test/ {
                root /var/www;
        }123

即把指定路径作为location的URI的根路径。如果出现这种情况,最好就使用root了。

4.3 index定义主页

指令index来自模块ngx_\http_index_module。用于定义主页。

使用范围:http段、server段、location段。定义在不同的段有不同的生效范围。默认值是index.html

比如server段配置为:

 

server{
        listen 80;
        server_name www.host.com;
        root /var/www/;
        access_log /var/log/nginx/access_log;

        index host1/host.html;
}12345678

 

[[email protected] ~]% cat /var/www/host1/host.html 
@host112

直接访问IP,效果:

 

 

4.4 error_page定义错误页面

指令error_page,用于自定义错误页面。

使用格式:error_page code ... [=[response]] uri。表示根据响应码code(可指定多个),返回给客户端uri指定的页面。

使用范围:http段、server段、location段、location段中的if语句

比如,在106主机定义文件,用于响应码为404的情况:

 

[[email protected] ~]% cat /var/www/error/404.html
The 404 page from 192.168.0.10612

在server段定义:

 

server{
        listen 80;
        server_name www.host.com;
        root /var/www/;

        error_page 404 /error/404.html;                    # 参数是URI,所以写的不是绝对路径
}1234567

效果:

 

有的访问不到,可能是浏览器原因,360、qq浏览器都显示的是它们定义的错误页面。

1、上述的404.html也是个页面文件,且正常显示了,那么是否响应码就成200了?

 

打开浏览器调试界面,可以看到响应码就是404,虽然返回的是一个页面文件6。 
不过如果需要专门修改错误页面的响应码,则使用error_page指令的”=response”即可。 
比如server段的error_page改为:

 

error_page 404 =200 /error/404.html;1

效果是返回自定义的404错误页面,状态码是200:

 

不过最好还是使用默认的,状态码乱改容易出问题。

2、error_page的实质是把对指定URI的错误请求,重定向至一个自定义页面。相当于客户端重新访问了服务端(只是相当于。其实这个过程客户端并不参与,由nginx自动进行),只不过请求的资源被重定向为了自定义的错误页面。

为此,要避免出现如下情况。比如在106主机的server段定义:

 

server{
        listen 80;
        server_name www.host.com;
        root /var/www/;

        location /test1 {
                error_page 404 /test1_error.html;
        }
}123456789

定义错误页面:

 

[[email protected] ~]% cat /var/www/test1_error.html 
<h1>test1_error</h1>12

由于是在/test1的location中自定义了错误页面,所以访问test1路径才会有:

 

如果在server段中增加一个location,要避免造成循环。即:


location1中定义的error_page符合location2指定的URI;
location2中定义的error_page恰好又符合location1指定的URI。


如果触发location1的error_page,于是重新匹配到location2中的错误页面,而后又重定向到location1的……最终可能会返回500。

避免这种情况,主要是要定义好location指定的URI,个人认为如果能使用精确匹配,最好使用精确匹配,这样应该较不容易出现循环。

这种情况就不演示了,在下文rewrite指令中有类似情况详细说明。

 

4.5 长连接相关指令

 


  指令
  意义

 

  keepalive_timeout
  用于指定长连接超时时长。默认值75秒。只要该指令指定数字不为0则表示启用了长连接,0为关闭


  keepalive_requests
  用于指定一次长连接所能获取的资源数量,默认100个。意义同httpd的


  keepalive_disable
  用于指定对哪些浏览器禁用长连接。因为有的浏览器不支持长连接。默认是对ie6禁用


  tcp_nodelay on|off
  仅在长连接时生效,指定是否不延迟(因缓存小数据的tcp报文造成的延迟)tcp报文,默认开启

 


其他容易理解,主要说下tcp_nodelay。 
需先说明tcp的一个机制:


tcp连接在有用户请求小数据(比如1个字节大小)且是长连接时,如果给这种数据单独封装报文发送,往往浪费开销(各首部大小就已经大于数据大小了)。
默认情况下,tcp协议对这种场景有优化机制:自动将其先缓存下来,待有多个小数据报文等待发送时,把他们封装成一个报文一并发送,以节约带宽。


这种机制对于web服务器可能不适用,造成的结果是:用户如果请求的就是一个小数据,可能半天等不到,需要请求多个资源才会响应。 
tcp_nodelay就是指定不使用这种机制。当然它默认是开启的,一般也无需关注。

 

4.6 限制响应报文发送速率

指令limit_rate,用于限制响应报文的发送速率(比如用于下载站点限速)。

使用范围:http段、server段、location段、location段中的if语句

使用格式:limit_rate NUM,参数的单位是字节/秒。默认是0,表示不限制速率。

使用对应的变量来配置,也具有相同的意义:

 

server {

    if ($slow) {
        set $limit_rate 4k;                  # 这种方式通常用于,是否限速依赖于指定条件的时候
    }

    ...
}12345678

验证效果:

1、106主机server段配置为:

 

server {
        listen 80;
        server_name www.test.com;
        root /var/www;

        location /test {
                limit_rate 10k;
        }
}123456789

2、把/var/log/messages目录复制到/var/www/test下,并开启读权限。

3、使用wget下载,速率大约就限制在10k:

 

 

4.7 文件元数据信息缓存

缓存用户请求的文件的元数据信息(文件描述符、大小、最近修改时间等),作用是在再次响应相同文件时能够快速响应(尤其是根据最近修改时间,可知请求的资源是否发生过变化)。

相关指令:

 


  指令、格式
  意义

 

  open_file_cache max=N [inactive=time]
  指定是否开启文件元数据缓存,默认off。如启用需指定max=NUM,表示指定缓存最大记录数;inactive指定非活动时长(默认60秒),经过该时长未被访问到的记录(或低于open_file_cache_min_uses指定的次数)被视为非活动缓存


  open_file_cache_errors on|off
  如果开启文件元数据缓存,则该指令指定是否缓存访问失败的信息(包括没有指定资源、没有权限等)。默认off


  open_file_cache_min_uses
  与openssh_file_cache指令中的incative参数关系密切,它定义的是在incative定义的时间内,未达到指定访问次数的记录,均被视为非活动(即需清除)。默认为1


  open_file_cache_valid
  设置多长周期检查一次缓存,以清除非活动缓存记录。默认60秒

 


如果启用文件元数据缓存,则这几个指令一般一起使用。官方文档示例:

 

open_file_cache          max=1000 inactive=20s;             # 最大记录数1000,非活动时长20秒
open_file_cache_valid    30s;                               # 每30秒检查、清理非活动缓存记录
open_file_cache_min_uses 2;                                 # inactive期间被访问低于2次,就被视为非活动缓存记录
open_file_cache_errors   on;                                # 缓存访问失败的文件信息1234

 

4.8 访问控制

指令allow、deny用于访问控制,来自模块ngx_http_access_module。

使用范围:http段、server段、location段、limit_except指令。

官方文档示例:

 

location / {
    deny  192.168.1.1;
    allow 192.168.1.0/24;
    allow 10.1.1.0/16;
    deny  all;
}123456

检查次序由上而下。 
上述规则允许访问请求的源IP为192.168.1.0/24网段(但拒绝192.168.1.1)、10.1.1.0/16网段。其他均拒绝。

访问控制效果同httpd的,此处不赘述了。

 

4.9 basic认证

nginx也支持http basic认证协议,通过用户名、密码认证用户,同httpd中的一样。基于模块ngx_http_auth_basic_module。

相关指令:

 


  指令
  意义
  使用范围

 

  auth_basic STRING | off
  设置是否启用basic认证。STRING表示启用,并且就是提示框中的信息
  http段、server段、location段、limit_except指令


  auth_basic_user_file
  指定用户名、密码存储的文件(可用htpasswd或openssl passwd等生成)
  http段、server段、location段、limit_except指令

 


演示效果:

1、创建用户、密码存放的认证文件,并添加用户user1:

 

[[email protected] ~]% htpasswd -c -m /var/www/auth_basic user1
New password: 
Re-type new password: 
Adding password for user user11234

2、在nginx配置文件中设置:

 

server {
        listen 80;
        server_name www.test.com;
        root /var/www;

        location / {
                auth_basic "You must input password.";
                auth_basic_user_file /var/www/auth_basic;             # 注意,参数是服务端的文件绝对路径,而不是相对于root的URI
        }
}12345678910

3、访问时需键入用户名、密码:

 

输入正确后可访问:

 

不输入则返回401:

 

 

4.10 limit_except

使用范围:location段 
可对指定请求方法的报文做限制。请求方法有很多,特别地,只要GET请求方法被允许,则HEAD也自动被允许。

注意,该命令本身不具备限制功能,要结合标题4.8、4.9的各访问控制指令、认证指令才能完成。该命令只是匹配对应请求方法的报文

使用格式:limit_except method ... { ... }

比如,在某location中定义:

 

limit_except GET {
    allow 192.168.1.0/32;
    deny  all;
}1234

意义为,只要请求报文的请求方法不是GET(和HEAD),则:


仅allow网段192.168.1.0/32发来的请求
拒绝其他所有主机的请求


所以,命令limit_except可看作一个限制请求方法的容器。起到控制作用的是,定义在其中的访问控制或basic认证指令。

示例:

1、192.168.0.106主机运行nginx,定义server段中的location如下:

 

location / {
                limit_except GET {
                        deny 192.168.0.106;
                        allow 192.168.0.61;
                }
        }123456

2、106主机和61主机分别访问效果:

在106主机:

 

[[email protected] ~]% curl http://192.168.0.106/test.html
<h1>test [email protected]</h1>12

在61主机:

 

[[email protected] ~]% curl http://192.168.0.106/test.html
<h1>test [email protected]</h1>12

因为限制的方法是除GET以外的方法,所以GET请求没有受影响,都是允许访问的

3、 改为限制除PUT以外的方法的报文,则GET请求就会受影响了:

 

location / {
                limit_except PUT {
                        deny 192.168.0.106;
                        allow 192.168.0.61;
                }
        }123456

效果就是106被拒绝、61可访问:

 

[[email protected] ~]% curl http://192.168.0.106/test.html
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.8.1</center>
</body>
</html>