Nginx特性:

模块化设计,较好的扩展性

高可靠性:采用master/worker模型。

支持热部署

不需要停机即可更新配置文件、更换日志、更新服务器版本

低内存消耗

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

支持event-driven,alo,mmap


Nginx基本功能:

静态资源的web服务器:

http协议的反向代理服务器:

pop3,smtp,imap4等邮件协议的反向代理(很少用)

能缓存打开的文件(元数据)、支持FastCGI(php-fpm),uWSGI(Python Web Framwork)等协议

模块化(非DSO机制),过滤器压缩zip、SSI、SSL

web服务相关的功能:

支持虚拟主机(server),keepalive,访问日志(支持基于日志缓冲,提高其性能)、url rewirte 、支持路径别名、基于IP及用户的访问控制、支持速率限制及连接数限制

Nginx架构:

master/worker

一个master进程,可生成一个或者多个worker进程

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

支持sendFile,sendfile64

支持AIO,mmap(内存映射)

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

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

模块类型:

核心模块:core module

Standard HTTP module

OptionalHTTP module

Mail modules

3rd part modules

用来做什么?

静态资源的web服务器

http服务器反向代理

Nginx安装配置:


yum groupinstall "Develop Tools " "Server platform"


yum install openssl-devel zlib-devel pcre-devel


#./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/nginx.lock --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_status_module --with-debug


#make && make install



配置文件的组成部分:

主配置文件:nginx.conf

