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.csdn.net/field_yang/article/details/52278390

状态监控模块:

注意访问的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,已编译安装完成。 
安装目录及配置文件目录:

[root@node1 ~]% ls /usr/local/nginx
html  logs  nginx

[root@node1 ~]% 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.csdn.net/wangzhenyu177/article/details/78633278 。

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

[root@node1 ~]% 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:

[root@node1 ~]% 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核心:

[root@node1 ~]% 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进程:

[root@node1 ~]% nginx

[root@node1 ~]% 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

[root@node1 ~]% 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

[root@node1 ~]% 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

[root@node1 ~]% 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:

[root@node1 ~]% 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

[root@node1 ~]% 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

对应的不同主页内容:

[root@node1 ~]% cat /var/www/6666/index.html 
Index Page from 192.168.0.106:6666
[root@node1 ~]% 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

分别有文件:

[root@node1 ~]% cat /var/www/host1/host.html 
@host1
[root@node1 ~]% 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

[root@node1 ~]% 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的情况:

[root@node1 ~]% 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

定义错误页面:

[root@node1 ~]% 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:

[root@node1 ~]% 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主机:

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

在61主机:

[root@node61 ~]% 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可访问:

[root@node106 ~]% 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>

————————————————————————————————————————————————————————————————————————————————————————————————————————————————

nginx概述

nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;nginx可以作为一个HTTP服务器进行网站的发布处理,另外nginx可以作为反向代理进行负载均衡的实现。

这里主要通过三个方面简单介绍nginx

  • 反向代理
  • 负载均衡
  • nginx特点

1. 反向代理

关于代理

说到代理,首先我们要明确一个概念,所谓代理就是一个代表、一个渠道;

此时就设计到两个角色,一个是被代理角色,一个是目标角色,被代理角色通过这个代理访问目标角色完成一些任务的过程称为代理操作过程;如同生活中的专卖店~客人到adidas专卖店买了一双鞋,这个专卖店就是代理,被代理角色就是adidas厂家,目标角色就是用户


正向代理

说反向代理之前,我们先看看正向代理,正向代理也是大家最常接触的到的代理模式,我们会从两个方面来说关于正向代理的处理模式,分别从软件方面和生活方面来解释一下什么叫正向代理

在如今的网络环境下,我们如果由于技术需要要去访问国外的某些网站,此时你会发现位于国外的某网站我们通过浏览器是没有办法访问的,此时大家可能都会用一个操作FQ进行访问,FQ的方式主要是找到一个可以访问国外网站的代理服务器,我们将请求发送给代理服务器,代理服务器去访问国外的网站,然后将访问到的数据传递给我们!

上述这样的代理模式称为正向代理,正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。


反向代理

明白了什么是正向代理,我们继续看关于反向代理的处理方式,举例如我大天朝的某宝网站,每天同时连接到网站的访问人数已经爆表,单个服务器远远不能满足人民日益增长的购买欲望了,此时就出现了一个大家耳熟能详的名词:分布式部署;也就是通过部署多台服务器来解决访问人数限制的问题;某宝网站中大部分功能也是直接使用nginx进行反向代理实现的,并且通过封装nginx和其他的组件之后起了个高大上的名字:Tengine,有兴趣的童鞋可以访问Tengine的官网查看具体的信息:http://tengine.taobao.org/
那么反向代理具体是通过什么样的方式实现的分布式的集群操作呢,我们先看一个示意图:

通过上述的图解大家就可以看清楚了,多个客户端给服务器发送的请求,nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。此时~请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,nginx扮演的就是一个反向代理角色

反向代理,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息!

项目场景

通常情况下,我们在实际项目操作时,正向代理和反向代理很有可能会存在在一个应用场景中,正向代理代理客户端的请求去访问目标服务器,目标服务器是一个反向单利服务器,反向代理了多台真实的业务处理服务器。具体的拓扑图如下:

2. 负载均衡

我们已经明确了所谓代理服务器的概念,那么接下来,nginx扮演了反向代理服务器的角色,它是以依据什么样的规则进行请求分发的呢?不用的项目应用场景,分发的规则是否可以控制呢?

这里提到的客户端发送的、nginx反向代理服务器接收到的请求数量,就是我们说的负载量

请求数量按照一定的规则进行分发到不同的服务器处理的规则,就是一种均衡规则

