Nginx 安装 配置 使用

 

Nginx 安装 配置 使用

 

基本的HTTP服务器特性

  • 处理静态文件,索引文件以及自动索引;打开文件描述符缓存(缓存元数据和文件描述符,下一次能够直接从内存找到数据或者文件的位置);
  • 使用缓存加速反向代理;简单负载均衡以及容错(后端服务的健康情况检查);
  • 远程FastCGI,uwsgi,SCGI,和memcached服务的缓存加速支持;简单的负载均衡以及容错;
  • 模块化的架构。过滤器包括gzip压缩、ranges支持、chunked响应、XSLT,SSI以及图像缩放。在SSI 过滤器中,一个包含多个SSI的页面,若是经由FastCGI或反向代理处理,可被并行处理;
  • 支持SSL,TLS SNI。 
    Tengine(淘宝的nginx或叫tnginx,整合很是多的第三方插件) 
    varnish:提供缓存,有限内存缓存(使用算法使性能更好) 
    squid:它和varnish就比如httpd和nginx 
    nginx:其缓存功能保存到磁盘中 
    已经附带了memcached,能够直接管理memcached 
    httpd:既支持磁盘缓存,有支持内存缓存 

    其余的HTTP服务器特性

  • 基于名字和IP的虚拟主机;
  • Keep-alive和pipelined链接支持;
  • 灵活的配置;
  • 从新加载配置以及在线升级时,不须要中断正在处理的请求; 
    (新的链接创建是使用新的配置,老的链接则在在下一次请求时候使用新配置,这种方式较nginx的热部署,平滑升级)
  • 自定义访问日志格式,带缓存的日志写操做(先将日志放于缓存,而后存在磁盘)以及快速日志轮转(日志滚动);
  • 3xx-5xx错误代码重定向;
  • 重写(rewrite)模块:使用正则表达式改变URI;
  • 根据客户端地址执行不一样的功能;(根据客户端的类型好比手机设备返回wrap页面)
  • 基于客户端IP地址和HTTP基本认证机制的访问控制;
  • 支持验证HTTP referer;(ngx_http_referer_module模块容许拦截“Referer”请求头中含有非法值的请求,阻止它们访问站点。 须要注意的是伪造一个有效的“Referer”请求头是至关容易的, 所以这个模块的预期目的不在于完全地阻止这些非法请求,而是为了阻止由正常浏览器发出的大规模此类请求。 还有一点须要注意,即便正常浏览器发送的合法请求,也可能没有“Referer”请求头。好比你的网站A的图片被网站B盗链了,当访问B的时候会产生对A的大量的访问,致使A访问量过大,用此方式修改只容许站内链接)
  • 支持PUT、DELETE、MKCOL、COPY以及MOVE方法;
  • 支持FLV流和MP4流;
  • 速度限制;
  • 来自同一地址的同时链接数或请求数限制;
  • 嵌入Perl语言。 

    架构和扩展性

  • 一个主进程和多个工做进程,工做进程以非特权用户运行;
  • 支持的事件机制:kqueue(FreeBSD 4.1+)、epoll(Linux 2.6+)、rt signals(realtime signals Linux 2.2.19+)、/dev/poll(Solaris 7 11/99+)、event ports(Solaris 10)、select以及poll;
  • 众多支持的kqueue特性包括EV_CLEAR、EV_DISABLE(临时禁止事件)、NOTE_LOWAT、EV_EOF,可用数据的数量,错误代码;
  • 支持sendfile(FreeBSD 3.1+, Linux 2.2+, Mac OS X 10.5+)、sendfile64(Linux 2.4.21+)和sendfilev(Solaris 8 7/01+);
  • 文件AIO(FreeBSD 4.3+, Linux 2.6.22+);
  • DIRECTIO (FreeBSD 4.4+, Linux 2.4+, Solaris 2.6+, Mac OS X);
  • 支持Accept-filters(FreeBSD 4.1+, NetBSD 5.0+,能够只接受有限的链接 )和 TCP_DEFER_ACCEPT(Linux 2.4+);
  • 10000个非活跃的HTTP keep-alive链接仅占用约2.5M内存;
  • 尽量避免数据拷贝操做(如sendfile)。 
    上图中master监控worker进程运行情况。master是由管理员启用的,加载配置文件来进行全局管理,worker是使用普通用户,由master发起,是master的子进程。nginx是高度模块化的,向上图中worker进程中有不少模块,用户发起的请求交给worker进程,而其自己交给本身的模块进行相应的处理,这些模块以流水线的形式进行工做的,好比第一个模块解析请求的头部, 第二个取得数据,第三个建立相应。 
    上面的描述: 
    从新加载配置以及在线升级时,不须要中断正在处理的请求 
    详细的过程是,当新的配置文件加载到nginx时,nginx创建新的worker进程(使用新的配置文件)来相应新的请求,而原来的worker进程在完成之前的请求以后被master kill掉,因而动态缓慢加载新的配置文件

