nginx是当前流行的用作反向代理服务器,作为web服务器,某些地方甚至优于apache

特性:

    1.基于边缘触发的epoll提供IO多路复用,epoll基于事件驱动的IO模型,提高了响应连接请求的性能

    2.目前不支持模块的动态装卸载,模块只会随着程序的启动而启动,但是由阿里做二次改进的版本tengine支持

    3.高可靠:一个主控进程master创建工作子进程worker,主控进程读取验证配置,创建绑定套接字,启动终止维护woker进程的个数,无需重启进程让新配置加载,平滑版本升级。worker子进程可以负责缓存加载,响应用户请求,管理缓存等

    4.低内存消耗:10K个keep-alive下的connection仅2.5M内存

    5.支持热部署,支持不停机更新配置文件或更换日志文件,升级程序版本

    6.事件驱动,异步IO,内存映射(mmap),sendfile和sendfile64(可以发送更大的文件)

    sendfile机制:没有sendfile机制的话:客户请求---->内核加载磁盘数据到内核内存--->从内核到内存复制到进程内存 --->从进程内存返回到内核内存---->通过网卡回应客户请求,有了sendfile     请求---->内核加载磁盘数据到内核内存---->通过网卡响应给客户,省去了中间的多余步骤

基本功能:

    1.静态资源的web服务器,能缓存打开的文件描述符到内存再次访问速度会加快,实现打开同一个文件多次时,打开性能提升

    2.支持http,smtp,pop3三种协议的反向代理服务器,反向代理服务器放置于客户和web服务器之间,利用缓存加速响应客户端,能处理用户请求从而减缓web服务器压力,加强web服务器安全

    3.有了反向代理实现了缓存加速,负载均衡

    4.支持fastcgi协议(实现LNMP),uwsgi(实现与python交互)

    5.非DSO机制的模块化,过滤机制(对某些内容特殊处理,如压缩),ssi(服务器端包含)图像大小调整

    6.支持SSL,提供https服务

扩展功能:

    1.基于ip和名称的虚拟主机

    2.支持长连接---keepalive

    3.平滑升级

    4.定制访问日志,支持日志缓存区提高日志存储性能

    5.url重写

    6.路径别名

    7.基于ip和用户的访问控制,用户访问控制需要借助httpd提供的htpasswd

    8.支持速率限制,并发访问数量限制

工作模式:非阻塞,事件驱动,一个主进程生成多个woker子进程,每个woker可以响应多个请求

模块类型:

    核心模块

    标准http模块

    可选的http模块

    邮件相关模块

    第三方模块

wKioL1Yq8PaS5geGAAF1lfdkE_k156.jpg

编译安装nginx:

1、解决依赖关系
编译安装nginx需要事先需要安装开发包组"Development Tools"和 "Development Libraries"。同时,还需要专门安装pcre-devel包:
# yum -y install pcre-devel(基于perl的正则表达式以支持url重写匹配)

2、安装
首先添加用户nginx,实现以之运行nginx服务进程:
# groupadd -r nginx
# useradd -r -g nginx nginx
接着开始编译和安装:

# ./configure \
  --prefix=/usr/local/nginx \
  --sbin-path=/usr/local/nginx/sbin/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/nginx.pid  \
  --lock-path=/var/lock/nginx.lock \
  --user=nginx \
  --group=nginx \
  --with-http_ssl_module \
  --with-http_flv_module \
  --with-http_stub_status_module \
  --with-http_gzip_static_module \
  --http-client-body-temp-path=/var/tmp/nginx/client/ \   #客户端上传文件临时存放目录
  --http-proxy-temp-path=/var/tmp/nginx/proxy/ \
  --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
  --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
  --http-scgi-temp-path=/var/tmp/nginx/scgi \
  --with-pcre
# make && make install

创建上面指定的没有的路径:

mkdir -pv /var/tmp/nginx/{client,fastcgi,proxy,uwsgi}

启动nginx:

/usr/local/nginx/sbin/nginx

wKiom1YXyi7D5DsbAAB-kV5kznA187.jpg


配置文件/etc/nginx/nginx.conf

配置文件的http://nginx.org/en/docs/ngx_core_module.html官方文档说明

