Nginx入门


简单了解Nginx

  Nginx:engine X ,2002年,开源,商业版 Nginx是免费的、开源的、高性能的HTTP和反向代理服务器、邮件代理服务器、以及TCP/UDP代理服务器 解决C10K问题(10K Connections),http://www.ideawu.net/blog/archives/740.html Nginx官网:http://nginx.org nginx的其它的二次发行版: Tengine:由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了不少高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等获得了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。从2011年12月开始,Tengine成为一个开源项目,官网 http://tengine.taobao.org/ OpenResty:基于Nginx 与 Lua 语言的高性能 Web 平台, 章亦春团队开发,官网:http://openresty.org/cn/php

Nginx基础特性

  1. 模块化设计,较好的扩展性
  2. 高可靠性
  3. 支持热部署:不停机更新配置文件,升级版本,更换日志文件
  4. 低内存消耗:10000个keep-alive链接模式下的非活动链接,仅需2.5M内存
  5. event-driven,aio,mmap,sendfile

基本功能

  1. 静态资源的web服务器
  2. http协议反向代理服务器
  3. pop3/imap4协议反向代理服务器
  4. FastCGI(LNMP),uWSGI(python)等协议
  5. 模块化(非DSO),如zip,SSL模块

和web服务相关的功能

  1. 虚拟主机(server)
  2. 支持 keep-alive 和管道链接(利用一个链接作屡次请求)
  3. 访问日志(支持基于日志缓冲提升其性能)
  4. url rewirte
  5. 路径别名
  6. 基于IP及用户的访问控制
  7. 支持速率限制及并发数限制
  8. 从新配置和在线升级而无须中断客户的工做进程

Nginx请求处理机制

  1. 多进程方式:服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直到用户关闭链接,这样的优点是处理速度快,子进程之间相互独立,可是若是访问过大会致使服务器资源耗尽而没法提供请求。
  2. 多线程方式:与多进程方式相似,可是每收到一个客户端请求会有服务进程派生出一个线程来个客户方进行交互,一个线程的开销远远小于一个进程,所以多线程方式在很大程度减轻了web服务器对系统资源的要求,可是多线程也有本身的缺点,即当多个线程位于同一个进程内工做的时候,能够相互访问一样的内存地址空间,因此他们相互影响,一旦主进程挂掉则全部子线程都不能工做了,IIS服务器使用了多线程的方式,须要间隔一段时间就重启一次才能稳定。

Nginx组织模型

Nginx是多进程组织模型,并且是一个由Master主进程和Worker工做进程组成。html

Nginx入门

主进程(master process)的功能

  1. 读取Nginx 配置文件并验证其有效性和正确性
  2. 创建、绑定和关闭socket链接
  3. 按照配置生成、管理和结束工做进程
  4. 接受外界指令,好比重启、升级及退出服务器等指令
  5. 不中断服务,实现平滑升级,重启服务并应用新的配置
  6. 开启日志文件,获取文件描述符
  7. 不中断服务,实现平滑升级,升级失败进行回滚处理
  8. 编译和处理perl脚本

工做进程(woker process)的功能

  1. 接受处理客户的请求
  2. 将请求以此送入各个功能模块进行处理
  3. IO调用,获取响应数据
  4. 与后端服务器通讯,接收后端服务器的处理结果
  5. 缓存数据,访问缓存索引,查询和调用缓存数据
  6. 发送请求结果,响应客户的请求
  7. 接收主程序指令,好比重启、升级和退出等

进程间通讯

  1. 工做进程之间的通讯原理基本上和主进程与工做进程之间的通讯是同样的,只要工做进程之间可以取得彼此的信息,创建管道便可通讯,可是因为工做进程之间是彻底隔离的,所以一个进程想要直到另一个进程的状态信息就只能经过主进程来设置了。
  2. 为了实现工做进程之间的交互,主进程在生成工做进程以后,在工做进程表中进行遍历,将该新进程的ID以及针对该进程创建的管道句柄传递给工做进程中的其余进程,为工做进程之间的通讯作准备,当工做进程1向工做进程2发送指令的时候,首先在主进程给它的其余工做进程工做信息中找到2的进程ID,而后将正确的指令写入指向进程2的管道,工做进程2捕获到管道中的事件后,解析指令并进行相关操做,这样就完成了工做进程之间的通讯。

Nginx入门

Nginx模块

核心模块

  是 Nginx 服务器正常运行 必不可少 的模块,提供 错误日志记录 、 配置文件解析 、 事件驱动机制 、进程管理 等核心功能java

标准HTTP模块

  标准HTTP模块:提供 HTTP 协议解析相关的功能,好比: 端口配置 、 网页编码设置 、HTTP响应头设置 等等 python

可选HTTP模块

  主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,好比: Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等 nginx

