Nginx:静态资源web服务器配置详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx:静态资源web服务器配置详解相关的知识,希望对你有一定的参考价值。





一、nginx概述

 1.Nginx简介

          解决基于进程模型产生的C10k问题,请求时即使无状态连接如web服务都无法达到并发响应量级一万现状。2006年俄罗斯编写。全称为engine X,缩减合并称为nginx  官方站点:http://nginx.org/ 2013年发出企业版Nginx Plus

          二次发行版:tengine, OpenResty… …

 

  2.Nginx的特性

       1) 模块化设计、较好扩展性;早期不支持模块的动态装卸载

       2) 高可靠性:基于master/worker模式

master:负责启动服务,分析配置文件,父子启动子进程和worker进程

worker:真正响应用户请求进程

       3) 支持热部署(平滑迁移)不停机更新配置文件、更换日志、更新服务器程序版本;

       4) 内存消耗低:10000个keep-alive连接模式下的非活动连接仅消耗2.5M内存;

       5) 支持event-driven事件驱动模型, aio一步驱动机制, mmap内存映射

 

  3.Nginx基本功能

       1) 静态资源的web服务器;

       2) http协议的反向代理服务器;

       3) pop3, smpt,imap4等邮件协议的反向代理;

       4) 能缓存打开的文件(元数据:文件的描述符等等信息

       5) 支持FastCGI(php-fpm), uWSGI(Python WebFramwork)等协议机制,实现代理后端应用程序交互

       6) 高度模块化(非DSO机制)

       模块类型:

core module

核心公用模块

Standard HTTP  modules

标准(核心)HTTP模块;自动编译进程序不止一个

Optional HTTP  modules

可选HTTP模块

Mail modules

邮件模块

3rd party modules

第三方模块,在编译时需手动指明加载方式加载

       7) 支持过滤器,例如zip,SSI

       8) 支持SSL加密机制

       9) web服务相关的功能:虚拟主机(server)、keepalive、访问日志(支持基于日志缓冲提高其性能)、urlrewirte、路径别名、基于IP及用户的访问控制、支持速率限制及并发数限制;

……

  4.Nginx的基本架构master/worker

       master/worker模型:一个master进程可生成一个或多个worker进程;每个worker基于时间驱动机制可以并行响应多个请求

   master:加载配置文件、管理worker进程、平滑升级,...

   worker:http服务,http代理,fastcgi代理,...

技术分享

 

     事件驱动:epoll(Linux),kqueue(FreeBSD), /dev/poll(Solaris)

消息通知:select,poll, rt signals

     支持sendfile,  sendfile64

     支持AIO,mmap

 

 

 

二、Nginx编译安装配置

  1.编译安装nginx

     (1)编译环境准备

              [[email protected]~]# yum install -y make

              [[email protected]~]# yum install -y gcc

              [[email protected]~]#  yum -y groupinstall "开发工具""服务器平台开发"

              [[email protected]~]# yum install -y pcre-devel  openssl-develzlib-devel

              [[email protected]~]# useradd -r nginx

     (2)解压安装

              [[email protected]~]# tar xf nginx-1.8.0.tar.gz

              [[email protected]]# ./configure --prefix=/usr/local/nginx--conf-path=/etc/nginx/nginx.conf --user=nginx --group=nginx  --error-log-path=/var/log/nginx/error.log--http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid--lock-path=/var/lock/nginx.lock --with-http_ssl_module--with-http_stub_status_module --with-http_gzip_static_module --with-debug

注意:check时,在Linuxepoll机制要存在

              [[email protected]]#make &&make install

     (3)启动服务,检测端口是否启用

              [[email protected]~]#  /usr/local/nginx/sbin/nginx

              [[email protected]~]# ss-tnl

技术分享

 

2.Nginx配置文件

    (1)配置指令有类型

             1) 全局指令:放置于mainblock中,即文档根

main配置段类别:正常运行必备的配置;优化性能相关的配置;用于调试、定位问题的配置;

             2) 模块指令:由模块引入,其也必须放置于相应的Directive blocks中block之间可能存在嵌套关系。用{}嵌套

   event 配置段

事件驱动模块段,面向用户并发连接请求响应组织配置机制

   http 配置段

web模块相关配置

   mail配置段

邮件模块相关配置;编译安装时候默认无此模块

   … ...


技术分享

    (2)组成部分

