nginx

nginx(web server,web reverse proxy)

http事务:request <----> response
request:
<method> <URL> <version>
<HEADERS>
...
<body>

response:
<version> <status> <reason phrase>
<HEADERS>
...
<body>

web资源:URL (scheme://server:port/path/to/source)

方法:GET, HEAD, POST, (WEBDAV) PUT, DELETE, TRACE, OPTIONS

status:
1xx: 信息类
2xx: 成功类,200
3xx: 重定向,301, 302, 304
4xx: 客户端类错误,403, 401, 404
5xx: 服务端类错误,502

I/O类型:
同步和异步:synchronous, asyncrhonous
关注的是消息通知机制

同步:调用发出不会立即返回,但一旦返回就可以返回最终结果;
异步:调用发出之后,被调用方立即返回消息,但返回的非最终结果;被调用者通过状态、通知机制来通知调用者,或通过回调函数来处理结果;

阻塞和非阻塞:block, nonblock
关注的是调用者等待调用结果(消息、返回值)时的状态

阻塞:调用结果返回之前,调用者(调用线程)会被挂起;调用者只有在得到结果之后才会返回;
非阻塞:调用结果返回之前,调用不会阻塞当前线程;

5种I/O模型:
同步阻塞   blocking IO
同步非阻塞    nonblocking IO
IO复用    IO multiplexing            select(),poll()
信号驱动IO   signal driven IO    通知:1、水平触发:多次通知;2、边缘触发:只通知一次;
异步IO     asyncrhonous IO

nginx:读音engine x
二次研发:tengine、registry

libevent:高性能的网络库
1、epool()

Nginx的特性:
模块化设计、较好扩展性;
高可靠性:master/worker
支持热部署:不停机更新配置文件、更换日志、更新服务器程序版本;
低内存消耗 :10000个keep-alive连接模式下的非活动连接仅消耗2.5M内存;
事件驱动机制(mmap), 异步IO(aio), 内存映射机制(mmap);

基本功能:
静态资源的web服务器,能缓存打开的文件描述符;
http、smtp、pop3、imap4等协议的反向代理服务器;
缓存加速、负载均衡;
支持FastCGI(php-fpm), uWSGI(Python Web Framwork)等协议
模块化(非DSO机制),过滤器zip、SSI及图像的大小调整;
支持SSL;

扩展功能:
基于名称和IP的虚拟主机;
支持keepalive
支持平滑升级
定制访问日志,支持使用日志缓存区提供日志存储性能;
支持url rewrite;
支持路径别名;
支持基于IP及用户的访问控制;
支持速率限制,支持并发数限制;

Nginx的程序架构:
master/worker
一个master进程,可生成一个或多个worker进程;
事件驱动模型:epoll(Linux默认边缘触发), kqueue(FreeBSD), /dev/poll(Solaris)
消息通知(复用器):select, poll, rt signals
支持sendfile,  sendfile64
支持AIO,mmap

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

模块类型:
1、核心模块:core module
2、标准模块:
a、标准http模块:Standard HTTP modules
b、可选http模块:Optional HTTP modules
c、邮件相关模块:Mail modules
3、第三方模块:3rd party modules

安装方法:
1、源码:编译安装

yum groupinstall "development tools" "server plantform development"

yum -y install pcre-devel openssl-devel zlib-devel

wget http://101.110.118.22/nginx.org/download/nginx-1.14.0.tar.gz

tar xvf nginx-1.14.0.tar.gz -C /usr/local/

cd /usr/local/nginx-1.14.0/

./configure --help | less

useradd -r nginx

./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

make && make install

2、制作好的程序包:rpm包

配置文件组织结构
main block:全局配置;对http及mail模块均有效;
events {}:定义event模型(事件驱动)的相关配置;对http及mail模块均有效
http {}:http协议的相关配置;
mail {}:mail协议的相关配置;

 配置指令:要以分号结尾,语法格式:directive    value1 [value2...]
支持使用变量:1、内置变量:模块会提供内建变量;2、自定义变量:set var_name value;

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

正常运行必备的配置:
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 #;
指定单个worker进程所能够打开的最大文件描述符数量;

性能优化相关的配置:
1、worker_processes #;
worker进程的个数;通常应该为物理CPU核心数量减1;
可以为"auto",实现自动设定;

2、worker_cpu_affinity  CPUMASK(cpu掩码) CPUMASK ...;
  worker_cpu_affinity auto [CPUMASK]
   实现nginx绑定cpu;
优点:提升缓存的命中率;
CPUMASK:多少颗cpu就用多少个二进制来表示;如下例如4颗cpu;
0001
0010
0100
1000

worker_cpu_affinity 00000001 00000010 00000100;

3、worker_priority  nice;
定义worker进程的优先级;
[-20, 19],默认nice值为0
100-139,默认优先级为120

4、timer_resolution interval;
计时器解析度,降低此值,可减少gettimeofday()系统调用的次数;

调试、定位问题的配置:
1、daemon  off|on;
是否以守护进程方式启动nignx;默认为on;调试时应该设置为off;

2、master_process  on|off;
是否以master/worker模型运行nginx;默认是on;调试时应该设置为off;

3、error_log     /PATH/TO/ERROR_LOG     level;
错误日志文件的记录方式,及其级别;出于调试的需要,可以设为debug;但debug仅在编译时使用了“--with-debug”选项时才有效;
方式:
file /PATH/TO/SOME_LOG_FILE;
stderr:发送到错误输出;
syslog:server=address[,parameter=value]:发送给syslog服务器;
memory:size

日志级别:
debug:依赖于configure时的--with-debug选项;
info、notice、warn、error、crit、alert、emerg

事件驱动相关的配置:
1、accept_mutex on | off;
master调度用户请求至各worker进程时使用的负载均衡锁;on表示能让多个worker轮流地、序列化的响应新请求;

2、lock_file file;
accept_mutex用到的锁文件路径;

3、use method;
指明并发连接请求处理时使用的方法;即指明使用的事件模型;建议让nginx自行选择;
use epool;linux只有epool可选

 4、worker_connections number;
每个worker进程所能够响应的最大并发请求数量;

总结:常需要进行调整的参数:
worker_processes,worker_connetctions,worker_cpu_affinity,worker_priority

新改动配置生效的方式:nginx -s reload | stop | quit | reopen

nginx作为web服务器时使用的配置:
定义套接字相关功能
1、server {}:定义一个虚拟主机;
server {
listen PORT;
server_name HOSTNAME;
root /PATH/TO/DOCUMENTROOT;
}
...

注意:
(1) 基于port的虚拟主机;
listen指令监听在不同的端口;
(2) 基于hostname的虚拟主机;
server_name指令指向不同的主机名;
(3)基于ip的虚拟主机:
   listen IP:PORT;

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

default_server:设置默认虚拟主机;用于基于IP地址,或使用了任意不能对应于任何一个server的name时所返回站点;
ssl:用于限制只能通过ssl连接提供服务;
backlog:后援队列的长度;
rcvbuf:接收缓冲区大小;
sndbuf:发送缓冲区大小;
spdy:SPDY protocol(speedy),在编译了spdy模块的情况下,用于支持SPDY协议;
http2:http version 2;

3、server_name NAME [...];
指明当前server的主机名;后可跟一个或多个用空白字符分隔的主机;
支持使用*任意长度的任意字符;
支持~起始的正则表达式模式字符串;

优先级:
(1) 首先做精确匹配;例如:www.magedu.com
(2) 左侧通配符;例如:.magedu.com
(3) 右侧通配符,例如:www.magedu.

(4) 正则表达式,例如:~^.*.magedu.com$
(5) default_server

4、root path;

设置web资源的路径映射;用于指明请求的URL所对应的文档的目录路径;
可用上下文:http,server,location,if

5、location [ = | ^~ | ~ | ~*  ] uri { ... };
   location @name { ... }
功能:允许根据用户请求的URI来匹配定义的各location;匹配到时,此请求将被相应的location块中的配置所处理,例如做访问控制等功能;

=:URI的精确匹配;
^~:URI的前半部分匹配,不支持正则表达式;
~:做正则表达式匹配,区分字符大小写;
~*:做正则表达式匹配,不区分字符大小写;

匹配优先级:精确匹配=、^~、~或~*、不带符号的URL;

6、alias path;
只能用于location配置段,定义路径别名;
location  /images/ {
root /data/imgs/;
}
http://www.magedu.com/images/a.jpg      <---    /data/imgs/images/a.jpg

location  /images/  {
alias /data/imgs/;
}
http://www.magedu.com/images/a.jpg      <---    /data/imgs/a.jpg

注意:root表示指明路径为对应的location "/" URL;alias表示路径映射,即location指令后定义的URL是相对于alias所指明的路径而言;

7、index  file;
默认主页面;
例如:   index    index.php    index.html;

8、error_page    code   [...]    [=code]   URI   |   @name;

根据http的响应状态码来指明特用的错误页面;
error_page   404   /404_customed.html

 [=code]:以指定的响应码进行响应,而不是默认的原来的响应码;默认表示以新资源的响应码为其响应码;
error_page  404  =200  /404.html

9、基于IP的访问控制
allow    IP |  NETWORK | unix: | all;
deny    IP  | NETWORK | unix: | all;
可用上下文:http, server, location, limit_except

10、基于用户的访问控制(basic,digest)

auth_basic   "";
auth_basic_user_file   "/PATH/TO/PASSWD_FILE";
账号密码建议使用htpasswd来创建
htpasswd命令;

htpasswd -c -m  /etc/nginx/.ngxhtpasswd tom

htpasswd -m  /etc/nginx/.ngxhtpasswd jerry

11、https服务
前提:生成私钥,生成证书签署请求,并获得证书;

server {
listen 443 ssl;
server_name www.magedu.com;

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    /vhosts/web1;
index    index.html index.htm;
}
}

