Nginx及Nginx模块——更加轻量级的HTTP server

Nginx

engine X = Nginx

    

NGINX is a free, open-source, high-performance HTTP server and reverse proxy, as well as an IMAP/POP3 proxy server. NGINX is known for its high performance, stability, rich feature set, simple configuration, and low resource consumption.

    

NGINX is one of a handful of servers written to address the C10K problem. Unlike traditional servers, NGINX doesn’t rely on threads to handle requests. Instead it uses a much more scalable event-driven (asynchronous) architecture. This architecture uses small, but more importantly, predictable amounts of memory under load. Even if you don’t expect to handle thousands of simultaneous requests, you can still benefit from NGINX’s high-performance and small memory footprint. NGINX scales in all directions: from the smallest VPS all the way up to large clusters of servers.

    

NGINX powers several high-visibility sites, such as Netflix, Hulu, Pinterest, CloudFlare, Airbnb, WordPress.com, GitHub, SoundCloud, Zynga, Eventbrite, Zappos, Media Temple, Heroku, RightScale, Engine Yard, MaxCDN and many others.

Nginx的程序架构:

master/worker

         一个master进程:负载加载配置文件、管理worker进程、平滑升级

         一个或多个worker进程:处理并响应用户请求

         缓存相关的进程:

                 cache loader:载入缓存对象

                 cache manager:管理缓存对象

特性:异步、事件驱动和非阻塞

         并发请求处理:通过kevent/epoll/select

         文件IO:高级IO sendfile,异步,mmap

nginx高度模块化:高度模块化,但其模块早期不支持DSO机制;近期版本支持动态装载和卸载;

         模块分类:

                 核心模块:core module

                 标准模块:

                         Standard HTTP modules

                         Optional HTTP modules

                         Mail modules

                         Stream modules

                 3rd party modules

nginx的功用:

         静态的web资源服务器

         结合FastCGI/uwSGI/SCGI等协议反代动态资源请求

         http/https协议的反向代理

         imap4/pop3协议的反抽代理

         tcp/udp协议的反代

nginx的安装配置:

官方的预制包:

    http://nginx.org/packages/centos/7/x86_64/RPMS/

编译安装:

         ~]# yum install pcre-devel openssl-devel zlib-devel

         ~]# useradd -r nginx

         ~]#  ./configure –prefix=/usr/local/nginx –conf-path=/etc/nginx/nginx.conf –error-log-path=/var/log/nginx/error.log –http-log-path=/var/log/nginx/access.log –pid-path=/var/run/nginx.pid –lock-path=/var/run/nginx.lock –user=nginx –group=nginx –with-http_ssl_module –with-http_v2_module –with-http_dav_module –with-http_stub_status_module –with-threads –with-file-aio

         # make && make install