邮件服务模块

  主要用于支持Nginx 的邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持 c++

第三方模块

  是为了扩展 Nginx 服务器应用,完成开发者自定义功能,好比: Json 支持、 Lua 支持等web

安装Nginx

Nginx的安装版本分为开发版、稳定版和过时版, Nginx安装可使用yum或源码安装,可是推荐使用源码,一是yum的版本比较旧,二是编译安装能够更方便自定义相关路径,三是使用源码编译能够自定义相关功能,更方便业务的上的使用,源码安装须要提早准备标准的编译器,GCC的全称是(GNU Compiler collection),其有GNU开发,并以GPL即LGPL许可,是自由的类UNIX即苹果电脑Mac OS X操做系统的标准编译器,由于GCC本来只能处理C语言,因此原名为GNU C语言编译器,后来获得快速发展,能够处理C++,Fortran,pascal,objective-C,java以及Ada等其余语言,此外还须要Automake工具,以完成自动建立Makefile的工做,Nginx的一些模块须要依赖第三方库,好比pcre(支持rewrite),zlib(支持gzip模块)和openssl(支持ssl模块)等。正则表达式

YUM安装Nginx

  安装前须要提早配置好epel源vim

[root@CentOS7 ~]#yum install -y nginx

编译安装Nginx

准备编译安装的基础环境后端

[root@CentOS7 ~]#yum install -y vim lrzsz tree screen psmisc lsof tcpdump wget ntpdate gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel net-tools iotop bc zip unzip zlib-devel bash-completion nfs-utils automake libxml2 libxml2-devel libxslt libxslt-devel perl perl-ExtUtils-Embed

    gcc为GNU Compiler Collection的缩写,能够编译C和C++源代码等,它是GNU开发的C和C++以及其余不少种语言的编译器(最先的时候只能编译C,后来很快进化成一个编译多种语言的集合,如Fortran、Pascal、Objective-C、Java、Ada、 Go等。)

    gcc 在编译C++源代码的阶段,只能编译 C++ 源文件,而不能自动和 C++ 程序使用的库连接(编译过程分为编译、连接两个阶段,注意不要和可执行文件这个概念搞混,相对可执行文件来讲有三个重要的概念:编译(compile)、连接(link)、加载(load)。源程序文件被编译成目标文件,多个目标文件连同库被连接成一个最终的可执行文件,可执行文件被加载到内存中运行)。所以,一般使用 g++ 命令来完成 C++ 程序的编译和链接,该程序会自动调用 gcc 实现编译。

    gcc-c++也能编译C源代码,只不过把会把它当成C++源代码,后缀为.c的,gcc把它看成是C程序,而g++看成是c++程序;后缀为.cpp的,二者都会认为是c++程序,注意,虽然c++是c的超集,可是二者对语法的要求是有区别的。

    automake是一个从Makefile.am文件自动生成Makefile.in的工具。为了生成Makefile.in,automake还需用到perl,因为automake建立的发布彻底遵循GNU标准,因此在建立中不须要perl。libtool是一款方便生成各类程序库的工具。

    pcre pcre-devel:在Nginx编译须要 PCRE(Perl Compatible Regular Expression),由于Nginx的Rewrite模块和HTTP 核心模块会使用到PCRE正则表达式语法。

    zlip zlib-devel:nginx启用压缩功能的时候,须要此模块的支持。

    openssl openssl-devel:开启SSL的时候须要此模块的支持。

下载源码包,解压

[root@CentOS7 ~]# cd /usr/local/src/
[root@CentOS7 src]# wget https://nginx.org/download/nginx-1.14.2.tar.gz
[root@CentOS7 src]# tar xf nginx-1.14.2.tar.gz
[root@CentOS7 src]# cd nginx-1.14.2/

编译安装

[root@CentOS7 nginx-1.14.2]#./configure --prefix=/apps/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module
[root@CentOS7 nginx-1.14.2]# make  # 编译步骤,根据Makefile文件生成相应的模块
[root@CentOS7 nginx-1.14.2]# make install  # 建立目录,并将生成的模块和文件复制到相应的目录

Nginx安装完成以后会生成四个主要目录:
一、conf:保存nginx全部的配置文件,其中nginx.conf是nginx服务器的最核心最主要的配置文件,其余的.conf则是用来配置nginx相关的功能的,例如fastcgi功能使用的是fastcgi.conf和fastcgi_params两个文件,配置文件通常都有个样板配置文件,是文件名.default结尾,使用的使用将其复制为并将default去掉便可。
二、html目录中保存了nginx服务器的web文件,可是能够更改成其余目录保存web文件,另外还有一个50x的web文件是默认的错误页面提示页面。
三、logs:用来保存nginx服务器的访问日志错误日志等日志,logs目录能够放在其余路径,好比/var/logs/nginx里面。
四、sbin:保存nginx二进制启动脚本,能够接受不一样的参数以实现不一样的功能。