所以~将服务器接收到的请求按照规则分发的过程,称为负载均衡。

负载均衡在实际项目操作过程中,有硬件负载均衡和软件负载均衡两种,硬件负载均衡也称为硬负载,如F5负载均衡,相对造价昂贵成本较高,但是数据的稳定性安全性等等有非常好的保障,如中国移动中国联通这样的公司才会选择硬负载进行操作;更多的公司考虑到成本原因,会选择使用软件负载均衡,软件负载均衡是利用现有的技术结合主机硬件实现的一种消息队列分发机制

nginx支持的负载均衡调度算法方式如下:

  1. weight轮询(默认):接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。 这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。

  2. ip_hash:每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。

  3. fair:智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是nginx默认不支持fair算法,如果要使用这种调度算法,请安装upstream_fair模块

  4. url_hash:按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在nginx作为静态服务器的情况下提高缓存效率。同样要注意nginx默认不支持这种调度算法,要使用的话需要安装nginx的hash软件包

Nginx安装

1. windows安装

官方网站下载地址:

https://nginx.org/en/download.html

如下图所示,下载对应的版本的nginx压缩包,解压到自己电脑上存放软件的文件夹中即可

解压完成后,文件目录结构如下:

 

启动nginx

1) 直接双击该目录下的nginx.exe,即可启动nginx服务器

2) 命令行计入该文件夹,执行nginx命令,也会直接启动nginx服务器

D:/resp_application/nginx-1.13.5> nginx

 

访问nginx

打开浏览器,输入地址:http://localhost,访问页面,出现如下页面表示访问成功

 

停止nginx

命令行进入nginx根目录,执行如下命令,停止服务器:

# 强制停止nginx服务器,如果有未处理的数据,丢弃
D:/resp_application/nginx-1.13.5> nginx -s stop

# 优雅的停止nginx服务器,如果有未处理的数据,等待处理完成之后停止
D:/resp_application/nginx-1.13.5> nginx -s quit

 

2. ubuntu安装

按照正常软件的安装方式,直接通过如下命令进行安装:

$ sudo apt-get install nginx

安装完成即可,在/usr/sbin/目录下是nginx命令所在目录,在/etc/nginx/目录下是nginx所有的配置文件,用于配置nginx服务器以及负载均衡等信息

查看nginx进程是否启动

$ ps -ef|grep nginx

nginx会自动根据当前主机的CPU的内核数目创建对应的进程数量(当前ubuntu主机是2核4线程配置)

备注:这里启动的服务进程其实是4个进程,因为nginx进程在启动的时候,会附带一个守护进程,用于保护正式进程不被异常终止;如果守护进程一旦返现nginx继承被终止了,会自动重启该进程。

守护进程一般会称为master进程,业务进程被称为worker进程

启动nginx服务器命令

直接执行nginx会按照默认的配置文件进行服务器的启动

$ nginx

停止nginx服务命令

和windows系统执行过程一样,两种停止方式

$ nginx -s stop
or
$ nginx -s quit

重新启动加载

同样也可以使用命令reopen和reload来重新启动nginx或者重新加载配合着文件。

 

3. mac os安装

直接通过brew进行nginx的安装,或者下载tar.gz压缩包都是可以的。

直接通过brew进行安装

brew install nginx

安装完成后,后续的命令操作,服务器的启动、进程查看、服务器的停止、服务器的重启已经文件加载命令都是一致的。

nginx配置

nginx是一个功能非常强大的web服务器加反向代理服务器,同时又是邮件服务器等等

在项目使用中,使用最多的三个核心功能是反向代理、负载均衡和静态服务器

这三个不同的功能的使用,都跟nginx的配置密切相关,nginx服务器的配置信息主要集中在nginx.conf这个配置文件中,并且所有的可配置选项大致分为以下几个部分

main                                # 全局配置

events {                            # nginx工作模式配置

}

http {                                # http设置
    ....

    server {                        # 服务器主机配置
        ....
        location {                    # 路由配置
            ....
        }

        location path {
            ....
        }

        location otherpath {
            ....
        }
    }

    server {
        ....

        location {
            ....
        }
    }

    upstream name {                    # 负载均衡配置
        ....
    }
}

如上述配置文件所示,主要由6个部分组成:

  1. main:用于进行nginx全局信息的配置
  2. events:用于nginx工作模式的配置
  3. http:用于进行http协议信息的一些配置
  4. server:用于进行服务器访问信息的配置
  5. location:用于进行访问路由的配置
  6. upstream:用于进行负载均衡的配置