12、stub_status {on|off};
通过指定的uri输出stub status;仅能用于location上下文;

location  /status    {
stub_status on;
allow    172.20.120.0/23
deny   all;
}

结果示例:
Active connections: 5
server               accepts               handled             requests
                             234                       234                    462
Reading: 1               Writing: 5                Waiting: 12

Active connections:当前所有处于打开状态的连接数;
accepts:已经接受过的连接数;
handled:已经处理过的连接数;
requests:已经处理过的请求数;在“保持连接”模式下,请求数量可能会多于连接数量;
Readking:正处于接收请求状态的连接数;
Writing:请求已经接收完成,正处于处理请求或发送响应的过程中的连接数;
Waiting:保持连接模式,且处于活动状态的连接数;

13、rewrite     regex      replacement     [flag];
把用户请求的URI基于regex做检查,匹配到时将替换为replacement指定的字符串;
在同一个location中存在的多个rewrite规则会自上而下逐个被检查(循环);可以使用flag控制此循环功能;
regex:正则表达式,用于匹配用户请求的url;
replacement:重写为的结果;
[flag]:
last:一旦此rewrite规则重写完成后,就不再被后面其他的rewrite规则进行处理;而是由user agent重新对重写后的URL再一次发起请求,并从头开始执行类似的过程;
break:一旦此rewrite规则重写完成后,由user agent对新的URL重新发起请求,且不再会被当前location内的任何rewrite规则所检查;
redirect:以302响应码(临时重定向)返回新的URL;
permanent:以301响应码(永久重定向)返回新的URL;
 例如:
rewrite    ^/images/(.*.jpg)$     /imgs/$1    break;
http://www.magedu.com/images/a/1.jpg      --->    http://www.magedu.com/imgs/a/1.jpg

14、if
语法 if (condition)  {...}
应用环境:server,location
condition:
(1)变量名:
变量值为空串,或者以“0”开始,则为fault,其他均为true;
(2)以变量为操作数构成的比较表达式
可使用=,!=类似的比较操作符进行测试;
(3)正则表达式的模式匹配操作;
~:区分大小写的模式匹配检查;
~:不区分大小写的模式匹配检查;
!~和!~
:对上面两种测试取反;
(4)测试路径为文件的可能性:-f,!-f
(5)测试路径为目录的可能性:-d,!-d
(6)测试文件的存在性:-e,!-e
(7)检查文件是否有执行权限:-x,!-x
例如:
      if    ($http_user_agent ~ MSIE) {
             rewrite   ^(.
)$  /msie/$1 break;
 }

15、防盗链
location   ~*   .(jpg|gif|jpeg|png)$   {
          valid_referer   none  blocked   www.lewis.com;
          if     ($invalid_referer)   {
                            rewrite     ^/    http://www.lewis.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;

注意:此处可用变量为nginx各模块内建变量;

网络连接相关配置:

1、keepalive_timeout  #;          长连接的超时时长,默认为75s;

2、keepalive_requests  #;   在一个长连接上所能够允许请求的最大资源数;

3、keepalive_disable [msie|safari|none];    为指定类型的user agent禁用长连接;

4、tcp_nodelay   on|offf;     是否对长连接使用TCP_NODELAY选项;

5、client_header_timeout  #;    读取http请求报文首部的超时时长;

6、client_body_timeout   #;      读取http请求报文body部分的超时时长;

7、send_timeout   #;      发送响应报文的超时时长;

LNMP:php启用fpm模型;

例如:

location / {

root           /vhosts/web1;
index           index.php     index.html         index.htm;
}

location ~ .php$ {
root              /vhosts/web1;
fastcgi_pass              127.0.0.1:9000;
fastcgi_index        index.php;
fastcgi_param           SCRIPT_FILENAME         /vhosts/web1/$fastcgi_script_name;
include                fastcgi_params;
}

nginx反向代理:proxy、fastcgi、upstream

ngx_http_proxy_module:实现反向代理及缓存功能;

(1) proxy_pass URL;
应用上下文:location, if in location, limit_except

proxy_pass后面的路径不带uri时,其会将location的uri传递给后端的主机;下面的示例会将/uri/传递给backend服务器;
location  /uri/ {
proxy_pass http://hostname;
}

proxy_pass后面的路径是一个uri时,其会将location的uri替换为后端主机自己的uri;
location  /uri/ {
proxy_pass http://hostname/new_uri/;
}

如果location定义其uri时使用的正则表达式模式匹配,则proxy_pass后的路径不能够使用uri;
location  ~*  .(jpg|gif|jpeg)$  {
proxy_pass  http://HOSTNAME;
}
 此处的http://HOSTNAME后面不能有任何uri,哪怕只有/也不可以;

(2) proxy_set_header field value;
用于proxy server向backend server发请求报文时,将某请求首部重新赋值,或在原有值后面添加一个新的值; 也可以添加自定义首部;
 示例:
proxy_set_header  X-Real-IP  $remote_addr;
proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
原有请求报文中如果存在X-Forwared-For首部,则将remote_addr以逗号分隔补原有值后,否则则直接添加此首部;

实践作业:
假如nginx有两个server(虚拟主机),且均反代至后端某一个主机,此主机亦有两个虚拟主机,虚拟主机名与nginx的相同;
要求:用户请求nginx的哪一个虚拟主机,就将其代理后后端主机的对应的虚拟主机;

缓存相关的选项(缓存要先定义,后调用):
(3) proxy_cache_path    path    [levels=levels]   [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size]
定义缓存;可用上下文为http;

(4) proxy_cache zone | off;
调用缓存;可用上下文 为http, server和location;

(5) proxy_cache_key string;
定义缓存键;
proxy_cache_key $scheme$proxy_host$request_uri;

(6) proxy_cache_valid [code ...] time;
对不同响应码的响应设定其可缓存时长;
示例:
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404      1m;

proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...;
处于什么状态下,以旧的缓存响应;

proxy_cache_bypass  string:设置在何种情况下nginx将不从cache取数据;
$cookie_nocache  $arg_nocache  $httpd_authorization

跟连接相关的选项
(7) proxy_connect_timeout time;
定义与后端服务器建立连接的超时时长;默认为60s,不建议超出75s;

(8) proxy_send_timeout time;
把请求发送给后端服务器的超时时长;默认为60s;

(9) proxy_read_timeout time;
等待后端服务器发送响应报文的超时时长;

ngx_http_upstream_module:定义服务器组
用于将多个服务器定义成服务器组,而由proxy_pass, fastcgi_pass等指令进行引用;

(1) upstream name { ... }
定义一个后端服务器组,name为组名称;仅能用于http上下文 ;

(2) server address [parameters];
在upstream中定义一个服务器及其相关参数;仅能用于upstream上下文;

常用参数:
weight=number:定义服务器权重,默认为1;
max_fails=number:最大失败连接尝试次数,失败连接超时时长由fail_timeout参数指定;
fail_timeout=number:等待目标服务器发送响应的时长;
backup:备用服务器,所有主服务器均故障时才启用此主机;
down:手动标记其不再处理任何用户请求;

使用方法:
(a) 定义upstream服务器组
upstream websrvs {
server 172.16.100.68 weight=2 max_fails=2 fail_timeout=6s;
server 172.16.100.6  weight=1 max_fails=2 fail_timeout=6s;
}

(b) 在反代场景中(proxy_pass, fastcgi_pass, ...)进行调用;
location / {
proxy_pass http://websrvs/;
}

(3) ip_hash;
源地址hash,把来自同一个ip地址的请求始终发往同一个backend server,除非此backend server不可用;

(4) least_conn;
最少连接;当各server权重不同时,即为加权最少连接;

(5) health_check [parameters];
健康状态检测机制;只能用于location上下文;建议关闭访问日志;

常用参数:
interval=time检测的频率,默认为5秒;
fails=number:判定服务器不可用的失败检测次数;默认为1次;
passes=number:判定服务器可用的失败检测次数;默认为1次;
uri=uri:做健康状态检测测试的目标uri;默认为/;
match=NAME:健康状态检测的结果评估调用此处指定的match配置块;

(6) match name { ... }
对backend server做健康状态检测时,定义其结果判断机制;只能用于http上下文;

常用的参数:
status  code[  code ...]: 期望的响应状态码;
header  HEADER[operator  value]:期望存在响应首部,也可对期望的响应首部的值基于比较操作符和值进行比较;
body:期望响应报文的主体部分应该有的内容;

(7) hash key [consistent];
指明基于hash方式进行调度时,其hash key;
hash  $remote_addr相当于ip_hash;

常用的hash key:
$cookie_name:将一个用户的请求始终发往同一个backend server,能实现会话绑定的功能;此处的name为cookie某些参数的名称,此处常用的有cookie_username;
$request_uri: 将对同一个uri的请求始终发往同一个backend server,后端为cache server时特别有用;

session会话保持:
session sticky:基于ip, ngix还可基于请求报文首部中的多种信息,例如cookie, uri;
session cluster:每个server均把创建和维护session同步集群中的其它主机;仅适用于较小规模的环境;
session server:使用一个共享的存储服务存储session信息;

ngx_http_headers_module模块配置
 (1) add_header name value [always];
向响应报文添加自定义首部,并为其赋值;
示例:
add_header realserver $server_addr;                     添加真实服务器地址的自定义首部
add_header cache_status $upstream_cache_status;                 添加nginx缓存状态的自定义首部

(2) expires [modified] time;
     expires epoch | max | off;
允许或禁止向响应报文的Cache-Control或Expires首部添加新值或修改其值;

fastcgi模块指令:
 (1) fastcgi_pass address;
address为fastcgi server监听的地址和端口;

示例:fastcgi_pass   127.0.0.1:9000;

(2) fastcgi_index name;
定义fastcgi应用的默认主页;

示例:fastcgi_index  index.php;

(3) fastcgi_param parameter value [if_not_empty];
设定传递给后端fastcgi server参数及其值;

示例:fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

/index.php --> /scripts/index.php
http://www.magedu.com/users.php?username=tom

(4) fastcgi_cache_path path  [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size];
定义缓存:缓存空间等;

可应用的上下文 :http
缓存机制:
元数据:内存,即为keys_zone;
数据:磁盘,即为path;
path:文件系统路径,用于储存缓存的文件数据;

levels=#[:#[:#]]:缓存目录层级定义;
levels=2:1

keys_zone=name:size
内存中用于缓存k/v映射关系的空间名称及大小;
name: cache的标识符;
size:元数据cache大小;

max_size:缓存空间上限;

注意:只能用于http上下文;

(5) fastcgi_cache zone | off;
调用定义过的缓存;

zone即为通过fastcgi_cache_path定义缓存时其keys_zone参数中的name;

(6) fastcgi_cache_key string;
定义如何使用缓存键;

使用示例:fastcgi_cache_key   $request_uri;

(7) fastcgi_cache_methods GET | HEAD | POST ...;
为何请求方法对应的请求进行缓存,默认为GET和HEAD;

(8) fastcgi_cache_min_uses number;
缓存项的最少使用次数;

(9) fastcgi_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_503 | http_403 | http_404 | off ...;
是否可使用stale缓存项响应用户请求;

(10) fastcgi_cache_valid [code ...] time;
对不同响应码的响应设定其可缓存时长;

示例:
fastcgi_cache_valid 200 302 10m;
fastcgi_cache_valid 301 1h;
fastcgi_cache_valid 404      1m;

注意:调用缓存时,至少应该指定三个参数
fastcgi_cache
fastcgi_cache_key
fastcgi_cache_valid

LNMP:php启用fpm模型;

php-fpm的工作方式:
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
pm = dynamic|static
pm.start_servers:启动fpm进程时启动的工作进程数量;
pm.min_spare_servers:最少空闲进程数;
pm.max_spare_servers:最大空闲进程数;
pm.max_children:最大工作进程数;
user = USERNAME
group = GROUPNAME

示例:location / {

root           /vhosts/web1;
index           index.php     index.html         index.htm;
}

location ~ .php$ {
root              /vhosts/web1;
fastcgi_pass              127.0.0.1:9000;
fastcgi_index        index.php;
fastcgi_param           SCRIPT_FILENAME         /vhosts/web1/$fastcgi_script_name;
include                fastcgi_params;
}

转载于:https://blog.51cto.com/11476314/2159897

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值