主配置文件:nginx.conf

     在主配置文件中加入include语句,可以将主配置文件切割成端例如include conf.d/*.conf   ===>  /etc/nginx/conf.d/*.conf

fastcgi的配置文件:fastcgi_params

  …  ...

    (3)配置文件内容语法格式

 1)  配置指令(必须以分号结尾):Directive  value1 [value2...];

 2) 支持使用变量:

内置变量:由模块引入;

自定义变量:set  variable value; 引用变量:$variable

 

 

 

三、主配置文件框架解析

 1.MAIN配置段常用参数

   (1)常规配置指令

user  USERNAME  [GROUPNAME];

指定用于运行worker进程的用户和组:例如user  nginx   nginx;

pid  /PATH/TO/PID_FILE;

指定nginx进程的pid文件路径;pid  /var/run/nginx.pid;

worker_rlimit_nofile  #;

指定一个worker进程所能够打开的最大文件描述符数量;

worker_rlimit_sigpending  #;

指定每个用户能够发往worker进程的信号的数量;

   (2)性能优化相关指令

worker_processes  #;

worker进程的个数;通常应该为物理CPU核心数量减1"auto"实现自动设定

worker_cpu_affinity  CPUMASK CPUMASK …;

CPU绑定;加上CPU掩码

实例:worker_cpu_affinity 00000001 00000010 00000100;

worker_priority  nice;

[-20, 19]

   (3)调试定位Bug相关指令

daemon  off|on;

是否以守护进程方式启动nignx;

master_process  on|off;

是否以master/worker模型运行nginx;

error_log  /PATH/TO/ERROR_LOG level;

错误日志文件及其级别;

调试需要可以设定为debug;但debug在编译时使用了"--with-debug"选项

 

 2.event配置段常用参数

worker_connections  #;

  每个worker进程所能够响应的最大并发请求数量;默认为1024

 上限:worker_proceses * worker_connections

use  [epoll|rgsig|select|poll];

定义使用的事件模型;建议让nginx自动选择;

accept_mutex  [on|off];

各worker接收用户的请求的负载均衡锁(互斥锁)

on启用表示用于让多个worker轮流地、序列化地响应新请求;

lock_file  /PATH/TO/LOCK_FILE;

锁文件位置

 

 

 

四、Nginxhttp常规配置

     说明:http的所有配置需要在http{ } 配置段进行定义。未具体说明指令基于ngx_http_core_module模块配置

  1.主机或套接字相关指令

   (1) server {}定义一个虚拟主机;server可以出现一次货多次

server{

listenPORT;

server_name  NAME;

root /PATH/TO/DOCUMENTROOT;

}

...

              注意:

      1) 基于portlisten指令监听在不同的端口;

      2) 基于hostnameserver_name指令指向不同的主机名;

   (2) listen:配置监听端口

  使用格式:listen address[:port] [default_server] [ssl] [http2 | spdy]

                        listen port [default_server] [ssl] [http2 | spdy]

        注释:

default_server:设置默认虚拟主机;用于基于IP地址,或使用了任意不能对应于任何一个server的name时所返回站点;

ssl:用于限制只能通过ssl连接提供服务;

spdy:SPDYprotocol(speedy),在编译了spdy模块的情况下,用于支持SPDY协议;

http2:支持httpversion 2第二版http协议

   (3) server_name NAME [...];:指明主机名称

   后可跟一个或多个主机名;名称还可以使用通配符和正则表达式(~引导整个正则表达式);

匹配顺序:

1) 首先做精确匹配;例如:www.xxx.com

2) 左侧通配符;例如:*.xxx.com

3) 右侧通配符,例如:www.xxx.*

4) 正则表达式,例如:~^.*\.xxx\.com$

5)default_server

   (4) tcp_nodelay on|off;

对keepalive模式下的连接是否使用TCP_NODELAY选项;一般为off

提高带宽利用率,将发往同一主机很小的TCP报文合并成一个;实际生产上对于用户请求即使浪费带块也不能合并请求

   (5) tcp_nopush on|off;

是否启用TCP_NOPUSH(FREEBSE)或TCP_CORK(Linux)选项;仅在sendfile为on时有用;

尝试将多个报文首部压缩成一个发送,默认off,不启用该功能

   (6) sendfile on|off;

是否启用sendfile功能;静态文件直接在内核中封装响应,而不是从内核空间到用户空间再发往内和空间

 

  2.路径相关指令

   (1) root:指明根文件路径

设置web资源的路径映射;用于指明请求的URL所对应的文档的目录路径;可用与serverlocaltion

实例:

server{

...

root  /data/www/vhosts;

}

http://www.xuding.com/images/logo.jpg --> /data/www/vhosts/images/logo.jpg

server{

...

server_name  www.xuding.com;

location/images/ {

root  /data/imgs/;

...

}

}

http://www.xuding.com/images/logo.jpg --> /data/imgs/images/logo.jpg

   (2) location

            允许根据用户请求的URI来匹配定义的各location匹配到时,此请求将被相应的location块中的配置所处理;即用于为需要用到专用配置的uri提供特定配置;

       使用格式:

              1) location @name { ... }

   2) location[ = | ~ | ~* | ^~ ] uri { ... }  

当能匹配多次时,其匹配优先级:精确匹配=、^~、~或~*、不带符号的URL;

=:URI的精确匹配,其后多一个字符都不可以,精确匹配根

~:做正则表达式匹配,区分字符大小写;

~*:做正则表达式匹配,不区分字符大小写;

^~:URI的左半部分匹配,不区分字符大小写;

           server {

...

server_name www.xuding.com;

root/data/www;

location  /admin/ {

...

}

}

   (3) alias定义路径别名只能用于location配置段

location  /images/ {

root/data/imgs/;

}

location  /images/ {

alias/data/imgs/;

}

          注意:

       root指令:给定的路径对应于location的“/”这个URL;/images/test.jpg -->  /data/imgs/images/test.jpg

       alias指令:给定的路径对应于location的“/uri/"这个URL;/images/test.jpg-->  /data/imgs/test.jpg

   (4) index :设置默认主页(ngx_http_index_module模块引入)

  可以带上变量,如$geo更具不同IP地区来设置不同的语言主页

      indexfile ...;

   (5) error_page code ... [=[response]] uri;:自定义错误页面,根据http的状态码重定向错误页面;

  实例:

       1)指明错误页面

error_page  404 /404.html

error_page 500 502 503 504 /50x.html

location = /50x.html {

root html;

}

        2) 以指定的响应状态码进行响应

error_page  404 =200  /404.html

   (6) try_files file ... uri;以指定的顺序检查文件的存在性响应

     try_files file ... =code;

            尝试查找第1至第N-1个文件,第一个即为返回给请求者的资源;若1至N-1文件都不存在,则跳转至最一个uri(必须不能匹配至当前location,而应该匹配至其它location,否则会导致死循环);

       

  3.面向客户端请求相关的配置

    (1) keepalive_timeout # ;

设定keepalive连接的超时时长;0表示禁止长连接;默认为启用为75s;

   (2) keepalive_requests # ;

在keepalived连接上所允许请求的最大资源数量;默认为100;

   (3) keepalive_disable … ….;

指明禁止为何种浏览器使用keepalive功能;默认none,也可以指明具体浏览器名称

   (4) send_timeout #;

发送响应报文的超时时长,默认为60s;

   (5) client_body_buffer_size size;

接收客户请求报文body的缓冲区大小;默认为16k;超出此指定大小时将被移存于磁盘上;

   (6) client_body_temp_pathpath [level1 [level2 [level3]]];

设定用于存储客户端请求body的临时存储路径及子目录结构和数量;

client_body_temp_path  /var/tmp/client_body  2 2;

 

  4.对客户端请求的进行限制

   (1) limit_excpet  METHOD {...}对指定范围之外的其它的方法进行访问控制;

limit_except  GET {

allow  172.16.0.0/16;

denyall;

}

   (2) limit_rate  # ;

              制客户端每秒钟所能够传输的字节数,默认为0表示无限制;

 

  5.文件操作优化相关的配置

    (1) aio  on|off;    

  是否启用异步IO模式

   (2) directio  size|off;   

    直接IO;不在内存中缓冲,直接从硬盘加载使用(当大于指定size)

Enablesthe use of the O_DIRECT flag (FreeBSD, Linux), the F_NOCACHE flag (Mac OS X),or the directio() function (Solaris), when reading files that are larger thanor equal to the specified size.

   (3) open_file_cache :打开文件缓存

open_file_cache off; 

open_file_cachemax=N [inactive=time];

注释:nginx可以缓存以下三种信息

1)文件描述符、文件大小和最近一次的修改时间;

2)打开的目录的结构;

3)没有找到的或者没有权限操作的文件的相关信息;

    max=N表示可缓存的最大条目上限;一旦达到上限,则会使用LRU算法从缓存中删除最近最少使用的缓存项;

    inactive=time:在此处指定的时长内没有被访问过的缓存项是为非活动缓存项,因此直接删除;

   (4) open_file_cache_errorson | off;

是否缓存找不到其路径的文件,或没有权限没有权限访问的文件相关信息;

   (5) open_file_cache_valid # ;

每隔多久检查一次缓存中缓存项的有效性;默认为60s;

   (6) open_file_cache_min_uses # ;

缓存项在非活动期限内最少应该被访问的次数;

 

  6.ngx_http_access_module模块调用配置(基于IP的访问控制)

        allow address | CIDR | unix: | all;   允许

         deny address | CIDR | unix: | all;  拒绝

可以应用于http, server, location, limit_except上下文范围内,直接指定IP

 

  7.ngx_http_auth_basic_module模块调用配置(basic认证)

   (1) auth_basic string |off;使用httpbasic认证协议对用户进行认证;

string为所给定字符,其作用在于认证时显示的提示所信息

   (2) auth_basic_user_file FILE ;实现用户认证的账号文件;

         认证文件格式(需手动创建)

name1:password1

name2:password2:comment

    注意:密码需要加密,加密方式可以为encryptedwith the crypt() function; md5加密;

       密码可以用htpasswd创建:htpasswd-c -m  /etc/nginx/.ngxhtpasswd tom(创建第二个用户时需要将-c去掉)

详解nginx如何代理静态资源(长搜索路径优先)

nginx的安装配置详解

【NGINX入门】2.Nginx搭建静态资源web服务器

使用Nginx搭建静态网站

Nginx配置与应用详解

Nginx修改静态文件访问路径