main模块

观察下面的配置代码

# user nobody nobody;
worker_processes 2;
# error_log logs/error.log
# error_log logs/error.log notice
# error_log logs/error.log info
# pid logs/nginx.pid
worker_rlimit_nofile 1024;

上述配置都是存放在main全局配置模块中的配置项

  • user用来指定nginx worker进程运行用户以及用户组,默认nobody账号运行
  • worker_processes指定nginx要开启的子进程数量,运行过程中监控每个进程消耗内存(一般几M~几十M不等)根据实际情况进行调整,通常数量是CPU内核数量的整数倍
  • error_log定义错误日志文件的位置及输出级别【debug / info / notice / warn / error / crit】
  • pid用来指定进程id的存储文件的位置
  • worker_rlimit_nofile用于指定一个进程可以打开最多文件数量的描述

event 模块

上干货

event {
    worker_connections 1024;
    multi_accept on;
    use epoll;
}

上述配置是针对nginx服务器的工作模式的一些操作配置

  • worker_connections 指定最大可以同时接收的连接数量,这里一定要注意,最大连接数量是和worker processes共同决定的。
  • multi_accept 配置指定nginx在收到一个新连接通知后尽可能多的接受更多的连接
  • use epoll 配置指定了线程轮询的方法,如果是linux2.6+,使用epoll,如果是BSD如Mac请使用Kqueue

http模块

作为web服务器,http模块是nginx最核心的一个模块,配置项也是比较多的,项目中会设置到很多的实际业务场景,需要根据硬件信息进行适当的配置,常规情况下,使用默认配置即可!

http {
    ##
    # 基础配置
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # SSL证书配置
    ##

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;

    ##
    # 日志配置
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip 压缩配置
    ##

    gzip on;
    gzip_disable "msie6";

    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/javascript
 text/xml application/xml application/xml+rss text/javascript;

    ##
    # 虚拟主机配置
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;

1) 基础配置

sendfile on:配置on让sendfile发挥作用,将文件的回写过程交给数据缓冲去去完成,而不是放在应用中完成,这样的话在性能提升有有好处
tc_nopush on:让nginx在一个数据包中发送所有的头文件,而不是一个一个单独发
tcp_nodelay on:让nginx不要缓存数据,而是一段一段发送,如果数据的传输有实时性的要求的话可以配置它,发送完一小段数据就立刻能得到返回值,但是不要滥用哦

keepalive_timeout 10:给客户端分配连接超时时间,服务器会在这个时间过后关闭连接。一般设置时间较短,可以让nginx工作持续性更好
client_header_timeout 10:设置请求头的超时时间
client_body_timeout 10:设置请求体的超时时间
send_timeout 10:指定客户端响应超时时间,如果客户端两次操作间隔超过这个时间,服务器就会关闭这个链接

limit_conn_zone $binary_remote_addr zone=addr:5m :设置用于保存各种key的共享内存的参数,
limit_conn addr 100: 给定的key设置最大连接数

server_tokens:虽然不会让nginx执行速度更快,但是可以在错误页面关闭nginx版本提示,对于网站安全性的提升有好处哦
include /etc/nginx/mime.types:指定在当前文件中包含另一个文件的指令
default_type application/octet-stream:指定默认处理的文件类型可以是二进制
type_hash_max_size 2048:混淆数据,影响三列冲突率,值越大消耗内存越多,散列key冲突率会降低,检索速度更快;值越小key,占用内存较少,冲突率越高,检索速度变慢

2) 日志配置

access_log logs/access.log:设置存储访问记录的日志
error_log logs/error.log:设置存储记录错误发生的日志

3) SSL证书加密

ssl_protocols:指令用于启动特定的加密协议,nginx在1.1.13和1.0.12版本后默认是ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2,TLSv1.1与TLSv1.2要确保OpenSSL >= 1.0.1 ,SSLv3 现在还有很多地方在用但有不少被攻击的漏洞。
ssl prefer server ciphers:设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件

4) 压缩配置

