深入理解Nginx-第2章 - Nginx的配置 - 二

2.4 用HTTP 核心模块配置一个静态Web服务器

           静态Web服务器的主要功能由ngx_http_core_module模块实现,当然,一个完整的静态Web服务器还有许多功能是由其他的HTTP模块实现的。本节主要讨论如何配置一个包含基本功能的Web服务器。文中主要说明ngx_http_core_module模块提供的配置项及变量的用法。

           除了之前提到的基本配置项外,一个典型的静态Web服务器还会包含多个server块和location块,例如:


           所有的HTTP配置项都必须直属于http块、server块、location块、upstream块或if块等。Nginx为配置一个完整的静态Web服务器提供了非常多的功能,下面把这些配置项分为以下8类进行详述:虚拟主机与请求的分发、文件路径的定义、内存及磁盘资源的分配、网络连接的设置、MIME类型的设置、对客户端请求的限制、文件操作的优化、对客户端请求的特殊处理。

 2.4.1 虚拟主机与请求分发 

           由于IP地址的数量有限,因此经常存在多个主机域名对应着同一个IP地址的情况,这时在nginx.conf中就可以按照server_name并通过server块来定义虚拟主机,每个server块就是一个虚拟主机,它只处理与之对应的主机域名请求。这样,一台服务器上的Nginx就能以不同的方式处理访问不同主机域名的HTTP请求了。  