建立nginx用户

[root@CentOS7 nginx-1.14.2]# useradd nginx -s /sbin/nologin -u 2000

对安装目录受权

[root@CentOS7 nginx-1.14.2]# chown nginx.nginx -R /apps/nginx/

验证版本即编译参数

[root@CentOS7 ~]#/apps/nginx/sbin/nginx -V
nginx version: nginx/1.14.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=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module

启动nginx

[root@CentOS ~]#/apps/nginx/sbin/nginx
[root@CentOS ~]#ss -ntl | grep 80
LISTEN     0      128          *:80                       *:*

Nginx测试页访问

Nginx入门

Nginx默认配置文件

[root@CentOS-Test ~]#cat /apps/nginx/conf/nginx.conf
user  nginx nginx;  #启动Nginx工做进程的用户和组
worker_processes  1;  #启动Nginx工做进程的数量

#错误日志记录配置
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

pid        logs/nginx.pid;  #pid文件保存路径

events {  #events设置快,主要影响nginx服务器与用户的网络链接,好比是否容许同时接受多个网络链接,使用哪一种事件驱动模型处理请求,每一个工做进程能够同时支持的最大链接数,是否开启对多工做进程下的网络链接进行序列化等。
    worker_connections  1024;  #设置单个nginx工做进程能够接受的最大并发,做为web服务器的时候最大并发数为worker_connections * worker_processes,做为反向代理的时候为(worker_connections * worker_processes)/2
}

http {  #http块是Nginx服务器配置中的重要部分,缓存、代理和日志格式定义等绝大多数功能和第三方模块均可以在这设置,http块能够包含多个server块,而一个server块中又能够包含多个location块,server块能够配置文件引入、MIME-Type定义、日志自定义、是否启用sendfile、链接超时时间和单个连接的请求上限等。
    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  logs/access.log  main;  # 引用日志文件格式
    sendfile        on;  # 做为web服务器的时候打开sendfile加快静态文件传输,指定是否使用sendfile系统调用来传输文件,sendfile系统调用在两个文件描述符之间直接传递数据(彻底在内核中操做),从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,操做效率很高,被称之为零拷贝,硬盘 >> kernel buffer (快速拷贝到kernelsocket buffer) >>协议栈。
    #tcp_nopush     on;  # 在开启了sendfile的状况下,合并请求后统一发送给客户端。
    #keepalive_timeout  0;
    keepalive_timeout  65;   # 长链接超时时间(会话保持时长),单位是秒
    #gzip  on;  # 开启文件压缩
    server {  # 设置一个虚拟机主机,能够包含本身的全局快,同时也能够包含多个location模块。好比本虚拟机监听的端口、本虚拟机的名称和IP配置,多个server 可使用一个端口,好比都使用80端口提供web服务
        listen       80;  # 配置server监听的端口
        server_name  localhost;  # 本server的名称,当访问此名称的时候nginx会调用当前serevr内部的配置进程匹配。
        #charset koi8-r;  # nginx编码格式,默认为俄语,建议设置成utf-8格式
        #access_log  logs/host.access.log  main;
        location / {  # location实际上是server的一个指令,为nginx服务器提供比较多并且灵活的指令,都是在location中提现的,主要是基于nginx接受到的请求字符串,对用户请求的UIL进行匹配,并对特定的指令进行处理,包括地址重定向、数据缓存和应答控制等功能都是在这部分实现,另外不少第三方模块的配置也是在location模块中配置。
            root   html;  # 至关于默认页面的目录名称,默认是相对路径,可使用绝对路径配置。
            index  index.html index.htm;  # 默认的页面文件名称
        }
        #error_page  404              /404.html;  # 错误页面的文件名称

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;  # 错误页面的文件名称
        location = /50x.html {  # location处理对应的不一样错误码的页面定义到/50x.html,这个跟对应其server中定义的目录下
            root   html;  # 定义默认页面所在的目录
        }

        # PHP页面配置
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {  # 以http的方式转发php请求到指定web服务器
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {  # 以fastcgi的方式转发php请求到php处理
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {  # 拒绝web形式访问指定文件,如不少的网站都是经过.htaccess文件来改变本身的重定向等功能。
        #    deny  all;  # 拒绝全部
        #}
    }

    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {  # 自定义虚拟server
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;  # 指定默认网页文件,此指令由ngx_http_index_module模块提供
    #    }
    #}

    # HTTPS server
    #
    #server {  # https服务器配置
    #    listen       443 ssl;
    #    server_name  localhost;

    #    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   html;
    #        index  index.html index.htm;
    #    }
    #}
#导入其余路径的配置文件
#include /apps/nginx/conf.d/*.conf
}
相关文章
相关标签/搜索