完成内容

  • 主进程主要完成以下工做: 
    1. 读取并验正配置信息;
    2. 建立、绑定及关闭套接字;
    3. 启动、终止及维护worker进程的个数;
    4. 无须停止服务而从新配置工做特性;
    5. 控制非中断式程序升级,启用新的二进制程序并在须要时回滚至老版本;(相似从新加载配置文件加载,新版本的master兼容老版本的worker)
    6. 从新打开日志文件,实现日志滚动;
    7. 编译嵌入式perl脚本;
  • worker进程主要完成的任务包括: 
    1. 接收、传入并处理来自客户端的链接;
    2. 提供反向代理及过滤功能;
    3. nginx任何能完成的其它任务; 
      cache loader进程主要完成的任务包括:
    4. 检查缓存存储中的缓存对象;
    5. 使用缓存元数据创建内存数据库;
  • cache manager进程的主要任务: 
    1. 缓存的失效及过时检验; 
      Nginx的配置有着几个不一样的上下文:main(对任何配置都生效,全局的)、http(包括server,upstream实现反向代理,location定义访问相应),还有实现邮件服务反向代理的mail。配置语法的格式和定义方式遵循所谓的C风格,所以支持嵌套,还有着逻辑清晰并易于建立、阅读和维护等优点。
  • sendfile: 
    步骤一:系统调用read致使了从用户空间到内核空间的上下文切换。DMA模块从磁盘中读取文件内容,并将其存储在内核空间的缓冲区内,完成了第1次复制。 
    步骤二:数据从内核空间缓冲区复制到用户空间缓冲区,以后系统调用read返回,这致使了从内核空间向用户空间的上下文切换。此时,须要的数据已存放在指定的用户空间缓冲区内(参数tmp_buf),程序能够继续下面的操做。 
    步骤三:系统调用write致使从用户空间到内核空间的上下文切换。数据从用户空间缓冲区被再次复制到内核空间缓冲区,完成了第3次复制。不过,此次数据存放在内核空间中与使用的socket相关的特定缓冲区中,而不是步骤一中的缓冲区。 
    步骤四:系统调用返回,致使了第4次上下文切换。第4次复制在DMA模块将数据从内核空间缓冲区传递至协议引擎的时候发生,这与咱们的代码的执行是独立且异步发生的。你可能会疑惑:“为什么要说是独立、异步?难道不是在write系统调用返回前数据已经被传送了?write系统调用的返回,并不意味着传输成功——它甚至没法保证传输的开始。调用的返回,只是代表以太网驱动程序在其传输队列中有空位,并已经接受咱们的数据用于传输。可能有众多的数据排在咱们的数据以前。除非驱动程序或硬件采用优先级队列的方法,各组数据是依照FIFO的次序被传输的(图1中叉状的DMA copy代表这最后一次复制能够被延后)。 
    采用sendfile能够很好地避免在将数据有DMA传入用户空间,再由用户空间传入内核空间的socket缓冲: 
    步骤一:mmap系统调用致使文件的内容经过DMA模块被复制到内核缓冲区中,该缓冲区以后与用户进程共享,这样就内核缓冲区与用户缓冲区之间的复制就不会发生。 
    步骤二:write系统调用致使内核将数据从内核缓冲区复制到与socket相关联的内核缓冲区中。 
    步骤三:DMA模块将数据由socket的缓冲区传递给协议引擎时,第3次复制发生。

nginx安装:

>本文采用编译安装的方式
  1. 解决依赖关系 
    编译安装nginx须要事先须要安装开发包组”Development Tools”和 “Development Libraries”。同时,还须要专门安装pcre-devel包:nginx

    yum -y install zlib zlib-devel openssl openssl-devel pcre-devel gd-devel
  2. 添加用户正则表达式

    groupadd -r nginx
    useradd -r -g nginx nginx
  3. 编译安装算法

    ./configure \
    --prefix=/usr \
    --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.pid \
    --lock-path=/var/run/nginx.lock \
    --http-client-body-temp-path=/var/cache/nginx/client_temp \
    --http-proxy-temp-path=/var/cache/nginx/proxy_temp \
    --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
    --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
    --http-scgi-temp-path=/var/cache/nginx/scgi_temp \
    --user=nginx \
    --group=nginx \
    --with-http_ssl_module \
    --with-http_realip_module \
    --with-http_addition_module \
    --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_stub_status_module \
    --with-http_auth_request_module \
    --with-mail \
    --with-mail_ssl_module \
    --with-file-aio \
    --with-ipv6 \
    --with-http_v2_module \
    --with-http_image_filter_module \
    --with-pcre \
    --with-cc-opt='-O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'
    make
    make install
  4. 配置支持Centos7 systemctl服务管理数据库

    vim /lib/systemd/system/nginx.service

    添加下面内容vim

    [Unit]
    Description=The NGINX HTTP and reverse proxy server
    After=syslog.target network.target remote-fs.target nss-lookup.target

    [Service]
    Type=forking
    PIDFile=/var/run/nginx.pid
    ExecStartPre=/usr/sbin/nginx -t
    ExecStart=/usr/sbin/nginx
    ExecReload=/bin/kill -s HUP $MAINPID
    ExecStop=/bin/kill -s QUIT $MAINPID
    PrivateTmp=true

    [Install]
    WantedBy=multi-user.target

    能够经过systemctl status start stop来看nginx服务内容后端

  5. 配置nginx浏览器

    vim /etc/nginx/nginx.conf

    #在http节点下,添加upstream节点

    upstream mysite {
    server 172.20.13.229:8081;
    server 172.20.13.230:8082;
    }

    #修改server节点下的location节点

    location / {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_buffering off;
    proxy_pass http://mysite;
    }

    #主要内容在mysite中

完成:)缓存

相关文章
相关标签/搜索