#监听端口  
语法:listen   address:port[default | default_server | [backlong=num | rcvbuf=size | sndbuf=size |   
# accept_filter | deferred | bind | ipv6only=[on | off] | ssl]];  
# 默认:listen:80;  
#配置块范围:server  
# 说明:  
#   default或default_server:将所在的server块作为web服务的默认server块;当请求无法匹配配置文件中的所有主机名时,就会选择默认的虚拟主机(server块);  
#   backlog=num:表示 TCP 中backlog队列存放TCP新连接请求的大小,默认是-1,表示不予设置;  在TCP建立三次握手过程中,进程还没有开始处理监听句柄,这时backlog队列将会放置这些新连接。
#   rcvbuf=size:设置监听句柄SO_RCVBUF的参数;  
#   sndbuf=size:设置监听句柄SO_SNDBUF的参数;  
#   accept_filter:设置accept过滤器,只对FreeBSD操作系统有用;  
#   deferred:设置该参数后,若用户发起TCP连接请求,并且完成TCP三次握手,但是若用户没有发送数据,则不会唤醒worker进程,直到发送数据;  
#   bind:绑定当前端口 / 地址对,只有同时对一个端口监听多个地址时才会生效;  
#   ssl:在当前端口建立的连接必须基于ssl协议;  
  
#主机名称  
#语法:server_name  name[...];  
#默认:server_name  "";  
#配置块范围:server  
 在开始处理一个HTTP请求时,Nginx会取出header头中的Host,与每个server中的server_name进行匹配(server_name后可以跟多个主机名),以此决定到底由哪一个server块来处理这个请求。 
 
#server name 是使用散列表存储的  
#每个散列桶占用内存大小  
#语法:server_names_hash_bucket_size    size;  
#默认:server_names_hash_bucker_size    32|64|128;  
 
#散列表最大bucket数量 ,这个大小会影响散列表的冲突率。越大,内存消耗越多,但冲突率则越小,检索速度也更快
#语法:server_names_hash_max_size   size;  
#默认:server_names_hash_max_size   512;  
#配置块范围:server、http、location  
  
#处理重定向主机名,打开时表示在重定向请求时会使用server_name里配置的第一个主机名代替原先请求中的Host头部  
#语法:server_name_in_redirect  on | off;  
#默认:server_name_in_redirect  on;  
#配置块范围:server、http、location  
  
#location语法:location[= | ~ | ~* | ^~ | @] /uri/ {}    
#配置块范围:server  
#location尝试根据用户请求中的URI来匹配 /uri表达式,若匹配成功,则执行{}里面的配置来处理用户请求    
#以下是location的一般配置项    
#1、以root方式设置资源路径    
#   语法格式:root path;    
#2、以alias方式设置资源路径    
#   语法格式:alias path;    
#3、访问首页    
#   语法格式:index file...;    
#4、根据HTTP返回码重定向页面    
#   语法格式:error_page code [code...] [= | =answer-code] uri | @named_location;    
#5、是否允许递归使用error_page    
#   语法格式:recursive_error_pages [on | off];    
#6、try_files    
#   语法格式:try_files path1 [path2] uri;    

2.4.2  文件路径的定义  

#root方式设置资源路径  
#语法:root path;  
#默认:root html;  
#配置块范围:server、http、location、if  
  
#以alias方式设置资源路径  
#语法:alias path;  
#配置块范围:location  
  
#访问主页  
#语法:index    file...;  
#默认:index    index.html;  
#配置块范围:http、server、location  
  
#根据HTTP返回码重定向页面    
#   语法:error_page code [code...] [= | =answer-code] uri | @named_location;    
#配置块范围:server、http、location、if  
  
#是否允许递归使用error_page    
#   语法:recursive_error_pages [on | off];    
#配置块范围:http、server、location  
  
#try_files    
#   语法:try_files path1 [path2] uri;    
#配置块范围:server、location    

2.4.3  内存及磁盘资源分配

下面介绍处理请求时内存、磁盘资源分配的配置项  

# HTTP 包体只存储在磁盘文件中  
# 语法:client_body_in_file_only    on | clean | off;  
# 默认:client_body_in_file_only  off;  
# 配置块范围:http、server、location  
  
# HTTP 包体尽量写入到一个内存buffer中  
# 语法:client_body_single_buffer   on | off;  
# 默认:client_body_single_buffer   off;  
# 配置块范围:http、server、location  
  
# 存储 HTTP 头部的内存buffer大小  
# 语法:client_header_buffer_size   size;  
# 默认:client_header_buffer_size   1k;  
# 配置块范围:http、server  
  
# 存储超大 HTTP 头部的内存buffer大小  
# 语法:large_client_header_buffer_size   number    size;  
# 默认:large_client_header_buffer_size   4   8k;  
# 配置块范围:http、server  
    
# 存储 HTTP 包体的内存buffer大小  
# 语法:client_body_buffer_size   size;  
# 默认:client_body_buffer_size   8k/16k;  
# 配置块范围:http、server、location  
  
# HTTP 包体的临时存放目录  
# 语法:client_body_temp_path   dir-path    [level1 [level2 [level3]]];  
# 默认:client_body_temp_path   client_body_temp;  
# 配置块范围:http、server、location  
  
# 存储 TCP 成功建立连接的内存池大小  
# 语法:connection_pool_size    size;  
# 默认:connection_pool_size    256;  
# 配置块范围:http、server  
  
# 存储 TCP 请求连接的内存池大小  
# 语法:request_pool_size    size;  
# 默认:request_pool_size    4k;  
# 配置块范围:http、server  

2.4.4  网络连接设置

下面介绍网络连接的设置配置项    

# 读取 HTTP 头部的超时时间  
# 语法:client_header_timeout   time;  
# 默认:client_header_timeout   60;  
# 配置块范围:http、server、location  
客户端与服务器建立连接后将开始接受HTTP头部,在这个过程中,如果在一个时间间隔内没有读取到客户端发来的字节,则认为超时,并向客户端返回408(“Request timed out”)响应。
  
# 读取 HTTP 包体的超时时间  
# 语法:client_body_timeout   time;  
# 默认:client_body_timeout   60;  
# 配置块范围:http、server、location  
  
# 发送响应的超时时间 (Nginx服务器项客户端发送数据包) 
# 语法:send_timeout   time;  
# 默认:send_timeout   60;  
# 配置块范围:http、server、location  
  
# TCP 连接的超时重置  
# 语法:reset_timeout_connection   on | off;  
# 默认:reset_timeout_connection   off;  
# 配置块范围:http、server、location  
连接超时后将通过向客户端发送RST包来直接重置连接。这个选项打开后,Nginx会在某个连接超时后,直接向用户发送RST重置包,不再等待客户的应答,直接释放Nginx服务器上关于这个套接字使用的所有缓存,相比正常的关闭方式,它使得服务器避免产生许多处于FIN_WAIT_1,FIN_WAIT_2等状态的TCP 连接。
  
# 控制关闭 TCP 连接的方式  
# 语法:lingering_close off | on | always;  
# 默认:lingering_close on;  
# 配置块范围:http、server、location  
# always 表示关闭连接之前无条件处理连接上所有用户数据;  
# off 表示不处理;on 一般会处理;  
  
# lingering_time  
# 语法:lingering_time   time;  
# 默认:lingering_time   30s;  
# 配置块范围:http、server、location  
这个配置项对于上传大文件很有用。当用户请求的Content-Length大于max_client_body_size配置时,Nginx会发送413(Request entity too large)响应,但是,很多客户端可能不管413返回值,仍然持续不断地上传HTTPbody,这时,经过这个时间设置后,Nginx将不管用户是否仍在上传,都会把连接关闭掉。
  
# lingering_timeout  
# 语法:lingering_timeout   time;  
# 默认:lingering_time   5s;  
# 配置块范围:http、server、location  
  
# 对某些浏览器禁止keepalive功能  
# 语法:keepalive_disable   [mise6 | safari | none]...  
# 默认:keepalive_disable   mise6  safari;  
# 配置块范围:http、server、location  
HTTP请求中的keepalieve功能是为了让多个请求服用一个HTTP长连接,这个功能对服务器的性能提高是很有帮助的。
  
# keepalive超时时间  
# 语法:keepalive_timeout   time;  
# 默认:keepalive_timeout   75;  
# 配置块范围:http、server、location  
  
# keepalive长连接上允许最大请求数  
# 语法:keepalive_requests  n;  
# 默认:keepalive_requests  100;  
# 配置块范围:http、server、location  
  
# tcp_nodelay  
# 语法:tcp_nodelay on | off;  
# 默认:tcp_nodelay on;  
# 配置块范围:http、server、location  
  
# tcp_nopush  
# 语法:tcp_nopush on | off;  
# 默认:tcp_nopush off;  
# 配置块范围:http、server、location  

2.4.5 MIME 类型设置 

# MIME type 与文件扩展的映射  
# 语法:type{...}  
# 配置块范围:http、server、location  
# 多个扩展名可映射到同一个 MIME type  
  
# 默认 MIME type  
# 语法:default_type    MIME-type;  
# 默认:default_type    text/plain;  
# 配置块范围:http、server、location  
当找不到相应的MIME type与文件扩展名之间的映射时,使用默认的。
  
# type_hash_bucket_size  
# 语法:type_hash_bucket_size   size;  
# 默认:type_hash_bucket_size   32 | 64 | 128;  
# 配置块范围:http、server、location  
 为了快速寻找到相应的MIME type,Nginx使用散列表来存储MIMEtype与文件扩展名。type_hash_bucket_size  设置了每个散列桶占用的内存大小。
 
# type_hash_max_size  
# 语法:type_hash_max_size   size;  
# 默认:type_hash_max_size   1024;  
# 配置块范围:http、server、location 

2.4.6 对客户端请求的限制

 # 按 HTTP 方法名限制用户请求  
# 语法:limit_except    method...{...}  
# 配置块:location  
# method 的取值如下:  
# GET、HEAD、POST、PUT、DELETE、MKCOL、COPY、MOVE、OPTIONS、  
# PROPFIND、PROPPATCH、LOCK、UNLOCK、PATCH  
  
# HTTP 请求包体的最大值  
# 语法:client_max_body_size    size;  
# 默认:client_max_body_size    1m;  
# 配置块范围:http、server、location  
浏览器在发送含有较大HTTP包体的请求时,其头部会有一个Content-Length字段,client_max_body_size就是用来限制它的。当Content-Length大于client_max_body_size时,说明用户试图上传的文件较大,则直接发送413给客户端。
  
# 对客户端请求限制每秒传输的字节数
# 语法:limit_rate  speed;  
# 默认:limit_rate  0;  
# 配置块范围:http、server、location、if  
# 0 表示不限速  
  
# limit_rate_after规定时间后限速  
# 语法:limit_rate_after  time;  
# 默认:limit_rate_after    1m;  
# 配置块范围:http、server、location、if    

2.4.7 文件操作的优化  

# sendfile系统调用  
# 语法:sendfile    on | off;  
# 默认:sendfile    off;  
# 配置块:http、server、location  
  
# AIO 系统调用  
# 语法:aio on | off;  
# 默认:aio off;  
# 配置块:http、server、location  
  
# directio  
# 语法:directio    size | off;  
# 默认:directio    off;  
# 配置块:http、server、location  
  
# directio_alignment  
# 语法:directio_alignment    size;  
# 默认:directio_alignment    512;  
# 配置块:http、server、location  
  
# 打开文件缓存  
# 语法:open_file_cache max=N [inactive=time] | off;  
# 默认:open_file_cache off;  
# 配置块:http、server、location  
  
# 是否缓存打开文件的错误信息  
# 语法:open_file_cache_errors  on | off;  
# 默认:open_file_cache_errors  off;  
# 配置块:http、server、location  
  
# 不被淘汰的最小访问次数  
# 语法:open_file_cache_min_user  number;  
# 默认:open_file_cache_min_user  1;  
# 配置块:http、server、location  
  
# 检验缓存中元素有效性的频率  
# 语法:open_file_cache_valid  time;  
# 默认:open_file_cache_valid  60s;  
# 配置块:http、server、location  

 2.4.8 客户请求的特殊处理

  # 忽略不合法的 HTTP 头部  
# 语法:ignore_invalid_headers  on | off;  
# 默认:ignore_invalid_headers  on;  
# 配置块:http、server  
  
# HTTP 头部是否允许下划线  
# 语法:underscores_in_headers  on | off;  
# 默认:underscores_in_headers  off;  
# 配置块:http、server  
  
# If_Modified_Since 头部的处理策略  
# 语法:if_modified_since   [off | exact | before]  
# 默认:if_modified_since   exact;  
# 配置块:http、server、location  
  
# 文件未找到时是否记录到error日志  
# 语法:log_not_found   on | off;  
# 默认:log_not_found   on;  
# 配置块:http、server、location  
  
# 是否合并相邻的“/”  
# 语法:merge_slashes   on | off;  
# 默认:merge_slashes   on;  
# 配置块:http、server、location  
  
# DNS解析地址  
# 语法:resolver    address...;  
# 配置块:http、server、location  
  
# DNS解析的超时时间  
# 语法:resolver_timeout    time;  
# 默认:resolver_timeout    30s;  
# 配置块:http、server、location  
  
# 返回错误页面是否在server中注明Nginx版本  
# 语法:server_tokens   on | off;  
# 默认:server_tokens   on;  
# 配置块:http、server、location  

以下是在CentOS 5.3 系统成功安装 Nginx 之后的主配置文件:

#Nginx服务器正常启动时会读取该配置文件,以下的值都是默认的,若需要可自行修改;  
#以下是配置选项  
  
#Nginx worker进程运行的用户以及用户组  
#语法格式:user  username[groupname]  
#user  nobody;  
  
#Nginx worker 进程个数  
worker_processes  1;  
  
#error 日志设置  
#语法格式:error /path/file level  
#其中/path/file是一个具体文件;level是日志的输出级别,其取值如下:  
#debug info notice warn error crit alert emerg,从左至右级别增大;  
#若设定一个级别后,则在输出的日志文件中只输出级别大于或等于已设定的级别;  
#error_log  logs/error.log;  
#error_log  logs/error.log  notice;  
#error_log  logs/error.log  info;  
  
#保存master进程ID的pid文件存放路径  
#语法格式:pid path/file  
#pid        logs/nginx.pid;  
  
#事件类配置项  
#一般有以下几种配置:  
#1、是否打开accept锁  
#   语法格式:accept_mutex [on | off];  
#2、lock文件的路径  
#   语法格式:lock_file  path/file;  
#3、使用accept锁后到真正建立连接之间的延迟时间  
#   语法格式:accept_mutex_delay Nms;  
#4、批量建立新连接  
#   语法格式:multi_accept [on | off];  
#5、选择事件模型  
#   语法格式:use [kqueue | rtisg | epoll | /dev/poll | select | poll | eventport];  
#6、每个worker进行的最大连接数  
#   语法格式:worker_connections number;  
events {  
    worker_connections  1024;  
}  
  
  
#以下是http模块  
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  0;  
    keepalive_timeout  65;  
  
    #gzip  on;  
  
#server块  
#   每个server块就是一个虚拟主机,按照server_name来区分  
    server {  
#监听端口  
        listen       80;  
#主机名称  
        server_name  localhost;  
  
        #charset koi8-r;  
  
        #access_log  logs/host.access.log  main;  
#location语法:location[= | ~ | ~* | ^~ | @] /uri/ {}  
        #location尝试根据用户请求中的URI来匹配 /uri表达式,若匹配成功,则执行{}里面的配置来处理用户请求  
#以下是location的一般配置项  
#1、以root方式设置资源路径  
#   语法格式:root path;  
#2、以alias方式设置资源路径  
#   语法格式:alias path;  
#3、访问首页  
#   语法格式:index file...;  
#4、根据HTTP返回码重定向页面  
#   语法格式:error_page code [code...] [= | =answer-code] uri | @named_location;  
#5、是否允许递归使用error_page  
#   语法格式:recursive_error_pages [on | off];  
#6、try_files  
#   语法格式:try_files path1 [path2] uri;  
        location / {  
            root   html;  
            index  index.html index.htm;  
        }  
  
        #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;  
        }  
  
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80  
        #  
        #location ~ \.php$ {  
        #    proxy_pass   http://127.0.0.1;  
        #}  
  
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000  
        #  
        #location ~ \.php$ {  
        #    root           html;  
        #    fastcgi_pass   127.0.0.1:9000;  
        #    fastcgi_index  index.php;  
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;  
        #    include        fastcgi_params;  
        #}  
  
        # deny access to .htaccess files, if Apache's document root  
        # concurs with nginx's one  
        #  
        #location ~ /\.ht {  
        #    deny  all;  
        #}  
    }  
  
  
    # another virtual host using mix of IP-, name-, and port-based configuration  
    #  
    #server {  
    #    listen       8000;  
    #    listen       somename:8080;  
    #    server_name  somename  alias  another.alias;  
  
    #    location / {  
    #        root   html;  
    #        index  index.html index.htm;  
    #    }  
    #}  
  
  
    # HTTPS server  
    #  
    #server {  
    #    listen       443 ssl;  
    #    server_name  localhost;  
  
    #    ssl_certificate      cert.pem;  
    #    ssl_certificate_key  cert.key;  
  
    #    ssl_session_cache    shared:SSL:1m;  
    #    ssl_session_timeout  5m;  
  
    #    ssl_ciphers  HIGH:!aNULL:!MD5;  
    #    ssl_prefer_server_ciphers  on;  
  
    #    location / {  
    #        root   html;  
    #        index  index.html index.htm;  
    #    }  
    #}    
}  


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值