Linux学习105 nginx基础入门

一、Nginx的程序架构

Linux学习105 nginx基础入门

    我们从图中可以看到,我们nginx有master,负责管理子进程worker,对nginx的worker来讲,每一个work都可以处理多个用户请求,他们是基于http或https来处理用户请求的。我们图中描述的是nginx作为反代时的一种情况,我们可以看到接收到用户请求后他会反代给后端的web server,或通过FastCGI协议反代给我们后端的fpm server,或者通过memcache协议反代给后端的memcache server。 为什么一个进程可以响应多个请求呢?我们可以看到,在网络IO方面他通过kevent,epoll,select来处理网络的多路管理。并且在收到用户请求以后nginx自己还可以实现管理缓存,这就意味着后端服务器的响应内容我们可以先缓存在nginx本地,而后再给客户端响应,随后第二个客户端请求再进来的时候我们可以看看缓存中是否有,如果有的话我们就直接从本地缓存直接返回了,这就实现了加速访问。而为了管理缓存空间,nginx需要两个线程来管理,第一个是Cache loader,第二个是Cache manager。

    整个nginx大体利用了这几个特性,首先是Event-driven,即事件驱动,然后是Asynchronous,即异步。最后是Non-blocking,即非阻塞模型

    对于磁盘IO来讲,他可以支持Advanced I/O,即高级IO,sendfile,AIO(异步IO),mmap etc即内存映射,我们对于内存映射可以这样来理解,我们说过一个数据要想被访问首先第一步要先从磁盘到内核内存,然后从内核内存到进程内存,即有两次的复制过程,而我们的内存映射是指直接从内存中开辟出一段空间来,数据在磁盘上直接映射到内存空间中来,然后进程就可以访问了而不用复制了。其实这是内核的功能,只是说nginx支持这种功能来实现文件访问。

  1、master/worker模型,worker负责处理用户请求,master负责装载配置文件,管理worker进程和平滑升级。

    a、一个master进程

      (1)、负责加载和分析配置文件,管理worker进程,平滑升级

    b、一个或多个worker进程

      (2)、处理并响应用户请求

    c、缓存相关的进程:

      (1)、cache loader:载入缓存对象

      (2)、cache manager:管理缓存对象

  2、特性:异步,事件驱动和非阻塞

    a、并发请求处理:通过kevent/epoll/select,/dev/poll,我们主要通过epoll,只有主机不支持epoll的时候才使用select

    b、文件IO,高级IO sendfile,异步,mmap

  3、nginx模块:高度模块化,但其模块早期不支持DSO机制;近期版本支持动态装载和卸载

    a、模块分类:

      (1)、核心模块:core module

      (2)、标准模块:

        1)、HTTP modules:

          standard HTTP modules

          Optional HTTP modules

        2)、Mail modules

        3)、Stream modules,叫流模块,他的功能主要实现传输层负载均衡。即传输层代理。

      (3)、3rd party modules,即三方模块

  4、nginx的功能

    a、静态的web资源服务器;(图片服务器,或js/css/html/txt等静态资源服务器)

    b、结合FastCGI/uwSGI/SCGI等协议反代动态资源请求,httpd结合php是可以把php作为模块的,但是nginx是不行的,php没有作为nginx模块的用法,所以我们要想实现nmp就只有一种方式,php工作为fpm。即nginx可以作为fpm的反向代理。

    c、http/https协议的反向代理

    d、imap4/pop3协议的反向代理

    e、tcp/udp协议的请求转发

二、nginx的安装配置

  1、官方的预制包

    http://nginx.org/packages/centos/7/x86_64/RPMS/

  2、编译安装

    yum groupinstall "Development Tools" "Server Platform Development"

    yum install -y pcre-devel openssl-devel zlib-devel (pcre-devel支持更强大的正则的引擎,zlib-devel是一个网络通信压缩库,要支持压缩传输功能就需要安装此包)

    useradd -r nginx

    ./configure  --prefix=/usr/local/nginx  --conf-path=/etc/nginx/nginx.conf  --error-log-path=/var/log/error.log  --http-log-path=/var/log/nginx/access.log  --pid-path=/var/run/nginx.pid  --lock-path=/var/run/nginx.lock  --user=nginx  --group=nginx  --with-http_ssl_module  --with-http_v2_module  --with-http_dav_module  --with-http_stub_status_module  --with-threads  --with-file-alo

      --with-http_dav_module:支持http dav功能,也叫分布式版本协作,即支持put和delete方法的模块,这个其实是不安全的,一般没有需要就不装他

      --with-http_stub_status_module:nginx的状态页是通过此模块来实现的

       --with-threads:线程池管理线程,比默认的线程管理方式,即work process单个线程管理多少个请求更加高效,即基于线程池来实现用户管理的模块

      --with-file-alo:异步IO模块

    make && make install 

  3、程序环境

    a、配置文件的组成部分

      (1)、主配置文件:nginx.conf

        include conf.d/*.conf

      (2)、fastcgi,uwsgi,scgi等协议相关的配置文件

      (3)、mime.types:支持的mime类型

    b、主程序文件:/usr/sbin/nginx

[root@node3 /]# nginx -h
nginx version: nginx/1.12.2
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]

Options:
  -?,-h         : this help
  -v            : show version and exit
  -V            : show version and configure options then exit #查看编译时的选项,非常有用
  -t            : test configuration and exit
  -T            : test configuration, dump it and exit
  -q            : suppress non-error messages during configuration testing
  -s signal     : send signal to a master process: stop, quit, reopen, reload #传递信号
  -p prefix     : set prefix path (default: /usr/share/nginx/)
  -c filename   : set configuration file (default: /etc/nginx/nginx.conf)
  -g directives : set global directives out of configuration file
[root@node3 /]# nginx -V
nginx version: nginx/1.12.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.lo
g --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_auth_request_module --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-http_stub_status_module --with-http_perl_module=dynamic --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module --with-google_perftools_module --with-debug --with-cc-opt=-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic --with-ld-opt=-Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -Wl,-E

    c、启动服务

      Unit File:nginx.service

  4、配置

    a、主配置文件的配置指令

      (1)、directive value [value2 ...];

      (2)、注意:

        1)、指令必须以分号结尾

        2)、支持使用配置变量

          内建变量:由Nginx模块引入,可直接引用

          自定义变量:由用户使用set命令定义

            set variable_name value

            引用变量:$variable_name

    b、主配置文件结构

      main block:主配置段,也即全局配置段

        event{

          ...

          }:事件驱动相关的配置

        http {

          ...

          }:http/https协议相关的配置段

        mail {

          ...

          }

        stream {

          ...

          }

    c、http协议相关的配置结构。nginx没有中心主机的概念,所以全部配置成虚拟主机,即server。

      http {

        ...

        ...:各server的公共配置,就不用在server中重复写

        server {

          ...

          listen

          server_name

          root :指定站点根目录

          alias :路径别名

          location [OPERATOR] URL {

              ...

              if CONDITION {

                ...

              }

            }:location用来指明对某一个或某一类URL的资源访问属性的定义。并且还可以基于条件来做。

          }

      }

41:08

 

Linux学习105 nginx基础入门

上一篇:Linux基础 7-10 Bash编程练习4--for循环


下一篇:守护进程