Nginx详解

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绑定
  •          
  •                   
  •                    worker_priority number;
  •                         指定worker进程的nice值,设定worker进程优先级;[-20,20]
  •                         默认值都是0 真正有效值是-20到19
  •                手动调优先级: 如图
  •                              
  •                       
  •                  
  •                     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;
  •                         指明并发连接请求的处理方法;
  •                             use epoll;
  •                     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 重载配置
  •             
 
  • 定义路径相关的配置:
  •                     root path; 
  •                         设置web资源路径映射;用于指明用户请求的url所对应的本地文件系统上的文档所在目录路径;可用的位置:http, server, location, if in location;
  •                   示例:
  •                           表示所有根下除了192.168.117.133以外都可以访问
  •                   
  •                                                                         
  •                     location [ = | ~ | ~* | ^~ ] uri { ... }
  •                         根据请求URI设置配置
  •                         在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;ngnix会根据用户请求的URI来检查定义的所有location,并找出一个最佳匹配,而后应用其配置;
  •                         =:对URI做精确匹配
  •                             location  =  / {
  •                                 ...
  •                             }
  •                         ~:对URI做正则表达式模式匹配,区分字符大小写;
  •                         ~*:对URI做正则表达式模式匹配,不区分字符大小写;
  •                         ^~:对URI的左半部分做匹配检查,不区分字符大小写;
  •                         不带符号:匹配起始于此uri的所有的url;
  •                           匹配优先级由上往下分别为: =
  •                                                                     ^~
  •                                                                      ~/
  •                                                                      ~*
  •                                                                       不带符号;
  •   示例:
  •                 指定访问路径:比如只允许访问以jpg,png结尾的url
  •                            
  •                  如果同时被匹配则根据优先级执行
  •                      
  •                            
  •                下图中localtion中定义的root会取代覆盖上边的root url
  •                     
  •                     alias path;
  •                         定义路径别名,文档映射的另一种机制;仅能用于location上下文;
  •                         注意:location中使用root指令和alias指令的意义不同;
  •                             (a) root,给定的路径对应于location中的/uri/左侧的/;
  •                             (b) alias,给定的路径对应于location中的/uri/右侧的/;
  •                  示例:
  •                            图中的url根会匹配其右边的/
  •                       
  •                     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部分的临时存储路径及子目录结构和数量;
  •                             16进制的数字;
  •                             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
  •               
  •      
  •               [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:处于等待客户端发出请求的空闲连接数;
  •                   stub_status;
  •                     配置示例:
  •                         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;  
  •                如图:
  •                                                         
 
  •  ngx_http_ssl_module模块:
  •                     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
  •           客户端
  •         
  •                    
  •                服务端签署证书
  •                          [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)浏览器访问
  •               
  •       注意域名解析
  •  每个代理服务器可以有多台后端主机服务器
  •          
  •  示例
  • (1) 添加新的后端和url
  •              
  •             注意url的"/" 
  •    (2) 浏览器访问           
  •               
  • 自定义报文守护
  •               
  • (1)添加请求守护指明ip
  •             
  •           
  •  (2)添加相应报文守护         
  •             
  • (3)修改后端主机http配置
  •              
  • (4)   [root@wxC7 conf.d]# tail /var/log/httpd/access_log
  •              
  •           日志信息为其源访问地址而不是代理地址
  •        
  • 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{}及其内部的组件中:
  •         
  • 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
  •      
  • 后端主机
  •         创建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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值