• 【Linux】【Services】【Web】Nginx基础


    1. 概念

    1.1. 消息通知机制:同步synchronous,异步asynchronous

      同步:等待对方返回信息

      异步:被调用者通过状态、通知或回调通知调用者

        状态:调用者每隔一段时间就需要检查一次(盲等);

        通知:调用着需要每隔一段时间检查一下请求是否被回应(标志位被置为ready);

        调用:调用者留下联系方式,如果请求ready就会被通知

    1.2. 调用者等待结果返回之前所处的状态:阻塞:block,非阻塞:noblock

      阻塞:调用结果返回之前,调用者会被挂起;

      非阻塞:调用结果返回之前,调用着不会被挂起;

    1.4. 网络IO:本质是socket读取;磁盘IO:本质是流

    1.5. IO过程:

      第一步:数据先加载至内核内存空间(缓冲区),这是等待数据准备完成的阶段

      第二步:数据从内核缓冲区复制到用户空间的进程的内存中去,数据从内核复制到进程

    1.3. I/O模型:同步阻塞,同步非阻塞,I/O复用(IO multipexing),信号驱动I/O(Signal Driver IO),异步I/O(Asynchronous IO)

    1.4. Nginx特性:

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

      高可靠性:master/worker

      支持热部署

        (不停机更新配置文件,更换日志文件,更新服务器程序版本)

      低内存消耗

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

      event-driven,alo,mmap

    1.5.基本功能:

      静态资源的web服务器

      http协议反向代理服务器

      pop3/imap4协议反射代理服务器

      FastCGI(Lnmp),uWSGI等协议;

      模块化(非DSO),著名有zip,SSL

    1.6. web服务器相关功能:虚拟主机,keepalive,访问日志,url rewrite,路径别名,基于IP及用户的访问控制,支持速率限制

    1.7. nginx的程序架构

      master/worker

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

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

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

    2. 版本:ngxin 1.8 RHEL7

    3. 安装

    3.1. OS安装:略

    3.2. Nginx安装

    3.2.1. rpm/yum安装: yum install ngxin

    3.2.2. 编译安装

    3.2.2.1. 依赖的软件包:yum groupinstall -y "Development Tools" "Server Platform Development" openssl-devel pcre-devel zlib-devel

    3.2.2.2. 编译选项详解

    ./configure 
      --prefix=/usr/local/  #安装路径
      --sbin-path=/usr/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   #pid文件位置
      --lock-path=/var/lock/nginx.lock  #锁文件位置
      --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/  #作为fastcgi临时文件
      --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi  #作为uwsgi的临时文件
      --http-scgi-temp-path=/var/tmp/nginx/scgi  #作为scgi的临时文件
      --user=nginx   #使用哪个用户来运行worker进程
      --group=nginx  #使用哪个组来运行worker进程
      --with-http_ssl_module  #模块
      --with-http_flv_module 
      --with-http_stub_status_module 
      --with-http_gzip_static_module 
      --with-pcre 
    

      

    3.2.2.3. 配置文件:

    主配置文件:nginx.conf,也可以使用include conf.d/*.conf, fastcgi,scgi,uwscgi的相关配置,mime.types

    配置文件结构:

      main block:全局配置

      event{}:事件驱动的相关配置

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

      mail{}:mail相关的配置

      http{

        server{

            

        }

    常用配置:

    #正常运行必备的配置
    user  nginx nginx; #用于指定运行worker进程的用户和组
    pid        /var/log/nginx/nginx.pid; #指定nginx进程pid文件路径
    worker_rlimit_nofile number #单个worker进程所能够打开的最大文件数
    
    #性能优化相关的配置
    worker_processes  2; #worker的进程数,通常应该为CPU的核心数或核心数减1,也可以使用auto
    worker_cpu_affinity 0000 0001; #绑定CPU,使用cpumask表示
    worker_priority -5; #-5为nice值
    
    #调试、定位问题
    daemon on|off; #是否以守护进程方式启动nginx进程,调试时候改为off
    master_process on|off; #是否以master/worker模式进程,调试时候改为off
    error_log file | stderr|syslog:server=address[,parameter=value]|memory:size[debug|info|notice|warn|error|crit|alert|emerg]; #错误日志文件的记录方式,及其日志级别;debug级别依赖于configure时--with-debug选项
    
    
    events {
        use epoll; #指定并发连接请求时使用的方法
        multi_accept on; 
        accept_mutex on | off; #默认启用,表示用于让多个worker轮流地、序列化地相应请求
        worker_connections  51200; #每个worker进程能够并发打开的最大连接数
    }
    
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        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  /var/log/nginx/access.log  main;
        access_log  syslog:server=10.26.2.65;
    
        server_tokens off; 
        sendfile        on;
        tcp_nopush     on;
        tcp_nodelay on;
        keepalive_timeout  120;
    
        gzip  on;
    
        include /usr/local/nginx/conf.d/*.conf;
    }
    
    
    server{
    	##定义套接字相关配置
    
    	#监听80端口
    	#listen address[:port][default_server][ssl][backlog=number][rcvbuf=size][sndbuf=size];
    	#listen port [default_server][ssl];
    	#listen unix:path[default_server][ssl]
    	listen 80; 
    
    	default_server; #默认虚拟主机;
    	ssl; #限制只能通过ssl连接提供服务;
    	backlog; #后援队列的长度
    	rcvbug; #接收缓冲区大小
    	sndbuf; #发送缓冲区大小
    
    	#指明当前server的主机名,后可跟一个或空白字符分隔的多个主机
    	#支持使用*任意长度的任意字符;
    	#支持~起始的正则表达式模式字符串
    	server_name HOSTNAME;
    
    	#应用策略
    	#(1)首先精确匹配,www.example.com
    	#(2)左侧*通配符匹配,*.example.com
    	#(3)右侧*通配符匹配,www.example.*
    	#(4)正则表达式模式匹配,~^.*.example..*$
    	
    	##定义路径相关配置
    	root /PATH/TO/DOCUMENTROOT; #设置web资源路径映射,用于指明用户请求的url所对应的本地文件系统上的文档所在目录路径
    	#可用上下文:http
    
    	tcp_nodelay; #对keepalive模式下的连接是否启用tcp_nodelay选项;
    	tcp_nopush; #默认为off
    
    	sendfile on| off; #默认为关闭
    
    	#根据用户请求的URI来匹配定义的location,匹配到时,此请求将被相应的location块中的指令所处理
    	# =:URI精确匹配
    	# ~:正则表达式模式匹配,区分字符大小写
    	# ~*:做正则表达式模式匹配,不区分字符大小写
    	# ^~:对URI的左半部分做匹配检查,不区分字符大小写
    	# 匹配优先级: =、^~、~/~*、不带符号
    	location [ = | ~ | ~* | ^~ ] url {...}
    	location @name{...}
    
    	#定义路径别名,文档映射的一种机制;仅能用于location上下文;
    	#root指令:指定的路径对应于location中的/uri/左侧的/
    	#alias指令:指定的路径对应于locaation中的/uri/右侧的/
    	#http://www.example.com/bbs/a.jpj
    	#location /bbs/ {alias /web/forum} ==> /web/forum/a.jpg
    	#location /bbs/ {root /web/forum} ==> /web/forum/bbs/a.jpg
    	alias path;
    
    	index;#设置默认主页可用位置:http、server、location
    	
    	error_page code...[=[response]] url; #根据用户请求的资源的http相应的状态码实现错误
    
    	## 定义客户端请求的相关配置
    	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 path [level1[level2[level3]]] #设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构和数量 00-ff
    
    	##对客户的请求进行限制的相关配置
    	limit_rate rate; #限制相应给客户端的传输速率,单位是bytes/second,0表示无限制
    	limit_except method ...{...}; #对指定的请求方法之外的其他方法的使用客户端
    
    	##文件操作优化的配置
    	alo on|off|threads[=pool]; 是否启用alo功能
    
    	directio size|off;
    	open_file_cache off;
    	#nginx可以缓存三种信息
    	#文件的描述符、文件大小和最近一次的修改时间
    	#打开的目录的结构
    	#没有找到的或者没有权限的文件的相关信息
    	#max=N:可缓存的缓存项上限;达到上限后会使用LRU算法实现缓存管理;
    	#inactive=time:缓存项的超时时长,在此处指定的时长内未被命中的缓存项即为非活动项
    	open_file_cache max=N[inactive=time];
    
    	open_file_cache_error on|off; #是否缓存查找时发生错误的一类的信息
    	open_file_cache_min_user number; #在open_file_cache指令的inactive参数指定的时长内,至少命中此处指定的次数方可不被归类到非活动项;
    	open_file_cache_valid time; #缓存项有效性的检查频率;默认是60s
    
    	##ngx_http_access_module模块;实现基于IP的访问控制功能
    
    	#可用上下文:http,server,location,limit_except
    	allow address | CIDR | unix: | all;
    	deny address | CIDR | unix: | all;
    
    	##ngx_http_auth_basic_module
    	auth_basic string | off; #使用basic机制进行用户认证
    	auth_basic_user_file file; #认证用的账号密码文件
    
    	##ngx_http_stub_status_module模块,用于输出nginx的基本状态信息
    
    	Active connection:处于活动状态的客户端连接的数量;
    	accepts:已经接受的客户端请求的总数;
    	handled:已经处理完成的客户端请求的总数;
    	requests:客户端发来的总的请求数;
    	reading:处于读取客户端请求报文首部的连接数
    	writing:处于想客户端发送相应报文过程中的连接数;
    	waiting:处于等待客户端发出请求的空闲连接数;
    
    	##ngx_http_referer_module模块
    	# 定义合法的referer数据
    	# none:请求报文首部没有referer首部
    	# blocked:请求报文的referer首部没有值
    	# server_names:其值是主机名
    	# arbitrary string:直接字符串,可以使用*作为通配符
    	# regular expression:被指定的正则表达式模式匹配到的字符串;要使用-起始
    	valid_referers none | blocked | server_names | string ...;
    }
    

      

      

  • 相关阅读:
    开发者账号续期后,itunes停止付款了
    复杂sql分组查询 ( pivot)
    免费真机调试 -- Xcode7
    System.Security.Cryptography.CryptographicException: 指定了无效的提供程序类型
    phonegap创建的ios项目推送消息出现闪退现象
    这周的《财经郎眼
    <转>iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!
    ios线程和GCD和队列同步异步的关系
    <转>关于Certificate、Provisioning Profile、App ID的介绍及其之间的关系
    为什么我们要做单元测试?(二)
  • 原文地址:https://www.cnblogs.com/demonzk/p/6739934.html
Copyright © 2020-2023  润新知