main配置段:全局配置

http{}配置段:http协议相关配置

event{}配置段:定义event模型工作特性


主配置段指令:

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

user nginx nginx  指以nginx用户和nginx组运行nginx的worker进程

pid /var/run/nginx/nginx.pid 指定nginx守护进程的pid文件位置

woker_rlimit_nofile:指定所有woker进程加起来能够打开的最大文件句柄数

worker_rlimit_core:一个woker进程能打开的一个文件大小的最大值

2.性能优化相关的配置:

woker_processes #:woker进程的个数,通常少于cpu物理核心数

worker_cpu_affinity:将某woker进程绑定到某特定CPU,防止woker进程经常在各个cpu上切换,另外,对于此nginx的进程的缓存不会失效,这里用到了cpumask,0000 0001代表第一颗cpu,0000 0010代表第二颗,00000100代表第三颗,第几颗对应的就是第几位

timer_resolution:计时器解析度,提高可使日志更精准,降低可减少gettimeofday()调度(属于一种系统调用),从而提高性能,所以建议降低

worker_priority:worker进程优先级,这里使用nice值指明(-20-19),越小优先级越高,优先级越高,就越容易被调度到cpu上先行执行

3.event相关配置:

accept_mutex:master调度各woker进程时使用的负载均衡锁,on表示能让多个woker进程轮流序列化地响应请求

accept_mutex_delay:某个worker进程正在响应其他请求时,下一个请求延时多久再响应

lock_file:锁文件路径

use:使用何种事件驱动模型(select,epoll等)

worker_connections:一个woker进程能处理的并发连接数,  尽量设置大,但不超过65535

4.调试和定位问题相关配置:

debug-connection和debug-piont:

只有在编译nginx时打开--with-debug才能指定debug级别,否则就算指定debug级别也无效

root@localhost nginx-1.8.0]# ./configure --help | grep debug
  --with-debug                       enable debug logging

daemon:是否以守护进程运行nginx,off表示运行在前台,这样可以输出调试信息在屏幕,调试时使用

master_process:是否以master/woker模型允许nginx,调试时才设置为off

error_log:日志位置和级别指定

Syntax:error_log file | stderr |syslog:server=address[,parameter=value] |memory:size[debug |info |notice |warn |error |crit |alert |emerg];
               
Default:
error_log logs/error.log error;





常需要调整的参数worker_processes worker_priority worker_cpu_affinity worker_connections

使用nginx -s reload可以重载nginx

5.nginx作为web服务的配置:由ngx_http_core_module提供

官方文档http://nginx.org/en/docs/http/ngx_http_core_module.html

1.server{

    location URL{

    root 指明请求的url是本地文件系统哪个路径,可以定义在location和server上下文中,如果在

server段和location段都定义了,那么location段优先,如果root段写的是相对路径,相对的是nginx的安装路径

}    #location用于定义url和本地文件系统的映射关系

}#每个server类似于httpd中的<VirtualHost>,一个server中可以有多个location

location /URL {
                    if ...{    #还有if上下文
                        ...
                    }
                    root "/path/to/somewhere";
                    ...
                }

与http相关的指令只能放置于http,server,location,upstream,if中,但有些指令只能应用于这五种中的某几种

定义一个基于端口的虚拟主机:

wKioL1YX4LHiHEMYAAAqVYK-r1s011.jpg

创建页面文档:

wKiom1YX4JijvacMAACZ9GWztrk113.jpg

2.listen

    listen ip:[port];

    listen port;

    listen unix:path 客户端只能是本机

3.server_name (只用于server上下文)后面可以跟多个主机名,名称还可以使用正则表达式(~)或者通配符匹配

匹配优先级从高到低规则:当用户请求到达后根据主机名判断应用于哪个主机上

(1)先做精确匹配检查

(2)左侧通配符匹配检查 *.lee.com

(3)右侧通配符匹配检查 mail.*

(4)正则表达式 ~^.*\.lee\.com$ (使用正则表达式时需要~放在首部作为引导)

(5)default_server 以上都匹配不到则匹配此默认法则,定义在listen后面
4.location根据用户请求的url匹配定义的各location,匹配到时,此请求被相应的location块处理,例如做访问控制等