配置文件的组成部分:

         主配置文件:nginx.conf

             include conf.d/*.conf

         fastcgi, uwsgi,scgi等协议相关的配置文件

         mime.types:支持的mime类型

主配置文件的配置指令:

         directive value [value2 …];

        

         注意:

                 (1) 指令必须以分号结尾;

                 (2) 支持使用配置变量;

                         内建变量:由Nginx模块引入,可直接引用

                         自定义变量:由用户使用set命令定义

                                 set variable_name value;

                                 引用变量:$variable_name

主配置文件结构:

         main block:主配置段,也即全局配置段;

                 event {

                

                 }    :事件驱动相关的配置;

         http {

        

         }    :http/https 协议相关的配置段;

         mail {

        

         }

         stream {

        

         }    :和tcp/udp协议的反代有关;

http协议相关的配置结构

http {

        

         …:各server的公共配置

         server {

        

         }:每个server用于定义一个虚拟主机;

         server {

                

                 server_name

                 root

                 alias

                 location [OPERATOR] URL {

                        

                         if CONDITION {

                             

                         }

                 }

         }

}

main配置段常见的配置指令:

         分类:

                 正常运行必备的配置

                 优化性能相关的配置

                 用于调试及定位问题相关的配置

                 事件驱动相关的配置

        

nginx配置文件的详细说明:http://nginx.org/en/docs/

正常运行必备的配置:

1、user

Syntax: user user [group];

Default: user nobody nobody;

Context: main

        

Defines user and group credentials used by worker processes. If group is omitted, a group whose name equals that of user is used.

2、pid /PATH/TO/PID_FILE;

指定存储nginx主进程进程号码的文件路径

3、include file | mask;

指明包含进来的其它配置文件片断;Context: main, http

4、load_module file;

指明要装载的动态模块

性能优化相关的配置:

1、worker_processes number | auto;

worker进程的数量;通常应该为当前主机的cpu的物理核心数

2、worker_cpu_affinity cpumask …;

worker_cpu_affinity auto [cpumask];

CPU MASK:

         00000001:0号CPU

         00000010:1号CPU

         … …

3、worker_priority number;

指定worker进程的nice值,设定worker进程优先级;[-20,20]

4、worker_rlimit_nofile number;

worker进程所能够打开的文件数量上限

调试、定位问题:

1、daemon on|off;

是否以守护进程方式运行Nignx;默认是on

2、master_process on|off;

是否以master/worker模型运行nginx;默认为on

3、error_log file [level];

事件驱动相关的配置:

events {

    …

}    :以下配置都是配置在events中

1、worker_connections number;

每个worker进程所能够打开的最大并发连接数数量;

    

worker_processes * worker_connections

2、use method;

指明并发连接请求的处理方法;默认使用epoll

3、accept_mutex on | off;

处理新的连接请求的方法;on意味着由各worker轮流处理新请求,Off意味着每个新请求的到达都会通知所有的worker进程;默认为off

ngx_http_core_module模块:

1、server { … }

配置一个虚拟主机;

        

server {

         listen address[:PORT]|PORT;

         server_name SERVER_NAME;

         root /PATH/TO/DOCUMENT_ROOT;

}

2、listen PORT|address[:port]|unix:/PATH/TO/SOCKET_FILE

listen address[:port] [default_server] [ssl] [http2 | spdy]  [backlog=number] [rcvbuf=size] [sndbuf=size]

3、server_name name …;

指明虚拟主机的主机名称;后可跟多个由空白字符分隔的字符串;

         支持*通配任意长度的任意字符;server_name *.magedu.com

         支持~起始的字符做正则表达式模式匹配;server_name ~^www\d+\.magedu\.com$

    

匹配机制:

         (1) 首先是字符串精确匹配

         (2) 左侧*通配符

         (3) 右侧*通配符

         (4) 正则表达式

4、tcp_nodelay on | off;

Default: tcp_nodelay on;

Context: http, server, location

在keepalived模式下的连接是否启用TCP_NODELAY选项;等待多个报文包到达一并返回

最好不要开启此功能,否则用户体验会变差

5、sendfile on | off;

是否启用sendfile功能;在内核中直接封装报文返回客户端

定义路径相关的配置

1、root path;

设置web资源路径映射;用于指明用户请求的url所对应的本地文件系统上的文档所在目录路径;Context:http, server, location, if in location

2、location [ = | ~ | ~* | ^~ ] uri { … }

location @name { … }

    

在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;ngnix会根据用户请求的URI来检查定义的所有location,并找出一个最佳匹配,而后应用其配置;

    

         =:对URI做精确匹配;例如, http://www.magedu.com/, http://www.magedu.com/index.html

             location = / {

                 

             }

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

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

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

         不带符号:匹配起始于此uri的所有的url;

        

         匹配优先级:=, ^~, ~/~*,不带符号;

        

         root /vhosts/www/htdocs/

             http://www.magedu.com/index.html –> /vhosts/www/htdocs/index.html

        

         server {

                 root  /vhosts/www/htdocs/

                

                 location /admin/ {

                      root /webapps/app1/data/

                 }

         }

3、alias path;

定义路径别名,文档映射的另一种机制;仅能用于location上下文

    

注意:location中使用root指令和alias指令的意义不同

         (a) root,给定的路径对应于location中的/uri/左侧的/;即location后的路径要追加在root给定路径之后

    

         (b) alias,给定的路径对应于location中的/uri/右侧的/;即location后的路径替换了alias路径中的最后一个文件夹名字

4、index file …;

默认资源;http, server, location

5、error_page code … [=[response]] uri;

Defines the URI that will be shown for the specified errors.

    

errot_page 404 =200 /404.html :重定义了状态响应码

    

location = /404.html {

    root /usr/share/nginx/html;

}

6、try_files file … uri;

文件映射基于hash来实现

定义客户端请求的相关配置

1、keepalive_timeout timeout [header_timeout];

设定保持连接的超时时长,0表示禁止长连接;默认为75s

2、keepalive_requests number;

在一次长连接上所允许请求的资源的最大数量,默认为100

3、keepalive_disable none | browser …;

对哪种浏览器禁用长连接

4、send_timeout time;

向客户端发送响应报文的超时时长,此处,是指两次写操作之间的间隔时长

5、client_body_buffer_size size;

用于接收客户端请求报文的body部分的缓冲区大小;默认为16k;超出此大小时,其将被暂存到磁盘上的由client_body_temp_path指令所定义的位置

6、client_body_temp_path path [level1 [level2 [level3]]];

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

    

     16进制的数字;

    

     client_body_temp_path path  /var/tmp/client_body  1 2 2

对客户端进行限制的相关配置

1、limit_rate rate;

限制响应给客户端的传输速率,单位是bytes/second,0表示无限制

2、limit_except method … { … }

限制对指定的请求方法之外的其它方法的使用客户端;Context: location

limit_except GET {

         allow 192.168.1.0/32;

         deny  all;

}

文件操作优化的配置

1、aio on | off | threads[=pool];

是否启用aio功能

2、directio size | off;

在Linux主机启用O_DIRECT标记,此处意味文件大于等于给定的大小时使用

例如directio 4m;当文件大于4m则启动directio机制,从磁盘加载文件到内核中,直接从内核封装报文

3、open_file_cache off;

open_file_cache max=N [inactive=time];

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

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

                 (2) 打开的目录结构

                 (3) 没有找到的或者没有权限访问的文件的相关信息

        

         通常定义在http中,多所有的server都生效

        

         max=N:可缓存的缓存项上限;达到上限后会使用LRU算法实现缓存管理

        

         inactive=time:缓存项的非活动时长,在此处指定的时长内未被命中的或命中的次数少于open_file_cache_min_users指令所指定的次数的缓存项即为非活动项

4、open_file_cache_valid time;

缓存项有效性的检查频率;默认为60s

5、open_file_cache_min_uses number;

在open_file_cache指令的inactive参数指定的时长内,至少应该被命中多少次方可被归类为活动项

6、open_file_cache_errors on | off;

是否缓存查找时发生错误的文件一类的信息

ngx_http_access_module模块:

实现基于ip的访问控制功能;Context: http, server, location, limit_except

    

1、allow address | CIDR | unix: | all;

2、deny address | CIDR | unix: | all;

ngx_http_auth_basic_module模块:

实现基于用户的访问控制,使用basic机制进行用户认证;

    

1、auth_basic string | off;

2、auth_basic_user_file file;

    

         location /admin/ {

                 alias /webapps/app1/data/;

                 auth_basic "Admin Area";

                 auth_basic_user_file /etc/nginx/.ngxpasswd;

         }

            

         注意:htpasswd命令由httpd-tools所提供;

ngx_http_stub_status_module模块:

用于输出nginx的基本状态信息;

    

Active connections: 291

server accepts handled requests

16630948 16630948 31070465

Reading: 6 Writing: 179 Waiting: 106

    

Active connections: 活动状态的连接数

accepts:已经接受的客户端请求的总数

handled:已经处理完成的客户端请求的总数

requests:客户端发来的总的请求数

Reading:处于读取客户端请求报文首部的连接的连接数

Writing:处于向客户端发送响应报文过程中的连接数

Waiting:处于等待客户端发出请求的空闲连接数

1、stub_status;

配置示例:

         location  /basic_status {

             stub_status;

         }

ngx_http_log_module模块:

The ngx_http_log_module module writes request logs in the specified format.

1、log_format name string …;

string可以使用nginx核心模块及其它模块内嵌的变量;

    

课外作业:为nginx定义使用类似于httpd的combined格式的访问日志;

    

log_format gm '$remote_addr $remote_user – [$time_local] '

              '"$request" $status $body_bytes_sent '

              '"$http_referer" "$http_user_agent"'

2、access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];

access_log off;

access_log  /var/log/nginx/access.log  gm;

访问日志文件路径,格式及相关的缓冲的配置;

         buffer=size

         flush=time

3、open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];

open_log_file_cache off;

         缓存各日志文件相关的元数据信息

        

         max:缓存的最大文件描述符数量

         min_users:在inactive指定的时长内访问大于等于此值方可被当作活动项

         inactive:非活动时长

         valid:验正缓存中各缓存项是否为活动项的时间间隔

ngx_http_rewrite_module模块:

The ngx_http_rewrite_module module is used to change request URI using PCRE regular expressions, return redirects, and conditionally select configurations.

将用户请求的URI基于regex所描述的模式进行检查,而后完成替换

1、rewrite regex replacement [flag]

将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为replacement指定的新的URI;Context: server, location, if

注意:如果在同一级配置块中存在多个rewrite规则,那么会自上而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查,因此,隐含有循环机制;[flag]所表示的标志位用于控制此循环机制;

如果replacement是以http://或https://开头,则替换结果会直接以重向返回给客户端;

    301:永久重定向;

[flag]:

         last:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后对新的URI启动新一轮重写检查;提前重启新一轮循环

         break:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置;结束循环

         redirect:重写完成后以临时重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求;不能以http://或https://开头

         permanent:重写完成后以永久重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求

rewrite ^/bbs/(.*)$ /alias/$1 redirect;

2、return

return code [text];

return code URL;

return URL;

    

Stops processing and returns the specified code to a client.

3、 rewrite_log on | off;

是否开启重写日志

4、 if (condition) { … }

引入一个新的配置上下文 ;条件满足时,执行配置块中的配置指令;server, location;

condition:

         比较操作符:

                 ==

                 !=

                 ~:模式匹配,区分字符大小写

                 ~*:模式匹配,不区分字符大小写

                 !~:模式不匹配,区分字符大小写

                 !~*:模式不匹配,不区分字符大小写

         文件及目录存在性判断:

                 -e, !-e

                 -f, !-f

                 -d, !-d

                 -x, !-x

5、set $variable value;

用户自定义变量

ngx_http_gzip_module模块:

The ngx_http_gzip_module module is a filter that compresses responses using the “gzip” method. This often helps to reduce the size of transmitted data by half or even more.

1、gzip on | off;

Enables or disables gzipping of responses.

2、gzip_comp_level level;

Sets a gzip compression level of a response. Acceptable values are in the range from 1 to 9.

3、 gzip_disable regex …;

Disables gzipping of responses for requests with “User-Agent” header fields matching any of the specified regular expressions.

4、 gzip_min_length length;

启用压缩功能的响应报文大小阈值

5、gzip_buffers number size;

支持实现压缩功能时为其配置的缓冲区数量及每个缓存区的大小

6、gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any …;

nginx作为代理服务器接收到从被代理服务器发送的响应报文后,在何种条件下启用压缩功能的

         off:对代理的请求不启用

         no-cache, no-store,private:表示从被代理服务器收到的响应报文首部的Cache-Control的值为此三者中任何一个,则启用压缩功能

7、gzip_types mime-type …;

压缩过滤器,仅对此处设定的MIME类型的内容启用压缩功能

ngx_http_fastcgi_module模块:

The ngx_http_fastcgi_module module allows passing requests to a FastCGI server.

1、fastcgi_pass address;

address为fastcgi server的地址; location, if in location;

2、fastcgi_index name;

fastcgi默认的主页资源

3、fastcgi_param parameter value [if_not_empty];

Sets a parameter that should be passed to the FastCGI server. The value can contain text, variables, and their combination.

配置示例1:

    前提:配置好fpm server和mariadb-server服务;

location ~* \.php$ {

         root           /usr/share/nginx/html;

         fastcgi_pass   127.0.0.1:9000;

         fastcgi_index  index.php;

         fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;

         include        fastcgi_params;

}

配置示例2:通过/pm_status和/ping来获取fpm server状态信息;

location ~* ^/(pm_status|ping)$ {

         include        fastcgi_params;

         fastcgi_pass 127.0.0.1:9000;

         fastcgi_param  SCRIPT_FILENAME  $fastcgi_script_name;

}

4、fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];

定义fastcgi的缓存;缓存位置为磁盘上的文件系统,由path所指定路径来定义;

一般写在http段

        

         levels=levels:缓存目录的层级数量,以及每一级的目录数量;levels=ONE:TWO:THREE

                 leves=1:2:2

                         1级子目录16个文件,2级子目录256个文件,3级子目录256个文件

                         把文件内容的hash码做为cache中的文件名

                         把hash值的第1个匹配1级子目录  把2-3位所在的字符匹配2级子目录

                         但是nginx的hash比较时从最后一位开始比较的

        

         keys_zone=name:size

             k/v映射的内存空间的名称及大小

         inactive=time

             非活动时长

         max_size=size

             磁盘上用于缓存数据的缓存空间上限

5、fastcgi_cache zone | off;

调用指定的缓存空间来缓存数据;http, server, location

zone的值要同fastcgi_cache_path 中keys_zone 中的name参数

6、fastcgi_cache_key string;

定义用作缓存项的key的字符串

7、fastcgi_cache_methods GET | HEAD | POST …;

为哪些请求方法使用缓存

默认的方法是GET、HEAD

8、fastcgi_cache_min_uses number;

缓存空间中的缓存项在inactive定义的非活动时间内至少要被访问到此处所指定的次数方可被认作活动项

9、fastcgi_cache_valid [code …] time;

不同的响应码各自的缓存时长

示例:

http {

        

         fastcgi_cache_path /var/cache/nginx/fastcgi_cache levels=1:2:1 keys_zone=fcgi:20m inactive=120s;

        

         server {

                

                 location ~* \.php$ {

                        

                         fastcgi_cache fcgi;

                         fastcgi_cache_key $request_uri;

                         fastcgi_cache_valid 200 302 10m;

                         fastcgi_cache_valid 301 1h;

                         fastcgi_cache_valid any 1m;

                        

                 }

                

         }

        

}

10、fastcgi_keep_conn on | off;

By default, a FastCGI server will close a connection right after sending the response. However, when this directive is set to the value on, nginx will instruct a FastCGI server to keep connections open.

ngx_http_ssl_module模块:

1、ssl on | off;

Enables the HTTPS protocol for the given virtual server.

2、ssl_certificate file;

当前虚拟主机使用PEM格式的证书文件

3、ssl_certificate_key file;

当前虚拟主机上与其证书匹配的私钥文件

4、ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];

支持ssl协议版本,默认为后三个

5、ssl_session_cache off | none | [builtin[:size]] [shared:name:size];

builtin[:size]:使用OpenSSL内建的缓存,此缓存为每worker进程私有

    

[shared:name:size]:在各worker之间使用一个共享的缓存

6、ssl_session_timeout time;

客户端一侧的连接可以复用ssl session cache中缓存 的ssl参数的有效时长

配置示例:

server {

         listen 443 ssl;

         server_name www.magedu.com;

         root /vhosts/ssl/htdocs;

         ssl on;

         ssl_certificate /etc/nginx/ssl/nginx.crt;

         ssl_certificate_key /etc/nginx/ssl/nginx.key;

         ssl_session_cache shared:sslcache:20m;

}

ngx_http_referer_module模块:

The ngx_http_referer_module module is used to block access to a site for requests with invalid values in the “Referer” header field.

1、valid_referers none | blocked | server_names | string …;

定义referer首部的合法可用值

    

         none:请求报文首部没有referer首部

         blocked:请求报文的referer首部没有值

         server_names:参数,其可以有值作为主机名或主机名模式

                 arbitrary_string:直接字符串,但可使用*作通配符

                 regular expression:被指定的正则表达式模式匹配到的字符串;要使用~打头,例如 ~.*\.magedu\.com

配置示例:

valid_referers none block server_names *.magedu.com *.mageedu.com magedu.* mageedu.* ~\.magedu\.;

    

if($invalid_referer) {

    return 403;

}


原创文章,作者:megedugao,如若转载,请注明出处:http://www.178linux.com/55506

(0)
megedugaomegedugao
上一篇 2016-10-25
下一篇 2016-10-25

相关推荐

  • Linux 第九天: 练习和作业

    Linux 第九天: 练习和作业       编写脚本/root/bin/systeminfo.sh 显示当前主机系统信息 包括主机名 ipv4地址 操作系统版本 内核版本 CPU信号 内存大小 硬盘大小 server_ip=`ifconfig|grep'inet\b'|grep -v '…

    Linux干货 2016-08-15
  • Linux哲学思想以及自己的理解

    Linux哲学思想: #1 一切接文件 #2  单一目的小程序 #3 组合小程序完成复杂任务 #4 文本文件保存配置信息 #5 尽量避免捕获用户接口 #6 提供机制,而非策略 自己的理解:(玩Linux时间比较短,没什么太深刻的理解) #1 一切皆文件 我们说“Linux中一切皆文件”直观地可以这样理解:所有的东西,设备、内存都模拟成文件,我们可以…

    Linux干货 2016-08-15
  • GIAC 2017全球互联网架构大会12月22日即将登陆上海!

    12月22~23日,高可用架构和msup联合主办的GIAC 全球互联网架构大会将于上海举行。GIAC 2017全球互联网架构大会优惠报名平台活动家

    2017-12-04
  • Linux 内存管理

    1.Linux 进程在内存数据结构      可以看到一个可执行程序在存储(没有调入内存)时分为代码段,数据段,未初始化数据段三部分:      1) 代码段:存放CPU执行的机器指令。通常代码区是共享的,即其它执行程序可调用它。假如机器中有数个进程运行相同的一个程序,那么它们就…

    Linux干货 2015-04-13
  • Apache运行机制剖析

    1. B/S交互过程 浏览器(Browser)和服务器(Web Server)的交互过程:   1、  浏览器向服务器发出HTTP请求(Request)。 2、  服务器收到浏览器的请求数据,经过分析处理,向浏览器输出响应数据(Response)。 3、  浏览器收到服务器的响应数据,经过分析处理,将最终结果显示在浏览…

    Linux干货 2015-04-10
  • 系统启动这块的一些实验及基本内容–下

    下面我来讲下grub,grub在编辑的时候可以进入一种模式就是单用户模式,就是当grub.conf文件未写入密码时,普通用户将直接忽略系统密码进入系统,所以这可以称为一个捷径,也可以成为一个漏洞,当然linux的前辈们不可能连这个都想不到,他们也有自己的办法,这就是我们grub的两层加密机制,在选定登陆界面之前可以设置一次,启动内核时也可以设置一次,密码也可…

    Linux干货 2016-09-13