包含文件:include conf.d/*.conf -->/etc/nginx/conf.d/*.conf

fastcgi的配置文件:fastcgi_params

  uwcgi_params

  scgi_params



配置文件的配置指令(必须以分号结尾):

Directive value1[value2....];

支持使用变量:

内置变量:由模块引入;

自定义变量:

set variable value;

引用变量:$variable


配置文件的组织结构:主要有以下三段

main block

event{

.... #配置系统调用的相关

}

http{

.....#http相关的所有配置

}

详解:

http配置段:

http{

....

upstream{

.....#定义一个负载均衡的容器的反向代理

}

server{

.....

servername

root

alias

location /url{

.....

}

}

server{

.....

}

}

main 配置段:

类别:

正常运行必备的配置:

优化性能相关的配置:

用于调试、定位问题的配置:

详解:

1、正常运行必备的配置:

1.user USERNAME[GROUPNAME]

指定用于运行worker进程的用户和组,如果编译的时候没有指定用户,则使用配置文件里面的

user nginx nginx;

2.pid /PATH/TO/PID_FILE

指定nginx进程的pid文件路径

pid /var/run/nginx.pid;

3、worker_rlimit_nofile #NUM;

指定一个worker进程可以打开最大的文件描述符数

worker_rlimit_nofile 1024;

4、worker_rlimit_sigpending #NUM;

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

worker_rlimit_sigpending 1024;

2、性能优化的配置:

1.worker_processes #NUM

worker进程的个数;通常应为物理CPU核心数减1

可以为“auto”,实现自动设定

2.worker_cpu_affinlty CPUMASK ..;

CPUMASK:

0001

0010

0100

work_cpu_affinity 00001 00010 00100;

3.work_priority nice:

[-20,19]

调试、定位问题的配置:

1、daemon[on|off]

是否以守护进程方式启动nginx

2、master_process on|off

是否以master/worker模型运行nginx

3、error_log /PATH/TO/ERROR_LOG level

错误日志文件目录及级别;出于调试需要,可以设定为debug,但debug仅在编译时使用“--with-debug”选项才有效。

Nginx.conf的配置:

main配置段

event{

...

}

1、worker_connection

每个worker进程所能相应的最大并发请求数量;

总数量 = worker_processes *worker_connection

2、use [epool|rgsig|select|poll]

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

3、accept_mutex[on|off]

各worker接收用户的请求的负载均衡锁;启动时,表示用于让多个worker轮流地,序列化地相应新请求;

4、lock_file /PATH/TO/LOCK_FILE;

http配置段:

http{

...

server{

...

server_name 

root 

}

}

套接字相关指令

1、server{}

定义一个虚拟主机;

server{

listen PORT;

server_name NAME;

root /PATH/TO/DOCUMENTROOT;

}

注意:

(1)基于port:

listen指令监听在不同的端口;

(2)基于hostname

server_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:SPDY PROTOCOL(speedy),在编译时必须编译了spdy模块的情况下,用于支持SPDY协议

http2:http version2;

3、server_name NAME[NAME2...]

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

匹配顺序:

(1)首先做精确匹配,如:www.example.com

(2)匹配左侧通配符,如:*.example.com

(3)匹配右侧通配符,如:www.example.

(4)匹配正则表达式,如:~^.*\.example\.com$

(5)default_server

4、tcp_nodelay on|off

对keepalive模式下的连接是否启用TCP_NODELAY选项,默认没启动。为了避免开销,如果启动这个选项,自动会把很多小的报文合并成一个大的报文发送出去,这可能会造成一些异常,所以尽量不让合并,这个要关闭为好。

5、tcp_nopush on|off;

是否启用TCP_NOPUSH(freebsd)或者TCP_CORK(linux)选项;尽在sendfile为on时有用;默认为off;

6、sendfile on|off;

是否启用sendfile功能;

路径相关的指令:

7、root

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

server{

...

server_name www.example.com;

root /data/www/vhost1;

}

http://www.example.com/p_w_picpaths/logo.jpg -->/d/data/www/vhost1/p_w_picpaths/log.jpg

server{

...

server_name www.example.com;

location /p_w_picpaths/{

root /data/imgs/;

...

}

}

http://www.example.com/p_w_picpaths/logo.jpg -->/data/imgs/log.jpg

8.location [= | ~|~*|^~] url{...}

 location@name{....}

功能;允许根据用户请求的URL来匹配的各个location,匹配时,此请求将被对应的location块中的配置所处理;简言之,即用于为需要用到专用配置的URL提供特定配置;

server{

...

server_name www.example.com;

root /data/www;

...

location /admin/{

....

root /data/www/admin/; #不指明就是root+ location_name

}

}

操作符:

=:URL的精确匹配;

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

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

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

匹配优先级:精确匹配= > ^~ > ~|~* > 不带符号的url

9、alias

只能用于location配置段,定义路径别名;

location /p_w_picpaths/{

root /data/imgs/;

}

location /p_w_picpaths/{

alias /data/imgs/;

}

注意:

root指令:相当于指定location所在的目录

/p_w_picpath/test.jpg --> /data/imgs/p_w_picpaths/test.jpg

alias指令:相当于指定/data/imgs/为 p_w_picpaths的别名,p_w_picpaths就对应到/data/imgs/目录 

/p_w_picpath/test.jpg --> /data/imgs/test.jpg

访问http://../p_w_picpaths/1.jpg

10、index

index file ...;

指定默认主页面

11、error_page code ..[=[response]] url;

根据http的状态码重定向错误页面

error_page 404 /404.html

error_page 404=200 /404.html #以指定的响应码进行相应,此处指定为200  上面为404

12、try_files file1 file2... uri;

try_files file1 file2... = code;

访问的时候,会尝试查找从第一个到N-1个文件,第一个找到的就是返回给请求者的资源,若1至N-1个文件都不存在,则跳转至最后一个URI(必须不能匹配至当前location,由其他location定义的地方,防止死循环),或者返回定义的code

客户端请求相关的配置:

13、keepalive_time 

设置keepalive连接的超时时长,0表示禁用长连接,默认为75s

14、keepalive_requests NUM;

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

15、keepalive_disable none|browser...;

指明禁止为何种浏览器使用keepalive功能;

16、send_time

发送响应报文的超时时长,默认为60s。客户端两次响应时间间隔超过这个,服务端就会自动断开连接。

17、client_body_buffer_size 8k|16k;

接收客户端请求报文body的缓冲区大小,超出此指定大小,数据就不在内存中保存,将其移存到磁盘上,存在的位置,由client_body_temp_path 指定

18、client_body_temp_path path [level1 [ level2[ level3]]]

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

level1 一级子目录个数

level2 二级子目录个数

level3 三级子目录个数

client_body_temp_path /var/tmp/client_body 2 2 ; 

表示

19、limit_excpet METHOD{...}

对指定范围之外的其他方法进行访问控制

limit_excpet GET{

allow 192.168.80.0/24;

deny all;

}

20、limit_rate speed;

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

文件操作优化相关配置

21、aio on|off;

22、directio size | off;

超过指定大小,不在内存中缓冲,直接和磁盘交互读取和存储

23、open_file_cache off|max=N [inactive = time];

Nginx可以缓存一下3中信息:

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

(2)打开的目录结构;

(3)没有找到的或者没有操作权限的相关信息。

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

inactive =time 表示在指定的时长内没有被访问过的缓存项视为无效项,予以删除;

24、open_file_cache_errors on|off;

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

25、open_file_cache_valid time;

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

26、open_file_cache_min_users NUM;

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

ngx_http_access_module模块的配置(基于IP的访问控制)

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

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

应用上下文:http, server, location, limit_except


ngx_http_auth_basic_module模块的配置(basic认证)

29、auth_basic string | off;

使用http basic认证协议对用户进行认证;

30、auth_basic_user_file file;

实现用户认证的帐号文件;

文件格式:

name1:password1

name2:password2:comment

name3:password3

支持的密码格式:

(1)encrypted with the crypt() function;

(2)md5

location /admin/{

auth_basic "Admin Area";

auth_basic_user_file /etc/nginx/.ngxhtpasswd;

}

下面为生成.ngxhtpasswd文件的方法:

需要用到htpasswd命令,在httpd包中,因此需要安装这个包,但是不用启动服务。

# yum install -y httpd

# htpasswd -c -m /etc/nginx/.ngxhtpasswd tom  然后输入2次密码即可创建好tom用户

# htpasswd  -m /etc/nginx/.ngxhtpasswd tom    第一次需要创建文件所以需要-c参数

ngx_http_log_module 模块的配置(访问日志)

31、log_format name string ...;

定义日志格式及其名称,日志格式通过调用内置变量来定义。

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

access_log off;

访问日志文件路径、格式名称以及缓存大小和刷写时间间隔,建议设置缓存,以提升性能,但是会面临异常退出丢失日志

example:

log_format compression '$remote_addr - $remote_user [$time_local] '

                       '"$request" $status $bytes_sent '

                       '"$http_referer" "$http_user_agent" "$gzip_ratio"';


access_log /spool/logs/nginx-access.log compression buffer=32k;

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

open_log_file_cache off;

ngx_http_stub_status_module 模块的配置

34、stub_status;

通过指定的url输出stub_status

Active connections: 291   #当前活动的客户端连接数 包括等待的

server accepts handled requests #accepts 已接受的  handled 已处理完成的 requests 总请求数

16630948 16630948 31070465 

Reading: 6 Writing: 179 Waiting: 106 

#reading nginx正在读取头信息的数量

#Writing 正在发送响应报文的连接数量

#Waiting 等待nginx发送响应的空闲连接数量

ngx_http_referer_module模块配置(基于请求报文的Referer首部的值做访问控制) -->防盗链

35、valid_referers none | blocked | server_names | string ...;

none:请求报文不存在referer首部

blocked:请求报文中存在referer首部,但其没有有效值,或者非以http:// https:// 开头的

server_name:其值为一个主机名

arbitrary string:直接字符串,可使用*通配符

regular expression:以~起始的正则表达式

内置变量:$invalid_referer(所有不符合valid_referer指定定义的引用请求均为不合法引用)

example:

valid_referers none blocked server_names

*.example.com example.* www.example.org/galleries/

~\.google\.;

if($invalid_referer){

return 403; #也可以做重定向,做出类似于“图片仅供XXX使用”

}

一个示例配置

user  nobody;

worker_processes  1;

error_log  logs/error.log  info;


events {

    worker_connections  1024;

}


http {

    server {

        listen          80;

        server_name     www.linuxidc.com;

        access_log      logs/linuxidc.access.log main;

        location / {

            index index.html;

            root  /var/www/linuxidc.com/htdocs;

        }

    }


    server {

        listen          80;

        server_name     www.Androidj.com;

        access_log      logs/androidj.access.log main;

        location / {

            index index.html;

            root  /var/www/androidj.com/htdocs;

        }

    }

}


mail {

    auth_http  127.0.0.1:80/auth.php;

    pop3_capabilities  "TOP"  "USER";

    imap_capabilities  "IMAP4rev1"  "UIDPLUS";


    server {

        listen     110;

        protocol   pop3;

        proxy      on;

    }

    server {

        listen      25;

        protocol    smtp;

        proxy       on;

        smtp_auth   login plain;

        xclient     off;

    }

}

学习视频:http://edu.51cto.com/course/course_id-5550.html