Nginx
- Nginx是一个免费的,开源的,高性能的HTTP和反向代理服务器,以及一个IMAP/POP3代理服务器。Nginx以其高性能、稳定性、丰富的功能设置,配置简单,低资源消耗。
- Nginx是一个少数的写地址的c10k问题服务器。不同于传统的服务器,Nginx不依赖于线程来处理请求。相反,它使用了更具伸缩性的事件驱动(异步)体系结构。这种体系结构使用了较小但更重要的是负载下可预测的内存量。即使你不想同时处理数千个请求,你仍然可以从Nginx的高性能和内存占用小的利益。在所有方向上nginx的尺度:从最小的VPS一直到大型服务器集群。
- http协议:web服务器(类似于httpd)、http reverse proxy(类似于httpd)、imap/pop3 reverse proxyd
- Nginx的程序架构:
- master/worker
- 一个master进程:
- 负载加载和分析配置文件、管理worker进程、平滑升级
- 一个或多个worker进程
- 处理并响应用户请求
- 缓存相关的进程:
- cache loader:载入缓存对象
- cache manager:管理缓存对象
- 特性:异步、事件驱动和非阻塞
- 并发请求处理:通过epoll/select
- 文件IO:高级IO sendfile,异步,mmap
- nginx模块:高度模块化,但其模块早期不支持DSO机制;近期版本支持动态装载和卸载;
- 模块分类:
- 核心模块:core module
- 标准模块:
- HTTP modules:
- Standard HTTP modules标准的HTTP模块
- Optional HTTP modules可选模块
- Mail modules邮件模块
- Stream modules:流模块
- 传输层代理
- 3rd party modules
- nginx的功用:
- 静态的web资源服务器;(图片服务器,或js/css/html/txt等静态资源服务器)
- 结合FastCGI/uwSGI/SCGI等协议反代动态资源请求;
- http/https协议的反向代理;
- imap4/pop3协议的反向代理;
- tcp/udp协议的请求转发;
- 程序环境
- 配置文件的组成部分:
- 主配置文件:nginx.conf
- include conf.d/*.conf
- fastcgi, uwsgi,scgi等协议相关的配置文件
- mime.types:支持的mime类型
- 主程序文件:/usr/sbin/nginx
- Unit File:nginx.service
- 配置:
- 主配置文件的配置指令:
- directive value [value2 ...];
- 注意:
- (1) 指令必须以分号结尾;
- (2) 支持使用配置变量;
- 内建变量:由Nginx模块引入,可直接引用;
- 自定义变量:由用户使用set命令定义;
- set variable_name value;
- 引用变量:$variable_name
- 配置指令:
- main配置段常见的配置指令:
- 分类:
- 正常运行必备的配置
- 优化性能相关的配置
- 用于调试及定位问题相关的配置
- 事件驱动相关的配置
- 正常运行必备的配置:
- user
- Syntax: user user [group];
- Default: user nobody nobody;
- Context: main
- 定义工作进程使用的用户和组凭据。如果省略组,则使用名称等于用户的组
- pid /PATH/TO/PID_FILE;
- 指定存储nginx主进程进程号码的文件路径;
- include file | mask;
- 指明包含进来的其它配置文件片断;
- load_module file;
- 指明要装载的动态模块;
- 性能优化相关的配置:
- worker_processes number | auto;
- worker进程的数量;通常应该等于小于当前主机的cpu的物理核心数;
- auto:当前主机物理CPU核心数;
- cpu优化
- worker_cpu_affinity cpumask ...;
- worker_cpu_affinity auto [cpumask];
- CPU MASK:
- 00000000:掩码格式
- 00000001:0号CPU
- 00000010:1号CPU
-
- 自定义指定cup绑定
-
![](https://images2015.cnblogs.com/blog/1134472/201706/1134472-20170627224400571-1145027633.png)
- worker_priority number;
- 指定worker进程的nice值,设定worker进程优先级;[-20,20]
- 默认值都是0 真正有效值是-20到19
- 手动调优先级: 如图
-
-
![](https://images2015.cnblogs.com/blog/1134472/201706/1134472-20170627224423618-1279864207.png)
-
- worker_rlimit_nofile number;
- worker进程所能够打开的文件数量上限;
- 示例:
-
- daemon on|off;
- 是否以守护进程方式运行Nignx;
- master_process on|off;
- 是否以master/worker模型运行nginx;默认为on;
- 事件驱动相关的配置:
- events {
- ...
- }
- worker_connections number;
- 每个worker进程所能够打开的最大并发连接数数量;
- worker_processes * worker_connections
- use method;
- 指明并发连接请求的处理方法;
- accept_mutex on | off;
- 处理新的连接请求的方法;on意味着由各worker轮流处理新请求,Off意味着每个新请求的到达都会通知所有的worker进程;
- listen PORT|address[:port]|unix:/PATH/TO/SOCKET_FILE
- listen address[:port] [default_server] [ssl] [http2 | spdy] [backlog=number] [rcvbuf=size] [sndbuf=size]
- default_server:设定为默认虚拟主机;
- ssl:限制仅能够通过ssl连接提供服务;
- backlog=number:后援队列长度;
- rcvbuf=size:接收缓冲区大小;
- sndbuf=size:发送缓冲区大小;
- server_name name ...;
- 指明虚拟主机的主机名称;后可跟多个由空白字符分隔的字符串;
- 支持*通配任意长度的任意字符;server_name *.magedu.com www.magedu.*
- 支持~起始的字符做正则表达式模式匹配;server_name ~^www\d+\.magedu\.com$
- 匹配机制:
- (1) 首先是字符串精确匹配;
- (2) 左侧*通配符;
- (3) 右侧*通配符;
- (4) 正则表达式;
- tcp_nodelay on | off;
- 在keepalived模式下的连接是否启用TCP_NODELAY选项;
- tcp_nopush on|off;
- 在sendfile模式下,是否启用TCP_CORK选项;
- sendfile on | off;
- 是否启用sendfile功能;
- 以上这些选项最好都开启
- 自己建虚拟主机
- [root@wxC7 ~]# cd /etc/nginx/
- [root@wxC7 nginx]# mkdir /web/nginx/host1 -pv
- 测试网页
- [root@wxC7nginx]# vim /web/nginx/host1 /index.html
- 创建配置文件
- [root@wxC7 nginx]# vim conf.d/host1.conf
- server {
- listen 80;
- server_name www.wx.com;
- root /web/nginx/host1;
- }
-
- nginx -t 检查语法
- nginx -s reload 重载配置
-
![](https://images2015.cnblogs.com/blog/1134472/201706/1134472-20170627224546414-712939894.png)
- 定义路径相关的配置:
- root path;
- 设置web资源路径映射;用于指明用户请求的url所对应的本地文件系统上的文档所在目录路径;可用的位置:http, server, location, if in location;
- 示例:
- 表示所有根下除了192.168.117.133以外都可以访问
-
![](https://images2015.cnblogs.com/blog/1134472/201706/1134472-20170627224606024-829501359.png)
-
- location [ = | ~ | ~* | ^~ ] uri { ... }
- 根据请求URI设置配置
- 在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;ngnix会根据用户请求的URI来检查定义的所有location,并找出一个最佳匹配,而后应用其配置;
- =:对URI做精确匹配
- location = / {
- ...
- }
- ~:对URI做正则表达式模式匹配,区分字符大小写;
- ~*:对URI做正则表达式模式匹配,不区分字符大小写;
- ^~:对URI的左半部分做匹配检查,不区分字符大小写;
- 不带符号:匹配起始于此uri的所有的url;
- 匹配优先级由上往下分别为: =
- ^~
- ~/
- ~*
- 不带符号;
- 示例:
- 指定访问路径:比如只允许访问以jpg,png结尾的url
-
- 如果同时被匹配则根据优先级执行
-
![](https://images2015.cnblogs.com/blog/1134472/201706/1134472-20170627224637024-1524470302.png)
-
- 下图中localtion中定义的root会取代覆盖上边的root url
-
![](https://images2015.cnblogs.com/blog/1134472/201706/1134472-20170627224644649-274007492.png)
- alias path;
- 定义路径别名,文档映射的另一种机制;仅能用于location上下文;
- 注意:location中使用root指令和alias指令的意义不同;
- (a) root,给定的路径对应于location中的/uri/左侧的/;
- (b) alias,给定的路径对应于location中的/uri/右侧的/;
- 示例:
- 图中的url根会匹配其右边的/
-
![](https://images2015.cnblogs.com/blog/1134472/201706/1134472-20170627224712539-1166993474.png)
- index file ...; 自定义主页
- 默认资源;http, server, location;
- error_page code ... [=[response]] uri;
- Defines the URI that will be shown for the specified errors.
- 示例:
- 自己定义错误页指定其路径
-
- 自定义状态码
-
- keepalive_timeout timeout [header_timeout];
- 设定保持连接的超时时长,0表示禁止长连接;默认为75s;
- keepalive_requests number;
- 在一次长连接上所允许请求的资源的最大数量,默认为100;
- keepalive_disable none | browser ...;
- 对哪种浏览器禁用长连接;
- send_timeout time;
- 向客户端发送响应报文的超时时长,此处,是指两次写操作之间的间隔时长;
- client_body_buffer_size size;
- 用于接收客户端请求报文的body部分的缓冲区大小;默认为16k;超出此大小时,其将被暂存到磁盘上的由client_body_temp_path指令所定义的位置;
- client_body_temp_path path [level1 [level2 [level3]]];
- 设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构和数量;
- client_body_temp_path /var/tmp/client_body 2 1 1
- 1:表示用一位16进制数字表示一级子目录;0-f
- 2:表示用2位16进程数字表示二级子目录:00-ff
- 2:表示用2位16进程数字表示三级子目录:00-ff
- 对客户端进行限制的相关配置:
- limit_rate rate;
- 限制响应给客户端的传输速率,单位是bytes/second,0表示无限制;
- limit_except method ... { ... }
- 限制对指定的请求方法之外的其它方法的使用客户端;
- limit_except GET {
- allow 192.168.1.0/24;
- deny all;
- }
- 文件操作优化的配置
- aio on | off | threads[=pool];
- 是否启用aio功能;
- directio size | off;
- 在Linux主机启用O_DIRECT标记,此处意味文件大于等于给定的大小时使用,例如directio 4m;
- open_file_cache off;
- open_file_cache max=N [inactive=time];
- nginx可以缓存以下三种信息:
- (1) 文件的描述符、文件大小和最近一次的修改时间;
- (2) 打开的目录结构;
- (3) 没有找到的或者没有权限访问的文件的相关信息;
- max=N:可缓存的缓存项上限;达到上限后会使用LRU算法实现缓存管理;
- inactive=time:缓存项的非活动时长,在此处指定的时长内未被命中的或命中的次数少于open_file_cache_min_uses指令所指定的次数的缓存项即为非活动项;
- open_file_cache_valid time;
- 缓存项有效性的检查频率;默认为60s;
- open_file_cache_min_uses number;
- 在open_file_cache指令的inactive参数指定的时长内,至少应该被命中多少次方可被归类为活动项;
- open_file_cache_errors on | off;
- 是否缓存查找时发生错误的文件一类的信息;
Nginx核心模块
- ngx_http_access_module模块:
- 实现基于ip的访问控制功能
- allow address | CIDR | unix: | all;
- deny address | CIDR | unix: | all;
- http, server, location, limit_except
- ngx_http_auth_basic_module模块
- 实现基于用户的访问控制,使用basic机制进行用户认证;
- auth_basic string | off;
- 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所提供;
- 示例:
- [root@wxC7 ~]# htpasswd -m /etc/nginx/ngpasswd tom
- [root@wxC7 ~]# htpasswd -m /etc/nginx/ngpasswd jerry
-
![](https://images2015.cnblogs.com/blog/1134472/201706/1134472-20170627224756305-708799120.png)
- [root@wxC7 ~]# mkdir /web/nginx/host1/admin
- [root@wxC7 ~]# vim /web/nginx/host1/admin
- [root@wxC7 ~]# vim /web/nginx/host1/admin/index.html
- ngx_http_stub_status_module模块nginx内键状态页
- 用于输出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:处于等待客户端发出请求的空闲连接数;
- 配置示例:
- location /basic_status {
- stub_status;
- }
- ngx_http_log_module
- 写入请求登录指定的格式
- log_format name string ...;
- string可以使用nginx核心模块及其它模块内嵌的变量;
- access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
- access_log off;
- 访问日志文件路径,格式及相关的缓冲的配置;
- buffer=size
- flush=time
- open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
- open_log_file_cache off;
- 缓存各日志文件相关的元数据信息;
- max:缓存的最大文件描述符数量;
- min_uses:在inactive指定的时长内访问大于等于此值方可被当作活动项;
- inactive:非活动时长;
- valid:验正缓存中各缓存项是否为活动项的时间间隔;
- ngx_http_gzip_module:
- 此模块是一个过滤器,压缩响应使用“gzip”方法。这通常有助于将传输数据的大小减少一半甚至更。
- gzip on | off;
- 启用或禁用Gzipping反应。
- gzip_comp_level level;
- 设置一个响应的gzip压缩级别。可接受的值在1到9之间
- gzip_disable regex ...;
- 禁用Gzipping响应“用户代理标头字段匹配任何指定的正则表达式的要求。
- gzip_min_length length;
- 启用压缩功能的响应报文大小阈值;
- gzip_buffers number size;
- 支持实现压缩功能时为其配置的缓冲区数量及每个缓存区的大小;
- 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的值为此三者中任何一个,则启用压缩功能;
- gzip_types mime-type ...;
- 压缩过滤器,仅对此处设定的MIME类型的内容启用压缩功能;
- 示例:
- gzip on;
- gzip_comp_level 6;
- gzip_min_length 64;
- gzip_proxied any; (如果有代理)
- gzip_types text/xml text/css application/javascript;
- 如图:
-
- ssl on | off;
- 启用给定虚拟服务器的HTTPS协议。
- ssl_certificate file;
- 当前虚拟主机使用PEM格式的证书文件;
- ssl_certificate_key file;
- 当前虚拟主机上与其证书匹配的私钥文件;
- ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
- 支持ssl协议版本,默认为后三个;
- ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
- builtin[:size]:使用OpenSSL内建的缓存,此缓存为每worker进程私有;
- [shared:name:size]:在各worker之间使用一个共享的缓存;
- ssl_session_timeout time;
- 客户端一侧的连接可以复用ssl session cache中缓存 的ssl参数的有效时长;
-
- 示例:
-
- 服务器签证方:
- [root@wxC7 ~]# cd /etc/pki/CA/
- [root@wxC7 CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048)
- [root@wxC7 CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365
- [root@wxC7 CA]# touch index.txt
- [root@wxC7 CA]# echo 01 >serial
- 客户端
-
![](https://images2015.cnblogs.com/blog/1134472/201706/1134472-20170627224917149-2030694085.png)
- 服务端签署证书
- [root@wxC7 CA]# openssl ca -in /tmp/nginx.csr -out certs/nginx.crt -days 365
- [root@wxC7 CA]# scp certs/nginx.crt 192.168.117.131:/etc/nginx/ssl/
- 客户端修改配置文件添加ssl等相关参数
-
- 完成以上就可以访问了
-
- nginx反代
- 示例
- 实现Linux反代
- (1) 选择一台主机当后端服务器
- 创建测试页
- [root@wxC7 nginx]# vim /var/www/html/index.html
- (2) 选择一台主机为nginx代理
- 自己创建配置文件
- [root@wxC6 ~]# cd /etc/nginx/
- [root@wxC6 nginx]# vim conf.d/wxc6.conf
- 编辑配置文件
- 如图所示 表示把根下用户的请求全都反代给其指定服务器(ip加端口)
-
- (3)浏览器访问
-
![](https://images2015.cnblogs.com/blog/1134472/201706/1134472-20170627225037539-1145246097.png)
- 注意域名解析
- 每个代理服务器可以有多台后端主机服务器
-
- 示例
- (1) 添加新的后端和url
-
![](https://images2015.cnblogs.com/blog/1134472/201706/1134472-20170627225052446-2048714640.png)
- 注意url的"/"
- (2) 浏览器访问
-
![](https://images2015.cnblogs.com/blog/1134472/201706/1134472-20170627225107836-834053775.png)
- 自定义报文守护
-
- (1)添加请求守护指明ip
-
![](https://images2015.cnblogs.com/blog/1134472/201706/1134472-20170627225129258-33430547.png)
-
- (2)添加相应报文守护
-
![](https://images2015.cnblogs.com/blog/1134472/201706/1134472-20170627225145086-1219065465.png)
- (3)修改后端主机http配置
-
![](https://images2015.cnblogs.com/blog/1134472/201706/1134472-20170627225201102-1531118999.png)
- (4) [root@wxC7 conf.d]# tail /var/log/httpd/access_log
-
![](https://images2015.cnblogs.com/blog/1134472/201706/1134472-20170627225224571-446838454.png)
- 日志信息为其源访问地址而不是代理地址
-
- nginx 自定义缓存
-
- proxy_cache_path
- proxy_cache zone | off;
- 调用的缓存的名称,或禁用缓存;
- proxy_cache_key string;
- 缓存条目的键;
- proxy_cache_valid [code ...] time;
- 对各类响应码的缓存时长;
- 使用示例:
- 定义在http{}中:
- proxy_cache_path /var/cache/nginx/proxy_cache levels=1:2:1 keys_zone=pcache:10m max_size=1g;
- 定义在server{}及其内部的组件中:
-
![](https://images2015.cnblogs.com/blog/1134472/201706/1134472-20170627225253446-414222455.png)
- ngx_http_fastcgi_module模块
- 允许通过请求FastCGI服务器。
- 1、fastcgi_pass address;
- address为fastcgi server的地址; location, if in location;
- 例如:
- http://www.wx.com/admin/index.php --> /admin/index.php (uri)
- /data/application/admin/index.php
- 2、fastcgi_index name;
- fastcgi默认的主页资源;
- 3、fastcgi_param parameter value [if_not_empty];
- 设置一个参数,应通过FastCGI服务器。该值可以包含文本、变量和它们的组合。
- 示例:
- 环境搭配
- 配置好fpm server和mariadb-server服务;
-
- (1) 配置一台主机包括php和mysql 服务
-
- 安装以下包
- [root@wxC7 conf.d]# yum install php-fpm php-mysql php-mbstring php-mcrypt mariadb-server-y
- 修改 www.conf配置文件
- [root@wxC7 php-fpm.d]# vim www.conf
- 修改监听地址为所有
- listen = 0.0.0.0:9000
- 根据cup负载修改最大进程数pm.max_children = 150
- 启用status路径pm.status_path = /status
- 启用健康路径检测 ping.path = /ping
- 创建session路径
- [root@wxC7 ~]# mkdir /var/lib/php/session
- [root@wxC7 ~]# chown apache:apache /var/lib/php/session
- 启动php服务
- [root@wxC7 php-fpm.d]# systemctl start php-fpm
- 前段主机配置
- [root@wxC6 conf.d]# vim wxc.conf
-
![](https://images2015.cnblogs.com/blog/1134472/201706/1134472-20170627225323993-1380760061.png)
- 后端主机
- 创建php测试页
- [root@wxC7 php-fpm.d]# mkdir /data/apps -pv
- [root@wxC7 php-fpm.d]# vim /data/apps/index.php
-
- 即可基于搭建服务
-
转载于:https://www.cnblogs.com/Xun1521/p/7087596.html