第一种用法:location=  |  ~  |~* |  ^~  ] uri { ... }
第二种用法:location @name { ... }

=表示精确匹配检查

~正则表达式模式匹配检查,区分字符大小写

~*正则表达式模式匹配检查,不区分字符大小写

^~uri的前半部分匹配,且不检查正则表达式(不匹配url中params,fragment等字段)

不带等于号的相当于起始于这个路径的都可以被匹配

匹配优先级 第一是 =  第二是 ^~ 第三是 ~ 第四是 ~*  最后是不带任何符号的

官方范例:

location = / {
    [ configuration A ]
}

location / {
    [ configuration B ]
}

location /documents/ {
    [ configuration C ]
}

location ^~ /p_w_picpaths/ {
    [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
    [ configuration E ]
}

The “/” request will match configuration A, the “/index.html” request will match configuration B, the “/documents/document.html” request will match configuration C, the “/p_w_picpaths/1.gif” request will match configuration D, and the “/documents/1.jpg” request will match configuration E.

The “@” prefix defines a named location. Such a location is not used for a regular request processing, but instead used for request redirection. They cannot be nested, and cannot contain nested locations

实验测试:

wKioL1YX6e_DvnQpAABug-XvFWo257.jpg

上面表示相对于www.lee.com这个域名,/是起始于vhosts/web1目录,而/p_w_picpaths/起始于/vhosts/p_w_picpaths目录

创建各自目录下标识性页面:

wKioL1YX6e6yI8onAAB0rsEM5rY501.jpg

根据优先级这个匹配到了第三个location,而第三个location的root其实是指向的/vhosts/text目录,下面没有p_w_picpath目录,所以报错

wKiom1YX6dXig4TZAACZi_fTfa4870.jpg

6.alias 用于location配置段,定义别名

       location /p_w_picpaths/ {
                root "/vhosts/web1";
        }

通常情况下:http://www.lee.com/p_w_picpath/a.jpg<-------/vhosts/web1/p_w_picpaths/a.jpg

       location /p_w_picpaths/ {
                alias "/www/pictures/";  #对于alias,上面的url右侧带斜线,映射的目录右侧就必须带斜线
        }
别名后:http://www.lee.com/p_w_picpath/a.jpg<-------/www/pictures/a.jpg

7.index file 默认主页面 index index.php index.html

8.error_page 根据http响应码指明特定错误页面

error_page code [...] [=code] URI | @name  @name表示定位到另一个location中

wKioL1YYadXzZRZTAAAtXikr288701.jpg

将状态码为404的页面定向到404_customed.html页面

wKioL1YYbHjiBO7mAAAriW9cey0559.jpg

[=code]表示以自定响应码响应,例如:假如出现404状态码,你可以定义返回302页面,以指定的响应码进行响应;省略code表示以新资源的响应码为响应码;

wKiom1YYbbCiqBWOAAAt-Lb1euE776.jpg

test1.html不存在,状态码本应该是404,现在变成了200

wKioL1YYbcuxFxg1AAFcpKvNI90063.jpg

9.访问控制实现:可以再多个上下文中定义

禁止192.168.3.1访问

wKioL1YYb3eQtCYKAAAmbESEZfo035.jpg

发现被禁止了

wKiom1YYb13BhSqDAACTROspf7c044.jpg

仅允许192.168网段访问

wKioL1YYb3fBO9o-AAAzePL8XcQ111.jpg

10.基于用户的访问控制:

wKiom1YYcpGzdO1AAABQEPkwKkM492.jpg

账号密码保存文件建议使用htpasswd命令创建

wKioL1YYcqvgWFJmAABMG_qz_OI670.jpg

测试:

wKiom1YYcpGQRqfzAAEHyxitzZ0403.jpg



11.https实现

创建CA证书:

wKioL1YYfAWT9_KGAAJXPN6nphU697.jpg

创建必备文件

wKiom1YYe-zy_GyZAAAt2hCJvG8253.jpg

在/etc/nginx目录下生成请求

wKioL1YYfAbQ46zIAAKMBeL344s536.jpg

CA签证

wKiom1YYe-3wpUYTAAC_eYgVBzE631.jpg

更改配置文件

wKioL1YYfAaxRlaTAADFiy37m7w046.jpg

12.stub_status 状态页,仅能用于location上下文中

wKiom1YYgQXiQCDSAAAqU91hLtw342.jpg

测试:

wKioL1YYgR_hiEuhAADxAFLRo_8034.jpg

字段说明:

1.已经打开的活动链接数

2.三个数字分别表示:已经接受的连接数,已经处理过的连接数,处理的请求数,请求数可能大于连接数是因为我们启用了持久连接功能(一次连接会发送N此请求)

3.reading表示正处于接收请求状态的连接数,writing表示请求已接收完成,正处于处理请求或者发送响应的过程中的连接数,wating表示工作于保持连接模式且处于活动状态的连接数

13.rewrite指令----url重写,作用是在网站服务器后台做了页面路径更改后不需要用户跟随这种更改,直接在服务器端实现了对用户请求的重定向

格式 rewrite 正则表达式 重定向路径 flag

例如:一般网站修改了域名会使用

rewrite ^/p_w_picpaths/(.*\.jpg)$  /imgs/$1 break;   $1表示引用前面括号中的

表示http://www.lee.com/p_w_picpaths/a/b/c/1.jpg---->http://www.lee.com/imgs/a/b/c/1.jpg

flag解释:

last:用户请求的url被重写后生成新的url,客户端会向新的url发请求,所以有可能还会被其他的正则表达式匹配,匹配到将继续执行重写,如果组织不好,会一直循环重写

break:一旦此rewrite规则重写完成之后,就不会再像上面那样被别的当前location内的其他rewrite语句检查,而是直接处理

wKioL1YYi8bi_tZXAABGa8L_9ro015.jpg

创建页面:

wKiom1YYi6yCCSzFAABJvIZ0444694.jpg

测试:

wKioL1YYi8aicIn3AABobkODX0s564.jpg

redirect:以302响应码(临时重定向)返回新的url

permanent:以301响应码永久重定向返回新的url

14.if (condition) {...}

应用在location和server上下文中

condition中可以使用变量:

(1)变量名:

变量值为空串或者以“0”开始判定为false,其他均为true

(2)以变量为操作数构成的比较表达式

可使用=,!=类似的比较操作符测试

(3)正则表达式的模式匹配操作

~:区分大小写的模式匹配检查

~*:不区分大小写的模式匹配检查

!~和!~*:对上面两种测试取反

(4)测试文件是否为文件: -f !-f

(5)测试指定路径是否为目录: -d,!-d

(6)测试文件存在性 -e !-e

(7)检测文件是否有执行权限 -x,!-x

例:根据浏览器类型给与不同页面返回

if ($http_user_agent ~* MISE) {

    rewrite ^(.*)$ /msie/$1 break;

}

15.防盗链

下面定义了只有www.lee2.com引用本站图片,其他人返回错误页面

location ~* \.(jpg|gif|jpeg|png)$ {

    valid_referer none blocked www.lee.com;

    if ($invalid_referer) {

        rewrite ^/ http://www.lee.com/403.html;

    }

}

16.定制访问日志格式

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;自定义访问日志时需要启用此项

http_x_forwarded_for:用于记录远程客户机访问时经过的代理服务器有哪些。

这里的变量都是nginx内建变量,可看官方文档自行定义

17.压缩机制

gzip on

gzip_comp_level 9

网络连接相关配置:

(1)keepalive_timeout:长连接超时时长,默认75s

(2)keepalive_requests:一个长连接能允许请求的最大资源数

(3)keepalive_disable [msie6|safari|none];为指定类型浏览器禁用长连接

(4)tcp_nodelay on|off:对于长连接,将多次请求的小资源合并为一个大资源构建响应报文发回客户端,建议关闭以减小因为组合包带来的不必要的延迟

(5)client_header_timeout:读取客户端发来的http请求首部的超时时长

(6)client_body_timeout:读取客户端发来的http请求body部分的超时时长

(7)send_timeout;发送响应报文的超时时长

fastcgi的相关配置,只有fpm机制可以用

wKioL1YYm3OAxeY5AABnMa4JpyY274.jpg