gzip 是告诉nginx采用gzip压缩的形式发送数据。这将会减少我们发送的数据量。
gzip_disable 为指定的客户端禁用gzip功能。我们设置成IE6或者更低版本以使我们的方案能够广泛兼容。
gzip_static 告诉nginx在压缩资源之前,先查找是否有预先gzip处理过的资源。这要求你预先压缩你的文件(在这个例子中被注释掉了),从而允许你使用最高压缩比,这样nginx就不用再压缩这些文件了(想要更详尽的gzip_static的信息,请点击这里)。
gzip_proxied 允许或者禁止压缩基于请求和响应的响应流。我们设置为any,意味着将会压缩所有的请求。
gzip_min_length 设置对数据启用压缩的最少字节数。如果一个请求小于1000字节,我们最好不要压缩它,因为压缩这些小的数据会降低处理此请求的所有进程的速度。
gzip_comp_level 设置数据的压缩等级。这个等级可以是1-9之间的任意数值,9是最慢但是压缩比最大的。我们设置为4,这是一个比较折中的设置。
gzip_type 设置需要压缩的数据格式。上面例子中已经有一些了,你也可以再添加更多的格式。

5) 文件缓存配置

open_file_cache 打开缓存的同时也指定了缓存最大数目,以及缓存的时间。我们可以设置一个相对高的最大时间,这样我们可以在它们不活动超过20秒后清除掉。
open_file_cache_valid 在open_file_cache中指定检测正确信息的间隔时间。
open_file_cache_min_uses 定义了open_file_cache中指令参数不活动时间期间里最小的文件数。
open_file_cache_errors 指定了当搜索一个文件时是否缓存错误信息,也包括再次给配置中添加文件。我们也包括了服务器模块,这些是在不同文件中定义的。如果你的服务器模块不在这些位置,你就得修改这一行来指定正确的位置。

server模块

srever模块配置是http模块中的一个子模块,用来定义一个虚拟访问主机,也就是一个虚拟服务器的配置信息

server {
    listen        80;
    server_name localhost    192.168.1.100;
    root        /nginx/www;
    index        index.php index.html index.html;
    charset        utf-8;
    access_log    logs/access.log;
    error_log    logs/error.log;
    ......
}

核心配置信息如下:

  • server:一个虚拟主机的配置,一个http中可以配置多个server

  • server_name:用力啊指定ip地址或者域名,多个配置之间用空格分隔

  • root:表示整个server虚拟主机内的根目录,所有当前主机中web项目的根目录

  • index:用户访问web网站时的全局首页

  • charset:用于设置www/路径中配置的网页的默认编码格式

  • access_log:用于指定该虚拟主机服务器中的访问记录日志存放路径

  • error_log:用于指定该虚拟主机服务器中访问错误日志的存放路径

location模块

location模块是nginx配置中出现最多的一个配置,主要用于配置路由访问信息

在路由访问信息配置中关联到反向代理、负载均衡等等各项功能,所以location模块也是一个非常重要的配置模块

基本配置

location / {
    root    /nginx/www;
    index    index.php index.html index.htm;
}

location /:表示匹配访问根目录

root:用于指定访问根目录时,访问虚拟主机的web目录

index:在不指定访问具体资源时,默认展示的资源文件列表

反向代理配置方式

通过反向代理代理服务器访问模式,通过proxy_set配置让客户端访问透明化

location / {
    proxy_pass http://localhost:8888;
    proxy_set_header X-real-ip $remote_addr;
    proxy_set_header Host $http_host;
}

uwsgi配置

wsgi模式下的服务器配置访问方式

location / {
    include uwsgi_params;
    uwsgi_pass localhost:8888
}

upstream模块

upstream模块主要负责负载均衡的配置,通过默认的轮询调度方式来分发请求到后端服务器

简单的配置方式如下

upstream name {
    ip_hash;
    server 192.168.1.100:8000;
    server 192.168.1.100:8001 down;
    server 192.168.1.100:8002 max_fails=3;
    server 192.168.1.100:8003 fail_timeout=20s;
    server 192.168.1.100:8004 max_fails=3 fail_timeout=20s;
}

核心配置信息如下

  • ip_hash:指定请求调度算法,默认是weight权重轮询调度,可以指定

  • server host:port:分发服务器的列表配置

  • -- down:表示该主机暂停服务

  • -- max_fails:表示失败最大次数,超过失败最大次数暂停服务

  • -- fail_timeout:表示如果请求受理失败,暂停指定的时间之后重新发起请求

猜你喜欢

转载自blog.csdn.net/qq_23587541/article/details/85702776